postgresql-syntax (empty) → 0.1
raw patch · 343 files changed
+126808/−0 lines, 343 filesdep +basedep +base-preludedep +bytestringbuild-type:Customsetup-changed
Dependencies added: base, base-prelude, bytestring, postgresql-syntax, rerebase, text
Files
- LICENSE +22/−0
- Setup.hs +50/−0
- demo/Main.hs +22/−0
- foreign/ffi/validation.c +20/−0
- foreign/libpg_query/LICENSE +28/−0
- foreign/libpg_query/Makefile +129/−0
- foreign/libpg_query/pg_query.h +59/−0
- foreign/libpg_query/src/pg_query.c +54/−0
- foreign/libpg_query/src/pg_query_fingerprint.c +318/−0
- foreign/libpg_query/src/pg_query_fingerprint.h +8/−0
- foreign/libpg_query/src/pg_query_fingerprint_conds.c +576/−0
- foreign/libpg_query/src/pg_query_fingerprint_defs.c +6614/−0
- foreign/libpg_query/src/pg_query_internal.h +24/−0
- foreign/libpg_query/src/pg_query_json.c +227/−0
- foreign/libpg_query/src/pg_query_json.h +6/−0
- foreign/libpg_query/src/pg_query_json_conds.c +576/−0
- foreign/libpg_query/src/pg_query_json_defs.c +2298/−0
- foreign/libpg_query/src/pg_query_json_helper.c +129/−0
- foreign/libpg_query/src/pg_query_json_plpgsql.c +672/−0
- foreign/libpg_query/src/pg_query_json_plpgsql.h +8/−0
- foreign/libpg_query/src/pg_query_normalize.c +372/−0
- foreign/libpg_query/src/pg_query_parse.c +124/−0
- foreign/libpg_query/src/pg_query_parse_plpgsql.c +450/−0
- foreign/libpg_query/src/postgres/contrib_pgcrypto_sha1.c +352/−0
- foreign/libpg_query/src/postgres/guc-file.c +0/−0
- foreign/libpg_query/src/postgres/include/access/attnum.h +64/−0
- foreign/libpg_query/src/postgres/include/access/commit_ts.h +69/−0
- foreign/libpg_query/src/postgres/include/access/genam.h +193/−0
- foreign/libpg_query/src/postgres/include/access/gin.h +83/−0
- foreign/libpg_query/src/postgres/include/access/hash.h +363/−0
- foreign/libpg_query/src/postgres/include/access/heapam.h +192/−0
- foreign/libpg_query/src/postgres/include/access/htup.h +88/−0
- foreign/libpg_query/src/postgres/include/access/htup_details.h +804/−0
- foreign/libpg_query/src/postgres/include/access/itup.h +151/−0
- foreign/libpg_query/src/postgres/include/access/parallel.h +69/−0
- foreign/libpg_query/src/postgres/include/access/printtup.h +35/−0
- foreign/libpg_query/src/postgres/include/access/rmgr.h +35/−0
- foreign/libpg_query/src/postgres/include/access/rmgrlist.h +47/−0
- foreign/libpg_query/src/postgres/include/access/sdir.h +58/−0
- foreign/libpg_query/src/postgres/include/access/skey.h +152/−0
- foreign/libpg_query/src/postgres/include/access/stratnum.h +75/−0
- foreign/libpg_query/src/postgres/include/access/sysattr.h +30/−0
- foreign/libpg_query/src/postgres/include/access/transam.h +179/−0
- foreign/libpg_query/src/postgres/include/access/tupdesc.h +130/−0
- foreign/libpg_query/src/postgres/include/access/tupmacs.h +243/−0
- foreign/libpg_query/src/postgres/include/access/twophase.h +59/−0
- foreign/libpg_query/src/postgres/include/access/xact.h +383/−0
- foreign/libpg_query/src/postgres/include/access/xlog.h +291/−0
- foreign/libpg_query/src/postgres/include/access/xlogdefs.h +102/−0
- foreign/libpg_query/src/postgres/include/access/xloginsert.h +62/−0
- foreign/libpg_query/src/postgres/include/access/xlogreader.h +206/−0
- foreign/libpg_query/src/postgres/include/access/xlogrecord.h +217/−0
- foreign/libpg_query/src/postgres/include/bootstrap/bootstrap.h +66/−0
- foreign/libpg_query/src/postgres/include/c.h +1116/−0
- foreign/libpg_query/src/postgres/include/catalog/dependency.h +269/−0
- foreign/libpg_query/src/postgres/include/catalog/genbki.h +50/−0
- foreign/libpg_query/src/postgres/include/catalog/index.h +134/−0
- foreign/libpg_query/src/postgres/include/catalog/indexing.h +322/−0
- foreign/libpg_query/src/postgres/include/catalog/namespace.h +153/−0
- foreign/libpg_query/src/postgres/include/catalog/objectaccess.h +185/−0
- foreign/libpg_query/src/postgres/include/catalog/objectaddress.h +77/−0
- foreign/libpg_query/src/postgres/include/catalog/pg_aggregate.h +338/−0
- foreign/libpg_query/src/postgres/include/catalog/pg_am.h +139/−0
- foreign/libpg_query/src/postgres/include/catalog/pg_attribute.h +223/−0
- foreign/libpg_query/src/postgres/include/catalog/pg_authid.h +102/−0
- foreign/libpg_query/src/postgres/include/catalog/pg_class.h +180/−0
- foreign/libpg_query/src/postgres/include/catalog/pg_collation.h +76/−0
- foreign/libpg_query/src/postgres/include/catalog/pg_constraint.h +258/−0
- foreign/libpg_query/src/postgres/include/catalog/pg_control.h +241/−0
- foreign/libpg_query/src/postgres/include/catalog/pg_conversion.h +77/−0
- foreign/libpg_query/src/postgres/include/catalog/pg_conversion_fn.h +27/−0
- foreign/libpg_query/src/postgres/include/catalog/pg_depend.h +90/−0
- foreign/libpg_query/src/postgres/include/catalog/pg_event_trigger.h +64/−0
- foreign/libpg_query/src/postgres/include/catalog/pg_index.h +111/−0
- foreign/libpg_query/src/postgres/include/catalog/pg_language.h +82/−0
- foreign/libpg_query/src/postgres/include/catalog/pg_namespace.h +85/−0
- foreign/libpg_query/src/postgres/include/catalog/pg_opclass.h +275/−0
- foreign/libpg_query/src/postgres/include/catalog/pg_operator.h +1823/−0
- foreign/libpg_query/src/postgres/include/catalog/pg_opfamily.h +186/−0
- foreign/libpg_query/src/postgres/include/catalog/pg_proc.h +5357/−0
- foreign/libpg_query/src/postgres/include/catalog/pg_proc_fn.h +50/−0
- foreign/libpg_query/src/postgres/include/catalog/pg_replication_origin.h +70/−0
- foreign/libpg_query/src/postgres/include/catalog/pg_statistic.h +293/−0
- foreign/libpg_query/src/postgres/include/catalog/pg_transform.h +47/−0
- foreign/libpg_query/src/postgres/include/catalog/pg_trigger.h +145/−0
- foreign/libpg_query/src/postgres/include/catalog/pg_ts_config.h +60/−0
- foreign/libpg_query/src/postgres/include/catalog/pg_ts_dict.h +66/−0
- foreign/libpg_query/src/postgres/include/catalog/pg_ts_parser.h +67/−0
- foreign/libpg_query/src/postgres/include/catalog/pg_ts_template.h +67/−0
- foreign/libpg_query/src/postgres/include/catalog/pg_type.h +738/−0
- foreign/libpg_query/src/postgres/include/commands/async.h +57/−0
- foreign/libpg_query/src/postgres/include/commands/dbcommands.h +34/−0
- foreign/libpg_query/src/postgres/include/commands/defrem.h +151/−0
- foreign/libpg_query/src/postgres/include/commands/event_trigger.h +89/−0
- foreign/libpg_query/src/postgres/include/commands/explain.h +97/−0
- foreign/libpg_query/src/postgres/include/commands/prepare.h +59/−0
- foreign/libpg_query/src/postgres/include/commands/tablespace.h +65/−0
- foreign/libpg_query/src/postgres/include/commands/trigger.h +215/−0
- foreign/libpg_query/src/postgres/include/commands/vacuum.h +206/−0
- foreign/libpg_query/src/postgres/include/commands/variable.h +40/−0
- foreign/libpg_query/src/postgres/include/common/relpath.h +74/−0
- foreign/libpg_query/src/postgres/include/datatype/timestamp.h +173/−0
- foreign/libpg_query/src/postgres/include/executor/execdesc.h +72/−0
- foreign/libpg_query/src/postgres/include/executor/executor.h +380/−0
- foreign/libpg_query/src/postgres/include/executor/functions.h +39/−0
- foreign/libpg_query/src/postgres/include/executor/instrument.h +73/−0
- foreign/libpg_query/src/postgres/include/executor/spi.h +150/−0
- foreign/libpg_query/src/postgres/include/executor/tuptable.h +174/−0
- foreign/libpg_query/src/postgres/include/fmgr.h +710/−0
- foreign/libpg_query/src/postgres/include/funcapi.h +318/−0
- foreign/libpg_query/src/postgres/include/getaddrinfo.h +164/−0
- foreign/libpg_query/src/postgres/include/lib/ilist.h +775/−0
- foreign/libpg_query/src/postgres/include/lib/pairingheap.h +102/−0
- foreign/libpg_query/src/postgres/include/lib/stringinfo.h +152/−0
- foreign/libpg_query/src/postgres/include/libpq/auth.h +29/−0
- foreign/libpg_query/src/postgres/include/libpq/be-fsstubs.h +68/−0
- foreign/libpg_query/src/postgres/include/libpq/hba.h +107/−0
- foreign/libpg_query/src/postgres/include/libpq/ip.h +51/−0
- foreign/libpg_query/src/postgres/include/libpq/libpq-be.h +229/−0
- foreign/libpg_query/src/postgres/include/libpq/libpq.h +103/−0
- foreign/libpg_query/src/postgres/include/libpq/pqcomm.h +204/−0
- foreign/libpg_query/src/postgres/include/libpq/pqformat.h +49/−0
- foreign/libpg_query/src/postgres/include/libpq/pqsignal.h +42/−0
- foreign/libpg_query/src/postgres/include/mb/pg_wchar.h +559/−0
- foreign/libpg_query/src/postgres/include/miscadmin.h +467/−0
- foreign/libpg_query/src/postgres/include/nodes/bitmapset.h +98/−0
- foreign/libpg_query/src/postgres/include/nodes/execnodes.h +2045/−0
- foreign/libpg_query/src/postgres/include/nodes/lockoptions.h +46/−0
- foreign/libpg_query/src/postgres/include/nodes/makefuncs.h +86/−0
- foreign/libpg_query/src/postgres/include/nodes/memnodes.h +81/−0
- foreign/libpg_query/src/postgres/include/nodes/nodeFuncs.h +66/−0
- foreign/libpg_query/src/postgres/include/nodes/nodes.h +652/−0
- foreign/libpg_query/src/postgres/include/nodes/params.h +106/−0
- foreign/libpg_query/src/postgres/include/nodes/parsenodes.h +3056/−0
- foreign/libpg_query/src/postgres/include/nodes/pg_list.h +326/−0
- foreign/libpg_query/src/postgres/include/nodes/plannodes.h +952/−0
- foreign/libpg_query/src/postgres/include/nodes/primnodes.h +1400/−0
- foreign/libpg_query/src/postgres/include/nodes/print.h +34/−0
- foreign/libpg_query/src/postgres/include/nodes/relation.h +1706/−0
- foreign/libpg_query/src/postgres/include/nodes/tidbitmap.h +66/−0
- foreign/libpg_query/src/postgres/include/nodes/value.h +61/−0
- foreign/libpg_query/src/postgres/include/optimizer/cost.h +194/−0
- foreign/libpg_query/src/postgres/include/optimizer/geqo.h +88/−0
- foreign/libpg_query/src/postgres/include/optimizer/geqo_gene.h +45/−0
- foreign/libpg_query/src/postgres/include/optimizer/paths.h +215/−0
- foreign/libpg_query/src/postgres/include/optimizer/planmain.h +145/−0
- foreign/libpg_query/src/postgres/include/optimizer/planner.h +52/−0
- foreign/libpg_query/src/postgres/include/optimizer/tlist.h +54/−0
- foreign/libpg_query/src/postgres/include/optimizer/var.h +44/−0
- foreign/libpg_query/src/postgres/include/parser/analyze.h +45/−0
- foreign/libpg_query/src/postgres/include/parser/gram.h +986/−0
- foreign/libpg_query/src/postgres/include/parser/gramparse.h +75/−0
- foreign/libpg_query/src/postgres/include/parser/keywords.h +38/−0
- foreign/libpg_query/src/postgres/include/parser/kwlist.h +444/−0
- foreign/libpg_query/src/postgres/include/parser/parse_agg.h +53/−0
- foreign/libpg_query/src/postgres/include/parser/parse_clause.h +56/−0
- foreign/libpg_query/src/postgres/include/parser/parse_coerce.h +90/−0
- foreign/libpg_query/src/postgres/include/parser/parse_collate.h +27/−0
- foreign/libpg_query/src/postgres/include/parser/parse_expr.h +26/−0
- foreign/libpg_query/src/postgres/include/parser/parse_func.h +70/−0
- foreign/libpg_query/src/postgres/include/parser/parse_node.h +236/−0
- foreign/libpg_query/src/postgres/include/parser/parse_oper.h +68/−0
- foreign/libpg_query/src/postgres/include/parser/parse_relation.h +121/−0
- foreign/libpg_query/src/postgres/include/parser/parse_target.h +45/−0
- foreign/libpg_query/src/postgres/include/parser/parse_type.h +55/−0
- foreign/libpg_query/src/postgres/include/parser/parser.h +41/−0
- foreign/libpg_query/src/postgres/include/parser/parsetree.h +79/−0
- foreign/libpg_query/src/postgres/include/parser/scanner.h +130/−0
- foreign/libpg_query/src/postgres/include/parser/scansup.h +27/−0
- foreign/libpg_query/src/postgres/include/pg_config.h +911/−0
- foreign/libpg_query/src/postgres/include/pg_config_ext.h +8/−0
- foreign/libpg_query/src/postgres/include/pg_config_manual.h +307/−0
- foreign/libpg_query/src/postgres/include/pg_config_os.h +8/−0
- foreign/libpg_query/src/postgres/include/pg_getopt.h +46/−0
- foreign/libpg_query/src/postgres/include/pg_trace.h +17/−0
- foreign/libpg_query/src/postgres/include/pgstat.h +1025/−0
- foreign/libpg_query/src/postgres/include/pgtime.h +84/−0
- foreign/libpg_query/src/postgres/include/pl_gram.h +251/−0
- foreign/libpg_query/src/postgres/include/plerrcodes.h +902/−0
- foreign/libpg_query/src/postgres/include/plpgsql.h +1040/−0
- foreign/libpg_query/src/postgres/include/port.h +471/−0
- foreign/libpg_query/src/postgres/include/port/atomics.h +537/−0
- foreign/libpg_query/src/postgres/include/port/atomics/arch-x86.h +255/−0
- foreign/libpg_query/src/postgres/include/port/atomics/fallback.h +148/−0
- foreign/libpg_query/src/postgres/include/port/atomics/generic-gcc.h +236/−0
- foreign/libpg_query/src/postgres/include/port/atomics/generic.h +387/−0
- foreign/libpg_query/src/postgres/include/port/pg_crc32c.h +93/−0
- foreign/libpg_query/src/postgres/include/portability/instr_time.h +154/−0
- foreign/libpg_query/src/postgres/include/postgres.h +722/−0
- foreign/libpg_query/src/postgres/include/postgres_ext.h +69/−0
- foreign/libpg_query/src/postgres/include/postmaster/autovacuum.h +67/−0
- foreign/libpg_query/src/postgres/include/postmaster/bgworker.h +144/−0
- foreign/libpg_query/src/postgres/include/postmaster/bgworker_internals.h +55/−0
- foreign/libpg_query/src/postgres/include/postmaster/bgwriter.h +43/−0
- foreign/libpg_query/src/postgres/include/postmaster/fork_process.h +17/−0
- foreign/libpg_query/src/postgres/include/postmaster/pgarch.h +39/−0
- foreign/libpg_query/src/postgres/include/postmaster/postmaster.h +74/−0
- foreign/libpg_query/src/postgres/include/postmaster/syslogger.h +90/−0
- foreign/libpg_query/src/postgres/include/postmaster/walwriter.h +20/−0
- foreign/libpg_query/src/postgres/include/regex/regex.h +177/−0
- foreign/libpg_query/src/postgres/include/replication/origin.h +88/−0
- foreign/libpg_query/src/postgres/include/replication/slot.h +182/−0
- foreign/libpg_query/src/postgres/include/replication/syncrep.h +57/−0
- foreign/libpg_query/src/postgres/include/replication/walreceiver.h +164/−0
- foreign/libpg_query/src/postgres/include/replication/walsender.h +64/−0
- foreign/libpg_query/src/postgres/include/rewrite/prs2lock.h +46/−0
- foreign/libpg_query/src/postgres/include/rewrite/rewriteHandler.h +33/−0
- foreign/libpg_query/src/postgres/include/rewrite/rewriteManip.h +85/−0
- foreign/libpg_query/src/postgres/include/rewrite/rewriteSupport.h +28/−0
- foreign/libpg_query/src/postgres/include/sha1.h +75/−0
- foreign/libpg_query/src/postgres/include/storage/backendid.h +27/−0
- foreign/libpg_query/src/postgres/include/storage/barrier.h +23/−0
- foreign/libpg_query/src/postgres/include/storage/block.h +121/−0
- foreign/libpg_query/src/postgres/include/storage/buf.h +46/−0
- foreign/libpg_query/src/postgres/include/storage/bufmgr.h +213/−0
- foreign/libpg_query/src/postgres/include/storage/bufpage.h +413/−0
- foreign/libpg_query/src/postgres/include/storage/dsm.h +59/−0
- foreign/libpg_query/src/postgres/include/storage/dsm_impl.h +78/−0
- foreign/libpg_query/src/postgres/include/storage/fd.h +125/−0
- foreign/libpg_query/src/postgres/include/storage/ipc.h +80/−0
- foreign/libpg_query/src/postgres/include/storage/item.h +19/−0
- foreign/libpg_query/src/postgres/include/storage/itemid.h +183/−0
- foreign/libpg_query/src/postgres/include/storage/itemptr.h +150/−0
- foreign/libpg_query/src/postgres/include/storage/latch.h +132/−0
- foreign/libpg_query/src/postgres/include/storage/lmgr.h +104/−0
- foreign/libpg_query/src/postgres/include/storage/lock.h +577/−0
- foreign/libpg_query/src/postgres/include/storage/lwlock.h +229/−0
- foreign/libpg_query/src/postgres/include/storage/off.h +58/−0
- foreign/libpg_query/src/postgres/include/storage/pg_sema.h +83/−0
- foreign/libpg_query/src/postgres/include/storage/pg_shmem.h +72/−0
- foreign/libpg_query/src/postgres/include/storage/pmsignal.h +56/−0
- foreign/libpg_query/src/postgres/include/storage/predicate.h +73/−0
- foreign/libpg_query/src/postgres/include/storage/proc.h +261/−0
- foreign/libpg_query/src/postgres/include/storage/procsignal.h +60/−0
- foreign/libpg_query/src/postgres/include/storage/relfilenode.h +99/−0
- foreign/libpg_query/src/postgres/include/storage/s_lock.h +985/−0
- foreign/libpg_query/src/postgres/include/storage/shm_mq.h +85/−0
- foreign/libpg_query/src/postgres/include/storage/shm_toc.h +57/−0
- foreign/libpg_query/src/postgres/include/storage/shmem.h +78/−0
- foreign/libpg_query/src/postgres/include/storage/sinval.h +153/−0
- foreign/libpg_query/src/postgres/include/storage/spin.h +77/−0
- foreign/libpg_query/src/postgres/include/storage/standby.h +120/−0
- foreign/libpg_query/src/postgres/include/tcop/deparse_utility.h +105/−0
- foreign/libpg_query/src/postgres/include/tcop/dest.h +141/−0
- foreign/libpg_query/src/postgres/include/tcop/fastpath.h +21/−0
- foreign/libpg_query/src/postgres/include/tcop/pquery.h +45/−0
- foreign/libpg_query/src/postgres/include/tcop/tcopprot.h +88/−0
- foreign/libpg_query/src/postgres/include/tcop/utility.h +52/−0
- foreign/libpg_query/src/postgres/include/tsearch/ts_cache.h +98/−0
- foreign/libpg_query/src/postgres/include/utils/acl.h +336/−0
- foreign/libpg_query/src/postgres/include/utils/aclchk_internal.h +45/−0
- foreign/libpg_query/src/postgres/include/utils/array.h +503/−0
- foreign/libpg_query/src/postgres/include/utils/builtins.h +1269/−0
- foreign/libpg_query/src/postgres/include/utils/bytea.h +52/−0
- foreign/libpg_query/src/postgres/include/utils/catcache.h +197/−0
- foreign/libpg_query/src/postgres/include/utils/date.h +208/−0
- foreign/libpg_query/src/postgres/include/utils/datetime.h +352/−0
- foreign/libpg_query/src/postgres/include/utils/datum.h +49/−0
- foreign/libpg_query/src/postgres/include/utils/dynamic_loader.h +25/−0
- foreign/libpg_query/src/postgres/include/utils/elog.h +422/−0
- foreign/libpg_query/src/postgres/include/utils/errcodes.h +328/−0
- foreign/libpg_query/src/postgres/include/utils/expandeddatum.h +151/−0
- foreign/libpg_query/src/postgres/include/utils/fmgroids.h +2450/−0
- foreign/libpg_query/src/postgres/include/utils/guc.h +435/−0
- foreign/libpg_query/src/postgres/include/utils/guc_tables.h +267/−0
- foreign/libpg_query/src/postgres/include/utils/hsearch.h +160/−0
- foreign/libpg_query/src/postgres/include/utils/int8.h +129/−0
- foreign/libpg_query/src/postgres/include/utils/inval.h +64/−0
- foreign/libpg_query/src/postgres/include/utils/lsyscache.h +166/−0
- foreign/libpg_query/src/postgres/include/utils/memdebug.h +34/−0
- foreign/libpg_query/src/postgres/include/utils/memutils.h +161/−0
- foreign/libpg_query/src/postgres/include/utils/numeric.h +63/−0
- foreign/libpg_query/src/postgres/include/utils/palloc.h +143/−0
- foreign/libpg_query/src/postgres/include/utils/pg_locale.h +84/−0
- foreign/libpg_query/src/postgres/include/utils/plancache.h +178/−0
- foreign/libpg_query/src/postgres/include/utils/portal.h +231/−0
- foreign/libpg_query/src/postgres/include/utils/probes.h +114/−0
- foreign/libpg_query/src/postgres/include/utils/ps_status.h +26/−0
- foreign/libpg_query/src/postgres/include/utils/rel.h +513/−0
- foreign/libpg_query/src/postgres/include/utils/relcache.h +130/−0
- foreign/libpg_query/src/postgres/include/utils/reltrigger.h +73/−0
- foreign/libpg_query/src/postgres/include/utils/resowner.h +82/−0
- foreign/libpg_query/src/postgres/include/utils/rls.h +50/−0
- foreign/libpg_query/src/postgres/include/utils/ruleutils.h +35/−0
- foreign/libpg_query/src/postgres/include/utils/snapmgr.h +72/−0
- foreign/libpg_query/src/postgres/include/utils/snapshot.h +124/−0
- foreign/libpg_query/src/postgres/include/utils/sortsupport.h +291/−0
- foreign/libpg_query/src/postgres/include/utils/syscache.h +197/−0
- foreign/libpg_query/src/postgres/include/utils/timeout.h +84/−0
- foreign/libpg_query/src/postgres/include/utils/timestamp.h +263/−0
- foreign/libpg_query/src/postgres/include/utils/tqual.h +103/−0
- foreign/libpg_query/src/postgres/include/utils/tuplesort.h +126/−0
- foreign/libpg_query/src/postgres/include/utils/tuplestore.h +89/−0
- foreign/libpg_query/src/postgres/include/utils/typcache.h +162/−0
- foreign/libpg_query/src/postgres/include/utils/tzparser.h +39/−0
- foreign/libpg_query/src/postgres/include/utils/xml.h +112/−0
- foreign/libpg_query/src/postgres/scan.c +11483/−0
- foreign/libpg_query/src/postgres/src_backend_catalog_namespace.c +963/−0
- foreign/libpg_query/src/postgres/src_backend_catalog_pg_proc.c +143/−0
- foreign/libpg_query/src/postgres/src_backend_commands_define.c +102/−0
- foreign/libpg_query/src/postgres/src_backend_lib_stringinfo.c +293/−0
- foreign/libpg_query/src/postgres/src_backend_libpq_pqcomm.c +634/−0
- foreign/libpg_query/src/postgres/src_backend_nodes_bitmapset.c +413/−0
- foreign/libpg_query/src/postgres/src_backend_nodes_copyfuncs.c +5195/−0
- foreign/libpg_query/src/postgres/src_backend_nodes_equalfuncs.c +3514/−0
- foreign/libpg_query/src/postgres/src_backend_nodes_list.c +738/−0
- foreign/libpg_query/src/postgres/src_backend_nodes_makefuncs.c +331/−0
- foreign/libpg_query/src/postgres/src_backend_nodes_nodeFuncs.c +1214/−0
- foreign/libpg_query/src/postgres/src_backend_nodes_value.c +75/−0
- foreign/libpg_query/src/postgres/src_backend_parser_gram.c too large to diff
- foreign/libpg_query/src/postgres/src_backend_parser_keywords.c +34/−0
- foreign/libpg_query/src/postgres/src_backend_parser_kwlookup.c +95/−0
- foreign/libpg_query/src/postgres/src_backend_parser_parse_expr.c +300/−0
- foreign/libpg_query/src/postgres/src_backend_parser_parser.c +203/−0
- foreign/libpg_query/src/postgres/src_backend_parser_scansup.c +150/−0
- foreign/libpg_query/src/postgres/src_backend_postmaster_postmaster.c +2081/−0
- foreign/libpg_query/src/postgres/src_backend_storage_ipc_ipc.c +187/−0
- foreign/libpg_query/src/postgres/src_backend_tcop_postgres.c +753/−0
- foreign/libpg_query/src/postgres/src_backend_utils_adt_datum.c +247/−0
- foreign/libpg_query/src/postgres/src_backend_utils_adt_expandeddatum.c +100/−0
- foreign/libpg_query/src/postgres/src_backend_utils_adt_format_type.c +119/−0
- foreign/libpg_query/src/postgres/src_backend_utils_adt_ruleutils.c +1502/−0
- foreign/libpg_query/src/postgres/src_backend_utils_error_assert.c +61/−0
- foreign/libpg_query/src/postgres/src_backend_utils_error_elog.c +2021/−0
- foreign/libpg_query/src/postgres/src_backend_utils_init_globals.c +151/−0
- foreign/libpg_query/src/postgres/src_backend_utils_mb_encnames.c +146/−0
- foreign/libpg_query/src/postgres/src_backend_utils_mb_mbutils.c +542/−0
- foreign/libpg_query/src/postgres/src_backend_utils_mb_wchar.c +1888/−0
- foreign/libpg_query/src/postgres/src_backend_utils_misc_guc.c +1580/−0
- foreign/libpg_query/src/postgres/src_backend_utils_mmgr_aset.c +1387/−0
- foreign/libpg_query/src/postgres/src_backend_utils_mmgr_mcxt.c +886/−0
- foreign/libpg_query/src/postgres/src_common_psprintf.c +197/−0
- foreign/libpg_query/src/postgres/src_pl_plpgsql_src_pl_comp.c +1114/−0
- foreign/libpg_query/src/postgres/src_pl_plpgsql_src_pl_funcs.c +798/−0
- foreign/libpg_query/src/postgres/src_pl_plpgsql_src_pl_gram.c +6151/−0
- foreign/libpg_query/src/postgres/src_pl_plpgsql_src_pl_handler.c +106/−0
- foreign/libpg_query/src/postgres/src_pl_plpgsql_src_pl_scanner.c +770/−0
- foreign/libpg_query/src/postgres/src_port_qsort.c +240/−0
- library/PostgreSQL/Syntax.hs +30/−0
- library/PostgreSQL/Syntax/Foreign.hs +9/−0
- library/PostgreSQL/Syntax/Pointers.hs +22/−0
- library/PostgreSQL/Syntax/Prelude.hs +26/−0
- postgresql-syntax.cabal +128/−0
+ LICENSE view
@@ -0,0 +1,22 @@+Copyright (c) 2017, Nikita Volkov++Permission is hereby granted, free of charge, to any person+obtaining a copy of this software and associated documentation+files (the "Software"), to deal in the Software without+restriction, including without limitation the rights to use,+copy, modify, merge, publish, distribute, sublicense, and/or sell+copies of the Software, and to permit persons to whom the+Software is furnished to do so, subject to the following+conditions:++The above copyright notice and this permission notice shall be+included in all copies or substantial portions of the Software.++THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR+OTHER DEALINGS IN THE SOFTWARE.
+ Setup.hs view
@@ -0,0 +1,50 @@+import Data.Maybe+import Data.Monoid+import System.Directory+import Distribution.Simple+import Distribution.Simple.Setup+import Distribution.Simple.Utils (rawSystemExit)+import Distribution.PackageDescription+import Distribution.Verbosity+import Distribution.Simple.LocalBuildInfo (LocalBuildInfo(..), InstallDirs(..), absoluteInstallDirs)++main =+ defaultMainWithHooks hooks+ where+ hooks =+ simpleUserHooks {+ confHook = theConfHook+ }++theConfHook :: (GenericPackageDescription, HookedBuildInfo) -> ConfigFlags -> IO LocalBuildInfo+theConfHook (description, buildInfo) flags = do+ localBuildInfo <- confHook simpleUserHooks (description, buildInfo) flags+ make (fromFlag (configVerbosity flags))+ updateLocalBuildInfo localBuildInfo++make :: Verbosity -> IO ()+make verbosity =+ do+ rawSystemExit verbosity "mkdir" ["-p", "dist/build"]+ rawSystemExit verbosity "cp" ["-a", "foreign/libpg_query", "dist/build/libpg_query"]+ rawSystemExit verbosity "env" ["CFLAGS=-D_LIB", "make", "--directory=dist/build/libpg_query", "libpg_query.a"]++updateLocalBuildInfo :: LocalBuildInfo -> IO LocalBuildInfo+updateLocalBuildInfo =+ def+ where+ def x =+ do+ path <- getCurrentDirectory+ return (addExtraLibDir (path <> "/dist/build/libpg_query") x)+ where+ updatePackageDescription fn localBuildInfo =+ localBuildInfo { localPkgDescr = fn (localPkgDescr localBuildInfo) }+ updateLibrary fn =+ updatePackageDescription (\x -> x { library = fmap fn (library x) })+ updateLibBuildInfo fn =+ updateLibrary (\x -> x { libBuildInfo = fn (libBuildInfo x) })+ updateExtraLibDirs fn =+ updateLibBuildInfo (\x -> x { extraLibDirs = fn (extraLibDirs x) })+ addExtraLibDir path =+ updateExtraLibDirs (\x -> path : x)
+ demo/Main.hs view
@@ -0,0 +1,22 @@+module Main where++import Prelude+import qualified PostgreSQL.Syntax as A+++main =+ do+ demo ""+ demo "wrong"+ demo "SELECT *"+ demo "SELECT * FROM a"+ demo "SELECT"+ demo "SELECT from b"+ demo "SELECT * from b"+ demo "SELECT * from b WHERE"+ demo "SELECT * from b WHERE c"+ demo "SELECT * from b WHERE ?"+ demo "SELECT * from b WHERE $2"+ where+ demo =+ print . A.validate
+ foreign/ffi/validation.c view
@@ -0,0 +1,20 @@+#include <stdio.h>+#include <stdlib.h>+#include <string.h>+#include "pg_query.h"+++int validate(const char *sql, char *output) {++ PgQueryParseResult result = pg_query_parse(sql);+ PgQueryError *error = result.error;++ if (error) {+ sprintf(output, "%s at offset %d", error->message, error->cursorpos - 1);+ }++ pg_query_free_parse_result(result);++ return error ? 1 : 0;++}
+ foreign/libpg_query/LICENSE view
@@ -0,0 +1,28 @@+Copyright (c) 2015, Lukas Fittl <lukas@fittl.com>+All rights reserved.++Redistribution and use in source and binary forms, with or without+modification, are permitted provided that the following conditions are met:++* Redistributions of source code must retain the above copyright notice, this+list of conditions and the following disclaimer.++* Redistributions in binary form must reproduce the above copyright notice,+this list of conditions and the following disclaimer in the documentation+and/or other materials provided with the distribution.++* Neither the name of pg_query nor the names of its contributors may be used+to endorse or promote products derived from this software without specific+prior written permission.++THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE+POSSIBILITY OF SUCH DAMAGE.
+ foreign/libpg_query/Makefile view
@@ -0,0 +1,129 @@+root_dir := $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST))))++TARGET = pg_query+ARLIB = lib$(TARGET).a+PGDIR = $(root_dir)/tmp/postgres+PGDIRBZ2 = $(root_dir)/tmp/postgres.tar.bz2++PG_VERSION = 9.5.3++SRC_FILES := $(wildcard src/*.c src/postgres/*.c)+OBJ_FILES := $(SRC_FILES:.c=.o)+NOT_OBJ_FILES := src/pg_query_fingerprint_defs.o src/pg_query_fingerprint_conds.o src/pg_query_json_defs.o src/pg_query_json_conds.o src/postgres/guc-file.o src/postgres/scan.o src/pg_query_json_helper.o+OBJ_FILES := $(filter-out $(NOT_OBJ_FILES), $(OBJ_FILES))++CFLAGS = -I. -I./src/postgres/include -Wall -Wno-unused-function -Wno-unused-value -Wno-unused-variable -fno-strict-aliasing -fwrapv -fPIC+LIBPATH = -L.++PG_CONFIGURE_FLAGS = -q --without-readline --without-zlib+PG_CFLAGS = -fPIC++ifeq ($(DEBUG),1)+ CFLAGS += -O0 -g+ PG_CONFIGURE_FLAGS += --enable-cassert --enable-debug+else+ CFLAGS += -O3 -g+ PG_CFLAGS += -O3+endif++CLEANLIBS = $(ARLIB)+CLEANOBJS = $(OBJ_FILES)+CLEANFILES = $(PGDIRBZ2)++AR = ar rs+RM = rm -f+ECHO = echo++CC ?= cc++all: examples test build++build: $(ARLIB)++clean:+ -@ $(RM) $(CLEANLIBS) $(CLEANOBJS) $(CLEANFILES) $(EXAMPLES) $(TESTS)+ -@ $(RM) -rf {test,examples}/*.dSYM+ -@ $(RM) -r $(PGDIR) $(PGDIRBZ2)++.PHONY: all clean build extract_source examples test++$(PGDIR):+ curl -o $(PGDIRBZ2) https://ftp.postgresql.org/pub/source/v$(PG_VERSION)/postgresql-$(PG_VERSION).tar.bz2+ tar -xjf $(PGDIRBZ2)+ mv $(root_dir)/postgresql-$(PG_VERSION) $(PGDIR)+ cd $(PGDIR); patch -p1 < $(root_dir)/patches/01_parse_replacement_char.patch+ cd $(PGDIR); patch -p1 < $(root_dir)/patches/02_normalize_alter_role_password.patch+ cd $(PGDIR); CFLAGS="$(PG_CFLAGS)" ./configure $(PG_CONFIGURE_FLAGS)+ cd $(PGDIR); make -C src/port pg_config_paths.h+ cd $(PGDIR); make -C src/backend parser-recursive # Triggers copying of includes to where they belong, as well as generating gram.c/scan.c++extract_source: $(PGDIR)+ -@ $(RM) -rf ./src/postgres/+ mkdir ./src/postgres+ mkdir ./src/postgres/include+ ruby ./scripts/extract_source.rb $(PGDIR)/ ./src/postgres/+ cp $(PGDIR)/src/include/storage/dsm_impl.h ./src/postgres/include/storage+ touch ./src/postgres/guc-file.c+ # This causes compatibility problems on some Linux distros, with "xlocale.h" not being available+ echo "#undef HAVE_LOCALE_T" >> ./src/postgres/include/pg_config.h+ echo "#undef LOCALE_T_IN_XLOCALE" >> ./src/postgres/include/pg_config.h+ echo "#undef WCSTOMBS_L_IN_XLOCALE" >> ./src/postgres/include/pg_config.h++.c.o:+ @$(ECHO) compiling $(<)+ @$(CC) $(CPPFLAGS) $(CFLAGS) -o $@ -c $<++$(ARLIB): $(OBJ_FILES) Makefile+ @$(AR) $@ $(OBJ_FILES)++EXAMPLES = examples/simple examples/normalize examples/simple_error examples/normalize_error examples/simple_plpgsql+examples: $(EXAMPLES)+ examples/simple+ examples/normalize+ examples/simple_error+ examples/normalize_error+ examples/simple_plpgsql++examples/simple: examples/simple.c $(ARLIB)+ $(CC) -I. -o $@ -g examples/simple.c $(ARLIB)++examples/normalize: examples/normalize.c $(ARLIB)+ $(CC) -I. -o $@ -g examples/normalize.c $(ARLIB)++examples/simple_error: examples/simple_error.c $(ARLIB)+ $(CC) -I. -o $@ -g examples/simple_error.c $(ARLIB)++examples/normalize_error: examples/normalize_error.c $(ARLIB)+ $(CC) -I. -o $@ -g examples/normalize_error.c $(ARLIB)++examples/simple_plpgsql: examples/simple_plpgsql.c $(ARLIB)+ $(CC) -I. -o $@ -g examples/simple_plpgsql.c $(ARLIB)++TESTS = test/complex test/concurrency test/fingerprint test/normalize test/parse test/parse_plpgsql+test: $(TESTS)+ test/complex+ test/concurrency+ test/fingerprint+ test/normalize+ test/parse+ # Output-based tests+ test/parse_plpgsql+ diff -Naur test/plpgsql_samples.expected.json test/plpgsql_samples.actual.json++test/complex: test/complex.c $(ARLIB)+ $(CC) -I. -Isrc -o $@ -g test/complex.c $(ARLIB)++test/concurrency: test/concurrency.c test/parse_tests.c $(ARLIB)+ $(CC) -I. -o $@ -pthread -g test/concurrency.c $(ARLIB)++test/fingerprint: test/fingerprint.c test/fingerprint_tests.c $(ARLIB)+ $(CC) -I. -Isrc -o $@ -g test/fingerprint.c $(ARLIB)++test/normalize: test/normalize.c test/normalize_tests.c $(ARLIB)+ $(CC) -I. -Isrc -o $@ -g test/normalize.c $(ARLIB)++test/parse: test/parse.c test/parse_tests.c $(ARLIB)+ $(CC) -I. -o $@ -g test/parse.c $(ARLIB)++test/parse_plpgsql: test/parse_plpgsql.c $(ARLIB)+ $(CC) -I. -o $@ -I./src -I./src/postgres/include -g test/parse_plpgsql.c $(ARLIB)
+ foreign/libpg_query/pg_query.h view
@@ -0,0 +1,59 @@+#ifndef PG_QUERY_H+#define PG_QUERY_H++typedef struct {+ char* message; // exception message+ char* funcname; // source function of exception (e.g. SearchSysCache)+ char* filename; // source of exception (e.g. parse.l)+ int lineno; // source of exception (e.g. 104)+ int cursorpos; // char in query at which exception occurred+ char* context; // additional context (optional, can be NULL)+} PgQueryError;++typedef struct {+ char* parse_tree;+ char* stderr_buffer;+ PgQueryError* error;+} PgQueryParseResult;++typedef struct {+ char* plpgsql_funcs;+ PgQueryError* error;+} PgQueryPlpgsqlParseResult;++typedef struct {+ char* hexdigest;+ char* stderr_buffer;+ PgQueryError* error;+} PgQueryFingerprintResult;++typedef struct {+ char* normalized_query;+ PgQueryError* error;+} PgQueryNormalizeResult;++#ifdef __cplusplus+extern "C" {+#endif++PgQueryNormalizeResult pg_query_normalize(const char* input);+PgQueryParseResult pg_query_parse(const char* input);+PgQueryPlpgsqlParseResult pg_query_parse_plpgsql(const char* input);++PgQueryFingerprintResult pg_query_fingerprint(const char* input);++void pg_query_free_normalize_result(PgQueryNormalizeResult result);+void pg_query_free_parse_result(PgQueryParseResult result);+void pg_query_free_plpgsql_parse_result(PgQueryPlpgsqlParseResult result);+void pg_query_free_fingerprint_result(PgQueryFingerprintResult result);+++// Deprecated APIs below++void pg_query_init(void); // Deprecated as of 9.5-1.4.1, this is now run automatically as needed++#ifdef __cplusplus+}+#endif++#endif
+ foreign/libpg_query/src/pg_query.c view
@@ -0,0 +1,54 @@+#include "pg_query.h"+#include "pg_query_internal.h"+#include <mb/pg_wchar.h>+#include <signal.h>++const char* progname = "pg_query";++__thread sig_atomic_t pg_query_initialized = 0;++void pg_query_init(void)+{+ if (pg_query_initialized != 0) return;+ pg_query_initialized = 1;++ MemoryContextInit();+ SetDatabaseEncoding(PG_UTF8);+}++MemoryContext pg_query_enter_memory_context(const char* ctx_name)+{+ MemoryContext ctx = NULL;++ pg_query_init();++ ctx = AllocSetContextCreate(TopMemoryContext,+ ctx_name,+ ALLOCSET_DEFAULT_MINSIZE,+ ALLOCSET_DEFAULT_INITSIZE,+ ALLOCSET_DEFAULT_MAXSIZE);+ MemoryContextSwitchTo(ctx);++ return ctx;+}++void pg_query_exit_memory_context(MemoryContext ctx)+{+ // Return to previous PostgreSQL memory context+ MemoryContextSwitchTo(TopMemoryContext);++ MemoryContextDelete(ctx);+}++void pg_query_free_error(PgQueryError *error)+{+ free(error->message);+ free(error->funcname);+ free(error->filename);++ if (error->context) {+ free(error->context);+ }++ free(error);+}
+ foreign/libpg_query/src/pg_query_fingerprint.c view
@@ -0,0 +1,318 @@+#include "pg_query.h"+#include "pg_query_internal.h"+#include "pg_query_fingerprint.h"++#include "postgres.h"+#include "sha1.h"+#include "lib/ilist.h"++#include "parser/parser.h"+#include "parser/scanner.h"+#include "parser/scansup.h"++#include "nodes/parsenodes.h"+#include "nodes/value.h"++#include <unistd.h>+#include <fcntl.h>++// Definitions++typedef struct FingerprintContext+{+ dlist_head tokens;+ SHA1_CTX *sha1; // If this is NULL we write tokens, otherwise we write the sha1sum directly+} FingerprintContext;++typedef struct FingerprintToken+{+ char *str;+ dlist_node list_node;+} FingerprintToken;++static void _fingerprintNode(FingerprintContext *ctx, const void *obj, const void *parent, char *parent_field_name, unsigned int depth);+static void _fingerprintInitForTokens(FingerprintContext *ctx);+static void _fingerprintCopyTokens(FingerprintContext *source, FingerprintContext *target, char *field_name);++#define PG_QUERY_FINGERPRINT_VERSION 1++// Implementations++static void+_fingerprintString(FingerprintContext *ctx, const char *str)+{+ if (ctx->sha1 != NULL) {+ SHA1Update(ctx->sha1, (uint8*) str, strlen(str));+ } else {+ FingerprintToken *token = palloc0(sizeof(FingerprintToken));+ token->str = pstrdup(str);+ dlist_push_tail(&ctx->tokens, &token->list_node);+ }+}++static void+_fingerprintInteger(FingerprintContext *ctx, const Value *node)+{+ if (node->val.ival != 0) {+ _fingerprintString(ctx, "Integer");+ _fingerprintString(ctx, "ival");+ char buffer[50];+ sprintf(buffer, "%ld", node->val.ival);+ _fingerprintString(ctx, buffer);+ }+}++static void+_fingerprintFloat(FingerprintContext *ctx, const Value *node)+{+ if (node->val.str != NULL) {+ _fingerprintString(ctx, "Float");+ _fingerprintString(ctx, "str");+ _fingerprintString(ctx, node->val.str);+ }+}++static void+_fingerprintBitString(FingerprintContext *ctx, const Value *node)+{+ if (node->val.str != NULL) {+ _fingerprintString(ctx, "BitString");+ _fingerprintString(ctx, "str");+ _fingerprintString(ctx, node->val.str);+ }+}++#define FINGERPRINT_CMP_STRBUF 1024++static int compareFingerprintContext(const void *a, const void *b)+{+ FingerprintContext *ca = *(FingerprintContext**) a;+ FingerprintContext *cb = *(FingerprintContext**) b;++ char strBufA[FINGERPRINT_CMP_STRBUF + 1] = {'\0'};+ char strBufB[FINGERPRINT_CMP_STRBUF + 1] = {'\0'};++ dlist_iter iterA;+ dlist_iter iterB;++ dlist_foreach(iterA, &ca->tokens)+ {+ FingerprintToken *token = dlist_container(FingerprintToken, list_node, iterA.cur);++ strncat(strBufA, token->str, FINGERPRINT_CMP_STRBUF - strlen(strBufA));+ }++ dlist_foreach(iterB, &cb->tokens)+ {+ FingerprintToken *token = dlist_container(FingerprintToken, list_node, iterB.cur);++ strncat(strBufB, token->str, FINGERPRINT_CMP_STRBUF - strlen(strBufB));+ }++ //printf("COMP %s <=> %s = %d\n", strBufA, strBufB, strcmp(strBufA, strBufB));++ return strcmp(strBufA, strBufB);+}++static void+_fingerprintList(FingerprintContext *ctx, const List *node, const void *parent, char *field_name, unsigned int depth)+{+ if (field_name != NULL && (strcmp(field_name, "fromClause") == 0 || strcmp(field_name, "targetList") == 0 ||+ strcmp(field_name, "cols") == 0 || strcmp(field_name, "rexpr") == 0)) {++ FingerprintContext** subCtxArr = palloc0(node->length * sizeof(FingerprintContext*));+ size_t subCtxCount = 0;+ size_t i;+ const ListCell *lc;++ foreach(lc, node)+ {+ FingerprintContext* subCtx = palloc0(sizeof(FingerprintContext));++ _fingerprintInitForTokens(subCtx);+ _fingerprintNode(subCtx, lfirst(lc), parent, field_name, depth + 1);++ bool exists = false;+ for (i = 0; i < subCtxCount; i++) {+ if (compareFingerprintContext(&subCtxArr[i], &subCtx) == 0) {+ exists = true;+ break;+ }+ }++ if (!exists) {+ subCtxArr[subCtxCount] = subCtx;+ subCtxCount += 1;+ }++ lnext(lc);+ }++ pg_qsort(subCtxArr, subCtxCount, sizeof(FingerprintContext*), compareFingerprintContext);++ for (i = 0; i < subCtxCount; i++) {+ _fingerprintCopyTokens(subCtxArr[i], ctx, NULL);+ }+ } else {+ const ListCell *lc;++ foreach(lc, node)+ {+ _fingerprintNode(ctx, lfirst(lc), parent, field_name, depth + 1);++ lnext(lc);+ }+ }+}++static void+_fingerprintInitForTokens(FingerprintContext *ctx) {+ ctx->sha1 = NULL;+ dlist_init(&ctx->tokens);+}++static void+_fingerprintCopyTokens(FingerprintContext *source, FingerprintContext *target, char *field_name) {+ dlist_iter iter;++ if (dlist_is_empty(&source->tokens)) return;++ if (field_name != NULL) {+ _fingerprintString(target, field_name);+ }++ dlist_foreach(iter, &source->tokens)+ {+ FingerprintToken *token = dlist_container(FingerprintToken, list_node, iter.cur);++ _fingerprintString(target, token->str);+ }+}++#include "pg_query_fingerprint_defs.c"++void+_fingerprintNode(FingerprintContext *ctx, const void *obj, const void *parent, char *field_name, unsigned int depth)+{+ // Some queries are overly complex in their parsetree - lets consistently cut them off at 100 nodes deep+ if (depth >= 100) {+ return;+ }++ if (obj == NULL)+ {+ return; // Ignore+ }++ if (IsA(obj, List))+ {+ _fingerprintList(ctx, obj, parent, field_name, depth);+ }+ else+ {+ switch (nodeTag(obj))+ {+ case T_Integer:+ _fingerprintInteger(ctx, obj);+ break;+ case T_Float:+ _fingerprintFloat(ctx, obj);+ break;+ case T_String:+ _fingerprintString(ctx, "String");+ _fingerprintString(ctx, "str");+ _fingerprintString(ctx, ((Value*) obj)->val.str);+ break;+ case T_BitString:+ _fingerprintBitString(ctx, obj);+ break;++ #include "pg_query_fingerprint_conds.c"++ default:+ elog(WARNING, "could not fingerprint unrecognized node type: %d",+ (int) nodeTag(obj));++ return;+ }+ }+}++PgQueryFingerprintResult pg_query_fingerprint_with_opts(const char* input, bool printTokens)+{+ MemoryContext ctx = NULL;+ PgQueryInternalParsetreeAndError parsetree_and_error;+ PgQueryFingerprintResult result = {0};++ ctx = pg_query_enter_memory_context("pg_query_fingerprint");++ parsetree_and_error = pg_query_raw_parse(input);++ // These are all malloc-ed and will survive exiting the memory context, the caller is responsible to free them now+ result.stderr_buffer = parsetree_and_error.stderr_buffer;+ result.error = parsetree_and_error.error;++ if (parsetree_and_error.tree != NULL || result.error == NULL) {+ FingerprintContext ctx;+ int i;+ uint8 sha1result[SHA1_RESULTLEN];++ ctx.sha1 = palloc0(sizeof(SHA1_CTX));+ SHA1Init(ctx.sha1);++ if (parsetree_and_error.tree != NULL) {+ _fingerprintNode(&ctx, parsetree_and_error.tree, NULL, NULL, 0);+ }++ SHA1Final(sha1result, ctx.sha1);++ // This is intentionally malloc-ed and will survive exiting the memory context+ result.hexdigest = calloc((1 + SHA1_RESULTLEN) * 2 + 1, sizeof(char));++ sprintf(result.hexdigest, "%02x", PG_QUERY_FINGERPRINT_VERSION);++ for (i = 0; i < SHA1_RESULTLEN; i++) {+ sprintf(result.hexdigest + (1 + i) * 2, "%02x", sha1result[i]);+ }++ if (printTokens) {+ FingerprintContext debugCtx;+ dlist_iter iter;++ _fingerprintInitForTokens(&debugCtx);+ _fingerprintNode(&debugCtx, parsetree_and_error.tree, NULL, NULL, 0);++ printf("[");++ dlist_foreach(iter, &debugCtx.tokens)+ {+ FingerprintToken *token = dlist_container(FingerprintToken, list_node, iter.cur);++ printf("%s, ", token->str);+ }++ printf("]\n");+ }+ }++ pg_query_exit_memory_context(ctx);++ return result;+}++PgQueryFingerprintResult pg_query_fingerprint(const char* input)+{+ return pg_query_fingerprint_with_opts(input, false);+}++void pg_query_free_fingerprint_result(PgQueryFingerprintResult result)+{+ if (result.error) {+ free(result.error->message);+ free(result.error->filename);+ free(result.error);+ }++ free(result.hexdigest);+ free(result.stderr_buffer);+}
+ foreign/libpg_query/src/pg_query_fingerprint.h view
@@ -0,0 +1,8 @@+#ifndef PG_QUERY_FINGERPRINT_H+#define PG_QUERY_FINGERPRINT_H++#include <stdbool.h>++PgQueryFingerprintResult pg_query_fingerprint_with_opts(const char* input, bool printTokens);++#endif
+ foreign/libpg_query/src/pg_query_fingerprint_conds.c view
@@ -0,0 +1,576 @@+case T_Alias:+ _fingerprintAlias(ctx, obj, parent, field_name, depth);+ break;+case T_RangeVar:+ _fingerprintRangeVar(ctx, obj, parent, field_name, depth);+ break;+case T_Expr:+ _fingerprintExpr(ctx, obj, parent, field_name, depth);+ break;+case T_Var:+ _fingerprintVar(ctx, obj, parent, field_name, depth);+ break;+case T_Const:+ _fingerprintConst(ctx, obj, parent, field_name, depth);+ break;+case T_Param:+ _fingerprintParam(ctx, obj, parent, field_name, depth);+ break;+case T_Aggref:+ _fingerprintAggref(ctx, obj, parent, field_name, depth);+ break;+case T_GroupingFunc:+ _fingerprintGroupingFunc(ctx, obj, parent, field_name, depth);+ break;+case T_WindowFunc:+ _fingerprintWindowFunc(ctx, obj, parent, field_name, depth);+ break;+case T_ArrayRef:+ _fingerprintArrayRef(ctx, obj, parent, field_name, depth);+ break;+case T_FuncExpr:+ _fingerprintFuncExpr(ctx, obj, parent, field_name, depth);+ break;+case T_NamedArgExpr:+ _fingerprintNamedArgExpr(ctx, obj, parent, field_name, depth);+ break;+case T_OpExpr:+ _fingerprintOpExpr(ctx, obj, parent, field_name, depth);+ break;+case T_ScalarArrayOpExpr:+ _fingerprintScalarArrayOpExpr(ctx, obj, parent, field_name, depth);+ break;+case T_BoolExpr:+ _fingerprintBoolExpr(ctx, obj, parent, field_name, depth);+ break;+case T_SubLink:+ _fingerprintSubLink(ctx, obj, parent, field_name, depth);+ break;+case T_SubPlan:+ _fingerprintSubPlan(ctx, obj, parent, field_name, depth);+ break;+case T_AlternativeSubPlan:+ _fingerprintAlternativeSubPlan(ctx, obj, parent, field_name, depth);+ break;+case T_FieldSelect:+ _fingerprintFieldSelect(ctx, obj, parent, field_name, depth);+ break;+case T_FieldStore:+ _fingerprintFieldStore(ctx, obj, parent, field_name, depth);+ break;+case T_RelabelType:+ _fingerprintRelabelType(ctx, obj, parent, field_name, depth);+ break;+case T_CoerceViaIO:+ _fingerprintCoerceViaIO(ctx, obj, parent, field_name, depth);+ break;+case T_ArrayCoerceExpr:+ _fingerprintArrayCoerceExpr(ctx, obj, parent, field_name, depth);+ break;+case T_ConvertRowtypeExpr:+ _fingerprintConvertRowtypeExpr(ctx, obj, parent, field_name, depth);+ break;+case T_CollateExpr:+ _fingerprintCollateExpr(ctx, obj, parent, field_name, depth);+ break;+case T_CaseExpr:+ _fingerprintCaseExpr(ctx, obj, parent, field_name, depth);+ break;+case T_CaseWhen:+ _fingerprintCaseWhen(ctx, obj, parent, field_name, depth);+ break;+case T_CaseTestExpr:+ _fingerprintCaseTestExpr(ctx, obj, parent, field_name, depth);+ break;+case T_ArrayExpr:+ _fingerprintArrayExpr(ctx, obj, parent, field_name, depth);+ break;+case T_RowExpr:+ _fingerprintRowExpr(ctx, obj, parent, field_name, depth);+ break;+case T_RowCompareExpr:+ _fingerprintRowCompareExpr(ctx, obj, parent, field_name, depth);+ break;+case T_CoalesceExpr:+ _fingerprintCoalesceExpr(ctx, obj, parent, field_name, depth);+ break;+case T_MinMaxExpr:+ _fingerprintMinMaxExpr(ctx, obj, parent, field_name, depth);+ break;+case T_XmlExpr:+ _fingerprintXmlExpr(ctx, obj, parent, field_name, depth);+ break;+case T_NullTest:+ _fingerprintNullTest(ctx, obj, parent, field_name, depth);+ break;+case T_BooleanTest:+ _fingerprintBooleanTest(ctx, obj, parent, field_name, depth);+ break;+case T_CoerceToDomain:+ _fingerprintCoerceToDomain(ctx, obj, parent, field_name, depth);+ break;+case T_CoerceToDomainValue:+ _fingerprintCoerceToDomainValue(ctx, obj, parent, field_name, depth);+ break;+case T_SetToDefault:+ _fingerprintSetToDefault(ctx, obj, parent, field_name, depth);+ break;+case T_CurrentOfExpr:+ _fingerprintCurrentOfExpr(ctx, obj, parent, field_name, depth);+ break;+case T_InferenceElem:+ _fingerprintInferenceElem(ctx, obj, parent, field_name, depth);+ break;+case T_TargetEntry:+ _fingerprintTargetEntry(ctx, obj, parent, field_name, depth);+ break;+case T_RangeTblRef:+ _fingerprintRangeTblRef(ctx, obj, parent, field_name, depth);+ break;+case T_JoinExpr:+ _fingerprintJoinExpr(ctx, obj, parent, field_name, depth);+ break;+case T_FromExpr:+ _fingerprintFromExpr(ctx, obj, parent, field_name, depth);+ break;+case T_OnConflictExpr:+ _fingerprintOnConflictExpr(ctx, obj, parent, field_name, depth);+ break;+case T_IntoClause:+ _fingerprintIntoClause(ctx, obj, parent, field_name, depth);+ break;+case T_Query:+ _fingerprintQuery(ctx, obj, parent, field_name, depth);+ break;+case T_InsertStmt:+ _fingerprintInsertStmt(ctx, obj, parent, field_name, depth);+ break;+case T_DeleteStmt:+ _fingerprintDeleteStmt(ctx, obj, parent, field_name, depth);+ break;+case T_UpdateStmt:+ _fingerprintUpdateStmt(ctx, obj, parent, field_name, depth);+ break;+case T_SelectStmt:+ _fingerprintSelectStmt(ctx, obj, parent, field_name, depth);+ break;+case T_AlterTableStmt:+ _fingerprintAlterTableStmt(ctx, obj, parent, field_name, depth);+ break;+case T_AlterTableCmd:+ _fingerprintAlterTableCmd(ctx, obj, parent, field_name, depth);+ break;+case T_AlterDomainStmt:+ _fingerprintAlterDomainStmt(ctx, obj, parent, field_name, depth);+ break;+case T_SetOperationStmt:+ _fingerprintSetOperationStmt(ctx, obj, parent, field_name, depth);+ break;+case T_GrantStmt:+ _fingerprintGrantStmt(ctx, obj, parent, field_name, depth);+ break;+case T_GrantRoleStmt:+ _fingerprintGrantRoleStmt(ctx, obj, parent, field_name, depth);+ break;+case T_AlterDefaultPrivilegesStmt:+ _fingerprintAlterDefaultPrivilegesStmt(ctx, obj, parent, field_name, depth);+ break;+case T_ClosePortalStmt:+ _fingerprintClosePortalStmt(ctx, obj, parent, field_name, depth);+ break;+case T_ClusterStmt:+ _fingerprintClusterStmt(ctx, obj, parent, field_name, depth);+ break;+case T_CopyStmt:+ _fingerprintCopyStmt(ctx, obj, parent, field_name, depth);+ break;+case T_CreateStmt:+ _fingerprintCreateStmt(ctx, obj, parent, field_name, depth);+ break;+case T_DefineStmt:+ _fingerprintDefineStmt(ctx, obj, parent, field_name, depth);+ break;+case T_DropStmt:+ _fingerprintDropStmt(ctx, obj, parent, field_name, depth);+ break;+case T_TruncateStmt:+ _fingerprintTruncateStmt(ctx, obj, parent, field_name, depth);+ break;+case T_CommentStmt:+ _fingerprintCommentStmt(ctx, obj, parent, field_name, depth);+ break;+case T_FetchStmt:+ _fingerprintFetchStmt(ctx, obj, parent, field_name, depth);+ break;+case T_IndexStmt:+ _fingerprintIndexStmt(ctx, obj, parent, field_name, depth);+ break;+case T_CreateFunctionStmt:+ _fingerprintCreateFunctionStmt(ctx, obj, parent, field_name, depth);+ break;+case T_AlterFunctionStmt:+ _fingerprintAlterFunctionStmt(ctx, obj, parent, field_name, depth);+ break;+case T_DoStmt:+ _fingerprintDoStmt(ctx, obj, parent, field_name, depth);+ break;+case T_RenameStmt:+ _fingerprintRenameStmt(ctx, obj, parent, field_name, depth);+ break;+case T_RuleStmt:+ _fingerprintRuleStmt(ctx, obj, parent, field_name, depth);+ break;+case T_NotifyStmt:+ _fingerprintNotifyStmt(ctx, obj, parent, field_name, depth);+ break;+case T_ListenStmt:+ _fingerprintListenStmt(ctx, obj, parent, field_name, depth);+ break;+case T_UnlistenStmt:+ _fingerprintUnlistenStmt(ctx, obj, parent, field_name, depth);+ break;+case T_TransactionStmt:+ _fingerprintTransactionStmt(ctx, obj, parent, field_name, depth);+ break;+case T_ViewStmt:+ _fingerprintViewStmt(ctx, obj, parent, field_name, depth);+ break;+case T_LoadStmt:+ _fingerprintLoadStmt(ctx, obj, parent, field_name, depth);+ break;+case T_CreateDomainStmt:+ _fingerprintCreateDomainStmt(ctx, obj, parent, field_name, depth);+ break;+case T_CreatedbStmt:+ _fingerprintCreatedbStmt(ctx, obj, parent, field_name, depth);+ break;+case T_DropdbStmt:+ _fingerprintDropdbStmt(ctx, obj, parent, field_name, depth);+ break;+case T_VacuumStmt:+ _fingerprintVacuumStmt(ctx, obj, parent, field_name, depth);+ break;+case T_ExplainStmt:+ _fingerprintExplainStmt(ctx, obj, parent, field_name, depth);+ break;+case T_CreateTableAsStmt:+ _fingerprintCreateTableAsStmt(ctx, obj, parent, field_name, depth);+ break;+case T_CreateSeqStmt:+ _fingerprintCreateSeqStmt(ctx, obj, parent, field_name, depth);+ break;+case T_AlterSeqStmt:+ _fingerprintAlterSeqStmt(ctx, obj, parent, field_name, depth);+ break;+case T_VariableSetStmt:+ _fingerprintVariableSetStmt(ctx, obj, parent, field_name, depth);+ break;+case T_VariableShowStmt:+ _fingerprintVariableShowStmt(ctx, obj, parent, field_name, depth);+ break;+case T_DiscardStmt:+ _fingerprintDiscardStmt(ctx, obj, parent, field_name, depth);+ break;+case T_CreateTrigStmt:+ _fingerprintCreateTrigStmt(ctx, obj, parent, field_name, depth);+ break;+case T_CreatePLangStmt:+ _fingerprintCreatePLangStmt(ctx, obj, parent, field_name, depth);+ break;+case T_CreateRoleStmt:+ _fingerprintCreateRoleStmt(ctx, obj, parent, field_name, depth);+ break;+case T_AlterRoleStmt:+ _fingerprintAlterRoleStmt(ctx, obj, parent, field_name, depth);+ break;+case T_DropRoleStmt:+ _fingerprintDropRoleStmt(ctx, obj, parent, field_name, depth);+ break;+case T_LockStmt:+ _fingerprintLockStmt(ctx, obj, parent, field_name, depth);+ break;+case T_ConstraintsSetStmt:+ _fingerprintConstraintsSetStmt(ctx, obj, parent, field_name, depth);+ break;+case T_ReindexStmt:+ _fingerprintReindexStmt(ctx, obj, parent, field_name, depth);+ break;+case T_CheckPointStmt:+ _fingerprintCheckPointStmt(ctx, obj, parent, field_name, depth);+ break;+case T_CreateSchemaStmt:+ _fingerprintCreateSchemaStmt(ctx, obj, parent, field_name, depth);+ break;+case T_AlterDatabaseStmt:+ _fingerprintAlterDatabaseStmt(ctx, obj, parent, field_name, depth);+ break;+case T_AlterDatabaseSetStmt:+ _fingerprintAlterDatabaseSetStmt(ctx, obj, parent, field_name, depth);+ break;+case T_AlterRoleSetStmt:+ _fingerprintAlterRoleSetStmt(ctx, obj, parent, field_name, depth);+ break;+case T_CreateConversionStmt:+ _fingerprintCreateConversionStmt(ctx, obj, parent, field_name, depth);+ break;+case T_CreateCastStmt:+ _fingerprintCreateCastStmt(ctx, obj, parent, field_name, depth);+ break;+case T_CreateOpClassStmt:+ _fingerprintCreateOpClassStmt(ctx, obj, parent, field_name, depth);+ break;+case T_CreateOpFamilyStmt:+ _fingerprintCreateOpFamilyStmt(ctx, obj, parent, field_name, depth);+ break;+case T_AlterOpFamilyStmt:+ _fingerprintAlterOpFamilyStmt(ctx, obj, parent, field_name, depth);+ break;+case T_PrepareStmt:+ _fingerprintPrepareStmt(ctx, obj, parent, field_name, depth);+ break;+case T_ExecuteStmt:+ _fingerprintExecuteStmt(ctx, obj, parent, field_name, depth);+ break;+case T_DeallocateStmt:+ _fingerprintDeallocateStmt(ctx, obj, parent, field_name, depth);+ break;+case T_DeclareCursorStmt:+ _fingerprintDeclareCursorStmt(ctx, obj, parent, field_name, depth);+ break;+case T_CreateTableSpaceStmt:+ _fingerprintCreateTableSpaceStmt(ctx, obj, parent, field_name, depth);+ break;+case T_DropTableSpaceStmt:+ _fingerprintDropTableSpaceStmt(ctx, obj, parent, field_name, depth);+ break;+case T_AlterObjectSchemaStmt:+ _fingerprintAlterObjectSchemaStmt(ctx, obj, parent, field_name, depth);+ break;+case T_AlterOwnerStmt:+ _fingerprintAlterOwnerStmt(ctx, obj, parent, field_name, depth);+ break;+case T_DropOwnedStmt:+ _fingerprintDropOwnedStmt(ctx, obj, parent, field_name, depth);+ break;+case T_ReassignOwnedStmt:+ _fingerprintReassignOwnedStmt(ctx, obj, parent, field_name, depth);+ break;+case T_CompositeTypeStmt:+ _fingerprintCompositeTypeStmt(ctx, obj, parent, field_name, depth);+ break;+case T_CreateEnumStmt:+ _fingerprintCreateEnumStmt(ctx, obj, parent, field_name, depth);+ break;+case T_CreateRangeStmt:+ _fingerprintCreateRangeStmt(ctx, obj, parent, field_name, depth);+ break;+case T_AlterEnumStmt:+ _fingerprintAlterEnumStmt(ctx, obj, parent, field_name, depth);+ break;+case T_AlterTSDictionaryStmt:+ _fingerprintAlterTSDictionaryStmt(ctx, obj, parent, field_name, depth);+ break;+case T_AlterTSConfigurationStmt:+ _fingerprintAlterTSConfigurationStmt(ctx, obj, parent, field_name, depth);+ break;+case T_CreateFdwStmt:+ _fingerprintCreateFdwStmt(ctx, obj, parent, field_name, depth);+ break;+case T_AlterFdwStmt:+ _fingerprintAlterFdwStmt(ctx, obj, parent, field_name, depth);+ break;+case T_CreateForeignServerStmt:+ _fingerprintCreateForeignServerStmt(ctx, obj, parent, field_name, depth);+ break;+case T_AlterForeignServerStmt:+ _fingerprintAlterForeignServerStmt(ctx, obj, parent, field_name, depth);+ break;+case T_CreateUserMappingStmt:+ _fingerprintCreateUserMappingStmt(ctx, obj, parent, field_name, depth);+ break;+case T_AlterUserMappingStmt:+ _fingerprintAlterUserMappingStmt(ctx, obj, parent, field_name, depth);+ break;+case T_DropUserMappingStmt:+ _fingerprintDropUserMappingStmt(ctx, obj, parent, field_name, depth);+ break;+case T_AlterTableSpaceOptionsStmt:+ _fingerprintAlterTableSpaceOptionsStmt(ctx, obj, parent, field_name, depth);+ break;+case T_AlterTableMoveAllStmt:+ _fingerprintAlterTableMoveAllStmt(ctx, obj, parent, field_name, depth);+ break;+case T_SecLabelStmt:+ _fingerprintSecLabelStmt(ctx, obj, parent, field_name, depth);+ break;+case T_CreateForeignTableStmt:+ _fingerprintCreateForeignTableStmt(ctx, obj, parent, field_name, depth);+ break;+case T_ImportForeignSchemaStmt:+ _fingerprintImportForeignSchemaStmt(ctx, obj, parent, field_name, depth);+ break;+case T_CreateExtensionStmt:+ _fingerprintCreateExtensionStmt(ctx, obj, parent, field_name, depth);+ break;+case T_AlterExtensionStmt:+ _fingerprintAlterExtensionStmt(ctx, obj, parent, field_name, depth);+ break;+case T_AlterExtensionContentsStmt:+ _fingerprintAlterExtensionContentsStmt(ctx, obj, parent, field_name, depth);+ break;+case T_CreateEventTrigStmt:+ _fingerprintCreateEventTrigStmt(ctx, obj, parent, field_name, depth);+ break;+case T_AlterEventTrigStmt:+ _fingerprintAlterEventTrigStmt(ctx, obj, parent, field_name, depth);+ break;+case T_RefreshMatViewStmt:+ _fingerprintRefreshMatViewStmt(ctx, obj, parent, field_name, depth);+ break;+case T_ReplicaIdentityStmt:+ _fingerprintReplicaIdentityStmt(ctx, obj, parent, field_name, depth);+ break;+case T_AlterSystemStmt:+ _fingerprintAlterSystemStmt(ctx, obj, parent, field_name, depth);+ break;+case T_CreatePolicyStmt:+ _fingerprintCreatePolicyStmt(ctx, obj, parent, field_name, depth);+ break;+case T_AlterPolicyStmt:+ _fingerprintAlterPolicyStmt(ctx, obj, parent, field_name, depth);+ break;+case T_CreateTransformStmt:+ _fingerprintCreateTransformStmt(ctx, obj, parent, field_name, depth);+ break;+case T_A_Expr:+ _fingerprintA_Expr(ctx, obj, parent, field_name, depth);+ break;+case T_ColumnRef:+ _fingerprintColumnRef(ctx, obj, parent, field_name, depth);+ break;+case T_ParamRef:+ _fingerprintParamRef(ctx, obj, parent, field_name, depth);+ break;+case T_A_Const:+ _fingerprintA_Const(ctx, obj, parent, field_name, depth);+ break;+case T_FuncCall:+ _fingerprintFuncCall(ctx, obj, parent, field_name, depth);+ break;+case T_A_Star:+ _fingerprintA_Star(ctx, obj, parent, field_name, depth);+ break;+case T_A_Indices:+ _fingerprintA_Indices(ctx, obj, parent, field_name, depth);+ break;+case T_A_Indirection:+ _fingerprintA_Indirection(ctx, obj, parent, field_name, depth);+ break;+case T_A_ArrayExpr:+ _fingerprintA_ArrayExpr(ctx, obj, parent, field_name, depth);+ break;+case T_ResTarget:+ _fingerprintResTarget(ctx, obj, parent, field_name, depth);+ break;+case T_MultiAssignRef:+ _fingerprintMultiAssignRef(ctx, obj, parent, field_name, depth);+ break;+case T_TypeCast:+ _fingerprintTypeCast(ctx, obj, parent, field_name, depth);+ break;+case T_CollateClause:+ _fingerprintCollateClause(ctx, obj, parent, field_name, depth);+ break;+case T_SortBy:+ _fingerprintSortBy(ctx, obj, parent, field_name, depth);+ break;+case T_WindowDef:+ _fingerprintWindowDef(ctx, obj, parent, field_name, depth);+ break;+case T_RangeSubselect:+ _fingerprintRangeSubselect(ctx, obj, parent, field_name, depth);+ break;+case T_RangeFunction:+ _fingerprintRangeFunction(ctx, obj, parent, field_name, depth);+ break;+case T_RangeTableSample:+ _fingerprintRangeTableSample(ctx, obj, parent, field_name, depth);+ break;+case T_TypeName:+ _fingerprintTypeName(ctx, obj, parent, field_name, depth);+ break;+case T_ColumnDef:+ _fingerprintColumnDef(ctx, obj, parent, field_name, depth);+ break;+case T_IndexElem:+ _fingerprintIndexElem(ctx, obj, parent, field_name, depth);+ break;+case T_Constraint:+ _fingerprintConstraint(ctx, obj, parent, field_name, depth);+ break;+case T_DefElem:+ _fingerprintDefElem(ctx, obj, parent, field_name, depth);+ break;+case T_RangeTblEntry:+ _fingerprintRangeTblEntry(ctx, obj, parent, field_name, depth);+ break;+case T_RangeTblFunction:+ _fingerprintRangeTblFunction(ctx, obj, parent, field_name, depth);+ break;+case T_TableSampleClause:+ _fingerprintTableSampleClause(ctx, obj, parent, field_name, depth);+ break;+case T_WithCheckOption:+ _fingerprintWithCheckOption(ctx, obj, parent, field_name, depth);+ break;+case T_SortGroupClause:+ _fingerprintSortGroupClause(ctx, obj, parent, field_name, depth);+ break;+case T_GroupingSet:+ _fingerprintGroupingSet(ctx, obj, parent, field_name, depth);+ break;+case T_WindowClause:+ _fingerprintWindowClause(ctx, obj, parent, field_name, depth);+ break;+case T_FuncWithArgs:+ _fingerprintFuncWithArgs(ctx, obj, parent, field_name, depth);+ break;+case T_AccessPriv:+ _fingerprintAccessPriv(ctx, obj, parent, field_name, depth);+ break;+case T_CreateOpClassItem:+ _fingerprintCreateOpClassItem(ctx, obj, parent, field_name, depth);+ break;+case T_TableLikeClause:+ _fingerprintTableLikeClause(ctx, obj, parent, field_name, depth);+ break;+case T_FunctionParameter:+ _fingerprintFunctionParameter(ctx, obj, parent, field_name, depth);+ break;+case T_LockingClause:+ _fingerprintLockingClause(ctx, obj, parent, field_name, depth);+ break;+case T_RowMarkClause:+ _fingerprintRowMarkClause(ctx, obj, parent, field_name, depth);+ break;+case T_XmlSerialize:+ _fingerprintXmlSerialize(ctx, obj, parent, field_name, depth);+ break;+case T_WithClause:+ _fingerprintWithClause(ctx, obj, parent, field_name, depth);+ break;+case T_InferClause:+ _fingerprintInferClause(ctx, obj, parent, field_name, depth);+ break;+case T_OnConflictClause:+ _fingerprintOnConflictClause(ctx, obj, parent, field_name, depth);+ break;+case T_CommonTableExpr:+ _fingerprintCommonTableExpr(ctx, obj, parent, field_name, depth);+ break;+case T_RoleSpec:+ _fingerprintRoleSpec(ctx, obj, parent, field_name, depth);+ break;+case T_InlineCodeBlock:+ _fingerprintInlineCodeBlock(ctx, obj, parent, field_name, depth);+ break;
+ foreign/libpg_query/src/pg_query_fingerprint_defs.c view
@@ -0,0 +1,6614 @@+static void+_fingerprintAlias(FingerprintContext *ctx, const Alias *node, const void *parent, const char *field_name, unsigned int depth)+{+ // Intentionally ignoring all fields for fingerprinting+}++static void+_fingerprintRangeVar(FingerprintContext *ctx, const RangeVar *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "RangeVar");+ if (node->alias != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->alias, node, "alias", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "alias");+ }++ if (node->catalogname != NULL) {+ _fingerprintString(ctx, "catalogname");+ _fingerprintString(ctx, node->catalogname);+ }++ if (node->inhOpt != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->inhOpt);+ _fingerprintString(ctx, "inhOpt");+ _fingerprintString(ctx, buffer);+ }++ // Intentionally ignoring node->location for fingerprinting++ if (node->relname != NULL) {+ _fingerprintString(ctx, "relname");+ _fingerprintString(ctx, node->relname);+ }++ if (node->relpersistence != 0) {+ char str[2] = {node->relpersistence, '\0'};+ _fingerprintString(ctx, "relpersistence");+ _fingerprintString(ctx, str);+ }+++ if (node->schemaname != NULL) {+ _fingerprintString(ctx, "schemaname");+ _fingerprintString(ctx, node->schemaname);+ }++}++static void+_fingerprintExpr(FingerprintContext *ctx, const Expr *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "Expr");+}++static void+_fingerprintVar(FingerprintContext *ctx, const Var *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "Var");+ // Intentionally ignoring node->location for fingerprinting+ if (node->varattno != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->varattno);+ _fingerprintString(ctx, "varattno");+ _fingerprintString(ctx, buffer);+ }++ if (node->varcollid != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->varcollid);+ _fingerprintString(ctx, "varcollid");+ _fingerprintString(ctx, buffer);+ }++ if (node->varlevelsup != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->varlevelsup);+ _fingerprintString(ctx, "varlevelsup");+ _fingerprintString(ctx, buffer);+ }++ if (node->varno != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->varno);+ _fingerprintString(ctx, "varno");+ _fingerprintString(ctx, buffer);+ }++ if (node->varnoold != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->varnoold);+ _fingerprintString(ctx, "varnoold");+ _fingerprintString(ctx, buffer);+ }++ if (node->varoattno != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->varoattno);+ _fingerprintString(ctx, "varoattno");+ _fingerprintString(ctx, buffer);+ }++ if (node->vartype != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->vartype);+ _fingerprintString(ctx, "vartype");+ _fingerprintString(ctx, buffer);+ }++ if (node->vartypmod != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->vartypmod);+ _fingerprintString(ctx, "vartypmod");+ _fingerprintString(ctx, buffer);+ }++}++static void+_fingerprintConst(FingerprintContext *ctx, const Const *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "Const");++ if (node->constbyval) { _fingerprintString(ctx, "constbyval");+ _fingerprintString(ctx, "true");+ }++ if (node->constcollid != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->constcollid);+ _fingerprintString(ctx, "constcollid");+ _fingerprintString(ctx, buffer);+ }+++ if (node->constisnull) { _fingerprintString(ctx, "constisnull");+ _fingerprintString(ctx, "true");+ }++ if (node->constlen != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->constlen);+ _fingerprintString(ctx, "constlen");+ _fingerprintString(ctx, buffer);+ }++ if (node->consttype != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->consttype);+ _fingerprintString(ctx, "consttype");+ _fingerprintString(ctx, buffer);+ }++ if (node->consttypmod != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->consttypmod);+ _fingerprintString(ctx, "consttypmod");+ _fingerprintString(ctx, buffer);+ }++ // Intentionally ignoring node->location for fingerprinting+}++static void+_fingerprintParam(FingerprintContext *ctx, const Param *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "Param");+ // Intentionally ignoring node->location for fingerprinting+ if (node->paramcollid != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->paramcollid);+ _fingerprintString(ctx, "paramcollid");+ _fingerprintString(ctx, buffer);+ }++ if (node->paramid != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->paramid);+ _fingerprintString(ctx, "paramid");+ _fingerprintString(ctx, buffer);+ }++ if (node->paramkind != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->paramkind);+ _fingerprintString(ctx, "paramkind");+ _fingerprintString(ctx, buffer);+ }++ if (node->paramtype != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->paramtype);+ _fingerprintString(ctx, "paramtype");+ _fingerprintString(ctx, buffer);+ }++ if (node->paramtypmod != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->paramtypmod);+ _fingerprintString(ctx, "paramtypmod");+ _fingerprintString(ctx, buffer);+ }++}++static void+_fingerprintAggref(FingerprintContext *ctx, const Aggref *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "Aggref");+ if (node->aggcollid != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->aggcollid);+ _fingerprintString(ctx, "aggcollid");+ _fingerprintString(ctx, buffer);+ }++ if (node->aggdirectargs != NULL && node->aggdirectargs->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->aggdirectargs, node, "aggdirectargs", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "aggdirectargs");+ }+ if (node->aggdistinct != NULL && node->aggdistinct->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->aggdistinct, node, "aggdistinct", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "aggdistinct");+ }+ if (node->aggfilter != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->aggfilter, node, "aggfilter", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "aggfilter");+ }+ if (node->aggfnoid != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->aggfnoid);+ _fingerprintString(ctx, "aggfnoid");+ _fingerprintString(ctx, buffer);+ }++ if (node->aggkind != 0) {+ char str[2] = {node->aggkind, '\0'};+ _fingerprintString(ctx, "aggkind");+ _fingerprintString(ctx, str);+ }++ if (node->agglevelsup != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->agglevelsup);+ _fingerprintString(ctx, "agglevelsup");+ _fingerprintString(ctx, buffer);+ }++ if (node->aggorder != NULL && node->aggorder->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->aggorder, node, "aggorder", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "aggorder");+ }++ if (node->aggstar) { _fingerprintString(ctx, "aggstar");+ _fingerprintString(ctx, "true");+ }++ if (node->aggtype != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->aggtype);+ _fingerprintString(ctx, "aggtype");+ _fingerprintString(ctx, buffer);+ }+++ if (node->aggvariadic) { _fingerprintString(ctx, "aggvariadic");+ _fingerprintString(ctx, "true");+ }++ if (node->args != NULL && node->args->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->args, node, "args", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "args");+ }+ if (node->inputcollid != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->inputcollid);+ _fingerprintString(ctx, "inputcollid");+ _fingerprintString(ctx, buffer);+ }++ // Intentionally ignoring node->location for fingerprinting+}++static void+_fingerprintGroupingFunc(FingerprintContext *ctx, const GroupingFunc *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "GroupingFunc");+ if (node->agglevelsup != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->agglevelsup);+ _fingerprintString(ctx, "agglevelsup");+ _fingerprintString(ctx, buffer);+ }++ if (node->args != NULL && node->args->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->args, node, "args", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "args");+ }+ if (node->cols != NULL && node->cols->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->cols, node, "cols", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "cols");+ }+ // Intentionally ignoring node->location for fingerprinting+ if (node->refs != NULL && node->refs->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->refs, node, "refs", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "refs");+ }+}++static void+_fingerprintWindowFunc(FingerprintContext *ctx, const WindowFunc *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "WindowFunc");+ if (node->aggfilter != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->aggfilter, node, "aggfilter", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "aggfilter");+ }+ if (node->args != NULL && node->args->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->args, node, "args", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "args");+ }+ if (node->inputcollid != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->inputcollid);+ _fingerprintString(ctx, "inputcollid");+ _fingerprintString(ctx, buffer);+ }++ // Intentionally ignoring node->location for fingerprinting++ if (node->winagg) { _fingerprintString(ctx, "winagg");+ _fingerprintString(ctx, "true");+ }++ if (node->wincollid != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->wincollid);+ _fingerprintString(ctx, "wincollid");+ _fingerprintString(ctx, buffer);+ }++ if (node->winfnoid != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->winfnoid);+ _fingerprintString(ctx, "winfnoid");+ _fingerprintString(ctx, buffer);+ }++ if (node->winref != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->winref);+ _fingerprintString(ctx, "winref");+ _fingerprintString(ctx, buffer);+ }+++ if (node->winstar) { _fingerprintString(ctx, "winstar");+ _fingerprintString(ctx, "true");+ }++ if (node->wintype != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->wintype);+ _fingerprintString(ctx, "wintype");+ _fingerprintString(ctx, buffer);+ }++}++static void+_fingerprintArrayRef(FingerprintContext *ctx, const ArrayRef *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "ArrayRef");+ if (node->refarraytype != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->refarraytype);+ _fingerprintString(ctx, "refarraytype");+ _fingerprintString(ctx, buffer);+ }++ if (node->refassgnexpr != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->refassgnexpr, node, "refassgnexpr", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "refassgnexpr");+ }+ if (node->refcollid != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->refcollid);+ _fingerprintString(ctx, "refcollid");+ _fingerprintString(ctx, buffer);+ }++ if (node->refelemtype != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->refelemtype);+ _fingerprintString(ctx, "refelemtype");+ _fingerprintString(ctx, buffer);+ }++ if (node->refexpr != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->refexpr, node, "refexpr", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "refexpr");+ }+ if (node->reflowerindexpr != NULL && node->reflowerindexpr->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->reflowerindexpr, node, "reflowerindexpr", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "reflowerindexpr");+ }+ if (node->reftypmod != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->reftypmod);+ _fingerprintString(ctx, "reftypmod");+ _fingerprintString(ctx, buffer);+ }++ if (node->refupperindexpr != NULL && node->refupperindexpr->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->refupperindexpr, node, "refupperindexpr", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "refupperindexpr");+ }+}++static void+_fingerprintFuncExpr(FingerprintContext *ctx, const FuncExpr *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "FuncExpr");+ if (node->args != NULL && node->args->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->args, node, "args", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "args");+ }+ if (node->funccollid != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->funccollid);+ _fingerprintString(ctx, "funccollid");+ _fingerprintString(ctx, buffer);+ }++ if (node->funcformat != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->funcformat);+ _fingerprintString(ctx, "funcformat");+ _fingerprintString(ctx, buffer);+ }++ if (node->funcid != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->funcid);+ _fingerprintString(ctx, "funcid");+ _fingerprintString(ctx, buffer);+ }++ if (node->funcresulttype != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->funcresulttype);+ _fingerprintString(ctx, "funcresulttype");+ _fingerprintString(ctx, buffer);+ }+++ if (node->funcretset) { _fingerprintString(ctx, "funcretset");+ _fingerprintString(ctx, "true");+ }+++ if (node->funcvariadic) { _fingerprintString(ctx, "funcvariadic");+ _fingerprintString(ctx, "true");+ }++ if (node->inputcollid != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->inputcollid);+ _fingerprintString(ctx, "inputcollid");+ _fingerprintString(ctx, buffer);+ }++ // Intentionally ignoring node->location for fingerprinting+}++static void+_fingerprintNamedArgExpr(FingerprintContext *ctx, const NamedArgExpr *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "NamedArgExpr");+ if (node->arg != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->arg, node, "arg", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "arg");+ }+ if (node->argnumber != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->argnumber);+ _fingerprintString(ctx, "argnumber");+ _fingerprintString(ctx, buffer);+ }++ // Intentionally ignoring node->location for fingerprinting++ if (node->name != NULL) {+ _fingerprintString(ctx, "name");+ _fingerprintString(ctx, node->name);+ }++}++static void+_fingerprintOpExpr(FingerprintContext *ctx, const OpExpr *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "OpExpr");+ if (node->args != NULL && node->args->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->args, node, "args", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "args");+ }+ if (node->inputcollid != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->inputcollid);+ _fingerprintString(ctx, "inputcollid");+ _fingerprintString(ctx, buffer);+ }++ // Intentionally ignoring node->location for fingerprinting+ if (node->opcollid != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->opcollid);+ _fingerprintString(ctx, "opcollid");+ _fingerprintString(ctx, buffer);+ }++ if (node->opfuncid != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->opfuncid);+ _fingerprintString(ctx, "opfuncid");+ _fingerprintString(ctx, buffer);+ }++ if (node->opno != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->opno);+ _fingerprintString(ctx, "opno");+ _fingerprintString(ctx, buffer);+ }++ if (node->opresulttype != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->opresulttype);+ _fingerprintString(ctx, "opresulttype");+ _fingerprintString(ctx, buffer);+ }+++ if (node->opretset) { _fingerprintString(ctx, "opretset");+ _fingerprintString(ctx, "true");+ }++}++static void+_fingerprintScalarArrayOpExpr(FingerprintContext *ctx, const ScalarArrayOpExpr *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "ScalarArrayOpExpr");+ if (node->args != NULL && node->args->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->args, node, "args", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "args");+ }+ if (node->inputcollid != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->inputcollid);+ _fingerprintString(ctx, "inputcollid");+ _fingerprintString(ctx, buffer);+ }++ // Intentionally ignoring node->location for fingerprinting+ if (node->opfuncid != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->opfuncid);+ _fingerprintString(ctx, "opfuncid");+ _fingerprintString(ctx, buffer);+ }++ if (node->opno != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->opno);+ _fingerprintString(ctx, "opno");+ _fingerprintString(ctx, buffer);+ }+++ if (node->useOr) { _fingerprintString(ctx, "useOr");+ _fingerprintString(ctx, "true");+ }++}++static void+_fingerprintBoolExpr(FingerprintContext *ctx, const BoolExpr *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "BoolExpr");+ if (node->args != NULL && node->args->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->args, node, "args", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "args");+ }+ if (node->boolop != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->boolop);+ _fingerprintString(ctx, "boolop");+ _fingerprintString(ctx, buffer);+ }++ // Intentionally ignoring node->location for fingerprinting+}++static void+_fingerprintSubLink(FingerprintContext *ctx, const SubLink *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "SubLink");+ // Intentionally ignoring node->location for fingerprinting+ if (node->operName != NULL && node->operName->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->operName, node, "operName", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "operName");+ }+ if (node->subLinkId != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->subLinkId);+ _fingerprintString(ctx, "subLinkId");+ _fingerprintString(ctx, buffer);+ }++ if (node->subLinkType != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->subLinkType);+ _fingerprintString(ctx, "subLinkType");+ _fingerprintString(ctx, buffer);+ }++ if (node->subselect != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->subselect, node, "subselect", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "subselect");+ }+ if (node->testexpr != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->testexpr, node, "testexpr", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "testexpr");+ }+}++static void+_fingerprintSubPlan(FingerprintContext *ctx, const SubPlan *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "SubPlan");+ if (node->args != NULL && node->args->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->args, node, "args", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "args");+ }+ if (node->firstColCollation != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->firstColCollation);+ _fingerprintString(ctx, "firstColCollation");+ _fingerprintString(ctx, buffer);+ }++ if (node->firstColType != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->firstColType);+ _fingerprintString(ctx, "firstColType");+ _fingerprintString(ctx, buffer);+ }++ if (node->firstColTypmod != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->firstColTypmod);+ _fingerprintString(ctx, "firstColTypmod");+ _fingerprintString(ctx, buffer);+ }++ if (node->parParam != NULL && node->parParam->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->parParam, node, "parParam", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "parParam");+ }+ if (node->paramIds != NULL && node->paramIds->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->paramIds, node, "paramIds", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "paramIds");+ }+if (node->per_call_cost != 0) {+ char buffer[50];+ sprintf(buffer, "%f", node->per_call_cost);+ _fingerprintString(ctx, "per_call_cost");+ _fingerprintString(ctx, buffer);+}++ if (node->plan_id != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->plan_id);+ _fingerprintString(ctx, "plan_id");+ _fingerprintString(ctx, buffer);+ }+++ if (node->plan_name != NULL) {+ _fingerprintString(ctx, "plan_name");+ _fingerprintString(ctx, node->plan_name);+ }++ if (node->setParam != NULL && node->setParam->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->setParam, node, "setParam", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "setParam");+ }+if (node->startup_cost != 0) {+ char buffer[50];+ sprintf(buffer, "%f", node->startup_cost);+ _fingerprintString(ctx, "startup_cost");+ _fingerprintString(ctx, buffer);+}++ if (node->subLinkType != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->subLinkType);+ _fingerprintString(ctx, "subLinkType");+ _fingerprintString(ctx, buffer);+ }++ if (node->testexpr != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->testexpr, node, "testexpr", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "testexpr");+ }++ if (node->unknownEqFalse) { _fingerprintString(ctx, "unknownEqFalse");+ _fingerprintString(ctx, "true");+ }+++ if (node->useHashTable) { _fingerprintString(ctx, "useHashTable");+ _fingerprintString(ctx, "true");+ }++}++static void+_fingerprintAlternativeSubPlan(FingerprintContext *ctx, const AlternativeSubPlan *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "AlternativeSubPlan");+ if (node->subplans != NULL && node->subplans->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->subplans, node, "subplans", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "subplans");+ }+}++static void+_fingerprintFieldSelect(FingerprintContext *ctx, const FieldSelect *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "FieldSelect");+ if (node->arg != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->arg, node, "arg", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "arg");+ }+ if (node->fieldnum != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->fieldnum);+ _fingerprintString(ctx, "fieldnum");+ _fingerprintString(ctx, buffer);+ }++ if (node->resultcollid != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->resultcollid);+ _fingerprintString(ctx, "resultcollid");+ _fingerprintString(ctx, buffer);+ }++ if (node->resulttype != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->resulttype);+ _fingerprintString(ctx, "resulttype");+ _fingerprintString(ctx, buffer);+ }++ if (node->resulttypmod != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->resulttypmod);+ _fingerprintString(ctx, "resulttypmod");+ _fingerprintString(ctx, buffer);+ }++}++static void+_fingerprintFieldStore(FingerprintContext *ctx, const FieldStore *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "FieldStore");+ if (node->arg != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->arg, node, "arg", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "arg");+ }+ if (node->fieldnums != NULL && node->fieldnums->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->fieldnums, node, "fieldnums", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "fieldnums");+ }+ if (node->newvals != NULL && node->newvals->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->newvals, node, "newvals", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "newvals");+ }+ if (node->resulttype != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->resulttype);+ _fingerprintString(ctx, "resulttype");+ _fingerprintString(ctx, buffer);+ }++}++static void+_fingerprintRelabelType(FingerprintContext *ctx, const RelabelType *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "RelabelType");+ if (node->arg != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->arg, node, "arg", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "arg");+ }+ // Intentionally ignoring node->location for fingerprinting+ if (node->relabelformat != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->relabelformat);+ _fingerprintString(ctx, "relabelformat");+ _fingerprintString(ctx, buffer);+ }++ if (node->resultcollid != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->resultcollid);+ _fingerprintString(ctx, "resultcollid");+ _fingerprintString(ctx, buffer);+ }++ if (node->resulttype != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->resulttype);+ _fingerprintString(ctx, "resulttype");+ _fingerprintString(ctx, buffer);+ }++ if (node->resulttypmod != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->resulttypmod);+ _fingerprintString(ctx, "resulttypmod");+ _fingerprintString(ctx, buffer);+ }++}++static void+_fingerprintCoerceViaIO(FingerprintContext *ctx, const CoerceViaIO *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "CoerceViaIO");+ if (node->arg != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->arg, node, "arg", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "arg");+ }+ if (node->coerceformat != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->coerceformat);+ _fingerprintString(ctx, "coerceformat");+ _fingerprintString(ctx, buffer);+ }++ // Intentionally ignoring node->location for fingerprinting+ if (node->resultcollid != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->resultcollid);+ _fingerprintString(ctx, "resultcollid");+ _fingerprintString(ctx, buffer);+ }++ if (node->resulttype != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->resulttype);+ _fingerprintString(ctx, "resulttype");+ _fingerprintString(ctx, buffer);+ }++}++static void+_fingerprintArrayCoerceExpr(FingerprintContext *ctx, const ArrayCoerceExpr *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "ArrayCoerceExpr");+ if (node->arg != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->arg, node, "arg", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "arg");+ }+ if (node->coerceformat != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->coerceformat);+ _fingerprintString(ctx, "coerceformat");+ _fingerprintString(ctx, buffer);+ }++ if (node->elemfuncid != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->elemfuncid);+ _fingerprintString(ctx, "elemfuncid");+ _fingerprintString(ctx, buffer);+ }+++ if (node->isExplicit) { _fingerprintString(ctx, "isExplicit");+ _fingerprintString(ctx, "true");+ }++ // Intentionally ignoring node->location for fingerprinting+ if (node->resultcollid != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->resultcollid);+ _fingerprintString(ctx, "resultcollid");+ _fingerprintString(ctx, buffer);+ }++ if (node->resulttype != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->resulttype);+ _fingerprintString(ctx, "resulttype");+ _fingerprintString(ctx, buffer);+ }++ if (node->resulttypmod != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->resulttypmod);+ _fingerprintString(ctx, "resulttypmod");+ _fingerprintString(ctx, buffer);+ }++}++static void+_fingerprintConvertRowtypeExpr(FingerprintContext *ctx, const ConvertRowtypeExpr *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "ConvertRowtypeExpr");+ if (node->arg != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->arg, node, "arg", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "arg");+ }+ if (node->convertformat != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->convertformat);+ _fingerprintString(ctx, "convertformat");+ _fingerprintString(ctx, buffer);+ }++ // Intentionally ignoring node->location for fingerprinting+ if (node->resulttype != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->resulttype);+ _fingerprintString(ctx, "resulttype");+ _fingerprintString(ctx, buffer);+ }++}++static void+_fingerprintCollateExpr(FingerprintContext *ctx, const CollateExpr *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "CollateExpr");+ if (node->arg != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->arg, node, "arg", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "arg");+ }+ if (node->collOid != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->collOid);+ _fingerprintString(ctx, "collOid");+ _fingerprintString(ctx, buffer);+ }++ // Intentionally ignoring node->location for fingerprinting+}++static void+_fingerprintCaseExpr(FingerprintContext *ctx, const CaseExpr *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "CaseExpr");+ if (node->arg != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->arg, node, "arg", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "arg");+ }+ if (node->args != NULL && node->args->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->args, node, "args", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "args");+ }+ if (node->casecollid != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->casecollid);+ _fingerprintString(ctx, "casecollid");+ _fingerprintString(ctx, buffer);+ }++ if (node->casetype != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->casetype);+ _fingerprintString(ctx, "casetype");+ _fingerprintString(ctx, buffer);+ }++ if (node->defresult != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->defresult, node, "defresult", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "defresult");+ }+ // Intentionally ignoring node->location for fingerprinting+}++static void+_fingerprintCaseWhen(FingerprintContext *ctx, const CaseWhen *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "CaseWhen");+ if (node->expr != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->expr, node, "expr", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "expr");+ }+ // Intentionally ignoring node->location for fingerprinting+ if (node->result != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->result, node, "result", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "result");+ }+}++static void+_fingerprintCaseTestExpr(FingerprintContext *ctx, const CaseTestExpr *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "CaseTestExpr");+ if (node->collation != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->collation);+ _fingerprintString(ctx, "collation");+ _fingerprintString(ctx, buffer);+ }++ if (node->typeId != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->typeId);+ _fingerprintString(ctx, "typeId");+ _fingerprintString(ctx, buffer);+ }++ if (node->typeMod != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->typeMod);+ _fingerprintString(ctx, "typeMod");+ _fingerprintString(ctx, buffer);+ }++}++static void+_fingerprintArrayExpr(FingerprintContext *ctx, const ArrayExpr *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "ArrayExpr");+ if (node->array_collid != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->array_collid);+ _fingerprintString(ctx, "array_collid");+ _fingerprintString(ctx, buffer);+ }++ if (node->array_typeid != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->array_typeid);+ _fingerprintString(ctx, "array_typeid");+ _fingerprintString(ctx, buffer);+ }++ if (node->element_typeid != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->element_typeid);+ _fingerprintString(ctx, "element_typeid");+ _fingerprintString(ctx, buffer);+ }++ if (node->elements != NULL && node->elements->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->elements, node, "elements", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "elements");+ }+ // Intentionally ignoring node->location for fingerprinting++ if (node->multidims) { _fingerprintString(ctx, "multidims");+ _fingerprintString(ctx, "true");+ }++}++static void+_fingerprintRowExpr(FingerprintContext *ctx, const RowExpr *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "RowExpr");+ if (node->args != NULL && node->args->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->args, node, "args", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "args");+ }+ if (node->colnames != NULL && node->colnames->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->colnames, node, "colnames", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "colnames");+ }+ // Intentionally ignoring node->location for fingerprinting+ if (node->row_format != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->row_format);+ _fingerprintString(ctx, "row_format");+ _fingerprintString(ctx, buffer);+ }++ if (node->row_typeid != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->row_typeid);+ _fingerprintString(ctx, "row_typeid");+ _fingerprintString(ctx, buffer);+ }++}++static void+_fingerprintRowCompareExpr(FingerprintContext *ctx, const RowCompareExpr *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "RowCompareExpr");+ if (node->inputcollids != NULL && node->inputcollids->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->inputcollids, node, "inputcollids", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "inputcollids");+ }+ if (node->largs != NULL && node->largs->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->largs, node, "largs", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "largs");+ }+ if (node->opfamilies != NULL && node->opfamilies->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->opfamilies, node, "opfamilies", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "opfamilies");+ }+ if (node->opnos != NULL && node->opnos->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->opnos, node, "opnos", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "opnos");+ }+ if (node->rargs != NULL && node->rargs->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->rargs, node, "rargs", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "rargs");+ }+ if (node->rctype != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->rctype);+ _fingerprintString(ctx, "rctype");+ _fingerprintString(ctx, buffer);+ }++}++static void+_fingerprintCoalesceExpr(FingerprintContext *ctx, const CoalesceExpr *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "CoalesceExpr");+ if (node->args != NULL && node->args->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->args, node, "args", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "args");+ }+ if (node->coalescecollid != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->coalescecollid);+ _fingerprintString(ctx, "coalescecollid");+ _fingerprintString(ctx, buffer);+ }++ if (node->coalescetype != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->coalescetype);+ _fingerprintString(ctx, "coalescetype");+ _fingerprintString(ctx, buffer);+ }++ // Intentionally ignoring node->location for fingerprinting+}++static void+_fingerprintMinMaxExpr(FingerprintContext *ctx, const MinMaxExpr *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "MinMaxExpr");+ if (node->args != NULL && node->args->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->args, node, "args", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "args");+ }+ if (node->inputcollid != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->inputcollid);+ _fingerprintString(ctx, "inputcollid");+ _fingerprintString(ctx, buffer);+ }++ // Intentionally ignoring node->location for fingerprinting+ if (node->minmaxcollid != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->minmaxcollid);+ _fingerprintString(ctx, "minmaxcollid");+ _fingerprintString(ctx, buffer);+ }++ if (node->minmaxtype != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->minmaxtype);+ _fingerprintString(ctx, "minmaxtype");+ _fingerprintString(ctx, buffer);+ }++ if (node->op != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->op);+ _fingerprintString(ctx, "op");+ _fingerprintString(ctx, buffer);+ }++}++static void+_fingerprintXmlExpr(FingerprintContext *ctx, const XmlExpr *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "XmlExpr");+ if (node->arg_names != NULL && node->arg_names->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->arg_names, node, "arg_names", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "arg_names");+ }+ if (node->args != NULL && node->args->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->args, node, "args", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "args");+ }+ // Intentionally ignoring node->location for fingerprinting++ if (node->name != NULL) {+ _fingerprintString(ctx, "name");+ _fingerprintString(ctx, node->name);+ }++ if (node->named_args != NULL && node->named_args->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->named_args, node, "named_args", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "named_args");+ }+ if (node->op != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->op);+ _fingerprintString(ctx, "op");+ _fingerprintString(ctx, buffer);+ }++ if (node->type != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->type);+ _fingerprintString(ctx, "type");+ _fingerprintString(ctx, buffer);+ }++ if (node->typmod != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->typmod);+ _fingerprintString(ctx, "typmod");+ _fingerprintString(ctx, buffer);+ }++ if (node->xmloption != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->xmloption);+ _fingerprintString(ctx, "xmloption");+ _fingerprintString(ctx, buffer);+ }++}++static void+_fingerprintNullTest(FingerprintContext *ctx, const NullTest *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "NullTest");+ if (node->arg != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->arg, node, "arg", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "arg");+ }++ if (node->argisrow) { _fingerprintString(ctx, "argisrow");+ _fingerprintString(ctx, "true");+ }++ // Intentionally ignoring node->location for fingerprinting+ if (node->nulltesttype != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->nulltesttype);+ _fingerprintString(ctx, "nulltesttype");+ _fingerprintString(ctx, buffer);+ }++}++static void+_fingerprintBooleanTest(FingerprintContext *ctx, const BooleanTest *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "BooleanTest");+ if (node->arg != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->arg, node, "arg", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "arg");+ }+ if (node->booltesttype != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->booltesttype);+ _fingerprintString(ctx, "booltesttype");+ _fingerprintString(ctx, buffer);+ }++ // Intentionally ignoring node->location for fingerprinting+}++static void+_fingerprintCoerceToDomain(FingerprintContext *ctx, const CoerceToDomain *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "CoerceToDomain");+ if (node->arg != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->arg, node, "arg", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "arg");+ }+ if (node->coercionformat != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->coercionformat);+ _fingerprintString(ctx, "coercionformat");+ _fingerprintString(ctx, buffer);+ }++ // Intentionally ignoring node->location for fingerprinting+ if (node->resultcollid != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->resultcollid);+ _fingerprintString(ctx, "resultcollid");+ _fingerprintString(ctx, buffer);+ }++ if (node->resulttype != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->resulttype);+ _fingerprintString(ctx, "resulttype");+ _fingerprintString(ctx, buffer);+ }++ if (node->resulttypmod != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->resulttypmod);+ _fingerprintString(ctx, "resulttypmod");+ _fingerprintString(ctx, buffer);+ }++}++static void+_fingerprintCoerceToDomainValue(FingerprintContext *ctx, const CoerceToDomainValue *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "CoerceToDomainValue");+ if (node->collation != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->collation);+ _fingerprintString(ctx, "collation");+ _fingerprintString(ctx, buffer);+ }++ // Intentionally ignoring node->location for fingerprinting+ if (node->typeId != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->typeId);+ _fingerprintString(ctx, "typeId");+ _fingerprintString(ctx, buffer);+ }++ if (node->typeMod != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->typeMod);+ _fingerprintString(ctx, "typeMod");+ _fingerprintString(ctx, buffer);+ }++}++static void+_fingerprintSetToDefault(FingerprintContext *ctx, const SetToDefault *node, const void *parent, const char *field_name, unsigned int depth)+{+ // Intentionally ignoring all fields for fingerprinting+}++static void+_fingerprintCurrentOfExpr(FingerprintContext *ctx, const CurrentOfExpr *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "CurrentOfExpr");++ if (node->cursor_name != NULL) {+ _fingerprintString(ctx, "cursor_name");+ _fingerprintString(ctx, node->cursor_name);+ }++ if (node->cursor_param != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->cursor_param);+ _fingerprintString(ctx, "cursor_param");+ _fingerprintString(ctx, buffer);+ }++ if (node->cvarno != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->cvarno);+ _fingerprintString(ctx, "cvarno");+ _fingerprintString(ctx, buffer);+ }++}++static void+_fingerprintInferenceElem(FingerprintContext *ctx, const InferenceElem *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "InferenceElem");+ if (node->expr != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->expr, node, "expr", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "expr");+ }+ if (node->infercollid != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->infercollid);+ _fingerprintString(ctx, "infercollid");+ _fingerprintString(ctx, buffer);+ }++ if (node->inferopclass != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->inferopclass);+ _fingerprintString(ctx, "inferopclass");+ _fingerprintString(ctx, buffer);+ }++}++static void+_fingerprintTargetEntry(FingerprintContext *ctx, const TargetEntry *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "TargetEntry");+ if (node->expr != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->expr, node, "expr", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "expr");+ }++ if (node->resjunk) { _fingerprintString(ctx, "resjunk");+ _fingerprintString(ctx, "true");+ }+++ if (node->resname != NULL) {+ _fingerprintString(ctx, "resname");+ _fingerprintString(ctx, node->resname);+ }++ if (node->resno != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->resno);+ _fingerprintString(ctx, "resno");+ _fingerprintString(ctx, buffer);+ }++ if (node->resorigcol != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->resorigcol);+ _fingerprintString(ctx, "resorigcol");+ _fingerprintString(ctx, buffer);+ }++ if (node->resorigtbl != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->resorigtbl);+ _fingerprintString(ctx, "resorigtbl");+ _fingerprintString(ctx, buffer);+ }++ if (node->ressortgroupref != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->ressortgroupref);+ _fingerprintString(ctx, "ressortgroupref");+ _fingerprintString(ctx, buffer);+ }++}++static void+_fingerprintRangeTblRef(FingerprintContext *ctx, const RangeTblRef *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "RangeTblRef");+ if (node->rtindex != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->rtindex);+ _fingerprintString(ctx, "rtindex");+ _fingerprintString(ctx, buffer);+ }++}++static void+_fingerprintJoinExpr(FingerprintContext *ctx, const JoinExpr *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "JoinExpr");+ if (node->alias != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->alias, node, "alias", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "alias");+ }++ if (node->isNatural) { _fingerprintString(ctx, "isNatural");+ _fingerprintString(ctx, "true");+ }++ if (node->jointype != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->jointype);+ _fingerprintString(ctx, "jointype");+ _fingerprintString(ctx, buffer);+ }++ if (node->larg != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->larg, node, "larg", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "larg");+ }+ if (node->quals != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->quals, node, "quals", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "quals");+ }+ if (node->rarg != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->rarg, node, "rarg", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "rarg");+ }+ if (node->rtindex != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->rtindex);+ _fingerprintString(ctx, "rtindex");+ _fingerprintString(ctx, buffer);+ }++ if (node->usingClause != NULL && node->usingClause->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->usingClause, node, "usingClause", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "usingClause");+ }+}++static void+_fingerprintFromExpr(FingerprintContext *ctx, const FromExpr *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "FromExpr");+ if (node->fromlist != NULL && node->fromlist->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->fromlist, node, "fromlist", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "fromlist");+ }+ if (node->quals != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->quals, node, "quals", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "quals");+ }+}++static void+_fingerprintOnConflictExpr(FingerprintContext *ctx, const OnConflictExpr *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "OnConflictExpr");+ if (node->action != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->action);+ _fingerprintString(ctx, "action");+ _fingerprintString(ctx, buffer);+ }++ if (node->arbiterElems != NULL && node->arbiterElems->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->arbiterElems, node, "arbiterElems", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "arbiterElems");+ }+ if (node->arbiterWhere != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->arbiterWhere, node, "arbiterWhere", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "arbiterWhere");+ }+ if (node->constraint != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->constraint);+ _fingerprintString(ctx, "constraint");+ _fingerprintString(ctx, buffer);+ }++ if (node->exclRelIndex != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->exclRelIndex);+ _fingerprintString(ctx, "exclRelIndex");+ _fingerprintString(ctx, buffer);+ }++ if (node->exclRelTlist != NULL && node->exclRelTlist->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->exclRelTlist, node, "exclRelTlist", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "exclRelTlist");+ }+ if (node->onConflictSet != NULL && node->onConflictSet->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->onConflictSet, node, "onConflictSet", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "onConflictSet");+ }+ if (node->onConflictWhere != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->onConflictWhere, node, "onConflictWhere", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "onConflictWhere");+ }+}++static void+_fingerprintIntoClause(FingerprintContext *ctx, const IntoClause *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "IntoClause");+ if (node->colNames != NULL && node->colNames->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->colNames, node, "colNames", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "colNames");+ }+ if (node->onCommit != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->onCommit);+ _fingerprintString(ctx, "onCommit");+ _fingerprintString(ctx, buffer);+ }++ if (node->options != NULL && node->options->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->options, node, "options", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "options");+ }+ if (node->rel != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->rel, node, "rel", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "rel");+ }++ if (node->skipData) { _fingerprintString(ctx, "skipData");+ _fingerprintString(ctx, "true");+ }+++ if (node->tableSpaceName != NULL) {+ _fingerprintString(ctx, "tableSpaceName");+ _fingerprintString(ctx, node->tableSpaceName);+ }++ if (node->viewQuery != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->viewQuery, node, "viewQuery", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "viewQuery");+ }+}++static void+_fingerprintQuery(FingerprintContext *ctx, const Query *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "Query");++ if (node->canSetTag) { _fingerprintString(ctx, "canSetTag");+ _fingerprintString(ctx, "true");+ }++ if (node->commandType != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->commandType);+ _fingerprintString(ctx, "commandType");+ _fingerprintString(ctx, buffer);+ }++ if (node->constraintDeps != NULL && node->constraintDeps->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->constraintDeps, node, "constraintDeps", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "constraintDeps");+ }+ if (node->cteList != NULL && node->cteList->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->cteList, node, "cteList", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "cteList");+ }+ if (node->distinctClause != NULL && node->distinctClause->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->distinctClause, node, "distinctClause", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "distinctClause");+ }+ if (node->groupClause != NULL && node->groupClause->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->groupClause, node, "groupClause", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "groupClause");+ }+ if (node->groupingSets != NULL && node->groupingSets->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->groupingSets, node, "groupingSets", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "groupingSets");+ }++ if (node->hasAggs) { _fingerprintString(ctx, "hasAggs");+ _fingerprintString(ctx, "true");+ }+++ if (node->hasDistinctOn) { _fingerprintString(ctx, "hasDistinctOn");+ _fingerprintString(ctx, "true");+ }+++ if (node->hasForUpdate) { _fingerprintString(ctx, "hasForUpdate");+ _fingerprintString(ctx, "true");+ }+++ if (node->hasModifyingCTE) { _fingerprintString(ctx, "hasModifyingCTE");+ _fingerprintString(ctx, "true");+ }+++ if (node->hasRecursive) { _fingerprintString(ctx, "hasRecursive");+ _fingerprintString(ctx, "true");+ }+++ if (node->hasRowSecurity) { _fingerprintString(ctx, "hasRowSecurity");+ _fingerprintString(ctx, "true");+ }+++ if (node->hasSubLinks) { _fingerprintString(ctx, "hasSubLinks");+ _fingerprintString(ctx, "true");+ }+++ if (node->hasWindowFuncs) { _fingerprintString(ctx, "hasWindowFuncs");+ _fingerprintString(ctx, "true");+ }++ if (node->havingQual != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->havingQual, node, "havingQual", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "havingQual");+ }+ if (node->jointree != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->jointree, node, "jointree", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "jointree");+ }+ if (node->limitCount != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->limitCount, node, "limitCount", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "limitCount");+ }+ if (node->limitOffset != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->limitOffset, node, "limitOffset", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "limitOffset");+ }+ if (node->onConflict != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->onConflict, node, "onConflict", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "onConflict");+ }+ if (node->queryId != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->queryId);+ _fingerprintString(ctx, "queryId");+ _fingerprintString(ctx, buffer);+ }++ if (node->querySource != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->querySource);+ _fingerprintString(ctx, "querySource");+ _fingerprintString(ctx, buffer);+ }++ if (node->resultRelation != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->resultRelation);+ _fingerprintString(ctx, "resultRelation");+ _fingerprintString(ctx, buffer);+ }++ if (node->returningList != NULL && node->returningList->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->returningList, node, "returningList", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "returningList");+ }+ if (node->rowMarks != NULL && node->rowMarks->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->rowMarks, node, "rowMarks", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "rowMarks");+ }+ if (node->rtable != NULL && node->rtable->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->rtable, node, "rtable", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "rtable");+ }+ if (node->setOperations != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->setOperations, node, "setOperations", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "setOperations");+ }+ if (node->sortClause != NULL && node->sortClause->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->sortClause, node, "sortClause", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "sortClause");+ }+ if (node->targetList != NULL && node->targetList->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->targetList, node, "targetList", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "targetList");+ }+ if (node->utilityStmt != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->utilityStmt, node, "utilityStmt", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "utilityStmt");+ }+ if (node->windowClause != NULL && node->windowClause->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->windowClause, node, "windowClause", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "windowClause");+ }+ if (node->withCheckOptions != NULL && node->withCheckOptions->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->withCheckOptions, node, "withCheckOptions", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "withCheckOptions");+ }+}++static void+_fingerprintInsertStmt(FingerprintContext *ctx, const InsertStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "InsertStmt");+ if (node->cols != NULL && node->cols->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->cols, node, "cols", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "cols");+ }+ if (node->onConflictClause != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->onConflictClause, node, "onConflictClause", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "onConflictClause");+ }+ if (node->relation != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->relation, node, "relation", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "relation");+ }+ if (node->returningList != NULL && node->returningList->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->returningList, node, "returningList", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "returningList");+ }+ if (node->selectStmt != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->selectStmt, node, "selectStmt", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "selectStmt");+ }+ if (node->withClause != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->withClause, node, "withClause", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "withClause");+ }+}++static void+_fingerprintDeleteStmt(FingerprintContext *ctx, const DeleteStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "DeleteStmt");+ if (node->relation != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->relation, node, "relation", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "relation");+ }+ if (node->returningList != NULL && node->returningList->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->returningList, node, "returningList", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "returningList");+ }+ if (node->usingClause != NULL && node->usingClause->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->usingClause, node, "usingClause", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "usingClause");+ }+ if (node->whereClause != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->whereClause, node, "whereClause", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "whereClause");+ }+ if (node->withClause != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->withClause, node, "withClause", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "withClause");+ }+}++static void+_fingerprintUpdateStmt(FingerprintContext *ctx, const UpdateStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "UpdateStmt");+ if (node->fromClause != NULL && node->fromClause->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->fromClause, node, "fromClause", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "fromClause");+ }+ if (node->relation != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->relation, node, "relation", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "relation");+ }+ if (node->returningList != NULL && node->returningList->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->returningList, node, "returningList", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "returningList");+ }+ if (node->targetList != NULL && node->targetList->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->targetList, node, "targetList", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "targetList");+ }+ if (node->whereClause != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->whereClause, node, "whereClause", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "whereClause");+ }+ if (node->withClause != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->withClause, node, "withClause", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "withClause");+ }+}++static void+_fingerprintSelectStmt(FingerprintContext *ctx, const SelectStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "SelectStmt");++ if (node->all) { _fingerprintString(ctx, "all");+ _fingerprintString(ctx, "true");+ }++ if (node->distinctClause != NULL && node->distinctClause->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->distinctClause, node, "distinctClause", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "distinctClause");+ }+ if (node->fromClause != NULL && node->fromClause->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->fromClause, node, "fromClause", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "fromClause");+ }+ if (node->groupClause != NULL && node->groupClause->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->groupClause, node, "groupClause", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "groupClause");+ }+ if (node->havingClause != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->havingClause, node, "havingClause", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "havingClause");+ }+ if (node->intoClause != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->intoClause, node, "intoClause", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "intoClause");+ }+ if (node->larg != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->larg, node, "larg", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "larg");+ }+ if (node->limitCount != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->limitCount, node, "limitCount", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "limitCount");+ }+ if (node->limitOffset != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->limitOffset, node, "limitOffset", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "limitOffset");+ }+ if (node->lockingClause != NULL && node->lockingClause->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->lockingClause, node, "lockingClause", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "lockingClause");+ }+ if (node->op != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->op);+ _fingerprintString(ctx, "op");+ _fingerprintString(ctx, buffer);+ }++ if (node->rarg != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->rarg, node, "rarg", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "rarg");+ }+ if (node->sortClause != NULL && node->sortClause->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->sortClause, node, "sortClause", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "sortClause");+ }+ if (node->targetList != NULL && node->targetList->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->targetList, node, "targetList", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "targetList");+ }+ if (node->valuesLists != NULL && node->valuesLists->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->valuesLists, node, "valuesLists", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "valuesLists");+ }+ if (node->whereClause != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->whereClause, node, "whereClause", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "whereClause");+ }+ if (node->windowClause != NULL && node->windowClause->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->windowClause, node, "windowClause", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "windowClause");+ }+ if (node->withClause != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->withClause, node, "withClause", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "withClause");+ }+}++static void+_fingerprintAlterTableStmt(FingerprintContext *ctx, const AlterTableStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "AlterTableStmt");+ if (node->cmds != NULL && node->cmds->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->cmds, node, "cmds", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "cmds");+ }++ if (node->missing_ok) { _fingerprintString(ctx, "missing_ok");+ _fingerprintString(ctx, "true");+ }++ if (node->relation != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->relation, node, "relation", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "relation");+ }+ if (node->relkind != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->relkind);+ _fingerprintString(ctx, "relkind");+ _fingerprintString(ctx, buffer);+ }++}++static void+_fingerprintAlterTableCmd(FingerprintContext *ctx, const AlterTableCmd *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "AlterTableCmd");+ if (node->behavior != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->behavior);+ _fingerprintString(ctx, "behavior");+ _fingerprintString(ctx, buffer);+ }++ if (node->def != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->def, node, "def", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "def");+ }++ if (node->missing_ok) { _fingerprintString(ctx, "missing_ok");+ _fingerprintString(ctx, "true");+ }+++ if (node->name != NULL) {+ _fingerprintString(ctx, "name");+ _fingerprintString(ctx, node->name);+ }++ if (node->newowner != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->newowner, node, "newowner", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "newowner");+ }+ if (node->subtype != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->subtype);+ _fingerprintString(ctx, "subtype");+ _fingerprintString(ctx, buffer);+ }++}++static void+_fingerprintAlterDomainStmt(FingerprintContext *ctx, const AlterDomainStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "AlterDomainStmt");+ if (node->behavior != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->behavior);+ _fingerprintString(ctx, "behavior");+ _fingerprintString(ctx, buffer);+ }++ if (node->def != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->def, node, "def", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "def");+ }++ if (node->missing_ok) { _fingerprintString(ctx, "missing_ok");+ _fingerprintString(ctx, "true");+ }+++ if (node->name != NULL) {+ _fingerprintString(ctx, "name");+ _fingerprintString(ctx, node->name);+ }++ if (node->subtype != 0) {+ char str[2] = {node->subtype, '\0'};+ _fingerprintString(ctx, "subtype");+ _fingerprintString(ctx, str);+ }++ if (node->typeName != NULL && node->typeName->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->typeName, node, "typeName", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "typeName");+ }+}++static void+_fingerprintSetOperationStmt(FingerprintContext *ctx, const SetOperationStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "SetOperationStmt");++ if (node->all) { _fingerprintString(ctx, "all");+ _fingerprintString(ctx, "true");+ }++ if (node->colCollations != NULL && node->colCollations->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->colCollations, node, "colCollations", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "colCollations");+ }+ if (node->colTypes != NULL && node->colTypes->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->colTypes, node, "colTypes", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "colTypes");+ }+ if (node->colTypmods != NULL && node->colTypmods->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->colTypmods, node, "colTypmods", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "colTypmods");+ }+ if (node->groupClauses != NULL && node->groupClauses->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->groupClauses, node, "groupClauses", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "groupClauses");+ }+ if (node->larg != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->larg, node, "larg", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "larg");+ }+ if (node->op != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->op);+ _fingerprintString(ctx, "op");+ _fingerprintString(ctx, buffer);+ }++ if (node->rarg != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->rarg, node, "rarg", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "rarg");+ }+}++static void+_fingerprintGrantStmt(FingerprintContext *ctx, const GrantStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "GrantStmt");+ if (node->behavior != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->behavior);+ _fingerprintString(ctx, "behavior");+ _fingerprintString(ctx, buffer);+ }+++ if (node->grant_option) { _fingerprintString(ctx, "grant_option");+ _fingerprintString(ctx, "true");+ }++ if (node->grantees != NULL && node->grantees->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->grantees, node, "grantees", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "grantees");+ }++ if (node->is_grant) { _fingerprintString(ctx, "is_grant");+ _fingerprintString(ctx, "true");+ }++ if (node->objects != NULL && node->objects->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->objects, node, "objects", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "objects");+ }+ if (node->objtype != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->objtype);+ _fingerprintString(ctx, "objtype");+ _fingerprintString(ctx, buffer);+ }++ if (node->privileges != NULL && node->privileges->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->privileges, node, "privileges", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "privileges");+ }+ if (node->targtype != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->targtype);+ _fingerprintString(ctx, "targtype");+ _fingerprintString(ctx, buffer);+ }++}++static void+_fingerprintGrantRoleStmt(FingerprintContext *ctx, const GrantRoleStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "GrantRoleStmt");++ if (node->admin_opt) { _fingerprintString(ctx, "admin_opt");+ _fingerprintString(ctx, "true");+ }++ if (node->behavior != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->behavior);+ _fingerprintString(ctx, "behavior");+ _fingerprintString(ctx, buffer);+ }++ if (node->granted_roles != NULL && node->granted_roles->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->granted_roles, node, "granted_roles", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "granted_roles");+ }+ if (node->grantee_roles != NULL && node->grantee_roles->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->grantee_roles, node, "grantee_roles", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "grantee_roles");+ }+ if (node->grantor != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->grantor, node, "grantor", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "grantor");+ }++ if (node->is_grant) { _fingerprintString(ctx, "is_grant");+ _fingerprintString(ctx, "true");+ }++}++static void+_fingerprintAlterDefaultPrivilegesStmt(FingerprintContext *ctx, const AlterDefaultPrivilegesStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "AlterDefaultPrivilegesStmt");+ if (node->action != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->action, node, "action", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "action");+ }+ if (node->options != NULL && node->options->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->options, node, "options", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "options");+ }+}++static void+_fingerprintClosePortalStmt(FingerprintContext *ctx, const ClosePortalStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "ClosePortalStmt");++ if (node->portalname != NULL) {+ _fingerprintString(ctx, "portalname");+ _fingerprintString(ctx, node->portalname);+ }++}++static void+_fingerprintClusterStmt(FingerprintContext *ctx, const ClusterStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "ClusterStmt");++ if (node->indexname != NULL) {+ _fingerprintString(ctx, "indexname");+ _fingerprintString(ctx, node->indexname);+ }++ if (node->relation != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->relation, node, "relation", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "relation");+ }++ if (node->verbose) { _fingerprintString(ctx, "verbose");+ _fingerprintString(ctx, "true");+ }++}++static void+_fingerprintCopyStmt(FingerprintContext *ctx, const CopyStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "CopyStmt");+ if (node->attlist != NULL && node->attlist->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->attlist, node, "attlist", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "attlist");+ }++ if (node->filename != NULL) {+ _fingerprintString(ctx, "filename");+ _fingerprintString(ctx, node->filename);+ }+++ if (node->is_from) { _fingerprintString(ctx, "is_from");+ _fingerprintString(ctx, "true");+ }+++ if (node->is_program) { _fingerprintString(ctx, "is_program");+ _fingerprintString(ctx, "true");+ }++ if (node->options != NULL && node->options->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->options, node, "options", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "options");+ }+ if (node->query != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->query, node, "query", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "query");+ }+ if (node->relation != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->relation, node, "relation", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "relation");+ }+}++static void+_fingerprintCreateStmt(FingerprintContext *ctx, const CreateStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "CreateStmt");+ if (node->constraints != NULL && node->constraints->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->constraints, node, "constraints", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "constraints");+ }++ if (node->if_not_exists) { _fingerprintString(ctx, "if_not_exists");+ _fingerprintString(ctx, "true");+ }++ if (node->inhRelations != NULL && node->inhRelations->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->inhRelations, node, "inhRelations", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "inhRelations");+ }+ if (node->ofTypename != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->ofTypename, node, "ofTypename", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "ofTypename");+ }+ if (node->oncommit != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->oncommit);+ _fingerprintString(ctx, "oncommit");+ _fingerprintString(ctx, buffer);+ }++ if (node->options != NULL && node->options->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->options, node, "options", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "options");+ }+ if (node->relation != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->relation, node, "relation", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "relation");+ }+ if (node->tableElts != NULL && node->tableElts->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->tableElts, node, "tableElts", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "tableElts");+ }++ if (node->tablespacename != NULL) {+ _fingerprintString(ctx, "tablespacename");+ _fingerprintString(ctx, node->tablespacename);+ }++}++static void+_fingerprintDefineStmt(FingerprintContext *ctx, const DefineStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "DefineStmt");+ if (node->args != NULL && node->args->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->args, node, "args", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "args");+ }+ if (node->definition != NULL && node->definition->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->definition, node, "definition", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "definition");+ }+ if (node->defnames != NULL && node->defnames->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->defnames, node, "defnames", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "defnames");+ }+ if (node->kind != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->kind);+ _fingerprintString(ctx, "kind");+ _fingerprintString(ctx, buffer);+ }+++ if (node->oldstyle) { _fingerprintString(ctx, "oldstyle");+ _fingerprintString(ctx, "true");+ }++}++static void+_fingerprintDropStmt(FingerprintContext *ctx, const DropStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "DropStmt");+ if (node->arguments != NULL && node->arguments->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->arguments, node, "arguments", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "arguments");+ }+ if (node->behavior != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->behavior);+ _fingerprintString(ctx, "behavior");+ _fingerprintString(ctx, buffer);+ }+++ if (node->concurrent) { _fingerprintString(ctx, "concurrent");+ _fingerprintString(ctx, "true");+ }+++ if (node->missing_ok) { _fingerprintString(ctx, "missing_ok");+ _fingerprintString(ctx, "true");+ }++ if (node->objects != NULL && node->objects->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->objects, node, "objects", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "objects");+ }+ if (node->removeType != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->removeType);+ _fingerprintString(ctx, "removeType");+ _fingerprintString(ctx, buffer);+ }++}++static void+_fingerprintTruncateStmt(FingerprintContext *ctx, const TruncateStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "TruncateStmt");+ if (node->behavior != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->behavior);+ _fingerprintString(ctx, "behavior");+ _fingerprintString(ctx, buffer);+ }++ if (node->relations != NULL && node->relations->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->relations, node, "relations", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "relations");+ }++ if (node->restart_seqs) { _fingerprintString(ctx, "restart_seqs");+ _fingerprintString(ctx, "true");+ }++}++static void+_fingerprintCommentStmt(FingerprintContext *ctx, const CommentStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "CommentStmt");++ if (node->comment != NULL) {+ _fingerprintString(ctx, "comment");+ _fingerprintString(ctx, node->comment);+ }++ if (node->objargs != NULL && node->objargs->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->objargs, node, "objargs", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "objargs");+ }+ if (node->objname != NULL && node->objname->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->objname, node, "objname", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "objname");+ }+ if (node->objtype != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->objtype);+ _fingerprintString(ctx, "objtype");+ _fingerprintString(ctx, buffer);+ }++}++static void+_fingerprintFetchStmt(FingerprintContext *ctx, const FetchStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "FetchStmt");+ if (node->direction != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->direction);+ _fingerprintString(ctx, "direction");+ _fingerprintString(ctx, buffer);+ }++ if (node->howMany != 0) {+ char buffer[50];+ sprintf(buffer, "%ld", node->howMany);+ _fingerprintString(ctx, "howMany");+ _fingerprintString(ctx, buffer);+ }+++ if (node->ismove) { _fingerprintString(ctx, "ismove");+ _fingerprintString(ctx, "true");+ }+++ if (node->portalname != NULL) {+ _fingerprintString(ctx, "portalname");+ _fingerprintString(ctx, node->portalname);+ }++}++static void+_fingerprintIndexStmt(FingerprintContext *ctx, const IndexStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "IndexStmt");++ if (node->accessMethod != NULL) {+ _fingerprintString(ctx, "accessMethod");+ _fingerprintString(ctx, node->accessMethod);+ }+++ if (node->concurrent) { _fingerprintString(ctx, "concurrent");+ _fingerprintString(ctx, "true");+ }+++ if (node->deferrable) { _fingerprintString(ctx, "deferrable");+ _fingerprintString(ctx, "true");+ }++ if (node->excludeOpNames != NULL && node->excludeOpNames->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->excludeOpNames, node, "excludeOpNames", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "excludeOpNames");+ }++ if (node->idxcomment != NULL) {+ _fingerprintString(ctx, "idxcomment");+ _fingerprintString(ctx, node->idxcomment);+ }+++ if (node->idxname != NULL) {+ _fingerprintString(ctx, "idxname");+ _fingerprintString(ctx, node->idxname);+ }+++ if (node->if_not_exists) { _fingerprintString(ctx, "if_not_exists");+ _fingerprintString(ctx, "true");+ }++ if (node->indexOid != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->indexOid);+ _fingerprintString(ctx, "indexOid");+ _fingerprintString(ctx, buffer);+ }++ if (node->indexParams != NULL && node->indexParams->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->indexParams, node, "indexParams", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "indexParams");+ }++ if (node->initdeferred) { _fingerprintString(ctx, "initdeferred");+ _fingerprintString(ctx, "true");+ }+++ if (node->isconstraint) { _fingerprintString(ctx, "isconstraint");+ _fingerprintString(ctx, "true");+ }++ if (node->oldNode != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->oldNode);+ _fingerprintString(ctx, "oldNode");+ _fingerprintString(ctx, buffer);+ }++ if (node->options != NULL && node->options->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->options, node, "options", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "options");+ }++ if (node->primary) { _fingerprintString(ctx, "primary");+ _fingerprintString(ctx, "true");+ }++ if (node->relation != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->relation, node, "relation", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "relation");+ }++ if (node->tableSpace != NULL) {+ _fingerprintString(ctx, "tableSpace");+ _fingerprintString(ctx, node->tableSpace);+ }+++ if (node->transformed) { _fingerprintString(ctx, "transformed");+ _fingerprintString(ctx, "true");+ }+++ if (node->unique) { _fingerprintString(ctx, "unique");+ _fingerprintString(ctx, "true");+ }++ if (node->whereClause != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->whereClause, node, "whereClause", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "whereClause");+ }+}++static void+_fingerprintCreateFunctionStmt(FingerprintContext *ctx, const CreateFunctionStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "CreateFunctionStmt");+ if (node->funcname != NULL && node->funcname->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->funcname, node, "funcname", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "funcname");+ }+ if (node->options != NULL && node->options->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->options, node, "options", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "options");+ }+ if (node->parameters != NULL && node->parameters->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->parameters, node, "parameters", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "parameters");+ }++ if (node->replace) { _fingerprintString(ctx, "replace");+ _fingerprintString(ctx, "true");+ }++ if (node->returnType != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->returnType, node, "returnType", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "returnType");+ }+ if (node->withClause != NULL && node->withClause->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->withClause, node, "withClause", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "withClause");+ }+}++static void+_fingerprintAlterFunctionStmt(FingerprintContext *ctx, const AlterFunctionStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "AlterFunctionStmt");+ if (node->actions != NULL && node->actions->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->actions, node, "actions", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "actions");+ }+ if (node->func != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->func, node, "func", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "func");+ }+}++static void+_fingerprintDoStmt(FingerprintContext *ctx, const DoStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "DoStmt");+ if (node->args != NULL && node->args->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->args, node, "args", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "args");+ }+}++static void+_fingerprintRenameStmt(FingerprintContext *ctx, const RenameStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "RenameStmt");+ if (node->behavior != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->behavior);+ _fingerprintString(ctx, "behavior");+ _fingerprintString(ctx, buffer);+ }+++ if (node->missing_ok) { _fingerprintString(ctx, "missing_ok");+ _fingerprintString(ctx, "true");+ }+++ if (node->newname != NULL) {+ _fingerprintString(ctx, "newname");+ _fingerprintString(ctx, node->newname);+ }++ if (node->objarg != NULL && node->objarg->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->objarg, node, "objarg", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "objarg");+ }+ if (node->object != NULL && node->object->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->object, node, "object", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "object");+ }+ if (node->relation != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->relation, node, "relation", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "relation");+ }+ if (node->relationType != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->relationType);+ _fingerprintString(ctx, "relationType");+ _fingerprintString(ctx, buffer);+ }++ if (node->renameType != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->renameType);+ _fingerprintString(ctx, "renameType");+ _fingerprintString(ctx, buffer);+ }+++ if (node->subname != NULL) {+ _fingerprintString(ctx, "subname");+ _fingerprintString(ctx, node->subname);+ }++}++static void+_fingerprintRuleStmt(FingerprintContext *ctx, const RuleStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "RuleStmt");+ if (node->actions != NULL && node->actions->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->actions, node, "actions", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "actions");+ }+ if (node->event != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->event);+ _fingerprintString(ctx, "event");+ _fingerprintString(ctx, buffer);+ }+++ if (node->instead) { _fingerprintString(ctx, "instead");+ _fingerprintString(ctx, "true");+ }++ if (node->relation != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->relation, node, "relation", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "relation");+ }++ if (node->replace) { _fingerprintString(ctx, "replace");+ _fingerprintString(ctx, "true");+ }+++ if (node->rulename != NULL) {+ _fingerprintString(ctx, "rulename");+ _fingerprintString(ctx, node->rulename);+ }++ if (node->whereClause != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->whereClause, node, "whereClause", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "whereClause");+ }+}++static void+_fingerprintNotifyStmt(FingerprintContext *ctx, const NotifyStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "NotifyStmt");++ if (node->conditionname != NULL) {+ _fingerprintString(ctx, "conditionname");+ _fingerprintString(ctx, node->conditionname);+ }+++ if (node->payload != NULL) {+ _fingerprintString(ctx, "payload");+ _fingerprintString(ctx, node->payload);+ }++}++static void+_fingerprintListenStmt(FingerprintContext *ctx, const ListenStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "ListenStmt");++ if (node->conditionname != NULL) {+ _fingerprintString(ctx, "conditionname");+ _fingerprintString(ctx, node->conditionname);+ }++}++static void+_fingerprintUnlistenStmt(FingerprintContext *ctx, const UnlistenStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "UnlistenStmt");++ if (node->conditionname != NULL) {+ _fingerprintString(ctx, "conditionname");+ _fingerprintString(ctx, node->conditionname);+ }++}++static void+_fingerprintTransactionStmt(FingerprintContext *ctx, const TransactionStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "TransactionStmt");+ // Intentionally ignoring node->gid for fingerprinting+ if (node->kind != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->kind);+ _fingerprintString(ctx, "kind");+ _fingerprintString(ctx, buffer);+ }++ // Intentionally ignoring node->options for fingerprinting+}++static void+_fingerprintViewStmt(FingerprintContext *ctx, const ViewStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "ViewStmt");+ if (node->aliases != NULL && node->aliases->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->aliases, node, "aliases", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "aliases");+ }+ if (node->options != NULL && node->options->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->options, node, "options", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "options");+ }+ if (node->query != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->query, node, "query", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "query");+ }++ if (node->replace) { _fingerprintString(ctx, "replace");+ _fingerprintString(ctx, "true");+ }++ if (node->view != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->view, node, "view", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "view");+ }+ if (node->withCheckOption != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->withCheckOption);+ _fingerprintString(ctx, "withCheckOption");+ _fingerprintString(ctx, buffer);+ }++}++static void+_fingerprintLoadStmt(FingerprintContext *ctx, const LoadStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "LoadStmt");++ if (node->filename != NULL) {+ _fingerprintString(ctx, "filename");+ _fingerprintString(ctx, node->filename);+ }++}++static void+_fingerprintCreateDomainStmt(FingerprintContext *ctx, const CreateDomainStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "CreateDomainStmt");+ if (node->collClause != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->collClause, node, "collClause", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "collClause");+ }+ if (node->constraints != NULL && node->constraints->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->constraints, node, "constraints", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "constraints");+ }+ if (node->domainname != NULL && node->domainname->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->domainname, node, "domainname", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "domainname");+ }+ if (node->typeName != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->typeName, node, "typeName", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "typeName");+ }+}++static void+_fingerprintCreatedbStmt(FingerprintContext *ctx, const CreatedbStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "CreatedbStmt");++ if (node->dbname != NULL) {+ _fingerprintString(ctx, "dbname");+ _fingerprintString(ctx, node->dbname);+ }++ if (node->options != NULL && node->options->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->options, node, "options", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "options");+ }+}++static void+_fingerprintDropdbStmt(FingerprintContext *ctx, const DropdbStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "DropdbStmt");++ if (node->dbname != NULL) {+ _fingerprintString(ctx, "dbname");+ _fingerprintString(ctx, node->dbname);+ }+++ if (node->missing_ok) { _fingerprintString(ctx, "missing_ok");+ _fingerprintString(ctx, "true");+ }++}++static void+_fingerprintVacuumStmt(FingerprintContext *ctx, const VacuumStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "VacuumStmt");+ if (node->options != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->options);+ _fingerprintString(ctx, "options");+ _fingerprintString(ctx, buffer);+ }++ if (node->relation != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->relation, node, "relation", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "relation");+ }+ if (node->va_cols != NULL && node->va_cols->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->va_cols, node, "va_cols", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "va_cols");+ }+}++static void+_fingerprintExplainStmt(FingerprintContext *ctx, const ExplainStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "ExplainStmt");+ if (node->options != NULL && node->options->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->options, node, "options", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "options");+ }+ if (node->query != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->query, node, "query", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "query");+ }+}++static void+_fingerprintCreateTableAsStmt(FingerprintContext *ctx, const CreateTableAsStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "CreateTableAsStmt");++ if (node->if_not_exists) { _fingerprintString(ctx, "if_not_exists");+ _fingerprintString(ctx, "true");+ }++ if (node->into != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->into, node, "into", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "into");+ }++ if (node->is_select_into) { _fingerprintString(ctx, "is_select_into");+ _fingerprintString(ctx, "true");+ }++ if (node->query != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->query, node, "query", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "query");+ }+ if (node->relkind != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->relkind);+ _fingerprintString(ctx, "relkind");+ _fingerprintString(ctx, buffer);+ }++}++static void+_fingerprintCreateSeqStmt(FingerprintContext *ctx, const CreateSeqStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "CreateSeqStmt");++ if (node->if_not_exists) { _fingerprintString(ctx, "if_not_exists");+ _fingerprintString(ctx, "true");+ }++ if (node->options != NULL && node->options->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->options, node, "options", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "options");+ }+ if (node->ownerId != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->ownerId);+ _fingerprintString(ctx, "ownerId");+ _fingerprintString(ctx, buffer);+ }++ if (node->sequence != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->sequence, node, "sequence", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "sequence");+ }+}++static void+_fingerprintAlterSeqStmt(FingerprintContext *ctx, const AlterSeqStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "AlterSeqStmt");++ if (node->missing_ok) { _fingerprintString(ctx, "missing_ok");+ _fingerprintString(ctx, "true");+ }++ if (node->options != NULL && node->options->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->options, node, "options", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "options");+ }+ if (node->sequence != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->sequence, node, "sequence", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "sequence");+ }+}++static void+_fingerprintVariableSetStmt(FingerprintContext *ctx, const VariableSetStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "VariableSetStmt");+ if (node->args != NULL && node->args->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->args, node, "args", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "args");+ }++ if (node->is_local) { _fingerprintString(ctx, "is_local");+ _fingerprintString(ctx, "true");+ }++ if (node->kind != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->kind);+ _fingerprintString(ctx, "kind");+ _fingerprintString(ctx, buffer);+ }+++ if (node->name != NULL) {+ _fingerprintString(ctx, "name");+ _fingerprintString(ctx, node->name);+ }++}++static void+_fingerprintVariableShowStmt(FingerprintContext *ctx, const VariableShowStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "VariableShowStmt");++ if (node->name != NULL) {+ _fingerprintString(ctx, "name");+ _fingerprintString(ctx, node->name);+ }++}++static void+_fingerprintDiscardStmt(FingerprintContext *ctx, const DiscardStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "DiscardStmt");+ if (node->target != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->target);+ _fingerprintString(ctx, "target");+ _fingerprintString(ctx, buffer);+ }++}++static void+_fingerprintCreateTrigStmt(FingerprintContext *ctx, const CreateTrigStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "CreateTrigStmt");+ if (node->args != NULL && node->args->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->args, node, "args", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "args");+ }+ if (node->columns != NULL && node->columns->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->columns, node, "columns", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "columns");+ }+ if (node->constrrel != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->constrrel, node, "constrrel", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "constrrel");+ }++ if (node->deferrable) { _fingerprintString(ctx, "deferrable");+ _fingerprintString(ctx, "true");+ }++ if (node->events != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->events);+ _fingerprintString(ctx, "events");+ _fingerprintString(ctx, buffer);+ }++ if (node->funcname != NULL && node->funcname->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->funcname, node, "funcname", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "funcname");+ }++ if (node->initdeferred) { _fingerprintString(ctx, "initdeferred");+ _fingerprintString(ctx, "true");+ }+++ if (node->isconstraint) { _fingerprintString(ctx, "isconstraint");+ _fingerprintString(ctx, "true");+ }++ if (node->relation != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->relation, node, "relation", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "relation");+ }++ if (node->row) { _fingerprintString(ctx, "row");+ _fingerprintString(ctx, "true");+ }++ if (node->timing != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->timing);+ _fingerprintString(ctx, "timing");+ _fingerprintString(ctx, buffer);+ }+++ if (node->trigname != NULL) {+ _fingerprintString(ctx, "trigname");+ _fingerprintString(ctx, node->trigname);+ }++ if (node->whenClause != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->whenClause, node, "whenClause", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "whenClause");+ }+}++static void+_fingerprintCreatePLangStmt(FingerprintContext *ctx, const CreatePLangStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "CreatePLangStmt");+ if (node->plhandler != NULL && node->plhandler->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->plhandler, node, "plhandler", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "plhandler");+ }+ if (node->plinline != NULL && node->plinline->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->plinline, node, "plinline", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "plinline");+ }++ if (node->plname != NULL) {+ _fingerprintString(ctx, "plname");+ _fingerprintString(ctx, node->plname);+ }+++ if (node->pltrusted) { _fingerprintString(ctx, "pltrusted");+ _fingerprintString(ctx, "true");+ }++ if (node->plvalidator != NULL && node->plvalidator->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->plvalidator, node, "plvalidator", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "plvalidator");+ }++ if (node->replace) { _fingerprintString(ctx, "replace");+ _fingerprintString(ctx, "true");+ }++}++static void+_fingerprintCreateRoleStmt(FingerprintContext *ctx, const CreateRoleStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "CreateRoleStmt");+ if (node->options != NULL && node->options->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->options, node, "options", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "options");+ }++ if (node->role != NULL) {+ _fingerprintString(ctx, "role");+ _fingerprintString(ctx, node->role);+ }++ if (node->stmt_type != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->stmt_type);+ _fingerprintString(ctx, "stmt_type");+ _fingerprintString(ctx, buffer);+ }++}++static void+_fingerprintAlterRoleStmt(FingerprintContext *ctx, const AlterRoleStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "AlterRoleStmt");+ if (node->action != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->action);+ _fingerprintString(ctx, "action");+ _fingerprintString(ctx, buffer);+ }++ if (node->options != NULL && node->options->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->options, node, "options", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "options");+ }+ if (node->role != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->role, node, "role", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "role");+ }+}++static void+_fingerprintDropRoleStmt(FingerprintContext *ctx, const DropRoleStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "DropRoleStmt");++ if (node->missing_ok) { _fingerprintString(ctx, "missing_ok");+ _fingerprintString(ctx, "true");+ }++ if (node->roles != NULL && node->roles->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->roles, node, "roles", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "roles");+ }+}++static void+_fingerprintLockStmt(FingerprintContext *ctx, const LockStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "LockStmt");+ if (node->mode != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->mode);+ _fingerprintString(ctx, "mode");+ _fingerprintString(ctx, buffer);+ }+++ if (node->nowait) { _fingerprintString(ctx, "nowait");+ _fingerprintString(ctx, "true");+ }++ if (node->relations != NULL && node->relations->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->relations, node, "relations", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "relations");+ }+}++static void+_fingerprintConstraintsSetStmt(FingerprintContext *ctx, const ConstraintsSetStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "ConstraintsSetStmt");+ if (node->constraints != NULL && node->constraints->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->constraints, node, "constraints", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "constraints");+ }++ if (node->deferred) { _fingerprintString(ctx, "deferred");+ _fingerprintString(ctx, "true");+ }++}++static void+_fingerprintReindexStmt(FingerprintContext *ctx, const ReindexStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "ReindexStmt");+ if (node->kind != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->kind);+ _fingerprintString(ctx, "kind");+ _fingerprintString(ctx, buffer);+ }+++ if (node->name != NULL) {+ _fingerprintString(ctx, "name");+ _fingerprintString(ctx, node->name);+ }++ if (node->options != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->options);+ _fingerprintString(ctx, "options");+ _fingerprintString(ctx, buffer);+ }++ if (node->relation != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->relation, node, "relation", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "relation");+ }+}++static void+_fingerprintCheckPointStmt(FingerprintContext *ctx, const CheckPointStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "CheckPointStmt");+}++static void+_fingerprintCreateSchemaStmt(FingerprintContext *ctx, const CreateSchemaStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "CreateSchemaStmt");+ if (node->authrole != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->authrole, node, "authrole", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "authrole");+ }++ if (node->if_not_exists) { _fingerprintString(ctx, "if_not_exists");+ _fingerprintString(ctx, "true");+ }++ if (node->schemaElts != NULL && node->schemaElts->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->schemaElts, node, "schemaElts", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "schemaElts");+ }++ if (node->schemaname != NULL) {+ _fingerprintString(ctx, "schemaname");+ _fingerprintString(ctx, node->schemaname);+ }++}++static void+_fingerprintAlterDatabaseStmt(FingerprintContext *ctx, const AlterDatabaseStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "AlterDatabaseStmt");++ if (node->dbname != NULL) {+ _fingerprintString(ctx, "dbname");+ _fingerprintString(ctx, node->dbname);+ }++ if (node->options != NULL && node->options->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->options, node, "options", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "options");+ }+}++static void+_fingerprintAlterDatabaseSetStmt(FingerprintContext *ctx, const AlterDatabaseSetStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "AlterDatabaseSetStmt");++ if (node->dbname != NULL) {+ _fingerprintString(ctx, "dbname");+ _fingerprintString(ctx, node->dbname);+ }++ if (node->setstmt != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->setstmt, node, "setstmt", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "setstmt");+ }+}++static void+_fingerprintAlterRoleSetStmt(FingerprintContext *ctx, const AlterRoleSetStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "AlterRoleSetStmt");++ if (node->database != NULL) {+ _fingerprintString(ctx, "database");+ _fingerprintString(ctx, node->database);+ }++ if (node->role != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->role, node, "role", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "role");+ }+ if (node->setstmt != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->setstmt, node, "setstmt", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "setstmt");+ }+}++static void+_fingerprintCreateConversionStmt(FingerprintContext *ctx, const CreateConversionStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "CreateConversionStmt");+ if (node->conversion_name != NULL && node->conversion_name->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->conversion_name, node, "conversion_name", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "conversion_name");+ }++ if (node->def) { _fingerprintString(ctx, "def");+ _fingerprintString(ctx, "true");+ }+++ if (node->for_encoding_name != NULL) {+ _fingerprintString(ctx, "for_encoding_name");+ _fingerprintString(ctx, node->for_encoding_name);+ }++ if (node->func_name != NULL && node->func_name->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->func_name, node, "func_name", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "func_name");+ }++ if (node->to_encoding_name != NULL) {+ _fingerprintString(ctx, "to_encoding_name");+ _fingerprintString(ctx, node->to_encoding_name);+ }++}++static void+_fingerprintCreateCastStmt(FingerprintContext *ctx, const CreateCastStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "CreateCastStmt");+ if (node->context != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->context);+ _fingerprintString(ctx, "context");+ _fingerprintString(ctx, buffer);+ }++ if (node->func != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->func, node, "func", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "func");+ }++ if (node->inout) { _fingerprintString(ctx, "inout");+ _fingerprintString(ctx, "true");+ }++ if (node->sourcetype != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->sourcetype, node, "sourcetype", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "sourcetype");+ }+ if (node->targettype != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->targettype, node, "targettype", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "targettype");+ }+}++static void+_fingerprintCreateOpClassStmt(FingerprintContext *ctx, const CreateOpClassStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "CreateOpClassStmt");++ if (node->amname != NULL) {+ _fingerprintString(ctx, "amname");+ _fingerprintString(ctx, node->amname);+ }++ if (node->datatype != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->datatype, node, "datatype", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "datatype");+ }++ if (node->isDefault) { _fingerprintString(ctx, "isDefault");+ _fingerprintString(ctx, "true");+ }++ if (node->items != NULL && node->items->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->items, node, "items", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "items");+ }+ if (node->opclassname != NULL && node->opclassname->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->opclassname, node, "opclassname", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "opclassname");+ }+ if (node->opfamilyname != NULL && node->opfamilyname->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->opfamilyname, node, "opfamilyname", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "opfamilyname");+ }+}++static void+_fingerprintCreateOpFamilyStmt(FingerprintContext *ctx, const CreateOpFamilyStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "CreateOpFamilyStmt");++ if (node->amname != NULL) {+ _fingerprintString(ctx, "amname");+ _fingerprintString(ctx, node->amname);+ }++ if (node->opfamilyname != NULL && node->opfamilyname->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->opfamilyname, node, "opfamilyname", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "opfamilyname");+ }+}++static void+_fingerprintAlterOpFamilyStmt(FingerprintContext *ctx, const AlterOpFamilyStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "AlterOpFamilyStmt");++ if (node->amname != NULL) {+ _fingerprintString(ctx, "amname");+ _fingerprintString(ctx, node->amname);+ }+++ if (node->isDrop) { _fingerprintString(ctx, "isDrop");+ _fingerprintString(ctx, "true");+ }++ if (node->items != NULL && node->items->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->items, node, "items", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "items");+ }+ if (node->opfamilyname != NULL && node->opfamilyname->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->opfamilyname, node, "opfamilyname", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "opfamilyname");+ }+}++static void+_fingerprintPrepareStmt(FingerprintContext *ctx, const PrepareStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "PrepareStmt");+ if (node->argtypes != NULL && node->argtypes->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->argtypes, node, "argtypes", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "argtypes");+ }+ // Intentionally ignoring node->name for fingerprinting+ if (node->query != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->query, node, "query", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "query");+ }+}++static void+_fingerprintExecuteStmt(FingerprintContext *ctx, const ExecuteStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "ExecuteStmt");+ // Intentionally ignoring node->name for fingerprinting+ if (node->params != NULL && node->params->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->params, node, "params", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "params");+ }+}++static void+_fingerprintDeallocateStmt(FingerprintContext *ctx, const DeallocateStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "DeallocateStmt");+ // Intentionally ignoring node->name for fingerprinting+}++static void+_fingerprintDeclareCursorStmt(FingerprintContext *ctx, const DeclareCursorStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "DeclareCursorStmt");+ if (node->options != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->options);+ _fingerprintString(ctx, "options");+ _fingerprintString(ctx, buffer);+ }+++ if (node->portalname != NULL) {+ _fingerprintString(ctx, "portalname");+ _fingerprintString(ctx, node->portalname);+ }++ if (node->query != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->query, node, "query", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "query");+ }+}++static void+_fingerprintCreateTableSpaceStmt(FingerprintContext *ctx, const CreateTableSpaceStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "CreateTableSpaceStmt");+ // Intentionally ignoring node->location for fingerprinting+ if (node->options != NULL && node->options->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->options, node, "options", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "options");+ }+ if (node->owner != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->owner, node, "owner", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "owner");+ }++ if (node->tablespacename != NULL) {+ _fingerprintString(ctx, "tablespacename");+ _fingerprintString(ctx, node->tablespacename);+ }++}++static void+_fingerprintDropTableSpaceStmt(FingerprintContext *ctx, const DropTableSpaceStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "DropTableSpaceStmt");++ if (node->missing_ok) { _fingerprintString(ctx, "missing_ok");+ _fingerprintString(ctx, "true");+ }+++ if (node->tablespacename != NULL) {+ _fingerprintString(ctx, "tablespacename");+ _fingerprintString(ctx, node->tablespacename);+ }++}++static void+_fingerprintAlterObjectSchemaStmt(FingerprintContext *ctx, const AlterObjectSchemaStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "AlterObjectSchemaStmt");++ if (node->missing_ok) { _fingerprintString(ctx, "missing_ok");+ _fingerprintString(ctx, "true");+ }+++ if (node->newschema != NULL) {+ _fingerprintString(ctx, "newschema");+ _fingerprintString(ctx, node->newschema);+ }++ if (node->objarg != NULL && node->objarg->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->objarg, node, "objarg", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "objarg");+ }+ if (node->object != NULL && node->object->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->object, node, "object", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "object");+ }+ if (node->objectType != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->objectType);+ _fingerprintString(ctx, "objectType");+ _fingerprintString(ctx, buffer);+ }++ if (node->relation != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->relation, node, "relation", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "relation");+ }+}++static void+_fingerprintAlterOwnerStmt(FingerprintContext *ctx, const AlterOwnerStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "AlterOwnerStmt");+ if (node->newowner != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->newowner, node, "newowner", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "newowner");+ }+ if (node->objarg != NULL && node->objarg->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->objarg, node, "objarg", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "objarg");+ }+ if (node->object != NULL && node->object->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->object, node, "object", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "object");+ }+ if (node->objectType != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->objectType);+ _fingerprintString(ctx, "objectType");+ _fingerprintString(ctx, buffer);+ }++ if (node->relation != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->relation, node, "relation", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "relation");+ }+}++static void+_fingerprintDropOwnedStmt(FingerprintContext *ctx, const DropOwnedStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "DropOwnedStmt");+ if (node->behavior != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->behavior);+ _fingerprintString(ctx, "behavior");+ _fingerprintString(ctx, buffer);+ }++ if (node->roles != NULL && node->roles->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->roles, node, "roles", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "roles");+ }+}++static void+_fingerprintReassignOwnedStmt(FingerprintContext *ctx, const ReassignOwnedStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "ReassignOwnedStmt");+ if (node->newrole != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->newrole, node, "newrole", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "newrole");+ }+ if (node->roles != NULL && node->roles->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->roles, node, "roles", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "roles");+ }+}++static void+_fingerprintCompositeTypeStmt(FingerprintContext *ctx, const CompositeTypeStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "CompositeTypeStmt");+ if (node->coldeflist != NULL && node->coldeflist->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->coldeflist, node, "coldeflist", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "coldeflist");+ }+ if (node->typevar != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->typevar, node, "typevar", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "typevar");+ }+}++static void+_fingerprintCreateEnumStmt(FingerprintContext *ctx, const CreateEnumStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "CreateEnumStmt");+ if (node->typeName != NULL && node->typeName->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->typeName, node, "typeName", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "typeName");+ }+ if (node->vals != NULL && node->vals->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->vals, node, "vals", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "vals");+ }+}++static void+_fingerprintCreateRangeStmt(FingerprintContext *ctx, const CreateRangeStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "CreateRangeStmt");+ if (node->params != NULL && node->params->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->params, node, "params", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "params");+ }+ if (node->typeName != NULL && node->typeName->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->typeName, node, "typeName", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "typeName");+ }+}++static void+_fingerprintAlterEnumStmt(FingerprintContext *ctx, const AlterEnumStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "AlterEnumStmt");++ if (node->newVal != NULL) {+ _fingerprintString(ctx, "newVal");+ _fingerprintString(ctx, node->newVal);+ }+++ if (node->newValIsAfter) { _fingerprintString(ctx, "newValIsAfter");+ _fingerprintString(ctx, "true");+ }+++ if (node->newValNeighbor != NULL) {+ _fingerprintString(ctx, "newValNeighbor");+ _fingerprintString(ctx, node->newValNeighbor);+ }+++ if (node->skipIfExists) { _fingerprintString(ctx, "skipIfExists");+ _fingerprintString(ctx, "true");+ }++ if (node->typeName != NULL && node->typeName->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->typeName, node, "typeName", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "typeName");+ }+}++static void+_fingerprintAlterTSDictionaryStmt(FingerprintContext *ctx, const AlterTSDictionaryStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "AlterTSDictionaryStmt");+ if (node->dictname != NULL && node->dictname->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->dictname, node, "dictname", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "dictname");+ }+ if (node->options != NULL && node->options->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->options, node, "options", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "options");+ }+}++static void+_fingerprintAlterTSConfigurationStmt(FingerprintContext *ctx, const AlterTSConfigurationStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "AlterTSConfigurationStmt");+ if (node->cfgname != NULL && node->cfgname->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->cfgname, node, "cfgname", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "cfgname");+ }+ if (node->dicts != NULL && node->dicts->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->dicts, node, "dicts", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "dicts");+ }+ if (node->kind != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->kind);+ _fingerprintString(ctx, "kind");+ _fingerprintString(ctx, buffer);+ }+++ if (node->missing_ok) { _fingerprintString(ctx, "missing_ok");+ _fingerprintString(ctx, "true");+ }+++ if (node->override) { _fingerprintString(ctx, "override");+ _fingerprintString(ctx, "true");+ }+++ if (node->replace) { _fingerprintString(ctx, "replace");+ _fingerprintString(ctx, "true");+ }++ if (node->tokentype != NULL && node->tokentype->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->tokentype, node, "tokentype", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "tokentype");+ }+}++static void+_fingerprintCreateFdwStmt(FingerprintContext *ctx, const CreateFdwStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "CreateFdwStmt");++ if (node->fdwname != NULL) {+ _fingerprintString(ctx, "fdwname");+ _fingerprintString(ctx, node->fdwname);+ }++ if (node->func_options != NULL && node->func_options->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->func_options, node, "func_options", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "func_options");+ }+ if (node->options != NULL && node->options->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->options, node, "options", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "options");+ }+}++static void+_fingerprintAlterFdwStmt(FingerprintContext *ctx, const AlterFdwStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "AlterFdwStmt");++ if (node->fdwname != NULL) {+ _fingerprintString(ctx, "fdwname");+ _fingerprintString(ctx, node->fdwname);+ }++ if (node->func_options != NULL && node->func_options->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->func_options, node, "func_options", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "func_options");+ }+ if (node->options != NULL && node->options->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->options, node, "options", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "options");+ }+}++static void+_fingerprintCreateForeignServerStmt(FingerprintContext *ctx, const CreateForeignServerStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "CreateForeignServerStmt");++ if (node->fdwname != NULL) {+ _fingerprintString(ctx, "fdwname");+ _fingerprintString(ctx, node->fdwname);+ }++ if (node->options != NULL && node->options->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->options, node, "options", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "options");+ }++ if (node->servername != NULL) {+ _fingerprintString(ctx, "servername");+ _fingerprintString(ctx, node->servername);+ }+++ if (node->servertype != NULL) {+ _fingerprintString(ctx, "servertype");+ _fingerprintString(ctx, node->servertype);+ }+++ if (node->version != NULL) {+ _fingerprintString(ctx, "version");+ _fingerprintString(ctx, node->version);+ }++}++static void+_fingerprintAlterForeignServerStmt(FingerprintContext *ctx, const AlterForeignServerStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "AlterForeignServerStmt");++ if (node->has_version) { _fingerprintString(ctx, "has_version");+ _fingerprintString(ctx, "true");+ }++ if (node->options != NULL && node->options->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->options, node, "options", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "options");+ }++ if (node->servername != NULL) {+ _fingerprintString(ctx, "servername");+ _fingerprintString(ctx, node->servername);+ }+++ if (node->version != NULL) {+ _fingerprintString(ctx, "version");+ _fingerprintString(ctx, node->version);+ }++}++static void+_fingerprintCreateUserMappingStmt(FingerprintContext *ctx, const CreateUserMappingStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "CreateUserMappingStmt");+ if (node->options != NULL && node->options->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->options, node, "options", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "options");+ }++ if (node->servername != NULL) {+ _fingerprintString(ctx, "servername");+ _fingerprintString(ctx, node->servername);+ }++ if (node->user != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->user, node, "user", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "user");+ }+}++static void+_fingerprintAlterUserMappingStmt(FingerprintContext *ctx, const AlterUserMappingStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "AlterUserMappingStmt");+ if (node->options != NULL && node->options->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->options, node, "options", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "options");+ }++ if (node->servername != NULL) {+ _fingerprintString(ctx, "servername");+ _fingerprintString(ctx, node->servername);+ }++ if (node->user != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->user, node, "user", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "user");+ }+}++static void+_fingerprintDropUserMappingStmt(FingerprintContext *ctx, const DropUserMappingStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "DropUserMappingStmt");++ if (node->missing_ok) { _fingerprintString(ctx, "missing_ok");+ _fingerprintString(ctx, "true");+ }+++ if (node->servername != NULL) {+ _fingerprintString(ctx, "servername");+ _fingerprintString(ctx, node->servername);+ }++ if (node->user != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->user, node, "user", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "user");+ }+}++static void+_fingerprintAlterTableSpaceOptionsStmt(FingerprintContext *ctx, const AlterTableSpaceOptionsStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "AlterTableSpaceOptionsStmt");++ if (node->isReset) { _fingerprintString(ctx, "isReset");+ _fingerprintString(ctx, "true");+ }++ if (node->options != NULL && node->options->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->options, node, "options", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "options");+ }++ if (node->tablespacename != NULL) {+ _fingerprintString(ctx, "tablespacename");+ _fingerprintString(ctx, node->tablespacename);+ }++}++static void+_fingerprintAlterTableMoveAllStmt(FingerprintContext *ctx, const AlterTableMoveAllStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "AlterTableMoveAllStmt");++ if (node->new_tablespacename != NULL) {+ _fingerprintString(ctx, "new_tablespacename");+ _fingerprintString(ctx, node->new_tablespacename);+ }+++ if (node->nowait) { _fingerprintString(ctx, "nowait");+ _fingerprintString(ctx, "true");+ }++ if (node->objtype != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->objtype);+ _fingerprintString(ctx, "objtype");+ _fingerprintString(ctx, buffer);+ }+++ if (node->orig_tablespacename != NULL) {+ _fingerprintString(ctx, "orig_tablespacename");+ _fingerprintString(ctx, node->orig_tablespacename);+ }++ if (node->roles != NULL && node->roles->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->roles, node, "roles", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "roles");+ }+}++static void+_fingerprintSecLabelStmt(FingerprintContext *ctx, const SecLabelStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "SecLabelStmt");++ if (node->label != NULL) {+ _fingerprintString(ctx, "label");+ _fingerprintString(ctx, node->label);+ }++ if (node->objargs != NULL && node->objargs->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->objargs, node, "objargs", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "objargs");+ }+ if (node->objname != NULL && node->objname->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->objname, node, "objname", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "objname");+ }+ if (node->objtype != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->objtype);+ _fingerprintString(ctx, "objtype");+ _fingerprintString(ctx, buffer);+ }+++ if (node->provider != NULL) {+ _fingerprintString(ctx, "provider");+ _fingerprintString(ctx, node->provider);+ }++}++static void+_fingerprintCreateForeignTableStmt(FingerprintContext *ctx, const CreateForeignTableStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "CreateForeignTableStmt");+ _fingerprintString(ctx, "base");+ _fingerprintCreateStmt(ctx, (const CreateStmt*) &node->base, node, "base", depth);+ if (node->options != NULL && node->options->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->options, node, "options", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "options");+ }++ if (node->servername != NULL) {+ _fingerprintString(ctx, "servername");+ _fingerprintString(ctx, node->servername);+ }++}++static void+_fingerprintImportForeignSchemaStmt(FingerprintContext *ctx, const ImportForeignSchemaStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "ImportForeignSchemaStmt");+ if (node->list_type != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->list_type);+ _fingerprintString(ctx, "list_type");+ _fingerprintString(ctx, buffer);+ }+++ if (node->local_schema != NULL) {+ _fingerprintString(ctx, "local_schema");+ _fingerprintString(ctx, node->local_schema);+ }++ if (node->options != NULL && node->options->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->options, node, "options", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "options");+ }++ if (node->remote_schema != NULL) {+ _fingerprintString(ctx, "remote_schema");+ _fingerprintString(ctx, node->remote_schema);+ }+++ if (node->server_name != NULL) {+ _fingerprintString(ctx, "server_name");+ _fingerprintString(ctx, node->server_name);+ }++ if (node->table_list != NULL && node->table_list->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->table_list, node, "table_list", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "table_list");+ }+}++static void+_fingerprintCreateExtensionStmt(FingerprintContext *ctx, const CreateExtensionStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "CreateExtensionStmt");++ if (node->extname != NULL) {+ _fingerprintString(ctx, "extname");+ _fingerprintString(ctx, node->extname);+ }+++ if (node->if_not_exists) { _fingerprintString(ctx, "if_not_exists");+ _fingerprintString(ctx, "true");+ }++ if (node->options != NULL && node->options->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->options, node, "options", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "options");+ }+}++static void+_fingerprintAlterExtensionStmt(FingerprintContext *ctx, const AlterExtensionStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "AlterExtensionStmt");++ if (node->extname != NULL) {+ _fingerprintString(ctx, "extname");+ _fingerprintString(ctx, node->extname);+ }++ if (node->options != NULL && node->options->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->options, node, "options", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "options");+ }+}++static void+_fingerprintAlterExtensionContentsStmt(FingerprintContext *ctx, const AlterExtensionContentsStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "AlterExtensionContentsStmt");+ if (node->action != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->action);+ _fingerprintString(ctx, "action");+ _fingerprintString(ctx, buffer);+ }+++ if (node->extname != NULL) {+ _fingerprintString(ctx, "extname");+ _fingerprintString(ctx, node->extname);+ }++ if (node->objargs != NULL && node->objargs->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->objargs, node, "objargs", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "objargs");+ }+ if (node->objname != NULL && node->objname->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->objname, node, "objname", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "objname");+ }+ if (node->objtype != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->objtype);+ _fingerprintString(ctx, "objtype");+ _fingerprintString(ctx, buffer);+ }++}++static void+_fingerprintCreateEventTrigStmt(FingerprintContext *ctx, const CreateEventTrigStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "CreateEventTrigStmt");++ if (node->eventname != NULL) {+ _fingerprintString(ctx, "eventname");+ _fingerprintString(ctx, node->eventname);+ }++ if (node->funcname != NULL && node->funcname->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->funcname, node, "funcname", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "funcname");+ }++ if (node->trigname != NULL) {+ _fingerprintString(ctx, "trigname");+ _fingerprintString(ctx, node->trigname);+ }++ if (node->whenclause != NULL && node->whenclause->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->whenclause, node, "whenclause", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "whenclause");+ }+}++static void+_fingerprintAlterEventTrigStmt(FingerprintContext *ctx, const AlterEventTrigStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "AlterEventTrigStmt");+ if (node->tgenabled != 0) {+ char str[2] = {node->tgenabled, '\0'};+ _fingerprintString(ctx, "tgenabled");+ _fingerprintString(ctx, str);+ }+++ if (node->trigname != NULL) {+ _fingerprintString(ctx, "trigname");+ _fingerprintString(ctx, node->trigname);+ }++}++static void+_fingerprintRefreshMatViewStmt(FingerprintContext *ctx, const RefreshMatViewStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "RefreshMatViewStmt");++ if (node->concurrent) { _fingerprintString(ctx, "concurrent");+ _fingerprintString(ctx, "true");+ }++ if (node->relation != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->relation, node, "relation", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "relation");+ }++ if (node->skipData) { _fingerprintString(ctx, "skipData");+ _fingerprintString(ctx, "true");+ }++}++static void+_fingerprintReplicaIdentityStmt(FingerprintContext *ctx, const ReplicaIdentityStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "ReplicaIdentityStmt");+ if (node->identity_type != 0) {+ char str[2] = {node->identity_type, '\0'};+ _fingerprintString(ctx, "identity_type");+ _fingerprintString(ctx, str);+ }+++ if (node->name != NULL) {+ _fingerprintString(ctx, "name");+ _fingerprintString(ctx, node->name);+ }++}++static void+_fingerprintAlterSystemStmt(FingerprintContext *ctx, const AlterSystemStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "AlterSystemStmt");+ if (node->setstmt != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->setstmt, node, "setstmt", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "setstmt");+ }+}++static void+_fingerprintCreatePolicyStmt(FingerprintContext *ctx, const CreatePolicyStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "CreatePolicyStmt");++ if (node->cmd_name != NULL) {+ _fingerprintString(ctx, "cmd_name");+ _fingerprintString(ctx, node->cmd_name);+ }+++ if (node->policy_name != NULL) {+ _fingerprintString(ctx, "policy_name");+ _fingerprintString(ctx, node->policy_name);+ }++ if (node->qual != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->qual, node, "qual", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "qual");+ }+ if (node->roles != NULL && node->roles->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->roles, node, "roles", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "roles");+ }+ if (node->table != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->table, node, "table", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "table");+ }+ if (node->with_check != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->with_check, node, "with_check", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "with_check");+ }+}++static void+_fingerprintAlterPolicyStmt(FingerprintContext *ctx, const AlterPolicyStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "AlterPolicyStmt");++ if (node->policy_name != NULL) {+ _fingerprintString(ctx, "policy_name");+ _fingerprintString(ctx, node->policy_name);+ }++ if (node->qual != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->qual, node, "qual", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "qual");+ }+ if (node->roles != NULL && node->roles->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->roles, node, "roles", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "roles");+ }+ if (node->table != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->table, node, "table", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "table");+ }+ if (node->with_check != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->with_check, node, "with_check", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "with_check");+ }+}++static void+_fingerprintCreateTransformStmt(FingerprintContext *ctx, const CreateTransformStmt *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "CreateTransformStmt");+ if (node->fromsql != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->fromsql, node, "fromsql", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "fromsql");+ }++ if (node->lang != NULL) {+ _fingerprintString(ctx, "lang");+ _fingerprintString(ctx, node->lang);+ }+++ if (node->replace) { _fingerprintString(ctx, "replace");+ _fingerprintString(ctx, "true");+ }++ if (node->tosql != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->tosql, node, "tosql", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "tosql");+ }+ if (node->type_name != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->type_name, node, "type_name", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "type_name");+ }+}++static void+_fingerprintA_Expr(FingerprintContext *ctx, const A_Expr *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "A_Expr");+ if (node->kind != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->kind);+ _fingerprintString(ctx, "kind");+ _fingerprintString(ctx, buffer);+ }++ if (node->lexpr != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->lexpr, node, "lexpr", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "lexpr");+ }+ // Intentionally ignoring node->location for fingerprinting+ if (node->name != NULL && node->name->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->name, node, "name", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "name");+ }+ if (node->rexpr != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->rexpr, node, "rexpr", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "rexpr");+ }+}++static void+_fingerprintColumnRef(FingerprintContext *ctx, const ColumnRef *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "ColumnRef");+ if (node->fields != NULL && node->fields->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->fields, node, "fields", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "fields");+ }+ // Intentionally ignoring node->location for fingerprinting+}++static void+_fingerprintParamRef(FingerprintContext *ctx, const ParamRef *node, const void *parent, const char *field_name, unsigned int depth)+{+ // Intentionally ignoring all fields for fingerprinting+}++static void+_fingerprintA_Const(FingerprintContext *ctx, const A_Const *node, const void *parent, const char *field_name, unsigned int depth)+{+ // Intentionally ignoring all fields for fingerprinting+}++static void+_fingerprintFuncCall(FingerprintContext *ctx, const FuncCall *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "FuncCall");++ if (node->agg_distinct) { _fingerprintString(ctx, "agg_distinct");+ _fingerprintString(ctx, "true");+ }++ if (node->agg_filter != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->agg_filter, node, "agg_filter", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "agg_filter");+ }+ if (node->agg_order != NULL && node->agg_order->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->agg_order, node, "agg_order", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "agg_order");+ }++ if (node->agg_star) { _fingerprintString(ctx, "agg_star");+ _fingerprintString(ctx, "true");+ }+++ if (node->agg_within_group) { _fingerprintString(ctx, "agg_within_group");+ _fingerprintString(ctx, "true");+ }++ if (node->args != NULL && node->args->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->args, node, "args", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "args");+ }++ if (node->func_variadic) { _fingerprintString(ctx, "func_variadic");+ _fingerprintString(ctx, "true");+ }++ if (node->funcname != NULL && node->funcname->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->funcname, node, "funcname", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "funcname");+ }+ // Intentionally ignoring node->location for fingerprinting+ if (node->over != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->over, node, "over", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "over");+ }+}++static void+_fingerprintA_Star(FingerprintContext *ctx, const A_Star *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "A_Star");+}++static void+_fingerprintA_Indices(FingerprintContext *ctx, const A_Indices *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "A_Indices");+ if (node->lidx != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->lidx, node, "lidx", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "lidx");+ }+ if (node->uidx != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->uidx, node, "uidx", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "uidx");+ }+}++static void+_fingerprintA_Indirection(FingerprintContext *ctx, const A_Indirection *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "A_Indirection");+ if (node->arg != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->arg, node, "arg", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "arg");+ }+ if (node->indirection != NULL && node->indirection->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->indirection, node, "indirection", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "indirection");+ }+}++static void+_fingerprintA_ArrayExpr(FingerprintContext *ctx, const A_ArrayExpr *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "A_ArrayExpr");+ if (node->elements != NULL && node->elements->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->elements, node, "elements", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "elements");+ }+ // Intentionally ignoring node->location for fingerprinting+}++static void+_fingerprintResTarget(FingerprintContext *ctx, const ResTarget *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "ResTarget");+ if (node->indirection != NULL && node->indirection->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->indirection, node, "indirection", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "indirection");+ }+ // Intentionally ignoring node->location for fingerprinting+ if (node->name != NULL && (field_name == NULL || parent == NULL || !IsA(parent, SelectStmt) || strcmp(field_name, "targetList") != 0)) {+ _fingerprintString(ctx, "name");+ _fingerprintString(ctx, node->name);+ }+ if (node->val != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->val, node, "val", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "val");+ }+}++static void+_fingerprintMultiAssignRef(FingerprintContext *ctx, const MultiAssignRef *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "MultiAssignRef");+ if (node->colno != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->colno);+ _fingerprintString(ctx, "colno");+ _fingerprintString(ctx, buffer);+ }++ if (node->ncolumns != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->ncolumns);+ _fingerprintString(ctx, "ncolumns");+ _fingerprintString(ctx, buffer);+ }++ if (node->source != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->source, node, "source", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "source");+ }+}++static void+_fingerprintTypeCast(FingerprintContext *ctx, const TypeCast *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "TypeCast");+ if (node->arg != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->arg, node, "arg", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "arg");+ }+ // Intentionally ignoring node->location for fingerprinting+ if (node->typeName != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->typeName, node, "typeName", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "typeName");+ }+}++static void+_fingerprintCollateClause(FingerprintContext *ctx, const CollateClause *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "CollateClause");+ if (node->arg != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->arg, node, "arg", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "arg");+ }+ if (node->collname != NULL && node->collname->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->collname, node, "collname", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "collname");+ }+ // Intentionally ignoring node->location for fingerprinting+}++static void+_fingerprintSortBy(FingerprintContext *ctx, const SortBy *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "SortBy");+ // Intentionally ignoring node->location for fingerprinting+ if (node->node != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->node, node, "node", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "node");+ }+ if (node->sortby_dir != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->sortby_dir);+ _fingerprintString(ctx, "sortby_dir");+ _fingerprintString(ctx, buffer);+ }++ if (node->sortby_nulls != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->sortby_nulls);+ _fingerprintString(ctx, "sortby_nulls");+ _fingerprintString(ctx, buffer);+ }++ if (node->useOp != NULL && node->useOp->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->useOp, node, "useOp", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "useOp");+ }+}++static void+_fingerprintWindowDef(FingerprintContext *ctx, const WindowDef *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "WindowDef");+ if (node->endOffset != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->endOffset, node, "endOffset", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "endOffset");+ }+ if (node->frameOptions != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->frameOptions);+ _fingerprintString(ctx, "frameOptions");+ _fingerprintString(ctx, buffer);+ }++ // Intentionally ignoring node->location for fingerprinting++ if (node->name != NULL) {+ _fingerprintString(ctx, "name");+ _fingerprintString(ctx, node->name);+ }++ if (node->orderClause != NULL && node->orderClause->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->orderClause, node, "orderClause", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "orderClause");+ }+ if (node->partitionClause != NULL && node->partitionClause->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->partitionClause, node, "partitionClause", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "partitionClause");+ }++ if (node->refname != NULL) {+ _fingerprintString(ctx, "refname");+ _fingerprintString(ctx, node->refname);+ }++ if (node->startOffset != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->startOffset, node, "startOffset", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "startOffset");+ }+}++static void+_fingerprintRangeSubselect(FingerprintContext *ctx, const RangeSubselect *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "RangeSubselect");+ if (node->alias != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->alias, node, "alias", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "alias");+ }++ if (node->lateral) { _fingerprintString(ctx, "lateral");+ _fingerprintString(ctx, "true");+ }++ if (node->subquery != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->subquery, node, "subquery", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "subquery");+ }+}++static void+_fingerprintRangeFunction(FingerprintContext *ctx, const RangeFunction *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "RangeFunction");+ if (node->alias != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->alias, node, "alias", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "alias");+ }+ if (node->coldeflist != NULL && node->coldeflist->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->coldeflist, node, "coldeflist", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "coldeflist");+ }+ if (node->functions != NULL && node->functions->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->functions, node, "functions", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "functions");+ }++ if (node->is_rowsfrom) { _fingerprintString(ctx, "is_rowsfrom");+ _fingerprintString(ctx, "true");+ }+++ if (node->lateral) { _fingerprintString(ctx, "lateral");+ _fingerprintString(ctx, "true");+ }+++ if (node->ordinality) { _fingerprintString(ctx, "ordinality");+ _fingerprintString(ctx, "true");+ }++}++static void+_fingerprintRangeTableSample(FingerprintContext *ctx, const RangeTableSample *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "RangeTableSample");+ if (node->args != NULL && node->args->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->args, node, "args", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "args");+ }+ // Intentionally ignoring node->location for fingerprinting+ if (node->method != NULL && node->method->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->method, node, "method", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "method");+ }+ if (node->relation != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->relation, node, "relation", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "relation");+ }+ if (node->repeatable != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->repeatable, node, "repeatable", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "repeatable");+ }+}++static void+_fingerprintTypeName(FingerprintContext *ctx, const TypeName *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "TypeName");+ if (node->arrayBounds != NULL && node->arrayBounds->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->arrayBounds, node, "arrayBounds", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "arrayBounds");+ }+ // Intentionally ignoring node->location for fingerprinting+ if (node->names != NULL && node->names->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->names, node, "names", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "names");+ }++ if (node->pct_type) { _fingerprintString(ctx, "pct_type");+ _fingerprintString(ctx, "true");+ }+++ if (node->setof) { _fingerprintString(ctx, "setof");+ _fingerprintString(ctx, "true");+ }++ if (node->typeOid != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->typeOid);+ _fingerprintString(ctx, "typeOid");+ _fingerprintString(ctx, buffer);+ }++ if (node->typemod != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->typemod);+ _fingerprintString(ctx, "typemod");+ _fingerprintString(ctx, buffer);+ }++ if (node->typmods != NULL && node->typmods->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->typmods, node, "typmods", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "typmods");+ }+}++static void+_fingerprintColumnDef(FingerprintContext *ctx, const ColumnDef *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "ColumnDef");+ if (node->collClause != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->collClause, node, "collClause", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "collClause");+ }+ if (node->collOid != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->collOid);+ _fingerprintString(ctx, "collOid");+ _fingerprintString(ctx, buffer);+ }+++ if (node->colname != NULL) {+ _fingerprintString(ctx, "colname");+ _fingerprintString(ctx, node->colname);+ }++ if (node->constraints != NULL && node->constraints->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->constraints, node, "constraints", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "constraints");+ }+ if (node->cooked_default != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->cooked_default, node, "cooked_default", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "cooked_default");+ }+ if (node->fdwoptions != NULL && node->fdwoptions->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->fdwoptions, node, "fdwoptions", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "fdwoptions");+ }+ if (node->inhcount != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->inhcount);+ _fingerprintString(ctx, "inhcount");+ _fingerprintString(ctx, buffer);+ }+++ if (node->is_from_type) { _fingerprintString(ctx, "is_from_type");+ _fingerprintString(ctx, "true");+ }+++ if (node->is_local) { _fingerprintString(ctx, "is_local");+ _fingerprintString(ctx, "true");+ }+++ if (node->is_not_null) { _fingerprintString(ctx, "is_not_null");+ _fingerprintString(ctx, "true");+ }++ // Intentionally ignoring node->location for fingerprinting+ if (node->raw_default != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->raw_default, node, "raw_default", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "raw_default");+ }+ if (node->storage != 0) {+ char str[2] = {node->storage, '\0'};+ _fingerprintString(ctx, "storage");+ _fingerprintString(ctx, str);+ }++ if (node->typeName != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->typeName, node, "typeName", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "typeName");+ }+}++static void+_fingerprintIndexElem(FingerprintContext *ctx, const IndexElem *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "IndexElem");+ if (node->collation != NULL && node->collation->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->collation, node, "collation", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "collation");+ }+ if (node->expr != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->expr, node, "expr", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "expr");+ }++ if (node->indexcolname != NULL) {+ _fingerprintString(ctx, "indexcolname");+ _fingerprintString(ctx, node->indexcolname);+ }+++ if (node->name != NULL) {+ _fingerprintString(ctx, "name");+ _fingerprintString(ctx, node->name);+ }++ if (node->nulls_ordering != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->nulls_ordering);+ _fingerprintString(ctx, "nulls_ordering");+ _fingerprintString(ctx, buffer);+ }++ if (node->opclass != NULL && node->opclass->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->opclass, node, "opclass", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "opclass");+ }+ if (node->ordering != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->ordering);+ _fingerprintString(ctx, "ordering");+ _fingerprintString(ctx, buffer);+ }++}++static void+_fingerprintConstraint(FingerprintContext *ctx, const Constraint *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "Constraint");++ if (node->access_method != NULL) {+ _fingerprintString(ctx, "access_method");+ _fingerprintString(ctx, node->access_method);+ }+++ if (node->conname != NULL) {+ _fingerprintString(ctx, "conname");+ _fingerprintString(ctx, node->conname);+ }++ if (node->contype != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->contype);+ _fingerprintString(ctx, "contype");+ _fingerprintString(ctx, buffer);+ }+++ if (node->cooked_expr != NULL) {+ _fingerprintString(ctx, "cooked_expr");+ _fingerprintString(ctx, node->cooked_expr);+ }+++ if (node->deferrable) { _fingerprintString(ctx, "deferrable");+ _fingerprintString(ctx, "true");+ }++ if (node->exclusions != NULL && node->exclusions->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->exclusions, node, "exclusions", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "exclusions");+ }+ if (node->fk_attrs != NULL && node->fk_attrs->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->fk_attrs, node, "fk_attrs", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "fk_attrs");+ }+ if (node->fk_del_action != 0) {+ char str[2] = {node->fk_del_action, '\0'};+ _fingerprintString(ctx, "fk_del_action");+ _fingerprintString(ctx, str);+ }++ if (node->fk_matchtype != 0) {+ char str[2] = {node->fk_matchtype, '\0'};+ _fingerprintString(ctx, "fk_matchtype");+ _fingerprintString(ctx, str);+ }++ if (node->fk_upd_action != 0) {+ char str[2] = {node->fk_upd_action, '\0'};+ _fingerprintString(ctx, "fk_upd_action");+ _fingerprintString(ctx, str);+ }+++ if (node->indexname != NULL) {+ _fingerprintString(ctx, "indexname");+ _fingerprintString(ctx, node->indexname);+ }+++ if (node->indexspace != NULL) {+ _fingerprintString(ctx, "indexspace");+ _fingerprintString(ctx, node->indexspace);+ }+++ if (node->initdeferred) { _fingerprintString(ctx, "initdeferred");+ _fingerprintString(ctx, "true");+ }+++ if (node->initially_valid) { _fingerprintString(ctx, "initially_valid");+ _fingerprintString(ctx, "true");+ }+++ if (node->is_no_inherit) { _fingerprintString(ctx, "is_no_inherit");+ _fingerprintString(ctx, "true");+ }++ if (node->keys != NULL && node->keys->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->keys, node, "keys", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "keys");+ }+ // Intentionally ignoring node->location for fingerprinting+ if (node->old_conpfeqop != NULL && node->old_conpfeqop->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->old_conpfeqop, node, "old_conpfeqop", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "old_conpfeqop");+ }+ if (node->old_pktable_oid != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->old_pktable_oid);+ _fingerprintString(ctx, "old_pktable_oid");+ _fingerprintString(ctx, buffer);+ }++ if (node->options != NULL && node->options->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->options, node, "options", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "options");+ }+ if (node->pk_attrs != NULL && node->pk_attrs->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->pk_attrs, node, "pk_attrs", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "pk_attrs");+ }+ if (node->pktable != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->pktable, node, "pktable", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "pktable");+ }+ if (node->raw_expr != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->raw_expr, node, "raw_expr", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "raw_expr");+ }++ if (node->skip_validation) { _fingerprintString(ctx, "skip_validation");+ _fingerprintString(ctx, "true");+ }++ if (node->where_clause != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->where_clause, node, "where_clause", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "where_clause");+ }+}++static void+_fingerprintDefElem(FingerprintContext *ctx, const DefElem *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "DefElem");+ if (node->arg != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->arg, node, "arg", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "arg");+ }+ if (node->defaction != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->defaction);+ _fingerprintString(ctx, "defaction");+ _fingerprintString(ctx, buffer);+ }+++ if (node->defname != NULL) {+ _fingerprintString(ctx, "defname");+ _fingerprintString(ctx, node->defname);+ }+++ if (node->defnamespace != NULL) {+ _fingerprintString(ctx, "defnamespace");+ _fingerprintString(ctx, node->defnamespace);+ }++ // Intentionally ignoring node->location for fingerprinting+}++static void+_fingerprintRangeTblEntry(FingerprintContext *ctx, const RangeTblEntry *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "RangeTblEntry");+ if (node->alias != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->alias, node, "alias", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "alias");+ }+ if (node->checkAsUser != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->checkAsUser);+ _fingerprintString(ctx, "checkAsUser");+ _fingerprintString(ctx, buffer);+ }++ if (node->ctecolcollations != NULL && node->ctecolcollations->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->ctecolcollations, node, "ctecolcollations", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "ctecolcollations");+ }+ if (node->ctecoltypes != NULL && node->ctecoltypes->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->ctecoltypes, node, "ctecoltypes", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "ctecoltypes");+ }+ if (node->ctecoltypmods != NULL && node->ctecoltypmods->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->ctecoltypmods, node, "ctecoltypmods", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "ctecoltypmods");+ }+ if (node->ctelevelsup != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->ctelevelsup);+ _fingerprintString(ctx, "ctelevelsup");+ _fingerprintString(ctx, buffer);+ }+++ if (node->ctename != NULL) {+ _fingerprintString(ctx, "ctename");+ _fingerprintString(ctx, node->ctename);+ }++ if (node->eref != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->eref, node, "eref", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "eref");+ }++ if (node->funcordinality) { _fingerprintString(ctx, "funcordinality");+ _fingerprintString(ctx, "true");+ }++ if (node->functions != NULL && node->functions->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->functions, node, "functions", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "functions");+ }++ if (node->inFromCl) { _fingerprintString(ctx, "inFromCl");+ _fingerprintString(ctx, "true");+ }+++ if (node->inh) { _fingerprintString(ctx, "inh");+ _fingerprintString(ctx, "true");+ }++ if (true) {+ int x;+ Bitmapset *bms = bms_copy(node->insertedCols);++ _fingerprintString(ctx, "insertedCols");++ while ((x = bms_first_member(bms)) >= 0) {+ char buffer[50];+ sprintf(buffer, "%d", x);+ _fingerprintString(ctx, buffer);+ }++ bms_free(bms);+ }+ if (node->joinaliasvars != NULL && node->joinaliasvars->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->joinaliasvars, node, "joinaliasvars", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "joinaliasvars");+ }+ if (node->jointype != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->jointype);+ _fingerprintString(ctx, "jointype");+ _fingerprintString(ctx, buffer);+ }+++ if (node->lateral) { _fingerprintString(ctx, "lateral");+ _fingerprintString(ctx, "true");+ }++ if (node->relid != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->relid);+ _fingerprintString(ctx, "relid");+ _fingerprintString(ctx, buffer);+ }++ if (node->relkind != 0) {+ char str[2] = {node->relkind, '\0'};+ _fingerprintString(ctx, "relkind");+ _fingerprintString(ctx, str);+ }++ if (node->requiredPerms != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->requiredPerms);+ _fingerprintString(ctx, "requiredPerms");+ _fingerprintString(ctx, buffer);+ }++ if (node->rtekind != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->rtekind);+ _fingerprintString(ctx, "rtekind");+ _fingerprintString(ctx, buffer);+ }++ if (node->securityQuals != NULL && node->securityQuals->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->securityQuals, node, "securityQuals", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "securityQuals");+ }++ if (node->security_barrier) { _fingerprintString(ctx, "security_barrier");+ _fingerprintString(ctx, "true");+ }++ if (true) {+ int x;+ Bitmapset *bms = bms_copy(node->selectedCols);++ _fingerprintString(ctx, "selectedCols");++ while ((x = bms_first_member(bms)) >= 0) {+ char buffer[50];+ sprintf(buffer, "%d", x);+ _fingerprintString(ctx, buffer);+ }++ bms_free(bms);+ }++ if (node->self_reference) { _fingerprintString(ctx, "self_reference");+ _fingerprintString(ctx, "true");+ }++ if (node->subquery != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->subquery, node, "subquery", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "subquery");+ }+ if (node->tablesample != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->tablesample, node, "tablesample", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "tablesample");+ }+ if (true) {+ int x;+ Bitmapset *bms = bms_copy(node->updatedCols);++ _fingerprintString(ctx, "updatedCols");++ while ((x = bms_first_member(bms)) >= 0) {+ char buffer[50];+ sprintf(buffer, "%d", x);+ _fingerprintString(ctx, buffer);+ }++ bms_free(bms);+ }+ if (node->values_collations != NULL && node->values_collations->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->values_collations, node, "values_collations", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "values_collations");+ }+ if (node->values_lists != NULL && node->values_lists->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->values_lists, node, "values_lists", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "values_lists");+ }+}++static void+_fingerprintRangeTblFunction(FingerprintContext *ctx, const RangeTblFunction *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "RangeTblFunction");+ if (node->funccolcollations != NULL && node->funccolcollations->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->funccolcollations, node, "funccolcollations", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "funccolcollations");+ }+ if (node->funccolcount != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->funccolcount);+ _fingerprintString(ctx, "funccolcount");+ _fingerprintString(ctx, buffer);+ }++ if (node->funccolnames != NULL && node->funccolnames->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->funccolnames, node, "funccolnames", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "funccolnames");+ }+ if (node->funccoltypes != NULL && node->funccoltypes->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->funccoltypes, node, "funccoltypes", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "funccoltypes");+ }+ if (node->funccoltypmods != NULL && node->funccoltypmods->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->funccoltypmods, node, "funccoltypmods", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "funccoltypmods");+ }+ if (node->funcexpr != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->funcexpr, node, "funcexpr", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "funcexpr");+ }+ if (true) {+ int x;+ Bitmapset *bms = bms_copy(node->funcparams);++ _fingerprintString(ctx, "funcparams");++ while ((x = bms_first_member(bms)) >= 0) {+ char buffer[50];+ sprintf(buffer, "%d", x);+ _fingerprintString(ctx, buffer);+ }++ bms_free(bms);+ }+}++static void+_fingerprintTableSampleClause(FingerprintContext *ctx, const TableSampleClause *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "TableSampleClause");+ if (node->args != NULL && node->args->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->args, node, "args", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "args");+ }+ if (node->repeatable != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->repeatable, node, "repeatable", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "repeatable");+ }+ if (node->tsmhandler != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->tsmhandler);+ _fingerprintString(ctx, "tsmhandler");+ _fingerprintString(ctx, buffer);+ }++}++static void+_fingerprintWithCheckOption(FingerprintContext *ctx, const WithCheckOption *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "WithCheckOption");++ if (node->cascaded) { _fingerprintString(ctx, "cascaded");+ _fingerprintString(ctx, "true");+ }++ if (node->kind != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->kind);+ _fingerprintString(ctx, "kind");+ _fingerprintString(ctx, buffer);+ }+++ if (node->polname != NULL) {+ _fingerprintString(ctx, "polname");+ _fingerprintString(ctx, node->polname);+ }++ if (node->qual != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->qual, node, "qual", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "qual");+ }++ if (node->relname != NULL) {+ _fingerprintString(ctx, "relname");+ _fingerprintString(ctx, node->relname);+ }++}++static void+_fingerprintSortGroupClause(FingerprintContext *ctx, const SortGroupClause *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "SortGroupClause");+ if (node->eqop != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->eqop);+ _fingerprintString(ctx, "eqop");+ _fingerprintString(ctx, buffer);+ }+++ if (node->hashable) { _fingerprintString(ctx, "hashable");+ _fingerprintString(ctx, "true");+ }+++ if (node->nulls_first) { _fingerprintString(ctx, "nulls_first");+ _fingerprintString(ctx, "true");+ }++ if (node->sortop != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->sortop);+ _fingerprintString(ctx, "sortop");+ _fingerprintString(ctx, buffer);+ }++ if (node->tleSortGroupRef != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->tleSortGroupRef);+ _fingerprintString(ctx, "tleSortGroupRef");+ _fingerprintString(ctx, buffer);+ }++}++static void+_fingerprintGroupingSet(FingerprintContext *ctx, const GroupingSet *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "GroupingSet");+ if (node->content != NULL && node->content->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->content, node, "content", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "content");+ }+ if (node->kind != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->kind);+ _fingerprintString(ctx, "kind");+ _fingerprintString(ctx, buffer);+ }++ // Intentionally ignoring node->location for fingerprinting+}++static void+_fingerprintWindowClause(FingerprintContext *ctx, const WindowClause *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "WindowClause");++ if (node->copiedOrder) { _fingerprintString(ctx, "copiedOrder");+ _fingerprintString(ctx, "true");+ }++ if (node->endOffset != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->endOffset, node, "endOffset", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "endOffset");+ }+ if (node->frameOptions != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->frameOptions);+ _fingerprintString(ctx, "frameOptions");+ _fingerprintString(ctx, buffer);+ }+++ if (node->name != NULL) {+ _fingerprintString(ctx, "name");+ _fingerprintString(ctx, node->name);+ }++ if (node->orderClause != NULL && node->orderClause->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->orderClause, node, "orderClause", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "orderClause");+ }+ if (node->partitionClause != NULL && node->partitionClause->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->partitionClause, node, "partitionClause", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "partitionClause");+ }++ if (node->refname != NULL) {+ _fingerprintString(ctx, "refname");+ _fingerprintString(ctx, node->refname);+ }++ if (node->startOffset != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->startOffset, node, "startOffset", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "startOffset");+ }+ if (node->winref != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->winref);+ _fingerprintString(ctx, "winref");+ _fingerprintString(ctx, buffer);+ }++}++static void+_fingerprintFuncWithArgs(FingerprintContext *ctx, const FuncWithArgs *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "FuncWithArgs");+ if (node->funcargs != NULL && node->funcargs->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->funcargs, node, "funcargs", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "funcargs");+ }+ if (node->funcname != NULL && node->funcname->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->funcname, node, "funcname", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "funcname");+ }+}++static void+_fingerprintAccessPriv(FingerprintContext *ctx, const AccessPriv *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "AccessPriv");+ if (node->cols != NULL && node->cols->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->cols, node, "cols", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "cols");+ }++ if (node->priv_name != NULL) {+ _fingerprintString(ctx, "priv_name");+ _fingerprintString(ctx, node->priv_name);+ }++}++static void+_fingerprintCreateOpClassItem(FingerprintContext *ctx, const CreateOpClassItem *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "CreateOpClassItem");+ if (node->args != NULL && node->args->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->args, node, "args", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "args");+ }+ if (node->class_args != NULL && node->class_args->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->class_args, node, "class_args", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "class_args");+ }+ if (node->itemtype != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->itemtype);+ _fingerprintString(ctx, "itemtype");+ _fingerprintString(ctx, buffer);+ }++ if (node->name != NULL && node->name->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->name, node, "name", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "name");+ }+ if (node->number != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->number);+ _fingerprintString(ctx, "number");+ _fingerprintString(ctx, buffer);+ }++ if (node->order_family != NULL && node->order_family->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->order_family, node, "order_family", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "order_family");+ }+ if (node->storedtype != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->storedtype, node, "storedtype", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "storedtype");+ }+}++static void+_fingerprintTableLikeClause(FingerprintContext *ctx, const TableLikeClause *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "TableLikeClause");+ if (node->options != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->options);+ _fingerprintString(ctx, "options");+ _fingerprintString(ctx, buffer);+ }++ if (node->relation != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->relation, node, "relation", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "relation");+ }+}++static void+_fingerprintFunctionParameter(FingerprintContext *ctx, const FunctionParameter *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "FunctionParameter");+ if (node->argType != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->argType, node, "argType", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "argType");+ }+ if (node->defexpr != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->defexpr, node, "defexpr", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "defexpr");+ }+ if (node->mode != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->mode);+ _fingerprintString(ctx, "mode");+ _fingerprintString(ctx, buffer);+ }+++ if (node->name != NULL) {+ _fingerprintString(ctx, "name");+ _fingerprintString(ctx, node->name);+ }++}++static void+_fingerprintLockingClause(FingerprintContext *ctx, const LockingClause *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "LockingClause");+ if (node->lockedRels != NULL && node->lockedRels->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->lockedRels, node, "lockedRels", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "lockedRels");+ }+ if (node->strength != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->strength);+ _fingerprintString(ctx, "strength");+ _fingerprintString(ctx, buffer);+ }++ if (node->waitPolicy != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->waitPolicy);+ _fingerprintString(ctx, "waitPolicy");+ _fingerprintString(ctx, buffer);+ }++}++static void+_fingerprintRowMarkClause(FingerprintContext *ctx, const RowMarkClause *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "RowMarkClause");++ if (node->pushedDown) { _fingerprintString(ctx, "pushedDown");+ _fingerprintString(ctx, "true");+ }++ if (node->rti != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->rti);+ _fingerprintString(ctx, "rti");+ _fingerprintString(ctx, buffer);+ }++ if (node->strength != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->strength);+ _fingerprintString(ctx, "strength");+ _fingerprintString(ctx, buffer);+ }++ if (node->waitPolicy != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->waitPolicy);+ _fingerprintString(ctx, "waitPolicy");+ _fingerprintString(ctx, buffer);+ }++}++static void+_fingerprintXmlSerialize(FingerprintContext *ctx, const XmlSerialize *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "XmlSerialize");+ if (node->expr != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->expr, node, "expr", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "expr");+ }+ // Intentionally ignoring node->location for fingerprinting+ if (node->typeName != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->typeName, node, "typeName", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "typeName");+ }+ if (node->xmloption != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->xmloption);+ _fingerprintString(ctx, "xmloption");+ _fingerprintString(ctx, buffer);+ }++}++static void+_fingerprintWithClause(FingerprintContext *ctx, const WithClause *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "WithClause");+ if (node->ctes != NULL && node->ctes->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->ctes, node, "ctes", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "ctes");+ }+ // Intentionally ignoring node->location for fingerprinting++ if (node->recursive) { _fingerprintString(ctx, "recursive");+ _fingerprintString(ctx, "true");+ }++}++static void+_fingerprintInferClause(FingerprintContext *ctx, const InferClause *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "InferClause");++ if (node->conname != NULL) {+ _fingerprintString(ctx, "conname");+ _fingerprintString(ctx, node->conname);+ }++ if (node->indexElems != NULL && node->indexElems->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->indexElems, node, "indexElems", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "indexElems");+ }+ // Intentionally ignoring node->location for fingerprinting+ if (node->whereClause != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->whereClause, node, "whereClause", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "whereClause");+ }+}++static void+_fingerprintOnConflictClause(FingerprintContext *ctx, const OnConflictClause *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "OnConflictClause");+ if (node->action != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->action);+ _fingerprintString(ctx, "action");+ _fingerprintString(ctx, buffer);+ }++ if (node->infer != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->infer, node, "infer", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "infer");+ }+ // Intentionally ignoring node->location for fingerprinting+ if (node->targetList != NULL && node->targetList->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->targetList, node, "targetList", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "targetList");+ }+ if (node->whereClause != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->whereClause, node, "whereClause", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "whereClause");+ }+}++static void+_fingerprintCommonTableExpr(FingerprintContext *ctx, const CommonTableExpr *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "CommonTableExpr");+ if (node->aliascolnames != NULL && node->aliascolnames->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->aliascolnames, node, "aliascolnames", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "aliascolnames");+ }+ if (node->ctecolcollations != NULL && node->ctecolcollations->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->ctecolcollations, node, "ctecolcollations", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "ctecolcollations");+ }+ if (node->ctecolnames != NULL && node->ctecolnames->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->ctecolnames, node, "ctecolnames", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "ctecolnames");+ }+ if (node->ctecoltypes != NULL && node->ctecoltypes->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->ctecoltypes, node, "ctecoltypes", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "ctecoltypes");+ }+ if (node->ctecoltypmods != NULL && node->ctecoltypmods->length > 0) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->ctecoltypmods, node, "ctecoltypmods", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "ctecoltypmods");+ }++ if (node->ctename != NULL) {+ _fingerprintString(ctx, "ctename");+ _fingerprintString(ctx, node->ctename);+ }++ if (node->ctequery != NULL) {+ FingerprintContext subCtx;+ _fingerprintInitForTokens(&subCtx);+ _fingerprintNode(&subCtx, node->ctequery, node, "ctequery", depth + 1);+ _fingerprintCopyTokens(&subCtx, ctx, "ctequery");+ }++ if (node->cterecursive) { _fingerprintString(ctx, "cterecursive");+ _fingerprintString(ctx, "true");+ }++ if (node->cterefcount != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->cterefcount);+ _fingerprintString(ctx, "cterefcount");+ _fingerprintString(ctx, buffer);+ }++ // Intentionally ignoring node->location for fingerprinting+}++static void+_fingerprintRoleSpec(FingerprintContext *ctx, const RoleSpec *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "RoleSpec");+ // Intentionally ignoring node->location for fingerprinting++ if (node->rolename != NULL) {+ _fingerprintString(ctx, "rolename");+ _fingerprintString(ctx, node->rolename);+ }++ if (node->roletype != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->roletype);+ _fingerprintString(ctx, "roletype");+ _fingerprintString(ctx, buffer);+ }++}++static void+_fingerprintInlineCodeBlock(FingerprintContext *ctx, const InlineCodeBlock *node, const void *parent, const char *field_name, unsigned int depth)+{+ _fingerprintString(ctx, "InlineCodeBlock");++ if (node->langIsTrusted) { _fingerprintString(ctx, "langIsTrusted");+ _fingerprintString(ctx, "true");+ }++ if (node->langOid != 0) {+ char buffer[50];+ sprintf(buffer, "%d", node->langOid);+ _fingerprintString(ctx, "langOid");+ _fingerprintString(ctx, buffer);+ }+++ if (node->source_text != NULL) {+ _fingerprintString(ctx, "source_text");+ _fingerprintString(ctx, node->source_text);+ }++}+
+ foreign/libpg_query/src/pg_query_internal.h view
@@ -0,0 +1,24 @@+#ifndef PG_QUERY_INTERNAL_H+#define PG_QUERY_INTERNAL_H++#include "postgres.h"+#include "utils/memutils.h"+#include "nodes/pg_list.h"++#define STDERR_BUFFER_LEN 4096+#define DEBUG++typedef struct {+ List *tree;+ char* stderr_buffer;+ PgQueryError* error;+} PgQueryInternalParsetreeAndError;++PgQueryInternalParsetreeAndError pg_query_raw_parse(const char* input);++void pg_query_free_error(PgQueryError *error);++MemoryContext pg_query_enter_memory_context(const char* ctx_name);+void pg_query_exit_memory_context(MemoryContext ctx);++#endif
+ foreign/libpg_query/src/pg_query_json.c view
@@ -0,0 +1,227 @@+#include "pg_query_json.h"++#include "postgres.h"++#include <ctype.h>++#include "nodes/plannodes.h"+#include "nodes/relation.h"+#include "utils/datum.h"++static void _outNode(StringInfo str, const void *obj);++#include "pg_query_json_helper.c"++#define WRITE_NODE_FIELD(fldname) \+ if (true) { \+ appendStringInfo(str, "\"" CppAsString(fldname) "\": "); \+ _outNode(str, &node->fldname); \+ appendStringInfo(str, ", "); \+ }++#define WRITE_NODE_FIELD_WITH_TYPE(fldname, typename) \+ if (true) { \+ appendStringInfo(str, "\"" CppAsString(fldname) "\": {"); \+ _out##typename(str, (const typename *) &node->fldname); \+ removeTrailingDelimiter(str); \+ appendStringInfo(str, "}}, "); \+ }++#define WRITE_NODE_PTR_FIELD(fldname) \+ if (node->fldname != NULL) { \+ appendStringInfo(str, "\"" CppAsString(fldname) "\": "); \+ _outNode(str, node->fldname); \+ appendStringInfo(str, ", "); \+ }++#define WRITE_BITMAPSET_FIELD(fldname) \+ (appendStringInfo(str, "\"" CppAsString(fldname) "\": "), \+ _outBitmapset(str, node->fldname), \+ appendStringInfo(str, ", "))+++static void+_outList(StringInfo str, const List *node)+{+ const ListCell *lc;++ // Simple lists are frequent structures - we don't make them into full nodes to avoid super-verbose output+ appendStringInfoChar(str, '[');++ foreach(lc, node)+ {+ _outNode(str, lfirst(lc));++ if (lnext(lc))+ appendStringInfoString(str, ", ");+ }++ appendStringInfoChar(str, ']');+}++static void+_outIntList(StringInfo str, const List *node)+{+ const ListCell *lc;++ WRITE_NODE_TYPE("IntList");+ appendStringInfo(str, "\"items\": ");+ appendStringInfoChar(str, '[');++ foreach(lc, node)+ {+ appendStringInfo(str, " %d", lfirst_int(lc));++ if (lnext(lc))+ appendStringInfoString(str, ", ");+ }++ appendStringInfoChar(str, ']');+ appendStringInfo(str, ", ");+}++static void+_outOidList(StringInfo str, const List *node)+{+ const ListCell *lc;++ WRITE_NODE_TYPE("OidList");+ appendStringInfo(str, "\"items\": ");+ appendStringInfoChar(str, '[');++ foreach(lc, node)+ {+ appendStringInfo(str, " %u", lfirst_oid(lc));++ if (lnext(lc))+ appendStringInfoString(str, ", ");+ }++ appendStringInfoChar(str, ']');+ appendStringInfo(str, ", ");+}++static void+_outBitmapset(StringInfo str, const Bitmapset *bms)+{+ Bitmapset *tmpset;+ int x;++ appendStringInfoChar(str, '[');+ /*appendStringInfoChar(str, 'b');*/+ tmpset = bms_copy(bms);+ while ((x = bms_first_member(tmpset)) >= 0)+ appendStringInfo(str, "%d, ", x);+ bms_free(tmpset);+ removeTrailingDelimiter(str);+ appendStringInfoChar(str, ']');+}++static void+_outInteger(StringInfo str, const Value *node)+{+ WRITE_NODE_TYPE("Integer");+ appendStringInfo(str, "\"ival\": %ld, ", node->val.ival);+}++static void+_outFloat(StringInfo str, const Value *node)+{+ WRITE_NODE_TYPE("Float");+ appendStringInfo(str, "\"str\": ");+ _outToken(str, node->val.str);+ appendStringInfo(str, ", ");+}++static void+_outString(StringInfo str, const Value *node)+{+ WRITE_NODE_TYPE("String");+ appendStringInfo(str, "\"str\": ");+ _outToken(str, node->val.str);+ appendStringInfo(str, ", ");+}++static void+_outBitString(StringInfo str, const Value *node)+{+ WRITE_NODE_TYPE("BitString");+ appendStringInfo(str, "\"str\": ");+ _outToken(str, node->val.str);+ appendStringInfo(str, ", ");+}++static void+_outNull(StringInfo str, const Value *node)+{+ WRITE_NODE_TYPE("Null");+}++#include "pg_query_json_defs.c"++static void+_outNode(StringInfo str, const void *obj)+{+ if (obj == NULL)+ {+ appendStringInfoString(str, "null");+ }+ else if (IsA(obj, List))+ {+ _outList(str, obj);+ }+ else+ {+ appendStringInfoChar(str, '{');+ switch (nodeTag(obj))+ {+ case T_Integer:+ _outInteger(str, obj);+ break;+ case T_Float:+ _outFloat(str, obj);+ break;+ case T_String:+ _outString(str, obj);+ break;+ case T_BitString:+ _outBitString(str, obj);+ break;+ case T_Null:+ _outNull(str, obj);+ break;+ case T_IntList:+ _outIntList(str, obj);+ break;+ case T_OidList:+ _outOidList(str, obj);+ break;++ #include "pg_query_json_conds.c"++ default:+ elog(WARNING, "could not dump unrecognized node type: %d",+ (int) nodeTag(obj));++ appendStringInfo(str, "}");+ return;+ }+ removeTrailingDelimiter(str);+ appendStringInfo(str, "}}");+ }+}++char *+pg_query_nodes_to_json(const void *obj)+{+ StringInfoData str;++ initStringInfo(&str);++ if (obj == NULL) /* Make sure we generate valid JSON for empty queries */+ appendStringInfoString(&str, "[]");+ else+ _outNode(&str, obj);++ return str.data;+}
+ foreign/libpg_query/src/pg_query_json.h view
@@ -0,0 +1,6 @@+#ifndef PG_QUERY_JSON_H+#define PG_QUERY_JSON_H++char *pg_query_nodes_to_json(const void *obj);++#endif
+ foreign/libpg_query/src/pg_query_json_conds.c view
@@ -0,0 +1,576 @@+case T_Alias:+ _outAlias(str, obj);+ break;+case T_RangeVar:+ _outRangeVar(str, obj);+ break;+case T_Var:+ _outVar(str, obj);+ break;+case T_Param:+ _outParam(str, obj);+ break;+case T_Aggref:+ _outAggref(str, obj);+ break;+case T_GroupingFunc:+ _outGroupingFunc(str, obj);+ break;+case T_WindowFunc:+ _outWindowFunc(str, obj);+ break;+case T_ArrayRef:+ _outArrayRef(str, obj);+ break;+case T_FuncExpr:+ _outFuncExpr(str, obj);+ break;+case T_NamedArgExpr:+ _outNamedArgExpr(str, obj);+ break;+case T_OpExpr:+ _outOpExpr(str, obj);+ break;+case T_DistinctExpr:+ _outDistinctExpr(str, obj);+ break;+case T_NullIfExpr:+ _outNullIfExpr(str, obj);+ break;+case T_ScalarArrayOpExpr:+ _outScalarArrayOpExpr(str, obj);+ break;+case T_BoolExpr:+ _outBoolExpr(str, obj);+ break;+case T_SubLink:+ _outSubLink(str, obj);+ break;+case T_SubPlan:+ _outSubPlan(str, obj);+ break;+case T_AlternativeSubPlan:+ _outAlternativeSubPlan(str, obj);+ break;+case T_FieldSelect:+ _outFieldSelect(str, obj);+ break;+case T_FieldStore:+ _outFieldStore(str, obj);+ break;+case T_RelabelType:+ _outRelabelType(str, obj);+ break;+case T_CoerceViaIO:+ _outCoerceViaIO(str, obj);+ break;+case T_ArrayCoerceExpr:+ _outArrayCoerceExpr(str, obj);+ break;+case T_ConvertRowtypeExpr:+ _outConvertRowtypeExpr(str, obj);+ break;+case T_CollateExpr:+ _outCollateExpr(str, obj);+ break;+case T_CaseExpr:+ _outCaseExpr(str, obj);+ break;+case T_CaseWhen:+ _outCaseWhen(str, obj);+ break;+case T_CaseTestExpr:+ _outCaseTestExpr(str, obj);+ break;+case T_ArrayExpr:+ _outArrayExpr(str, obj);+ break;+case T_RowExpr:+ _outRowExpr(str, obj);+ break;+case T_RowCompareExpr:+ _outRowCompareExpr(str, obj);+ break;+case T_CoalesceExpr:+ _outCoalesceExpr(str, obj);+ break;+case T_MinMaxExpr:+ _outMinMaxExpr(str, obj);+ break;+case T_XmlExpr:+ _outXmlExpr(str, obj);+ break;+case T_NullTest:+ _outNullTest(str, obj);+ break;+case T_BooleanTest:+ _outBooleanTest(str, obj);+ break;+case T_CoerceToDomain:+ _outCoerceToDomain(str, obj);+ break;+case T_CoerceToDomainValue:+ _outCoerceToDomainValue(str, obj);+ break;+case T_SetToDefault:+ _outSetToDefault(str, obj);+ break;+case T_CurrentOfExpr:+ _outCurrentOfExpr(str, obj);+ break;+case T_InferenceElem:+ _outInferenceElem(str, obj);+ break;+case T_TargetEntry:+ _outTargetEntry(str, obj);+ break;+case T_RangeTblRef:+ _outRangeTblRef(str, obj);+ break;+case T_JoinExpr:+ _outJoinExpr(str, obj);+ break;+case T_FromExpr:+ _outFromExpr(str, obj);+ break;+case T_OnConflictExpr:+ _outOnConflictExpr(str, obj);+ break;+case T_IntoClause:+ _outIntoClause(str, obj);+ break;+case T_Query:+ _outQuery(str, obj);+ break;+case T_InsertStmt:+ _outInsertStmt(str, obj);+ break;+case T_DeleteStmt:+ _outDeleteStmt(str, obj);+ break;+case T_UpdateStmt:+ _outUpdateStmt(str, obj);+ break;+case T_SelectStmt:+ _outSelectStmt(str, obj);+ break;+case T_AlterTableStmt:+ _outAlterTableStmt(str, obj);+ break;+case T_AlterTableCmd:+ _outAlterTableCmd(str, obj);+ break;+case T_AlterDomainStmt:+ _outAlterDomainStmt(str, obj);+ break;+case T_SetOperationStmt:+ _outSetOperationStmt(str, obj);+ break;+case T_GrantStmt:+ _outGrantStmt(str, obj);+ break;+case T_GrantRoleStmt:+ _outGrantRoleStmt(str, obj);+ break;+case T_AlterDefaultPrivilegesStmt:+ _outAlterDefaultPrivilegesStmt(str, obj);+ break;+case T_ClosePortalStmt:+ _outClosePortalStmt(str, obj);+ break;+case T_ClusterStmt:+ _outClusterStmt(str, obj);+ break;+case T_CopyStmt:+ _outCopyStmt(str, obj);+ break;+case T_CreateStmt:+ _outCreateStmt(str, obj);+ break;+case T_DefineStmt:+ _outDefineStmt(str, obj);+ break;+case T_DropStmt:+ _outDropStmt(str, obj);+ break;+case T_TruncateStmt:+ _outTruncateStmt(str, obj);+ break;+case T_CommentStmt:+ _outCommentStmt(str, obj);+ break;+case T_FetchStmt:+ _outFetchStmt(str, obj);+ break;+case T_IndexStmt:+ _outIndexStmt(str, obj);+ break;+case T_CreateFunctionStmt:+ _outCreateFunctionStmt(str, obj);+ break;+case T_AlterFunctionStmt:+ _outAlterFunctionStmt(str, obj);+ break;+case T_DoStmt:+ _outDoStmt(str, obj);+ break;+case T_RenameStmt:+ _outRenameStmt(str, obj);+ break;+case T_RuleStmt:+ _outRuleStmt(str, obj);+ break;+case T_NotifyStmt:+ _outNotifyStmt(str, obj);+ break;+case T_ListenStmt:+ _outListenStmt(str, obj);+ break;+case T_UnlistenStmt:+ _outUnlistenStmt(str, obj);+ break;+case T_TransactionStmt:+ _outTransactionStmt(str, obj);+ break;+case T_ViewStmt:+ _outViewStmt(str, obj);+ break;+case T_LoadStmt:+ _outLoadStmt(str, obj);+ break;+case T_CreateDomainStmt:+ _outCreateDomainStmt(str, obj);+ break;+case T_CreatedbStmt:+ _outCreatedbStmt(str, obj);+ break;+case T_DropdbStmt:+ _outDropdbStmt(str, obj);+ break;+case T_VacuumStmt:+ _outVacuumStmt(str, obj);+ break;+case T_ExplainStmt:+ _outExplainStmt(str, obj);+ break;+case T_CreateTableAsStmt:+ _outCreateTableAsStmt(str, obj);+ break;+case T_CreateSeqStmt:+ _outCreateSeqStmt(str, obj);+ break;+case T_AlterSeqStmt:+ _outAlterSeqStmt(str, obj);+ break;+case T_VariableSetStmt:+ _outVariableSetStmt(str, obj);+ break;+case T_VariableShowStmt:+ _outVariableShowStmt(str, obj);+ break;+case T_DiscardStmt:+ _outDiscardStmt(str, obj);+ break;+case T_CreateTrigStmt:+ _outCreateTrigStmt(str, obj);+ break;+case T_CreatePLangStmt:+ _outCreatePLangStmt(str, obj);+ break;+case T_CreateRoleStmt:+ _outCreateRoleStmt(str, obj);+ break;+case T_AlterRoleStmt:+ _outAlterRoleStmt(str, obj);+ break;+case T_DropRoleStmt:+ _outDropRoleStmt(str, obj);+ break;+case T_LockStmt:+ _outLockStmt(str, obj);+ break;+case T_ConstraintsSetStmt:+ _outConstraintsSetStmt(str, obj);+ break;+case T_ReindexStmt:+ _outReindexStmt(str, obj);+ break;+case T_CheckPointStmt:+ _outCheckPointStmt(str, obj);+ break;+case T_CreateSchemaStmt:+ _outCreateSchemaStmt(str, obj);+ break;+case T_AlterDatabaseStmt:+ _outAlterDatabaseStmt(str, obj);+ break;+case T_AlterDatabaseSetStmt:+ _outAlterDatabaseSetStmt(str, obj);+ break;+case T_AlterRoleSetStmt:+ _outAlterRoleSetStmt(str, obj);+ break;+case T_CreateConversionStmt:+ _outCreateConversionStmt(str, obj);+ break;+case T_CreateCastStmt:+ _outCreateCastStmt(str, obj);+ break;+case T_CreateOpClassStmt:+ _outCreateOpClassStmt(str, obj);+ break;+case T_CreateOpFamilyStmt:+ _outCreateOpFamilyStmt(str, obj);+ break;+case T_AlterOpFamilyStmt:+ _outAlterOpFamilyStmt(str, obj);+ break;+case T_PrepareStmt:+ _outPrepareStmt(str, obj);+ break;+case T_ExecuteStmt:+ _outExecuteStmt(str, obj);+ break;+case T_DeallocateStmt:+ _outDeallocateStmt(str, obj);+ break;+case T_DeclareCursorStmt:+ _outDeclareCursorStmt(str, obj);+ break;+case T_CreateTableSpaceStmt:+ _outCreateTableSpaceStmt(str, obj);+ break;+case T_DropTableSpaceStmt:+ _outDropTableSpaceStmt(str, obj);+ break;+case T_AlterObjectSchemaStmt:+ _outAlterObjectSchemaStmt(str, obj);+ break;+case T_AlterOwnerStmt:+ _outAlterOwnerStmt(str, obj);+ break;+case T_DropOwnedStmt:+ _outDropOwnedStmt(str, obj);+ break;+case T_ReassignOwnedStmt:+ _outReassignOwnedStmt(str, obj);+ break;+case T_CompositeTypeStmt:+ _outCompositeTypeStmt(str, obj);+ break;+case T_CreateEnumStmt:+ _outCreateEnumStmt(str, obj);+ break;+case T_CreateRangeStmt:+ _outCreateRangeStmt(str, obj);+ break;+case T_AlterEnumStmt:+ _outAlterEnumStmt(str, obj);+ break;+case T_AlterTSDictionaryStmt:+ _outAlterTSDictionaryStmt(str, obj);+ break;+case T_AlterTSConfigurationStmt:+ _outAlterTSConfigurationStmt(str, obj);+ break;+case T_CreateFdwStmt:+ _outCreateFdwStmt(str, obj);+ break;+case T_AlterFdwStmt:+ _outAlterFdwStmt(str, obj);+ break;+case T_CreateForeignServerStmt:+ _outCreateForeignServerStmt(str, obj);+ break;+case T_AlterForeignServerStmt:+ _outAlterForeignServerStmt(str, obj);+ break;+case T_CreateUserMappingStmt:+ _outCreateUserMappingStmt(str, obj);+ break;+case T_AlterUserMappingStmt:+ _outAlterUserMappingStmt(str, obj);+ break;+case T_DropUserMappingStmt:+ _outDropUserMappingStmt(str, obj);+ break;+case T_AlterTableSpaceOptionsStmt:+ _outAlterTableSpaceOptionsStmt(str, obj);+ break;+case T_AlterTableMoveAllStmt:+ _outAlterTableMoveAllStmt(str, obj);+ break;+case T_SecLabelStmt:+ _outSecLabelStmt(str, obj);+ break;+case T_CreateForeignTableStmt:+ _outCreateForeignTableStmt(str, obj);+ break;+case T_ImportForeignSchemaStmt:+ _outImportForeignSchemaStmt(str, obj);+ break;+case T_CreateExtensionStmt:+ _outCreateExtensionStmt(str, obj);+ break;+case T_AlterExtensionStmt:+ _outAlterExtensionStmt(str, obj);+ break;+case T_AlterExtensionContentsStmt:+ _outAlterExtensionContentsStmt(str, obj);+ break;+case T_CreateEventTrigStmt:+ _outCreateEventTrigStmt(str, obj);+ break;+case T_AlterEventTrigStmt:+ _outAlterEventTrigStmt(str, obj);+ break;+case T_RefreshMatViewStmt:+ _outRefreshMatViewStmt(str, obj);+ break;+case T_ReplicaIdentityStmt:+ _outReplicaIdentityStmt(str, obj);+ break;+case T_AlterSystemStmt:+ _outAlterSystemStmt(str, obj);+ break;+case T_CreatePolicyStmt:+ _outCreatePolicyStmt(str, obj);+ break;+case T_AlterPolicyStmt:+ _outAlterPolicyStmt(str, obj);+ break;+case T_CreateTransformStmt:+ _outCreateTransformStmt(str, obj);+ break;+case T_A_Expr:+ _outA_Expr(str, obj);+ break;+case T_ColumnRef:+ _outColumnRef(str, obj);+ break;+case T_ParamRef:+ _outParamRef(str, obj);+ break;+case T_A_Const:+ _outA_Const(str, obj);+ break;+case T_FuncCall:+ _outFuncCall(str, obj);+ break;+case T_A_Star:+ _outA_Star(str, obj);+ break;+case T_A_Indices:+ _outA_Indices(str, obj);+ break;+case T_A_Indirection:+ _outA_Indirection(str, obj);+ break;+case T_A_ArrayExpr:+ _outA_ArrayExpr(str, obj);+ break;+case T_ResTarget:+ _outResTarget(str, obj);+ break;+case T_MultiAssignRef:+ _outMultiAssignRef(str, obj);+ break;+case T_TypeCast:+ _outTypeCast(str, obj);+ break;+case T_CollateClause:+ _outCollateClause(str, obj);+ break;+case T_SortBy:+ _outSortBy(str, obj);+ break;+case T_WindowDef:+ _outWindowDef(str, obj);+ break;+case T_RangeSubselect:+ _outRangeSubselect(str, obj);+ break;+case T_RangeFunction:+ _outRangeFunction(str, obj);+ break;+case T_RangeTableSample:+ _outRangeTableSample(str, obj);+ break;+case T_TypeName:+ _outTypeName(str, obj);+ break;+case T_ColumnDef:+ _outColumnDef(str, obj);+ break;+case T_IndexElem:+ _outIndexElem(str, obj);+ break;+case T_Constraint:+ _outConstraint(str, obj);+ break;+case T_DefElem:+ _outDefElem(str, obj);+ break;+case T_RangeTblEntry:+ _outRangeTblEntry(str, obj);+ break;+case T_RangeTblFunction:+ _outRangeTblFunction(str, obj);+ break;+case T_TableSampleClause:+ _outTableSampleClause(str, obj);+ break;+case T_WithCheckOption:+ _outWithCheckOption(str, obj);+ break;+case T_SortGroupClause:+ _outSortGroupClause(str, obj);+ break;+case T_GroupingSet:+ _outGroupingSet(str, obj);+ break;+case T_WindowClause:+ _outWindowClause(str, obj);+ break;+case T_FuncWithArgs:+ _outFuncWithArgs(str, obj);+ break;+case T_AccessPriv:+ _outAccessPriv(str, obj);+ break;+case T_CreateOpClassItem:+ _outCreateOpClassItem(str, obj);+ break;+case T_TableLikeClause:+ _outTableLikeClause(str, obj);+ break;+case T_FunctionParameter:+ _outFunctionParameter(str, obj);+ break;+case T_LockingClause:+ _outLockingClause(str, obj);+ break;+case T_RowMarkClause:+ _outRowMarkClause(str, obj);+ break;+case T_XmlSerialize:+ _outXmlSerialize(str, obj);+ break;+case T_WithClause:+ _outWithClause(str, obj);+ break;+case T_InferClause:+ _outInferClause(str, obj);+ break;+case T_OnConflictClause:+ _outOnConflictClause(str, obj);+ break;+case T_CommonTableExpr:+ _outCommonTableExpr(str, obj);+ break;+case T_RoleSpec:+ _outRoleSpec(str, obj);+ break;+case T_InlineCodeBlock:+ _outInlineCodeBlock(str, obj);+ break;
+ foreign/libpg_query/src/pg_query_json_defs.c view
@@ -0,0 +1,2298 @@+static void+_outAlias(StringInfo str, const Alias *node)+{+ WRITE_NODE_TYPE("Alias");++ WRITE_STRING_FIELD(aliasname);+ WRITE_NODE_PTR_FIELD(colnames);+}++static void+_outRangeVar(StringInfo str, const RangeVar *node)+{+ WRITE_NODE_TYPE("RangeVar");++ WRITE_STRING_FIELD(schemaname);+ WRITE_STRING_FIELD(relname);+ WRITE_ENUM_FIELD(inhOpt);+ WRITE_CHAR_FIELD(relpersistence);+ WRITE_NODE_PTR_FIELD(alias);+ WRITE_INT_FIELD(location);+}++static void+_outVar(StringInfo str, const Var *node)+{+ WRITE_NODE_TYPE("Var");++ WRITE_UINT_FIELD(varno);+ WRITE_INT_FIELD(varattno);+ WRITE_UINT_FIELD(vartype);+ WRITE_INT_FIELD(vartypmod);+ WRITE_UINT_FIELD(varcollid);+ WRITE_UINT_FIELD(varlevelsup);+ WRITE_UINT_FIELD(varnoold);+ WRITE_INT_FIELD(varoattno);+ WRITE_INT_FIELD(location);+}++static void+_outParam(StringInfo str, const Param *node)+{+ WRITE_NODE_TYPE("Param");++ WRITE_ENUM_FIELD(paramkind);+ WRITE_INT_FIELD(paramid);+ WRITE_UINT_FIELD(paramtype);+ WRITE_INT_FIELD(paramtypmod);+ WRITE_UINT_FIELD(paramcollid);+ WRITE_INT_FIELD(location);+}++static void+_outAggref(StringInfo str, const Aggref *node)+{+ WRITE_NODE_TYPE("Aggref");++ WRITE_UINT_FIELD(aggfnoid);+ WRITE_UINT_FIELD(aggtype);+ WRITE_UINT_FIELD(aggcollid);+ WRITE_UINT_FIELD(inputcollid);+ WRITE_NODE_PTR_FIELD(aggdirectargs);+ WRITE_NODE_PTR_FIELD(args);+ WRITE_NODE_PTR_FIELD(aggorder);+ WRITE_NODE_PTR_FIELD(aggdistinct);+ WRITE_NODE_PTR_FIELD(aggfilter);+ WRITE_BOOL_FIELD(aggstar);+ WRITE_BOOL_FIELD(aggvariadic);+ WRITE_CHAR_FIELD(aggkind);+ WRITE_UINT_FIELD(agglevelsup);+ WRITE_INT_FIELD(location);+}++static void+_outGroupingFunc(StringInfo str, const GroupingFunc *node)+{+ WRITE_NODE_TYPE("GroupingFunc");++ WRITE_NODE_PTR_FIELD(args);+ WRITE_NODE_PTR_FIELD(refs);+ WRITE_NODE_PTR_FIELD(cols);+ WRITE_UINT_FIELD(agglevelsup);+ WRITE_INT_FIELD(location);+}++static void+_outWindowFunc(StringInfo str, const WindowFunc *node)+{+ WRITE_NODE_TYPE("WindowFunc");++ WRITE_UINT_FIELD(winfnoid);+ WRITE_UINT_FIELD(wintype);+ WRITE_UINT_FIELD(wincollid);+ WRITE_UINT_FIELD(inputcollid);+ WRITE_NODE_PTR_FIELD(args);+ WRITE_NODE_PTR_FIELD(aggfilter);+ WRITE_UINT_FIELD(winref);+ WRITE_BOOL_FIELD(winstar);+ WRITE_BOOL_FIELD(winagg);+ WRITE_INT_FIELD(location);+}++static void+_outArrayRef(StringInfo str, const ArrayRef *node)+{+ WRITE_NODE_TYPE("ArrayRef");++ WRITE_UINT_FIELD(refarraytype);+ WRITE_UINT_FIELD(refelemtype);+ WRITE_INT_FIELD(reftypmod);+ WRITE_UINT_FIELD(refcollid);+ WRITE_NODE_PTR_FIELD(refupperindexpr);+ WRITE_NODE_PTR_FIELD(reflowerindexpr);+ WRITE_NODE_PTR_FIELD(refexpr);+ WRITE_NODE_PTR_FIELD(refassgnexpr);+}++static void+_outFuncExpr(StringInfo str, const FuncExpr *node)+{+ WRITE_NODE_TYPE("FuncExpr");++ WRITE_UINT_FIELD(funcid);+ WRITE_UINT_FIELD(funcresulttype);+ WRITE_BOOL_FIELD(funcretset);+ WRITE_BOOL_FIELD(funcvariadic);+ WRITE_ENUM_FIELD(funcformat);+ WRITE_UINT_FIELD(funccollid);+ WRITE_UINT_FIELD(inputcollid);+ WRITE_NODE_PTR_FIELD(args);+ WRITE_INT_FIELD(location);+}++static void+_outNamedArgExpr(StringInfo str, const NamedArgExpr *node)+{+ WRITE_NODE_TYPE("NamedArgExpr");++ WRITE_NODE_PTR_FIELD(arg);+ WRITE_STRING_FIELD(name);+ WRITE_INT_FIELD(argnumber);+ WRITE_INT_FIELD(location);+}++static void+_outOpExpr(StringInfo str, const OpExpr *node)+{+ WRITE_NODE_TYPE("OpExpr");++ WRITE_UINT_FIELD(opno);+ WRITE_UINT_FIELD(opfuncid);+ WRITE_UINT_FIELD(opresulttype);+ WRITE_BOOL_FIELD(opretset);+ WRITE_UINT_FIELD(opcollid);+ WRITE_UINT_FIELD(inputcollid);+ WRITE_NODE_PTR_FIELD(args);+ WRITE_INT_FIELD(location);+}++static void+_outDistinctExpr(StringInfo str, const DistinctExpr *node)+{+ WRITE_NODE_TYPE("OpExpr");++ WRITE_UINT_FIELD(opno);+ WRITE_UINT_FIELD(opfuncid);+ WRITE_UINT_FIELD(opresulttype);+ WRITE_BOOL_FIELD(opretset);+ WRITE_UINT_FIELD(opcollid);+ WRITE_UINT_FIELD(inputcollid);+ WRITE_NODE_PTR_FIELD(args);+ WRITE_INT_FIELD(location);+}++static void+_outNullIfExpr(StringInfo str, const NullIfExpr *node)+{+ WRITE_NODE_TYPE("OpExpr");++ WRITE_UINT_FIELD(opno);+ WRITE_UINT_FIELD(opfuncid);+ WRITE_UINT_FIELD(opresulttype);+ WRITE_BOOL_FIELD(opretset);+ WRITE_UINT_FIELD(opcollid);+ WRITE_UINT_FIELD(inputcollid);+ WRITE_NODE_PTR_FIELD(args);+ WRITE_INT_FIELD(location);+}++static void+_outScalarArrayOpExpr(StringInfo str, const ScalarArrayOpExpr *node)+{+ WRITE_NODE_TYPE("ScalarArrayOpExpr");++ WRITE_UINT_FIELD(opno);+ WRITE_UINT_FIELD(opfuncid);+ WRITE_BOOL_FIELD(useOr);+ WRITE_UINT_FIELD(inputcollid);+ WRITE_NODE_PTR_FIELD(args);+ WRITE_INT_FIELD(location);+}++static void+_outBoolExpr(StringInfo str, const BoolExpr *node)+{+ WRITE_NODE_TYPE("BoolExpr");++ WRITE_ENUM_FIELD(boolop);+ WRITE_NODE_PTR_FIELD(args);+ WRITE_INT_FIELD(location);+}++static void+_outSubLink(StringInfo str, const SubLink *node)+{+ WRITE_NODE_TYPE("SubLink");++ WRITE_ENUM_FIELD(subLinkType);+ WRITE_INT_FIELD(subLinkId);+ WRITE_NODE_PTR_FIELD(testexpr);+ WRITE_NODE_PTR_FIELD(operName);+ WRITE_NODE_PTR_FIELD(subselect);+ WRITE_INT_FIELD(location);+}++static void+_outSubPlan(StringInfo str, const SubPlan *node)+{+ WRITE_NODE_TYPE("SubPlan");++ WRITE_ENUM_FIELD(subLinkType);+ WRITE_NODE_PTR_FIELD(testexpr);+ WRITE_NODE_PTR_FIELD(paramIds);+ WRITE_INT_FIELD(plan_id);+ WRITE_STRING_FIELD(plan_name);+ WRITE_UINT_FIELD(firstColType);+ WRITE_INT_FIELD(firstColTypmod);+ WRITE_UINT_FIELD(firstColCollation);+ WRITE_BOOL_FIELD(useHashTable);+ WRITE_BOOL_FIELD(unknownEqFalse);+ WRITE_NODE_PTR_FIELD(setParam);+ WRITE_NODE_PTR_FIELD(parParam);+ WRITE_NODE_PTR_FIELD(args);+ WRITE_FLOAT_FIELD(startup_cost);+ WRITE_FLOAT_FIELD(per_call_cost);+}++static void+_outAlternativeSubPlan(StringInfo str, const AlternativeSubPlan *node)+{+ WRITE_NODE_TYPE("AlternativeSubPlan");++ WRITE_NODE_PTR_FIELD(subplans);+}++static void+_outFieldSelect(StringInfo str, const FieldSelect *node)+{+ WRITE_NODE_TYPE("FieldSelect");++ WRITE_NODE_PTR_FIELD(arg);+ WRITE_INT_FIELD(fieldnum);+ WRITE_UINT_FIELD(resulttype);+ WRITE_INT_FIELD(resulttypmod);+ WRITE_UINT_FIELD(resultcollid);+}++static void+_outFieldStore(StringInfo str, const FieldStore *node)+{+ WRITE_NODE_TYPE("FieldStore");++ WRITE_NODE_PTR_FIELD(arg);+ WRITE_NODE_PTR_FIELD(newvals);+ WRITE_NODE_PTR_FIELD(fieldnums);+ WRITE_UINT_FIELD(resulttype);+}++static void+_outRelabelType(StringInfo str, const RelabelType *node)+{+ WRITE_NODE_TYPE("RelabelType");++ WRITE_NODE_PTR_FIELD(arg);+ WRITE_UINT_FIELD(resulttype);+ WRITE_INT_FIELD(resulttypmod);+ WRITE_UINT_FIELD(resultcollid);+ WRITE_ENUM_FIELD(relabelformat);+ WRITE_INT_FIELD(location);+}++static void+_outCoerceViaIO(StringInfo str, const CoerceViaIO *node)+{+ WRITE_NODE_TYPE("CoerceViaIO");++ WRITE_NODE_PTR_FIELD(arg);+ WRITE_UINT_FIELD(resulttype);+ WRITE_UINT_FIELD(resultcollid);+ WRITE_ENUM_FIELD(coerceformat);+ WRITE_INT_FIELD(location);+}++static void+_outArrayCoerceExpr(StringInfo str, const ArrayCoerceExpr *node)+{+ WRITE_NODE_TYPE("ArrayCoerceExpr");++ WRITE_NODE_PTR_FIELD(arg);+ WRITE_UINT_FIELD(elemfuncid);+ WRITE_UINT_FIELD(resulttype);+ WRITE_INT_FIELD(resulttypmod);+ WRITE_UINT_FIELD(resultcollid);+ WRITE_BOOL_FIELD(isExplicit);+ WRITE_ENUM_FIELD(coerceformat);+ WRITE_INT_FIELD(location);+}++static void+_outConvertRowtypeExpr(StringInfo str, const ConvertRowtypeExpr *node)+{+ WRITE_NODE_TYPE("ConvertRowtypeExpr");++ WRITE_NODE_PTR_FIELD(arg);+ WRITE_UINT_FIELD(resulttype);+ WRITE_ENUM_FIELD(convertformat);+ WRITE_INT_FIELD(location);+}++static void+_outCollateExpr(StringInfo str, const CollateExpr *node)+{+ WRITE_NODE_TYPE("CollateExpr");++ WRITE_NODE_PTR_FIELD(arg);+ WRITE_UINT_FIELD(collOid);+ WRITE_INT_FIELD(location);+}++static void+_outCaseExpr(StringInfo str, const CaseExpr *node)+{+ WRITE_NODE_TYPE("CaseExpr");++ WRITE_UINT_FIELD(casetype);+ WRITE_UINT_FIELD(casecollid);+ WRITE_NODE_PTR_FIELD(arg);+ WRITE_NODE_PTR_FIELD(args);+ WRITE_NODE_PTR_FIELD(defresult);+ WRITE_INT_FIELD(location);+}++static void+_outCaseWhen(StringInfo str, const CaseWhen *node)+{+ WRITE_NODE_TYPE("CaseWhen");++ WRITE_NODE_PTR_FIELD(expr);+ WRITE_NODE_PTR_FIELD(result);+ WRITE_INT_FIELD(location);+}++static void+_outCaseTestExpr(StringInfo str, const CaseTestExpr *node)+{+ WRITE_NODE_TYPE("CaseTestExpr");++ WRITE_UINT_FIELD(typeId);+ WRITE_INT_FIELD(typeMod);+ WRITE_UINT_FIELD(collation);+}++static void+_outArrayExpr(StringInfo str, const ArrayExpr *node)+{+ WRITE_NODE_TYPE("ArrayExpr");++ WRITE_UINT_FIELD(array_typeid);+ WRITE_UINT_FIELD(array_collid);+ WRITE_UINT_FIELD(element_typeid);+ WRITE_NODE_PTR_FIELD(elements);+ WRITE_BOOL_FIELD(multidims);+ WRITE_INT_FIELD(location);+}++static void+_outRowExpr(StringInfo str, const RowExpr *node)+{+ WRITE_NODE_TYPE("RowExpr");++ WRITE_NODE_PTR_FIELD(args);+ WRITE_UINT_FIELD(row_typeid);+ WRITE_ENUM_FIELD(row_format);+ WRITE_NODE_PTR_FIELD(colnames);+ WRITE_INT_FIELD(location);+}++static void+_outRowCompareExpr(StringInfo str, const RowCompareExpr *node)+{+ WRITE_NODE_TYPE("RowCompareExpr");++ WRITE_ENUM_FIELD(rctype);+ WRITE_NODE_PTR_FIELD(opnos);+ WRITE_NODE_PTR_FIELD(opfamilies);+ WRITE_NODE_PTR_FIELD(inputcollids);+ WRITE_NODE_PTR_FIELD(largs);+ WRITE_NODE_PTR_FIELD(rargs);+}++static void+_outCoalesceExpr(StringInfo str, const CoalesceExpr *node)+{+ WRITE_NODE_TYPE("CoalesceExpr");++ WRITE_UINT_FIELD(coalescetype);+ WRITE_UINT_FIELD(coalescecollid);+ WRITE_NODE_PTR_FIELD(args);+ WRITE_INT_FIELD(location);+}++static void+_outMinMaxExpr(StringInfo str, const MinMaxExpr *node)+{+ WRITE_NODE_TYPE("MinMaxExpr");++ WRITE_UINT_FIELD(minmaxtype);+ WRITE_UINT_FIELD(minmaxcollid);+ WRITE_UINT_FIELD(inputcollid);+ WRITE_ENUM_FIELD(op);+ WRITE_NODE_PTR_FIELD(args);+ WRITE_INT_FIELD(location);+}++static void+_outXmlExpr(StringInfo str, const XmlExpr *node)+{+ WRITE_NODE_TYPE("XmlExpr");++ WRITE_ENUM_FIELD(op);+ WRITE_STRING_FIELD(name);+ WRITE_NODE_PTR_FIELD(named_args);+ WRITE_NODE_PTR_FIELD(arg_names);+ WRITE_NODE_PTR_FIELD(args);+ WRITE_ENUM_FIELD(xmloption);+ WRITE_UINT_FIELD(type);+ WRITE_INT_FIELD(typmod);+ WRITE_INT_FIELD(location);+}++static void+_outNullTest(StringInfo str, const NullTest *node)+{+ WRITE_NODE_TYPE("NullTest");++ WRITE_NODE_PTR_FIELD(arg);+ WRITE_ENUM_FIELD(nulltesttype);+ WRITE_BOOL_FIELD(argisrow);+ WRITE_INT_FIELD(location);+}++static void+_outBooleanTest(StringInfo str, const BooleanTest *node)+{+ WRITE_NODE_TYPE("BooleanTest");++ WRITE_NODE_PTR_FIELD(arg);+ WRITE_ENUM_FIELD(booltesttype);+ WRITE_INT_FIELD(location);+}++static void+_outCoerceToDomain(StringInfo str, const CoerceToDomain *node)+{+ WRITE_NODE_TYPE("CoerceToDomain");++ WRITE_NODE_PTR_FIELD(arg);+ WRITE_UINT_FIELD(resulttype);+ WRITE_INT_FIELD(resulttypmod);+ WRITE_UINT_FIELD(resultcollid);+ WRITE_ENUM_FIELD(coercionformat);+ WRITE_INT_FIELD(location);+}++static void+_outCoerceToDomainValue(StringInfo str, const CoerceToDomainValue *node)+{+ WRITE_NODE_TYPE("CoerceToDomainValue");++ WRITE_UINT_FIELD(typeId);+ WRITE_INT_FIELD(typeMod);+ WRITE_UINT_FIELD(collation);+ WRITE_INT_FIELD(location);+}++static void+_outSetToDefault(StringInfo str, const SetToDefault *node)+{+ WRITE_NODE_TYPE("SetToDefault");++ WRITE_UINT_FIELD(typeId);+ WRITE_INT_FIELD(typeMod);+ WRITE_UINT_FIELD(collation);+ WRITE_INT_FIELD(location);+}++static void+_outCurrentOfExpr(StringInfo str, const CurrentOfExpr *node)+{+ WRITE_NODE_TYPE("CurrentOfExpr");++ WRITE_UINT_FIELD(cvarno);+ WRITE_STRING_FIELD(cursor_name);+ WRITE_INT_FIELD(cursor_param);+}++static void+_outInferenceElem(StringInfo str, const InferenceElem *node)+{+ WRITE_NODE_TYPE("InferenceElem");++ WRITE_NODE_PTR_FIELD(expr);+ WRITE_UINT_FIELD(infercollid);+ WRITE_UINT_FIELD(inferopclass);+}++static void+_outTargetEntry(StringInfo str, const TargetEntry *node)+{+ WRITE_NODE_TYPE("TargetEntry");++ WRITE_NODE_PTR_FIELD(expr);+ WRITE_INT_FIELD(resno);+ WRITE_STRING_FIELD(resname);+ WRITE_UINT_FIELD(ressortgroupref);+ WRITE_UINT_FIELD(resorigtbl);+ WRITE_INT_FIELD(resorigcol);+ WRITE_BOOL_FIELD(resjunk);+}++static void+_outRangeTblRef(StringInfo str, const RangeTblRef *node)+{+ WRITE_NODE_TYPE("RangeTblRef");++ WRITE_INT_FIELD(rtindex);+}++static void+_outJoinExpr(StringInfo str, const JoinExpr *node)+{+ WRITE_NODE_TYPE("JoinExpr");++ WRITE_ENUM_FIELD(jointype);+ WRITE_BOOL_FIELD(isNatural);+ WRITE_NODE_PTR_FIELD(larg);+ WRITE_NODE_PTR_FIELD(rarg);+ WRITE_NODE_PTR_FIELD(usingClause);+ WRITE_NODE_PTR_FIELD(quals);+ WRITE_NODE_PTR_FIELD(alias);+ WRITE_INT_FIELD(rtindex);+}++static void+_outFromExpr(StringInfo str, const FromExpr *node)+{+ WRITE_NODE_TYPE("FromExpr");++ WRITE_NODE_PTR_FIELD(fromlist);+ WRITE_NODE_PTR_FIELD(quals);+}++static void+_outOnConflictExpr(StringInfo str, const OnConflictExpr *node)+{+ WRITE_NODE_TYPE("OnConflictExpr");++ WRITE_ENUM_FIELD(action);+ WRITE_NODE_PTR_FIELD(arbiterElems);+ WRITE_NODE_PTR_FIELD(arbiterWhere);+ WRITE_UINT_FIELD(constraint);+ WRITE_NODE_PTR_FIELD(onConflictSet);+ WRITE_NODE_PTR_FIELD(onConflictWhere);+ WRITE_INT_FIELD(exclRelIndex);+ WRITE_NODE_PTR_FIELD(exclRelTlist);+}++static void+_outIntoClause(StringInfo str, const IntoClause *node)+{+ WRITE_NODE_TYPE("IntoClause");++ WRITE_NODE_PTR_FIELD(rel);+ WRITE_NODE_PTR_FIELD(colNames);+ WRITE_NODE_PTR_FIELD(options);+ WRITE_ENUM_FIELD(onCommit);+ WRITE_STRING_FIELD(tableSpaceName);+ WRITE_NODE_PTR_FIELD(viewQuery);+ WRITE_BOOL_FIELD(skipData);+}++static void+_outQuery(StringInfo str, const Query *node)+{+ WRITE_NODE_TYPE("Query");++ WRITE_ENUM_FIELD(commandType);+ WRITE_ENUM_FIELD(querySource);+ WRITE_BOOL_FIELD(canSetTag);+ WRITE_NODE_PTR_FIELD(utilityStmt);+ WRITE_INT_FIELD(resultRelation);+ WRITE_BOOL_FIELD(hasAggs);+ WRITE_BOOL_FIELD(hasWindowFuncs);+ WRITE_BOOL_FIELD(hasSubLinks);+ WRITE_BOOL_FIELD(hasDistinctOn);+ WRITE_BOOL_FIELD(hasRecursive);+ WRITE_BOOL_FIELD(hasModifyingCTE);+ WRITE_BOOL_FIELD(hasForUpdate);+ WRITE_BOOL_FIELD(hasRowSecurity);+ WRITE_NODE_PTR_FIELD(cteList);+ WRITE_NODE_PTR_FIELD(rtable);+ WRITE_NODE_PTR_FIELD(jointree);+ WRITE_NODE_PTR_FIELD(targetList);+ WRITE_NODE_PTR_FIELD(onConflict);+ WRITE_NODE_PTR_FIELD(returningList);+ WRITE_NODE_PTR_FIELD(groupClause);+ WRITE_NODE_PTR_FIELD(groupingSets);+ WRITE_NODE_PTR_FIELD(havingQual);+ WRITE_NODE_PTR_FIELD(windowClause);+ WRITE_NODE_PTR_FIELD(distinctClause);+ WRITE_NODE_PTR_FIELD(sortClause);+ WRITE_NODE_PTR_FIELD(limitOffset);+ WRITE_NODE_PTR_FIELD(limitCount);+ WRITE_NODE_PTR_FIELD(rowMarks);+ WRITE_NODE_PTR_FIELD(setOperations);+ WRITE_NODE_PTR_FIELD(constraintDeps);+ WRITE_NODE_PTR_FIELD(withCheckOptions);+}++static void+_outInsertStmt(StringInfo str, const InsertStmt *node)+{+ WRITE_NODE_TYPE("InsertStmt");++ WRITE_NODE_PTR_FIELD(relation);+ WRITE_NODE_PTR_FIELD(cols);+ WRITE_NODE_PTR_FIELD(selectStmt);+ WRITE_NODE_PTR_FIELD(onConflictClause);+ WRITE_NODE_PTR_FIELD(returningList);+ WRITE_NODE_PTR_FIELD(withClause);+}++static void+_outDeleteStmt(StringInfo str, const DeleteStmt *node)+{+ WRITE_NODE_TYPE("DeleteStmt");++ WRITE_NODE_PTR_FIELD(relation);+ WRITE_NODE_PTR_FIELD(usingClause);+ WRITE_NODE_PTR_FIELD(whereClause);+ WRITE_NODE_PTR_FIELD(returningList);+ WRITE_NODE_PTR_FIELD(withClause);+}++static void+_outUpdateStmt(StringInfo str, const UpdateStmt *node)+{+ WRITE_NODE_TYPE("UpdateStmt");++ WRITE_NODE_PTR_FIELD(relation);+ WRITE_NODE_PTR_FIELD(targetList);+ WRITE_NODE_PTR_FIELD(whereClause);+ WRITE_NODE_PTR_FIELD(fromClause);+ WRITE_NODE_PTR_FIELD(returningList);+ WRITE_NODE_PTR_FIELD(withClause);+}++static void+_outSelectStmt(StringInfo str, const SelectStmt *node)+{+ WRITE_NODE_TYPE("SelectStmt");++ WRITE_NODE_PTR_FIELD(distinctClause);+ WRITE_NODE_PTR_FIELD(intoClause);+ WRITE_NODE_PTR_FIELD(targetList);+ WRITE_NODE_PTR_FIELD(fromClause);+ WRITE_NODE_PTR_FIELD(whereClause);+ WRITE_NODE_PTR_FIELD(groupClause);+ WRITE_NODE_PTR_FIELD(havingClause);+ WRITE_NODE_PTR_FIELD(windowClause);+ WRITE_NODE_PTR_FIELD(valuesLists);+ WRITE_NODE_PTR_FIELD(sortClause);+ WRITE_NODE_PTR_FIELD(limitOffset);+ WRITE_NODE_PTR_FIELD(limitCount);+ WRITE_NODE_PTR_FIELD(lockingClause);+ WRITE_NODE_PTR_FIELD(withClause);+ WRITE_ENUM_FIELD(op);+ WRITE_BOOL_FIELD(all);+ WRITE_NODE_PTR_FIELD(larg);+ WRITE_NODE_PTR_FIELD(rarg);+}++static void+_outAlterTableStmt(StringInfo str, const AlterTableStmt *node)+{+ WRITE_NODE_TYPE("AlterTableStmt");++ WRITE_NODE_PTR_FIELD(relation);+ WRITE_NODE_PTR_FIELD(cmds);+ WRITE_ENUM_FIELD(relkind);+ WRITE_BOOL_FIELD(missing_ok);+}++static void+_outAlterTableCmd(StringInfo str, const AlterTableCmd *node)+{+ WRITE_NODE_TYPE("AlterTableCmd");++ WRITE_ENUM_FIELD(subtype);+ WRITE_STRING_FIELD(name);+ WRITE_NODE_PTR_FIELD(newowner);+ WRITE_NODE_PTR_FIELD(def);+ WRITE_ENUM_FIELD(behavior);+ WRITE_BOOL_FIELD(missing_ok);+}++static void+_outAlterDomainStmt(StringInfo str, const AlterDomainStmt *node)+{+ WRITE_NODE_TYPE("AlterDomainStmt");++ WRITE_CHAR_FIELD(subtype);+ WRITE_NODE_PTR_FIELD(typeName);+ WRITE_STRING_FIELD(name);+ WRITE_NODE_PTR_FIELD(def);+ WRITE_ENUM_FIELD(behavior);+ WRITE_BOOL_FIELD(missing_ok);+}++static void+_outSetOperationStmt(StringInfo str, const SetOperationStmt *node)+{+ WRITE_NODE_TYPE("SetOperationStmt");++ WRITE_ENUM_FIELD(op);+ WRITE_BOOL_FIELD(all);+ WRITE_NODE_PTR_FIELD(larg);+ WRITE_NODE_PTR_FIELD(rarg);+ WRITE_NODE_PTR_FIELD(colTypes);+ WRITE_NODE_PTR_FIELD(colTypmods);+ WRITE_NODE_PTR_FIELD(colCollations);+ WRITE_NODE_PTR_FIELD(groupClauses);+}++static void+_outGrantStmt(StringInfo str, const GrantStmt *node)+{+ WRITE_NODE_TYPE("GrantStmt");++ WRITE_BOOL_FIELD(is_grant);+ WRITE_ENUM_FIELD(targtype);+ WRITE_ENUM_FIELD(objtype);+ WRITE_NODE_PTR_FIELD(objects);+ WRITE_NODE_PTR_FIELD(privileges);+ WRITE_NODE_PTR_FIELD(grantees);+ WRITE_BOOL_FIELD(grant_option);+ WRITE_ENUM_FIELD(behavior);+}++static void+_outGrantRoleStmt(StringInfo str, const GrantRoleStmt *node)+{+ WRITE_NODE_TYPE("GrantRoleStmt");++ WRITE_NODE_PTR_FIELD(granted_roles);+ WRITE_NODE_PTR_FIELD(grantee_roles);+ WRITE_BOOL_FIELD(is_grant);+ WRITE_BOOL_FIELD(admin_opt);+ WRITE_NODE_PTR_FIELD(grantor);+ WRITE_ENUM_FIELD(behavior);+}++static void+_outAlterDefaultPrivilegesStmt(StringInfo str, const AlterDefaultPrivilegesStmt *node)+{+ WRITE_NODE_TYPE("AlterDefaultPrivilegesStmt");++ WRITE_NODE_PTR_FIELD(options);+ WRITE_NODE_PTR_FIELD(action);+}++static void+_outClosePortalStmt(StringInfo str, const ClosePortalStmt *node)+{+ WRITE_NODE_TYPE("ClosePortalStmt");++ WRITE_STRING_FIELD(portalname);+}++static void+_outClusterStmt(StringInfo str, const ClusterStmt *node)+{+ WRITE_NODE_TYPE("ClusterStmt");++ WRITE_NODE_PTR_FIELD(relation);+ WRITE_STRING_FIELD(indexname);+ WRITE_BOOL_FIELD(verbose);+}++static void+_outCopyStmt(StringInfo str, const CopyStmt *node)+{+ WRITE_NODE_TYPE("CopyStmt");++ WRITE_NODE_PTR_FIELD(relation);+ WRITE_NODE_PTR_FIELD(query);+ WRITE_NODE_PTR_FIELD(attlist);+ WRITE_BOOL_FIELD(is_from);+ WRITE_BOOL_FIELD(is_program);+ WRITE_STRING_FIELD(filename);+ WRITE_NODE_PTR_FIELD(options);+}++static void+_outCreateStmt(StringInfo str, const CreateStmt *node)+{+ WRITE_NODE_TYPE("CreateStmt");++ WRITE_NODE_PTR_FIELD(relation);+ WRITE_NODE_PTR_FIELD(tableElts);+ WRITE_NODE_PTR_FIELD(inhRelations);+ WRITE_NODE_PTR_FIELD(ofTypename);+ WRITE_NODE_PTR_FIELD(constraints);+ WRITE_NODE_PTR_FIELD(options);+ WRITE_ENUM_FIELD(oncommit);+ WRITE_STRING_FIELD(tablespacename);+ WRITE_BOOL_FIELD(if_not_exists);+}++static void+_outDefineStmt(StringInfo str, const DefineStmt *node)+{+ WRITE_NODE_TYPE("DefineStmt");++ WRITE_ENUM_FIELD(kind);+ WRITE_BOOL_FIELD(oldstyle);+ WRITE_NODE_PTR_FIELD(defnames);+ WRITE_NODE_PTR_FIELD(args);+ WRITE_NODE_PTR_FIELD(definition);+}++static void+_outDropStmt(StringInfo str, const DropStmt *node)+{+ WRITE_NODE_TYPE("DropStmt");++ WRITE_NODE_PTR_FIELD(objects);+ WRITE_NODE_PTR_FIELD(arguments);+ WRITE_ENUM_FIELD(removeType);+ WRITE_ENUM_FIELD(behavior);+ WRITE_BOOL_FIELD(missing_ok);+ WRITE_BOOL_FIELD(concurrent);+}++static void+_outTruncateStmt(StringInfo str, const TruncateStmt *node)+{+ WRITE_NODE_TYPE("TruncateStmt");++ WRITE_NODE_PTR_FIELD(relations);+ WRITE_BOOL_FIELD(restart_seqs);+ WRITE_ENUM_FIELD(behavior);+}++static void+_outCommentStmt(StringInfo str, const CommentStmt *node)+{+ WRITE_NODE_TYPE("CommentStmt");++ WRITE_ENUM_FIELD(objtype);+ WRITE_NODE_PTR_FIELD(objname);+ WRITE_NODE_PTR_FIELD(objargs);+ WRITE_STRING_FIELD(comment);+}++static void+_outFetchStmt(StringInfo str, const FetchStmt *node)+{+ WRITE_NODE_TYPE("FetchStmt");++ WRITE_ENUM_FIELD(direction);+ WRITE_LONG_FIELD(howMany);+ WRITE_STRING_FIELD(portalname);+ WRITE_BOOL_FIELD(ismove);+}++static void+_outIndexStmt(StringInfo str, const IndexStmt *node)+{+ WRITE_NODE_TYPE("IndexStmt");++ WRITE_STRING_FIELD(idxname);+ WRITE_NODE_PTR_FIELD(relation);+ WRITE_STRING_FIELD(accessMethod);+ WRITE_STRING_FIELD(tableSpace);+ WRITE_NODE_PTR_FIELD(indexParams);+ WRITE_NODE_PTR_FIELD(options);+ WRITE_NODE_PTR_FIELD(whereClause);+ WRITE_NODE_PTR_FIELD(excludeOpNames);+ WRITE_STRING_FIELD(idxcomment);+ WRITE_UINT_FIELD(indexOid);+ WRITE_UINT_FIELD(oldNode);+ WRITE_BOOL_FIELD(unique);+ WRITE_BOOL_FIELD(primary);+ WRITE_BOOL_FIELD(isconstraint);+ WRITE_BOOL_FIELD(deferrable);+ WRITE_BOOL_FIELD(initdeferred);+ WRITE_BOOL_FIELD(transformed);+ WRITE_BOOL_FIELD(concurrent);+ WRITE_BOOL_FIELD(if_not_exists);+}++static void+_outCreateFunctionStmt(StringInfo str, const CreateFunctionStmt *node)+{+ WRITE_NODE_TYPE("CreateFunctionStmt");++ WRITE_BOOL_FIELD(replace);+ WRITE_NODE_PTR_FIELD(funcname);+ WRITE_NODE_PTR_FIELD(parameters);+ WRITE_NODE_PTR_FIELD(returnType);+ WRITE_NODE_PTR_FIELD(options);+ WRITE_NODE_PTR_FIELD(withClause);+}++static void+_outAlterFunctionStmt(StringInfo str, const AlterFunctionStmt *node)+{+ WRITE_NODE_TYPE("AlterFunctionStmt");++ WRITE_NODE_PTR_FIELD(func);+ WRITE_NODE_PTR_FIELD(actions);+}++static void+_outDoStmt(StringInfo str, const DoStmt *node)+{+ WRITE_NODE_TYPE("DoStmt");++ WRITE_NODE_PTR_FIELD(args);+}++static void+_outRenameStmt(StringInfo str, const RenameStmt *node)+{+ WRITE_NODE_TYPE("RenameStmt");++ WRITE_ENUM_FIELD(renameType);+ WRITE_ENUM_FIELD(relationType);+ WRITE_NODE_PTR_FIELD(relation);+ WRITE_NODE_PTR_FIELD(object);+ WRITE_NODE_PTR_FIELD(objarg);+ WRITE_STRING_FIELD(subname);+ WRITE_STRING_FIELD(newname);+ WRITE_ENUM_FIELD(behavior);+ WRITE_BOOL_FIELD(missing_ok);+}++static void+_outRuleStmt(StringInfo str, const RuleStmt *node)+{+ WRITE_NODE_TYPE("RuleStmt");++ WRITE_NODE_PTR_FIELD(relation);+ WRITE_STRING_FIELD(rulename);+ WRITE_NODE_PTR_FIELD(whereClause);+ WRITE_ENUM_FIELD(event);+ WRITE_BOOL_FIELD(instead);+ WRITE_NODE_PTR_FIELD(actions);+ WRITE_BOOL_FIELD(replace);+}++static void+_outNotifyStmt(StringInfo str, const NotifyStmt *node)+{+ WRITE_NODE_TYPE("NotifyStmt");++ WRITE_STRING_FIELD(conditionname);+ WRITE_STRING_FIELD(payload);+}++static void+_outListenStmt(StringInfo str, const ListenStmt *node)+{+ WRITE_NODE_TYPE("ListenStmt");++ WRITE_STRING_FIELD(conditionname);+}++static void+_outUnlistenStmt(StringInfo str, const UnlistenStmt *node)+{+ WRITE_NODE_TYPE("UnlistenStmt");++ WRITE_STRING_FIELD(conditionname);+}++static void+_outTransactionStmt(StringInfo str, const TransactionStmt *node)+{+ WRITE_NODE_TYPE("TransactionStmt");++ WRITE_ENUM_FIELD(kind);+ WRITE_NODE_PTR_FIELD(options);+ WRITE_STRING_FIELD(gid);+}++static void+_outViewStmt(StringInfo str, const ViewStmt *node)+{+ WRITE_NODE_TYPE("ViewStmt");++ WRITE_NODE_PTR_FIELD(view);+ WRITE_NODE_PTR_FIELD(aliases);+ WRITE_NODE_PTR_FIELD(query);+ WRITE_BOOL_FIELD(replace);+ WRITE_NODE_PTR_FIELD(options);+ WRITE_ENUM_FIELD(withCheckOption);+}++static void+_outLoadStmt(StringInfo str, const LoadStmt *node)+{+ WRITE_NODE_TYPE("LoadStmt");++ WRITE_STRING_FIELD(filename);+}++static void+_outCreateDomainStmt(StringInfo str, const CreateDomainStmt *node)+{+ WRITE_NODE_TYPE("CreateDomainStmt");++ WRITE_NODE_PTR_FIELD(domainname);+ WRITE_NODE_PTR_FIELD(typeName);+ WRITE_NODE_PTR_FIELD(collClause);+ WRITE_NODE_PTR_FIELD(constraints);+}++static void+_outCreatedbStmt(StringInfo str, const CreatedbStmt *node)+{+ WRITE_NODE_TYPE("CreatedbStmt");++ WRITE_STRING_FIELD(dbname);+ WRITE_NODE_PTR_FIELD(options);+}++static void+_outDropdbStmt(StringInfo str, const DropdbStmt *node)+{+ WRITE_NODE_TYPE("DropdbStmt");++ WRITE_STRING_FIELD(dbname);+ WRITE_BOOL_FIELD(missing_ok);+}++static void+_outVacuumStmt(StringInfo str, const VacuumStmt *node)+{+ WRITE_NODE_TYPE("VacuumStmt");++ WRITE_INT_FIELD(options);+ WRITE_NODE_PTR_FIELD(relation);+ WRITE_NODE_PTR_FIELD(va_cols);+}++static void+_outExplainStmt(StringInfo str, const ExplainStmt *node)+{+ WRITE_NODE_TYPE("ExplainStmt");++ WRITE_NODE_PTR_FIELD(query);+ WRITE_NODE_PTR_FIELD(options);+}++static void+_outCreateTableAsStmt(StringInfo str, const CreateTableAsStmt *node)+{+ WRITE_NODE_TYPE("CreateTableAsStmt");++ WRITE_NODE_PTR_FIELD(query);+ WRITE_NODE_PTR_FIELD(into);+ WRITE_ENUM_FIELD(relkind);+ WRITE_BOOL_FIELD(is_select_into);+ WRITE_BOOL_FIELD(if_not_exists);+}++static void+_outCreateSeqStmt(StringInfo str, const CreateSeqStmt *node)+{+ WRITE_NODE_TYPE("CreateSeqStmt");++ WRITE_NODE_PTR_FIELD(sequence);+ WRITE_NODE_PTR_FIELD(options);+ WRITE_UINT_FIELD(ownerId);+ WRITE_BOOL_FIELD(if_not_exists);+}++static void+_outAlterSeqStmt(StringInfo str, const AlterSeqStmt *node)+{+ WRITE_NODE_TYPE("AlterSeqStmt");++ WRITE_NODE_PTR_FIELD(sequence);+ WRITE_NODE_PTR_FIELD(options);+ WRITE_BOOL_FIELD(missing_ok);+}++static void+_outVariableSetStmt(StringInfo str, const VariableSetStmt *node)+{+ WRITE_NODE_TYPE("VariableSetStmt");++ WRITE_ENUM_FIELD(kind);+ WRITE_STRING_FIELD(name);+ WRITE_NODE_PTR_FIELD(args);+ WRITE_BOOL_FIELD(is_local);+}++static void+_outVariableShowStmt(StringInfo str, const VariableShowStmt *node)+{+ WRITE_NODE_TYPE("VariableShowStmt");++ WRITE_STRING_FIELD(name);+}++static void+_outDiscardStmt(StringInfo str, const DiscardStmt *node)+{+ WRITE_NODE_TYPE("DiscardStmt");++ WRITE_ENUM_FIELD(target);+}++static void+_outCreateTrigStmt(StringInfo str, const CreateTrigStmt *node)+{+ WRITE_NODE_TYPE("CreateTrigStmt");++ WRITE_STRING_FIELD(trigname);+ WRITE_NODE_PTR_FIELD(relation);+ WRITE_NODE_PTR_FIELD(funcname);+ WRITE_NODE_PTR_FIELD(args);+ WRITE_BOOL_FIELD(row);+ WRITE_INT_FIELD(timing);+ WRITE_INT_FIELD(events);+ WRITE_NODE_PTR_FIELD(columns);+ WRITE_NODE_PTR_FIELD(whenClause);+ WRITE_BOOL_FIELD(isconstraint);+ WRITE_BOOL_FIELD(deferrable);+ WRITE_BOOL_FIELD(initdeferred);+ WRITE_NODE_PTR_FIELD(constrrel);+}++static void+_outCreatePLangStmt(StringInfo str, const CreatePLangStmt *node)+{+ WRITE_NODE_TYPE("CreatePLangStmt");++ WRITE_BOOL_FIELD(replace);+ WRITE_STRING_FIELD(plname);+ WRITE_NODE_PTR_FIELD(plhandler);+ WRITE_NODE_PTR_FIELD(plinline);+ WRITE_NODE_PTR_FIELD(plvalidator);+ WRITE_BOOL_FIELD(pltrusted);+}++static void+_outCreateRoleStmt(StringInfo str, const CreateRoleStmt *node)+{+ WRITE_NODE_TYPE("CreateRoleStmt");++ WRITE_ENUM_FIELD(stmt_type);+ WRITE_STRING_FIELD(role);+ WRITE_NODE_PTR_FIELD(options);+}++static void+_outAlterRoleStmt(StringInfo str, const AlterRoleStmt *node)+{+ WRITE_NODE_TYPE("AlterRoleStmt");++ WRITE_NODE_PTR_FIELD(role);+ WRITE_NODE_PTR_FIELD(options);+ WRITE_INT_FIELD(action);+}++static void+_outDropRoleStmt(StringInfo str, const DropRoleStmt *node)+{+ WRITE_NODE_TYPE("DropRoleStmt");++ WRITE_NODE_PTR_FIELD(roles);+ WRITE_BOOL_FIELD(missing_ok);+}++static void+_outLockStmt(StringInfo str, const LockStmt *node)+{+ WRITE_NODE_TYPE("LockStmt");++ WRITE_NODE_PTR_FIELD(relations);+ WRITE_INT_FIELD(mode);+ WRITE_BOOL_FIELD(nowait);+}++static void+_outConstraintsSetStmt(StringInfo str, const ConstraintsSetStmt *node)+{+ WRITE_NODE_TYPE("ConstraintsSetStmt");++ WRITE_NODE_PTR_FIELD(constraints);+ WRITE_BOOL_FIELD(deferred);+}++static void+_outReindexStmt(StringInfo str, const ReindexStmt *node)+{+ WRITE_NODE_TYPE("ReindexStmt");++ WRITE_ENUM_FIELD(kind);+ WRITE_NODE_PTR_FIELD(relation);+ WRITE_STRING_FIELD(name);+ WRITE_INT_FIELD(options);+}++static void+_outCheckPointStmt(StringInfo str, const CheckPointStmt *node)+{+ WRITE_NODE_TYPE("CheckPointStmt");++}++static void+_outCreateSchemaStmt(StringInfo str, const CreateSchemaStmt *node)+{+ WRITE_NODE_TYPE("CreateSchemaStmt");++ WRITE_STRING_FIELD(schemaname);+ WRITE_NODE_PTR_FIELD(authrole);+ WRITE_NODE_PTR_FIELD(schemaElts);+ WRITE_BOOL_FIELD(if_not_exists);+}++static void+_outAlterDatabaseStmt(StringInfo str, const AlterDatabaseStmt *node)+{+ WRITE_NODE_TYPE("AlterDatabaseStmt");++ WRITE_STRING_FIELD(dbname);+ WRITE_NODE_PTR_FIELD(options);+}++static void+_outAlterDatabaseSetStmt(StringInfo str, const AlterDatabaseSetStmt *node)+{+ WRITE_NODE_TYPE("AlterDatabaseSetStmt");++ WRITE_STRING_FIELD(dbname);+ WRITE_NODE_PTR_FIELD(setstmt);+}++static void+_outAlterRoleSetStmt(StringInfo str, const AlterRoleSetStmt *node)+{+ WRITE_NODE_TYPE("AlterRoleSetStmt");++ WRITE_NODE_PTR_FIELD(role);+ WRITE_STRING_FIELD(database);+ WRITE_NODE_PTR_FIELD(setstmt);+}++static void+_outCreateConversionStmt(StringInfo str, const CreateConversionStmt *node)+{+ WRITE_NODE_TYPE("CreateConversionStmt");++ WRITE_NODE_PTR_FIELD(conversion_name);+ WRITE_STRING_FIELD(for_encoding_name);+ WRITE_STRING_FIELD(to_encoding_name);+ WRITE_NODE_PTR_FIELD(func_name);+ WRITE_BOOL_FIELD(def);+}++static void+_outCreateCastStmt(StringInfo str, const CreateCastStmt *node)+{+ WRITE_NODE_TYPE("CreateCastStmt");++ WRITE_NODE_PTR_FIELD(sourcetype);+ WRITE_NODE_PTR_FIELD(targettype);+ WRITE_NODE_PTR_FIELD(func);+ WRITE_ENUM_FIELD(context);+ WRITE_BOOL_FIELD(inout);+}++static void+_outCreateOpClassStmt(StringInfo str, const CreateOpClassStmt *node)+{+ WRITE_NODE_TYPE("CreateOpClassStmt");++ WRITE_NODE_PTR_FIELD(opclassname);+ WRITE_NODE_PTR_FIELD(opfamilyname);+ WRITE_STRING_FIELD(amname);+ WRITE_NODE_PTR_FIELD(datatype);+ WRITE_NODE_PTR_FIELD(items);+ WRITE_BOOL_FIELD(isDefault);+}++static void+_outCreateOpFamilyStmt(StringInfo str, const CreateOpFamilyStmt *node)+{+ WRITE_NODE_TYPE("CreateOpFamilyStmt");++ WRITE_NODE_PTR_FIELD(opfamilyname);+ WRITE_STRING_FIELD(amname);+}++static void+_outAlterOpFamilyStmt(StringInfo str, const AlterOpFamilyStmt *node)+{+ WRITE_NODE_TYPE("AlterOpFamilyStmt");++ WRITE_NODE_PTR_FIELD(opfamilyname);+ WRITE_STRING_FIELD(amname);+ WRITE_BOOL_FIELD(isDrop);+ WRITE_NODE_PTR_FIELD(items);+}++static void+_outPrepareStmt(StringInfo str, const PrepareStmt *node)+{+ WRITE_NODE_TYPE("PrepareStmt");++ WRITE_STRING_FIELD(name);+ WRITE_NODE_PTR_FIELD(argtypes);+ WRITE_NODE_PTR_FIELD(query);+}++static void+_outExecuteStmt(StringInfo str, const ExecuteStmt *node)+{+ WRITE_NODE_TYPE("ExecuteStmt");++ WRITE_STRING_FIELD(name);+ WRITE_NODE_PTR_FIELD(params);+}++static void+_outDeallocateStmt(StringInfo str, const DeallocateStmt *node)+{+ WRITE_NODE_TYPE("DeallocateStmt");++ WRITE_STRING_FIELD(name);+}++static void+_outDeclareCursorStmt(StringInfo str, const DeclareCursorStmt *node)+{+ WRITE_NODE_TYPE("DeclareCursorStmt");++ WRITE_STRING_FIELD(portalname);+ WRITE_INT_FIELD(options);+ WRITE_NODE_PTR_FIELD(query);+}++static void+_outCreateTableSpaceStmt(StringInfo str, const CreateTableSpaceStmt *node)+{+ WRITE_NODE_TYPE("CreateTableSpaceStmt");++ WRITE_STRING_FIELD(tablespacename);+ WRITE_NODE_PTR_FIELD(owner);+ WRITE_STRING_FIELD(location);+ WRITE_NODE_PTR_FIELD(options);+}++static void+_outDropTableSpaceStmt(StringInfo str, const DropTableSpaceStmt *node)+{+ WRITE_NODE_TYPE("DropTableSpaceStmt");++ WRITE_STRING_FIELD(tablespacename);+ WRITE_BOOL_FIELD(missing_ok);+}++static void+_outAlterObjectSchemaStmt(StringInfo str, const AlterObjectSchemaStmt *node)+{+ WRITE_NODE_TYPE("AlterObjectSchemaStmt");++ WRITE_ENUM_FIELD(objectType);+ WRITE_NODE_PTR_FIELD(relation);+ WRITE_NODE_PTR_FIELD(object);+ WRITE_NODE_PTR_FIELD(objarg);+ WRITE_STRING_FIELD(newschema);+ WRITE_BOOL_FIELD(missing_ok);+}++static void+_outAlterOwnerStmt(StringInfo str, const AlterOwnerStmt *node)+{+ WRITE_NODE_TYPE("AlterOwnerStmt");++ WRITE_ENUM_FIELD(objectType);+ WRITE_NODE_PTR_FIELD(relation);+ WRITE_NODE_PTR_FIELD(object);+ WRITE_NODE_PTR_FIELD(objarg);+ WRITE_NODE_PTR_FIELD(newowner);+}++static void+_outDropOwnedStmt(StringInfo str, const DropOwnedStmt *node)+{+ WRITE_NODE_TYPE("DropOwnedStmt");++ WRITE_NODE_PTR_FIELD(roles);+ WRITE_ENUM_FIELD(behavior);+}++static void+_outReassignOwnedStmt(StringInfo str, const ReassignOwnedStmt *node)+{+ WRITE_NODE_TYPE("ReassignOwnedStmt");++ WRITE_NODE_PTR_FIELD(roles);+ WRITE_NODE_PTR_FIELD(newrole);+}++static void+_outCompositeTypeStmt(StringInfo str, const CompositeTypeStmt *node)+{+ WRITE_NODE_TYPE("CompositeTypeStmt");++ WRITE_NODE_PTR_FIELD(typevar);+ WRITE_NODE_PTR_FIELD(coldeflist);+}++static void+_outCreateEnumStmt(StringInfo str, const CreateEnumStmt *node)+{+ WRITE_NODE_TYPE("CreateEnumStmt");++ WRITE_NODE_PTR_FIELD(typeName);+ WRITE_NODE_PTR_FIELD(vals);+}++static void+_outCreateRangeStmt(StringInfo str, const CreateRangeStmt *node)+{+ WRITE_NODE_TYPE("CreateRangeStmt");++ WRITE_NODE_PTR_FIELD(typeName);+ WRITE_NODE_PTR_FIELD(params);+}++static void+_outAlterEnumStmt(StringInfo str, const AlterEnumStmt *node)+{+ WRITE_NODE_TYPE("AlterEnumStmt");++ WRITE_NODE_PTR_FIELD(typeName);+ WRITE_STRING_FIELD(newVal);+ WRITE_STRING_FIELD(newValNeighbor);+ WRITE_BOOL_FIELD(newValIsAfter);+ WRITE_BOOL_FIELD(skipIfExists);+}++static void+_outAlterTSDictionaryStmt(StringInfo str, const AlterTSDictionaryStmt *node)+{+ WRITE_NODE_TYPE("AlterTSDictionaryStmt");++ WRITE_NODE_PTR_FIELD(dictname);+ WRITE_NODE_PTR_FIELD(options);+}++static void+_outAlterTSConfigurationStmt(StringInfo str, const AlterTSConfigurationStmt *node)+{+ WRITE_NODE_TYPE("AlterTSConfigurationStmt");++ WRITE_ENUM_FIELD(kind);+ WRITE_NODE_PTR_FIELD(cfgname);+ WRITE_NODE_PTR_FIELD(tokentype);+ WRITE_NODE_PTR_FIELD(dicts);+ WRITE_BOOL_FIELD(override);+ WRITE_BOOL_FIELD(replace);+ WRITE_BOOL_FIELD(missing_ok);+}++static void+_outCreateFdwStmt(StringInfo str, const CreateFdwStmt *node)+{+ WRITE_NODE_TYPE("CreateFdwStmt");++ WRITE_STRING_FIELD(fdwname);+ WRITE_NODE_PTR_FIELD(func_options);+ WRITE_NODE_PTR_FIELD(options);+}++static void+_outAlterFdwStmt(StringInfo str, const AlterFdwStmt *node)+{+ WRITE_NODE_TYPE("AlterFdwStmt");++ WRITE_STRING_FIELD(fdwname);+ WRITE_NODE_PTR_FIELD(func_options);+ WRITE_NODE_PTR_FIELD(options);+}++static void+_outCreateForeignServerStmt(StringInfo str, const CreateForeignServerStmt *node)+{+ WRITE_NODE_TYPE("CreateForeignServerStmt");++ WRITE_STRING_FIELD(servername);+ WRITE_STRING_FIELD(servertype);+ WRITE_STRING_FIELD(version);+ WRITE_STRING_FIELD(fdwname);+ WRITE_NODE_PTR_FIELD(options);+}++static void+_outAlterForeignServerStmt(StringInfo str, const AlterForeignServerStmt *node)+{+ WRITE_NODE_TYPE("AlterForeignServerStmt");++ WRITE_STRING_FIELD(servername);+ WRITE_STRING_FIELD(version);+ WRITE_NODE_PTR_FIELD(options);+ WRITE_BOOL_FIELD(has_version);+}++static void+_outCreateUserMappingStmt(StringInfo str, const CreateUserMappingStmt *node)+{+ WRITE_NODE_TYPE("CreateUserMappingStmt");++ WRITE_NODE_PTR_FIELD(user);+ WRITE_STRING_FIELD(servername);+ WRITE_NODE_PTR_FIELD(options);+}++static void+_outAlterUserMappingStmt(StringInfo str, const AlterUserMappingStmt *node)+{+ WRITE_NODE_TYPE("AlterUserMappingStmt");++ WRITE_NODE_PTR_FIELD(user);+ WRITE_STRING_FIELD(servername);+ WRITE_NODE_PTR_FIELD(options);+}++static void+_outDropUserMappingStmt(StringInfo str, const DropUserMappingStmt *node)+{+ WRITE_NODE_TYPE("DropUserMappingStmt");++ WRITE_NODE_PTR_FIELD(user);+ WRITE_STRING_FIELD(servername);+ WRITE_BOOL_FIELD(missing_ok);+}++static void+_outAlterTableSpaceOptionsStmt(StringInfo str, const AlterTableSpaceOptionsStmt *node)+{+ WRITE_NODE_TYPE("AlterTableSpaceOptionsStmt");++ WRITE_STRING_FIELD(tablespacename);+ WRITE_NODE_PTR_FIELD(options);+ WRITE_BOOL_FIELD(isReset);+}++static void+_outAlterTableMoveAllStmt(StringInfo str, const AlterTableMoveAllStmt *node)+{+ WRITE_NODE_TYPE("AlterTableMoveAllStmt");++ WRITE_STRING_FIELD(orig_tablespacename);+ WRITE_ENUM_FIELD(objtype);+ WRITE_NODE_PTR_FIELD(roles);+ WRITE_STRING_FIELD(new_tablespacename);+ WRITE_BOOL_FIELD(nowait);+}++static void+_outSecLabelStmt(StringInfo str, const SecLabelStmt *node)+{+ WRITE_NODE_TYPE("SecLabelStmt");++ WRITE_ENUM_FIELD(objtype);+ WRITE_NODE_PTR_FIELD(objname);+ WRITE_NODE_PTR_FIELD(objargs);+ WRITE_STRING_FIELD(provider);+ WRITE_STRING_FIELD(label);+}++static void+_outCreateForeignTableStmt(StringInfo str, const CreateForeignTableStmt *node)+{+ WRITE_NODE_TYPE("CreateForeignTableStmt");++ WRITE_NODE_FIELD_WITH_TYPE(base, CreateStmt);+ WRITE_STRING_FIELD(servername);+ WRITE_NODE_PTR_FIELD(options);+}++static void+_outImportForeignSchemaStmt(StringInfo str, const ImportForeignSchemaStmt *node)+{+ WRITE_NODE_TYPE("ImportForeignSchemaStmt");++ WRITE_STRING_FIELD(server_name);+ WRITE_STRING_FIELD(remote_schema);+ WRITE_STRING_FIELD(local_schema);+ WRITE_ENUM_FIELD(list_type);+ WRITE_NODE_PTR_FIELD(table_list);+ WRITE_NODE_PTR_FIELD(options);+}++static void+_outCreateExtensionStmt(StringInfo str, const CreateExtensionStmt *node)+{+ WRITE_NODE_TYPE("CreateExtensionStmt");++ WRITE_STRING_FIELD(extname);+ WRITE_BOOL_FIELD(if_not_exists);+ WRITE_NODE_PTR_FIELD(options);+}++static void+_outAlterExtensionStmt(StringInfo str, const AlterExtensionStmt *node)+{+ WRITE_NODE_TYPE("AlterExtensionStmt");++ WRITE_STRING_FIELD(extname);+ WRITE_NODE_PTR_FIELD(options);+}++static void+_outAlterExtensionContentsStmt(StringInfo str, const AlterExtensionContentsStmt *node)+{+ WRITE_NODE_TYPE("AlterExtensionContentsStmt");++ WRITE_STRING_FIELD(extname);+ WRITE_INT_FIELD(action);+ WRITE_ENUM_FIELD(objtype);+ WRITE_NODE_PTR_FIELD(objname);+ WRITE_NODE_PTR_FIELD(objargs);+}++static void+_outCreateEventTrigStmt(StringInfo str, const CreateEventTrigStmt *node)+{+ WRITE_NODE_TYPE("CreateEventTrigStmt");++ WRITE_STRING_FIELD(trigname);+ WRITE_STRING_FIELD(eventname);+ WRITE_NODE_PTR_FIELD(whenclause);+ WRITE_NODE_PTR_FIELD(funcname);+}++static void+_outAlterEventTrigStmt(StringInfo str, const AlterEventTrigStmt *node)+{+ WRITE_NODE_TYPE("AlterEventTrigStmt");++ WRITE_STRING_FIELD(trigname);+ WRITE_CHAR_FIELD(tgenabled);+}++static void+_outRefreshMatViewStmt(StringInfo str, const RefreshMatViewStmt *node)+{+ WRITE_NODE_TYPE("RefreshMatViewStmt");++ WRITE_BOOL_FIELD(concurrent);+ WRITE_BOOL_FIELD(skipData);+ WRITE_NODE_PTR_FIELD(relation);+}++static void+_outReplicaIdentityStmt(StringInfo str, const ReplicaIdentityStmt *node)+{+ WRITE_NODE_TYPE("ReplicaIdentityStmt");++ WRITE_CHAR_FIELD(identity_type);+ WRITE_STRING_FIELD(name);+}++static void+_outAlterSystemStmt(StringInfo str, const AlterSystemStmt *node)+{+ WRITE_NODE_TYPE("AlterSystemStmt");++ WRITE_NODE_PTR_FIELD(setstmt);+}++static void+_outCreatePolicyStmt(StringInfo str, const CreatePolicyStmt *node)+{+ WRITE_NODE_TYPE("CreatePolicyStmt");++ WRITE_STRING_FIELD(policy_name);+ WRITE_NODE_PTR_FIELD(table);+ WRITE_STRING_FIELD(cmd_name);+ WRITE_NODE_PTR_FIELD(roles);+ WRITE_NODE_PTR_FIELD(qual);+ WRITE_NODE_PTR_FIELD(with_check);+}++static void+_outAlterPolicyStmt(StringInfo str, const AlterPolicyStmt *node)+{+ WRITE_NODE_TYPE("AlterPolicyStmt");++ WRITE_STRING_FIELD(policy_name);+ WRITE_NODE_PTR_FIELD(table);+ WRITE_NODE_PTR_FIELD(roles);+ WRITE_NODE_PTR_FIELD(qual);+ WRITE_NODE_PTR_FIELD(with_check);+}++static void+_outCreateTransformStmt(StringInfo str, const CreateTransformStmt *node)+{+ WRITE_NODE_TYPE("CreateTransformStmt");++ WRITE_BOOL_FIELD(replace);+ WRITE_NODE_PTR_FIELD(type_name);+ WRITE_STRING_FIELD(lang);+ WRITE_NODE_PTR_FIELD(fromsql);+ WRITE_NODE_PTR_FIELD(tosql);+}++static void+_outA_Expr(StringInfo str, const A_Expr *node)+{+ WRITE_NODE_TYPE("A_Expr");++ WRITE_ENUM_FIELD(kind);+ WRITE_NODE_PTR_FIELD(name);+ WRITE_NODE_PTR_FIELD(lexpr);+ WRITE_NODE_PTR_FIELD(rexpr);+ WRITE_INT_FIELD(location);+}++static void+_outColumnRef(StringInfo str, const ColumnRef *node)+{+ WRITE_NODE_TYPE("ColumnRef");++ WRITE_NODE_PTR_FIELD(fields);+ WRITE_INT_FIELD(location);+}++static void+_outParamRef(StringInfo str, const ParamRef *node)+{+ WRITE_NODE_TYPE("ParamRef");++ WRITE_INT_FIELD(number);+ WRITE_INT_FIELD(location);+}++static void+_outA_Const(StringInfo str, const A_Const *node)+{+ WRITE_NODE_TYPE("A_Const");++ WRITE_NODE_FIELD(val);+ WRITE_INT_FIELD(location);+}++static void+_outFuncCall(StringInfo str, const FuncCall *node)+{+ WRITE_NODE_TYPE("FuncCall");++ WRITE_NODE_PTR_FIELD(funcname);+ WRITE_NODE_PTR_FIELD(args);+ WRITE_NODE_PTR_FIELD(agg_order);+ WRITE_NODE_PTR_FIELD(agg_filter);+ WRITE_BOOL_FIELD(agg_within_group);+ WRITE_BOOL_FIELD(agg_star);+ WRITE_BOOL_FIELD(agg_distinct);+ WRITE_BOOL_FIELD(func_variadic);+ WRITE_NODE_PTR_FIELD(over);+ WRITE_INT_FIELD(location);+}++static void+_outA_Star(StringInfo str, const A_Star *node)+{+ WRITE_NODE_TYPE("A_Star");++}++static void+_outA_Indices(StringInfo str, const A_Indices *node)+{+ WRITE_NODE_TYPE("A_Indices");++ WRITE_NODE_PTR_FIELD(lidx);+ WRITE_NODE_PTR_FIELD(uidx);+}++static void+_outA_Indirection(StringInfo str, const A_Indirection *node)+{+ WRITE_NODE_TYPE("A_Indirection");++ WRITE_NODE_PTR_FIELD(arg);+ WRITE_NODE_PTR_FIELD(indirection);+}++static void+_outA_ArrayExpr(StringInfo str, const A_ArrayExpr *node)+{+ WRITE_NODE_TYPE("A_ArrayExpr");++ WRITE_NODE_PTR_FIELD(elements);+ WRITE_INT_FIELD(location);+}++static void+_outResTarget(StringInfo str, const ResTarget *node)+{+ WRITE_NODE_TYPE("ResTarget");++ WRITE_STRING_FIELD(name);+ WRITE_NODE_PTR_FIELD(indirection);+ WRITE_NODE_PTR_FIELD(val);+ WRITE_INT_FIELD(location);+}++static void+_outMultiAssignRef(StringInfo str, const MultiAssignRef *node)+{+ WRITE_NODE_TYPE("MultiAssignRef");++ WRITE_NODE_PTR_FIELD(source);+ WRITE_INT_FIELD(colno);+ WRITE_INT_FIELD(ncolumns);+}++static void+_outTypeCast(StringInfo str, const TypeCast *node)+{+ WRITE_NODE_TYPE("TypeCast");++ WRITE_NODE_PTR_FIELD(arg);+ WRITE_NODE_PTR_FIELD(typeName);+ WRITE_INT_FIELD(location);+}++static void+_outCollateClause(StringInfo str, const CollateClause *node)+{+ WRITE_NODE_TYPE("CollateClause");++ WRITE_NODE_PTR_FIELD(arg);+ WRITE_NODE_PTR_FIELD(collname);+ WRITE_INT_FIELD(location);+}++static void+_outSortBy(StringInfo str, const SortBy *node)+{+ WRITE_NODE_TYPE("SortBy");++ WRITE_NODE_PTR_FIELD(node);+ WRITE_ENUM_FIELD(sortby_dir);+ WRITE_ENUM_FIELD(sortby_nulls);+ WRITE_NODE_PTR_FIELD(useOp);+ WRITE_INT_FIELD(location);+}++static void+_outWindowDef(StringInfo str, const WindowDef *node)+{+ WRITE_NODE_TYPE("WindowDef");++ WRITE_STRING_FIELD(name);+ WRITE_STRING_FIELD(refname);+ WRITE_NODE_PTR_FIELD(partitionClause);+ WRITE_NODE_PTR_FIELD(orderClause);+ WRITE_INT_FIELD(frameOptions);+ WRITE_NODE_PTR_FIELD(startOffset);+ WRITE_NODE_PTR_FIELD(endOffset);+ WRITE_INT_FIELD(location);+}++static void+_outRangeSubselect(StringInfo str, const RangeSubselect *node)+{+ WRITE_NODE_TYPE("RangeSubselect");++ WRITE_BOOL_FIELD(lateral);+ WRITE_NODE_PTR_FIELD(subquery);+ WRITE_NODE_PTR_FIELD(alias);+}++static void+_outRangeFunction(StringInfo str, const RangeFunction *node)+{+ WRITE_NODE_TYPE("RangeFunction");++ WRITE_BOOL_FIELD(lateral);+ WRITE_BOOL_FIELD(ordinality);+ WRITE_BOOL_FIELD(is_rowsfrom);+ WRITE_NODE_PTR_FIELD(functions);+ WRITE_NODE_PTR_FIELD(alias);+ WRITE_NODE_PTR_FIELD(coldeflist);+}++static void+_outRangeTableSample(StringInfo str, const RangeTableSample *node)+{+ WRITE_NODE_TYPE("RangeTableSample");++ WRITE_NODE_PTR_FIELD(relation);+ WRITE_NODE_PTR_FIELD(method);+ WRITE_NODE_PTR_FIELD(args);+ WRITE_NODE_PTR_FIELD(repeatable);+ WRITE_INT_FIELD(location);+}++static void+_outTypeName(StringInfo str, const TypeName *node)+{+ WRITE_NODE_TYPE("TypeName");++ WRITE_NODE_PTR_FIELD(names);+ WRITE_UINT_FIELD(typeOid);+ WRITE_BOOL_FIELD(setof);+ WRITE_BOOL_FIELD(pct_type);+ WRITE_NODE_PTR_FIELD(typmods);+ WRITE_INT_FIELD(typemod);+ WRITE_NODE_PTR_FIELD(arrayBounds);+ WRITE_INT_FIELD(location);+}++static void+_outColumnDef(StringInfo str, const ColumnDef *node)+{+ WRITE_NODE_TYPE("ColumnDef");++ WRITE_STRING_FIELD(colname);+ WRITE_NODE_PTR_FIELD(typeName);+ WRITE_INT_FIELD(inhcount);+ WRITE_BOOL_FIELD(is_local);+ WRITE_BOOL_FIELD(is_not_null);+ WRITE_BOOL_FIELD(is_from_type);+ WRITE_CHAR_FIELD(storage);+ WRITE_NODE_PTR_FIELD(raw_default);+ WRITE_NODE_PTR_FIELD(cooked_default);+ WRITE_NODE_PTR_FIELD(collClause);+ WRITE_UINT_FIELD(collOid);+ WRITE_NODE_PTR_FIELD(constraints);+ WRITE_NODE_PTR_FIELD(fdwoptions);+ WRITE_INT_FIELD(location);+}++static void+_outIndexElem(StringInfo str, const IndexElem *node)+{+ WRITE_NODE_TYPE("IndexElem");++ WRITE_STRING_FIELD(name);+ WRITE_NODE_PTR_FIELD(expr);+ WRITE_STRING_FIELD(indexcolname);+ WRITE_NODE_PTR_FIELD(collation);+ WRITE_NODE_PTR_FIELD(opclass);+ WRITE_ENUM_FIELD(ordering);+ WRITE_ENUM_FIELD(nulls_ordering);+}++static void+_outConstraint(StringInfo str, const Constraint *node)+{+ WRITE_NODE_TYPE("Constraint");++ WRITE_ENUM_FIELD(contype);+ WRITE_STRING_FIELD(conname);+ WRITE_BOOL_FIELD(deferrable);+ WRITE_BOOL_FIELD(initdeferred);+ WRITE_INT_FIELD(location);+ WRITE_BOOL_FIELD(is_no_inherit);+ WRITE_NODE_PTR_FIELD(raw_expr);+ WRITE_STRING_FIELD(cooked_expr);+ WRITE_NODE_PTR_FIELD(keys);+ WRITE_NODE_PTR_FIELD(exclusions);+ WRITE_NODE_PTR_FIELD(options);+ WRITE_STRING_FIELD(indexname);+ WRITE_STRING_FIELD(indexspace);+ WRITE_STRING_FIELD(access_method);+ WRITE_NODE_PTR_FIELD(where_clause);+ WRITE_NODE_PTR_FIELD(pktable);+ WRITE_NODE_PTR_FIELD(fk_attrs);+ WRITE_NODE_PTR_FIELD(pk_attrs);+ WRITE_CHAR_FIELD(fk_matchtype);+ WRITE_CHAR_FIELD(fk_upd_action);+ WRITE_CHAR_FIELD(fk_del_action);+ WRITE_NODE_PTR_FIELD(old_conpfeqop);+ WRITE_UINT_FIELD(old_pktable_oid);+ WRITE_BOOL_FIELD(skip_validation);+ WRITE_BOOL_FIELD(initially_valid);+}++static void+_outDefElem(StringInfo str, const DefElem *node)+{+ WRITE_NODE_TYPE("DefElem");++ WRITE_STRING_FIELD(defnamespace);+ WRITE_STRING_FIELD(defname);+ WRITE_NODE_PTR_FIELD(arg);+ WRITE_ENUM_FIELD(defaction);+ WRITE_INT_FIELD(location);+}++static void+_outRangeTblEntry(StringInfo str, const RangeTblEntry *node)+{+ WRITE_NODE_TYPE("RangeTblEntry");++ WRITE_ENUM_FIELD(rtekind);+ WRITE_UINT_FIELD(relid);+ WRITE_CHAR_FIELD(relkind);+ WRITE_NODE_PTR_FIELD(tablesample);+ WRITE_NODE_PTR_FIELD(subquery);+ WRITE_BOOL_FIELD(security_barrier);+ WRITE_ENUM_FIELD(jointype);+ WRITE_NODE_PTR_FIELD(joinaliasvars);+ WRITE_NODE_PTR_FIELD(functions);+ WRITE_BOOL_FIELD(funcordinality);+ WRITE_NODE_PTR_FIELD(values_lists);+ WRITE_NODE_PTR_FIELD(values_collations);+ WRITE_STRING_FIELD(ctename);+ WRITE_UINT_FIELD(ctelevelsup);+ WRITE_BOOL_FIELD(self_reference);+ WRITE_NODE_PTR_FIELD(ctecoltypes);+ WRITE_NODE_PTR_FIELD(ctecoltypmods);+ WRITE_NODE_PTR_FIELD(ctecolcollations);+ WRITE_NODE_PTR_FIELD(alias);+ WRITE_NODE_PTR_FIELD(eref);+ WRITE_BOOL_FIELD(lateral);+ WRITE_BOOL_FIELD(inh);+ WRITE_BOOL_FIELD(inFromCl);+ WRITE_ENUM_FIELD(requiredPerms);+ WRITE_UINT_FIELD(checkAsUser);+ WRITE_BITMAPSET_FIELD(selectedCols);+ WRITE_BITMAPSET_FIELD(insertedCols);+ WRITE_BITMAPSET_FIELD(updatedCols);+ WRITE_NODE_PTR_FIELD(securityQuals);+}++static void+_outRangeTblFunction(StringInfo str, const RangeTblFunction *node)+{+ WRITE_NODE_TYPE("RangeTblFunction");++ WRITE_NODE_PTR_FIELD(funcexpr);+ WRITE_INT_FIELD(funccolcount);+ WRITE_NODE_PTR_FIELD(funccolnames);+ WRITE_NODE_PTR_FIELD(funccoltypes);+ WRITE_NODE_PTR_FIELD(funccoltypmods);+ WRITE_NODE_PTR_FIELD(funccolcollations);+ WRITE_BITMAPSET_FIELD(funcparams);+}++static void+_outTableSampleClause(StringInfo str, const TableSampleClause *node)+{+ WRITE_NODE_TYPE("TableSampleClause");++ WRITE_UINT_FIELD(tsmhandler);+ WRITE_NODE_PTR_FIELD(args);+ WRITE_NODE_PTR_FIELD(repeatable);+}++static void+_outWithCheckOption(StringInfo str, const WithCheckOption *node)+{+ WRITE_NODE_TYPE("WithCheckOption");++ WRITE_ENUM_FIELD(kind);+ WRITE_STRING_FIELD(relname);+ WRITE_STRING_FIELD(polname);+ WRITE_NODE_PTR_FIELD(qual);+ WRITE_BOOL_FIELD(cascaded);+}++static void+_outSortGroupClause(StringInfo str, const SortGroupClause *node)+{+ WRITE_NODE_TYPE("SortGroupClause");++ WRITE_UINT_FIELD(tleSortGroupRef);+ WRITE_UINT_FIELD(eqop);+ WRITE_UINT_FIELD(sortop);+ WRITE_BOOL_FIELD(nulls_first);+ WRITE_BOOL_FIELD(hashable);+}++static void+_outGroupingSet(StringInfo str, const GroupingSet *node)+{+ WRITE_NODE_TYPE("GroupingSet");++ WRITE_ENUM_FIELD(kind);+ WRITE_NODE_PTR_FIELD(content);+ WRITE_INT_FIELD(location);+}++static void+_outWindowClause(StringInfo str, const WindowClause *node)+{+ WRITE_NODE_TYPE("WindowClause");++ WRITE_STRING_FIELD(name);+ WRITE_STRING_FIELD(refname);+ WRITE_NODE_PTR_FIELD(partitionClause);+ WRITE_NODE_PTR_FIELD(orderClause);+ WRITE_INT_FIELD(frameOptions);+ WRITE_NODE_PTR_FIELD(startOffset);+ WRITE_NODE_PTR_FIELD(endOffset);+ WRITE_UINT_FIELD(winref);+ WRITE_BOOL_FIELD(copiedOrder);+}++static void+_outFuncWithArgs(StringInfo str, const FuncWithArgs *node)+{+ WRITE_NODE_TYPE("FuncWithArgs");++ WRITE_NODE_PTR_FIELD(funcname);+ WRITE_NODE_PTR_FIELD(funcargs);+}++static void+_outAccessPriv(StringInfo str, const AccessPriv *node)+{+ WRITE_NODE_TYPE("AccessPriv");++ WRITE_STRING_FIELD(priv_name);+ WRITE_NODE_PTR_FIELD(cols);+}++static void+_outCreateOpClassItem(StringInfo str, const CreateOpClassItem *node)+{+ WRITE_NODE_TYPE("CreateOpClassItem");++ WRITE_INT_FIELD(itemtype);+ WRITE_NODE_PTR_FIELD(name);+ WRITE_NODE_PTR_FIELD(args);+ WRITE_INT_FIELD(number);+ WRITE_NODE_PTR_FIELD(order_family);+ WRITE_NODE_PTR_FIELD(class_args);+ WRITE_NODE_PTR_FIELD(storedtype);+}++static void+_outTableLikeClause(StringInfo str, const TableLikeClause *node)+{+ WRITE_NODE_TYPE("TableLikeClause");++ WRITE_NODE_PTR_FIELD(relation);+ WRITE_UINT_FIELD(options);+}++static void+_outFunctionParameter(StringInfo str, const FunctionParameter *node)+{+ WRITE_NODE_TYPE("FunctionParameter");++ WRITE_STRING_FIELD(name);+ WRITE_NODE_PTR_FIELD(argType);+ WRITE_ENUM_FIELD(mode);+ WRITE_NODE_PTR_FIELD(defexpr);+}++static void+_outLockingClause(StringInfo str, const LockingClause *node)+{+ WRITE_NODE_TYPE("LockingClause");++ WRITE_NODE_PTR_FIELD(lockedRels);+ WRITE_ENUM_FIELD(strength);+ WRITE_ENUM_FIELD(waitPolicy);+}++static void+_outRowMarkClause(StringInfo str, const RowMarkClause *node)+{+ WRITE_NODE_TYPE("RowMarkClause");++ WRITE_UINT_FIELD(rti);+ WRITE_ENUM_FIELD(strength);+ WRITE_ENUM_FIELD(waitPolicy);+ WRITE_BOOL_FIELD(pushedDown);+}++static void+_outXmlSerialize(StringInfo str, const XmlSerialize *node)+{+ WRITE_NODE_TYPE("XmlSerialize");++ WRITE_ENUM_FIELD(xmloption);+ WRITE_NODE_PTR_FIELD(expr);+ WRITE_NODE_PTR_FIELD(typeName);+ WRITE_INT_FIELD(location);+}++static void+_outWithClause(StringInfo str, const WithClause *node)+{+ WRITE_NODE_TYPE("WithClause");++ WRITE_NODE_PTR_FIELD(ctes);+ WRITE_BOOL_FIELD(recursive);+ WRITE_INT_FIELD(location);+}++static void+_outInferClause(StringInfo str, const InferClause *node)+{+ WRITE_NODE_TYPE("InferClause");++ WRITE_NODE_PTR_FIELD(indexElems);+ WRITE_NODE_PTR_FIELD(whereClause);+ WRITE_STRING_FIELD(conname);+ WRITE_INT_FIELD(location);+}++static void+_outOnConflictClause(StringInfo str, const OnConflictClause *node)+{+ WRITE_NODE_TYPE("OnConflictClause");++ WRITE_ENUM_FIELD(action);+ WRITE_NODE_PTR_FIELD(infer);+ WRITE_NODE_PTR_FIELD(targetList);+ WRITE_NODE_PTR_FIELD(whereClause);+ WRITE_INT_FIELD(location);+}++static void+_outCommonTableExpr(StringInfo str, const CommonTableExpr *node)+{+ WRITE_NODE_TYPE("CommonTableExpr");++ WRITE_STRING_FIELD(ctename);+ WRITE_NODE_PTR_FIELD(aliascolnames);+ WRITE_NODE_PTR_FIELD(ctequery);+ WRITE_INT_FIELD(location);+ WRITE_BOOL_FIELD(cterecursive);+ WRITE_INT_FIELD(cterefcount);+ WRITE_NODE_PTR_FIELD(ctecolnames);+ WRITE_NODE_PTR_FIELD(ctecoltypes);+ WRITE_NODE_PTR_FIELD(ctecoltypmods);+ WRITE_NODE_PTR_FIELD(ctecolcollations);+}++static void+_outRoleSpec(StringInfo str, const RoleSpec *node)+{+ WRITE_NODE_TYPE("RoleSpec");++ WRITE_ENUM_FIELD(roletype);+ WRITE_STRING_FIELD(rolename);+ WRITE_INT_FIELD(location);+}++static void+_outInlineCodeBlock(StringInfo str, const InlineCodeBlock *node)+{+ WRITE_NODE_TYPE("InlineCodeBlock");++ WRITE_STRING_FIELD(source_text);+ WRITE_UINT_FIELD(langOid);+ WRITE_BOOL_FIELD(langIsTrusted);+}+
+ foreign/libpg_query/src/pg_query_json_helper.c view
@@ -0,0 +1,129 @@+#include "lib/stringinfo.h"++/* Write the label for the node type */+#define WRITE_NODE_TYPE(nodelabel) \+ appendStringInfoString(str, "\"" nodelabel "\": {")++/* Write an integer field */+#define WRITE_INT_FIELD(fldname) \+ if (node->fldname != 0) { \+ appendStringInfo(str, "\"" CppAsString(fldname) "\": %d, ", node->fldname); \+ }++#define WRITE_INT_VALUE(fldname, value) \+ if (value != 0) { \+ appendStringInfo(str, "\"" CppAsString(fldname) "\": %d, ", value); \+ }++/* Write an unsigned integer field */+#define WRITE_UINT_FIELD(fldname) \+ if (node->fldname != 0) { \+ appendStringInfo(str, "\"" CppAsString(fldname) "\": %u, ", node->fldname); \+ }++/* Write a long-integer field */+#define WRITE_LONG_FIELD(fldname) \+ if (node->fldname != 0) { \+ appendStringInfo(str, "\"" CppAsString(fldname) "\": %ld, ", node->fldname); \+ }++/* Write a char field (ie, one ascii character) */+#define WRITE_CHAR_FIELD(fldname) \+ if (node->fldname != 0) { \+ appendStringInfo(str, "\"" CppAsString(fldname) "\": \"%c\", ", node->fldname); \+ }++/* Write an enumerated-type field as an integer code */+#define WRITE_ENUM_FIELD(fldname) \+ appendStringInfo(str, "\"" CppAsString(fldname) "\": %d, ", \+ (int) node->fldname)++/* Write a float field */+#define WRITE_FLOAT_FIELD(fldname) \+ appendStringInfo(str, "\"" CppAsString(fldname) "\": %f, ", node->fldname)++/* Write a boolean field */+#define WRITE_BOOL_FIELD(fldname) \+ if (node->fldname) { \+ appendStringInfo(str, "\"" CppAsString(fldname) "\": %s, ", \+ booltostr(node->fldname)); \+ }++/* Write a character-string (possibly NULL) field */+#define WRITE_STRING_FIELD(fldname) \+ if (node->fldname != NULL) { \+ appendStringInfo(str, "\"" CppAsString(fldname) "\": "); \+ _outToken(str, node->fldname); \+ appendStringInfo(str, ", "); \+ }++#define WRITE_STRING_VALUE(fldname, value) \+ if (true) { \+ appendStringInfo(str, "\"" CppAsString(fldname) "\": "); \+ _outToken(str, value); \+ appendStringInfo(str, ", "); \+ }+++#define booltostr(x) ((x) ? "true" : "false")++static void+removeTrailingDelimiter(StringInfo str)+{+ if (str->len >= 2 && str->data[str->len - 2] == ',' && str->data[str->len - 1] == ' ') {+ str->len -= 2;+ str->data[str->len] = '\0';+ } else if (str->len >= 1 && str->data[str->len - 1] == ',') {+ str->len -= 1;+ str->data[str->len] = '\0';+ }+}++static void+_outToken(StringInfo buf, const char *str)+{+ if (str == NULL)+ {+ appendStringInfoString(buf, "null");+ return;+ }++ // copied directly from https://github.com/postgres/postgres/blob/master/src/backend/utils/adt/json.c#L2428+ const char *p;++ appendStringInfoCharMacro(buf, '"');+ for (p = str; *p; p++)+ {+ switch (*p)+ {+ case '\b':+ appendStringInfoString(buf, "\\b");+ break;+ case '\f':+ appendStringInfoString(buf, "\\f");+ break;+ case '\n':+ appendStringInfoString(buf, "\\n");+ break;+ case '\r':+ appendStringInfoString(buf, "\\r");+ break;+ case '\t':+ appendStringInfoString(buf, "\\t");+ break;+ case '"':+ appendStringInfoString(buf, "\\\"");+ break;+ case '\\':+ appendStringInfoString(buf, "\\\\");+ break;+ default:+ if ((unsigned char) *p < ' ')+ appendStringInfo(buf, "\\u%04x", (int) *p);+ else+ appendStringInfoCharMacro(buf, *p);+ break;+ }+ }+ appendStringInfoCharMacro(buf, '"');+}
+ foreign/libpg_query/src/pg_query_json_plpgsql.c view
@@ -0,0 +1,672 @@+#include "pg_query.h"+#include "pg_query_json_plpgsql.h"++#include "pg_query_json_helper.c"++#define WRITE_OBJ_FIELD(fldname, outfunc) \+ if (node->fldname != NULL) { \+ appendStringInfo(str, "\"" CppAsString(fldname) "\": {"); \+ outfunc(str, node->fldname); \+ removeTrailingDelimiter(str); \+ appendStringInfo(str, "}}, "); \+ }++#define WRITE_LIST_FIELD(fldname, fldtype, outfunc) \+ if (node->fldname != NULL) { \+ ListCell *lc; \+ appendStringInfo(str, "\"" CppAsString(fldname) "\": ["); \+ foreach(lc, node->fldname) { \+ appendStringInfoString(str, "{"); \+ outfunc(str, (fldtype *) lfirst(lc)); \+ removeTrailingDelimiter(str); \+ appendStringInfoString(str, "}},"); \+ } \+ removeTrailingDelimiter(str); \+ appendStringInfoString(str, "], "); \+ }++ #define WRITE_STATEMENTS_FIELD(fldname) \+ if (node->fldname != NULL) { \+ ListCell *lc; \+ appendStringInfo(str, "\"" CppAsString(fldname) "\": ["); \+ foreach(lc, node->fldname) { \+ dump_stmt(str, (PLpgSQL_stmt *) lfirst(lc)); \+ } \+ removeTrailingDelimiter(str); \+ appendStringInfoString(str, "],"); \+ }++#define WRITE_EXPR_FIELD(fldname) WRITE_OBJ_FIELD(fldname, dump_expr)+#define WRITE_BLOCK_FIELD(fldname) WRITE_OBJ_FIELD(fldname, dump_block)+#define WRITE_RECORD_FIELD(fldname) WRITE_OBJ_FIELD(fldname, dump_record)+#define WRITE_ROW_FIELD(fldname) WRITE_OBJ_FIELD(fldname, dump_row)+#define WRITE_VAR_FIELD(fldname) WRITE_OBJ_FIELD(fldname, dump_var)++static void dump_record(StringInfo str, PLpgSQL_rec *stmt);+static void dump_row(StringInfo str, PLpgSQL_row *stmt);+static void dump_var(StringInfo str, PLpgSQL_var *stmt);+static void dump_record_field(StringInfo str, PLpgSQL_recfield *node);+static void dump_array_elem(StringInfo str, PLpgSQL_arrayelem *node);+static void dump_stmt(StringInfo str, PLpgSQL_stmt *stmt);+static void dump_block(StringInfo str, PLpgSQL_stmt_block *block);+static void dump_exception_block(StringInfo str, PLpgSQL_exception_block *node);+static void dump_assign(StringInfo str, PLpgSQL_stmt_assign *stmt);+static void dump_if(StringInfo str, PLpgSQL_stmt_if *stmt);+static void dump_if_elsif(StringInfo str, PLpgSQL_if_elsif *node);+static void dump_case(StringInfo str, PLpgSQL_stmt_case *stmt);+static void dump_case_when(StringInfo str, PLpgSQL_case_when *node);+static void dump_loop(StringInfo str, PLpgSQL_stmt_loop *stmt);+static void dump_while(StringInfo str, PLpgSQL_stmt_while *stmt);+static void dump_fori(StringInfo str, PLpgSQL_stmt_fori *stmt);+static void dump_fors(StringInfo str, PLpgSQL_stmt_fors *stmt);+static void dump_forc(StringInfo str, PLpgSQL_stmt_forc *stmt);+static void dump_foreach_a(StringInfo str, PLpgSQL_stmt_foreach_a *stmt);+static void dump_exit(StringInfo str, PLpgSQL_stmt_exit *stmt);+static void dump_return(StringInfo str, PLpgSQL_stmt_return *stmt);+static void dump_return_next(StringInfo str, PLpgSQL_stmt_return_next *stmt);+static void dump_return_query(StringInfo str, PLpgSQL_stmt_return_query *stmt);+static void dump_raise(StringInfo str, PLpgSQL_stmt_raise *stmt);+static void dump_raise_option(StringInfo str, PLpgSQL_raise_option *node);+static void dump_execsql(StringInfo str, PLpgSQL_stmt_execsql *stmt);+static void dump_dynexecute(StringInfo str, PLpgSQL_stmt_dynexecute *stmt);+static void dump_dynfors(StringInfo str, PLpgSQL_stmt_dynfors *stmt);+static void dump_getdiag(StringInfo str, PLpgSQL_stmt_getdiag *stmt);+static void dump_getdiag_item(StringInfo str, PLpgSQL_diag_item *node);+static void dump_open(StringInfo str, PLpgSQL_stmt_open *stmt);+static void dump_fetch(StringInfo str, PLpgSQL_stmt_fetch *stmt);+static void dump_close(StringInfo str, PLpgSQL_stmt_close *stmt);+static void dump_perform(StringInfo str, PLpgSQL_stmt_perform *stmt);+static void dump_expr(StringInfo str, PLpgSQL_expr *expr);+static void dump_function(StringInfo str, PLpgSQL_function *func);+static void dump_exception(StringInfo str, PLpgSQL_exception *node);+static void dump_condition(StringInfo str, PLpgSQL_condition *node);+static void dump_type(StringInfo str, PLpgSQL_type *node);++static void+dump_stmt(StringInfo str, PLpgSQL_stmt *node)+{+ appendStringInfoChar(str, '{');+ switch ((enum PLpgSQL_stmt_types) node->cmd_type)+ {+ case PLPGSQL_STMT_BLOCK:+ dump_block(str, (PLpgSQL_stmt_block *) node);+ break;+ case PLPGSQL_STMT_ASSIGN:+ dump_assign(str, (PLpgSQL_stmt_assign *) node);+ break;+ case PLPGSQL_STMT_IF:+ dump_if(str, (PLpgSQL_stmt_if *) node);+ break;+ case PLPGSQL_STMT_CASE:+ dump_case(str, (PLpgSQL_stmt_case *) node);+ break;+ case PLPGSQL_STMT_LOOP:+ dump_loop(str, (PLpgSQL_stmt_loop *) node);+ break;+ case PLPGSQL_STMT_WHILE:+ dump_while(str, (PLpgSQL_stmt_while *) node);+ break;+ case PLPGSQL_STMT_FORI:+ dump_fori(str, (PLpgSQL_stmt_fori *) node);+ break;+ case PLPGSQL_STMT_FORS:+ dump_fors(str, (PLpgSQL_stmt_fors *) node);+ break;+ case PLPGSQL_STMT_FORC:+ dump_forc(str, (PLpgSQL_stmt_forc *) node);+ break;+ case PLPGSQL_STMT_FOREACH_A:+ dump_foreach_a(str, (PLpgSQL_stmt_foreach_a *) node);+ break;+ case PLPGSQL_STMT_EXIT:+ dump_exit(str, (PLpgSQL_stmt_exit *) node);+ break;+ case PLPGSQL_STMT_RETURN:+ dump_return(str, (PLpgSQL_stmt_return *) node);+ break;+ case PLPGSQL_STMT_RETURN_NEXT:+ dump_return_next(str, (PLpgSQL_stmt_return_next *) node);+ break;+ case PLPGSQL_STMT_RETURN_QUERY:+ dump_return_query(str, (PLpgSQL_stmt_return_query *) node);+ break;+ case PLPGSQL_STMT_RAISE:+ dump_raise(str, (PLpgSQL_stmt_raise *) node);+ break;+ case PLPGSQL_STMT_EXECSQL:+ dump_execsql(str, (PLpgSQL_stmt_execsql *) node);+ break;+ case PLPGSQL_STMT_DYNEXECUTE:+ dump_dynexecute(str, (PLpgSQL_stmt_dynexecute *) node);+ break;+ case PLPGSQL_STMT_DYNFORS:+ dump_dynfors(str, (PLpgSQL_stmt_dynfors *) node);+ break;+ case PLPGSQL_STMT_GETDIAG:+ dump_getdiag(str, (PLpgSQL_stmt_getdiag *) node);+ break;+ case PLPGSQL_STMT_OPEN:+ dump_open(str, (PLpgSQL_stmt_open *) node);+ break;+ case PLPGSQL_STMT_FETCH:+ dump_fetch(str, (PLpgSQL_stmt_fetch *) node);+ break;+ case PLPGSQL_STMT_CLOSE:+ dump_close(str, (PLpgSQL_stmt_close *) node);+ break;+ case PLPGSQL_STMT_PERFORM:+ dump_perform(str, (PLpgSQL_stmt_perform *) node);+ break;+ default:+ elog(ERROR, "unrecognized cmd_type: %d", node->cmd_type);+ break;+ }+ removeTrailingDelimiter(str);+ appendStringInfoString(str, "}}, ");+}++static void+dump_block(StringInfo str, PLpgSQL_stmt_block *node)+{+ WRITE_NODE_TYPE("PLpgSQL_stmt_block");++ WRITE_INT_FIELD(lineno);+ WRITE_STRING_FIELD(label);+ WRITE_STATEMENTS_FIELD(body);+ WRITE_OBJ_FIELD(exceptions, dump_exception_block);++ removeTrailingDelimiter(str);+}++static void+dump_exception_block(StringInfo str, PLpgSQL_exception_block *node)+{+ WRITE_NODE_TYPE("PLpgSQL_exception_block");++ WRITE_LIST_FIELD(exc_list, PLpgSQL_exception, dump_exception);+}++static void+dump_exception(StringInfo str, PLpgSQL_exception *node)+{+ PLpgSQL_condition *cond;++ WRITE_NODE_TYPE("PLpgSQL_exception");++ appendStringInfo(str, "\"conditions\": [");+ for (cond = node->conditions; cond; cond = cond->next)+ {+ appendStringInfoString(str, "{");+ dump_condition(str, cond);+ removeTrailingDelimiter(str);+ appendStringInfoString(str, "}},");+ }+ removeTrailingDelimiter(str);+ appendStringInfoString(str, "], ");++ WRITE_STATEMENTS_FIELD(action);+}++static void+dump_condition(StringInfo str, PLpgSQL_condition *node)+{+ WRITE_NODE_TYPE("PLpgSQL_condition");++ WRITE_STRING_FIELD(condname);+}++static void+dump_assign(StringInfo str, PLpgSQL_stmt_assign *node)+{+ WRITE_NODE_TYPE("PLpgSQL_stmt_assign");++ WRITE_INT_FIELD(lineno);+ WRITE_INT_FIELD(varno);+ WRITE_EXPR_FIELD(expr);+}++static void+dump_if(StringInfo str, PLpgSQL_stmt_if *node)+{+ WRITE_NODE_TYPE("PLpgSQL_stmt_if");++ WRITE_INT_FIELD(lineno);+ WRITE_EXPR_FIELD(cond);+ WRITE_STATEMENTS_FIELD(then_body);+ WRITE_LIST_FIELD(elsif_list, PLpgSQL_if_elsif, dump_if_elsif);+ WRITE_STATEMENTS_FIELD(else_body);+}++static void+dump_if_elsif(StringInfo str, PLpgSQL_if_elsif *node)+{+ WRITE_NODE_TYPE("PLpgSQL_if_elsif");++ WRITE_INT_FIELD(lineno);+ WRITE_EXPR_FIELD(cond);+ WRITE_STATEMENTS_FIELD(stmts);+}++static void+dump_case(StringInfo str, PLpgSQL_stmt_case *node)+{+ ListCell *l;++ WRITE_NODE_TYPE("PLpgSQL_stmt_case");++ WRITE_INT_FIELD(lineno);+ WRITE_EXPR_FIELD(t_expr);+ WRITE_INT_FIELD(t_varno);+ WRITE_LIST_FIELD(case_when_list, PLpgSQL_case_when, dump_case_when);+ WRITE_BOOL_FIELD(have_else);+ WRITE_STATEMENTS_FIELD(else_stmts);+}++static void+dump_case_when(StringInfo str, PLpgSQL_case_when *node)+{+ WRITE_NODE_TYPE("PLpgSQL_case_when");++ WRITE_INT_FIELD(lineno);+ WRITE_EXPR_FIELD(expr);+ WRITE_STATEMENTS_FIELD(stmts);+}++static void+dump_loop(StringInfo str, PLpgSQL_stmt_loop *node)+{+ WRITE_NODE_TYPE("PLpgSQL_stmt_loop");++ WRITE_INT_FIELD(lineno);+ WRITE_STRING_FIELD(label);+ WRITE_STATEMENTS_FIELD(body);+}++static void+dump_while(StringInfo str, PLpgSQL_stmt_while *node)+{+ WRITE_NODE_TYPE("PLpgSQL_stmt_while");++ WRITE_INT_FIELD(lineno);+ WRITE_STRING_FIELD(label);+ WRITE_EXPR_FIELD(cond);+ WRITE_STATEMENTS_FIELD(body);+}++/* FOR statement with integer loopvar */+static void+dump_fori(StringInfo str, PLpgSQL_stmt_fori *node)+{+ WRITE_NODE_TYPE("PLpgSQL_stmt_fori");++ WRITE_INT_FIELD(lineno);+ WRITE_STRING_FIELD(label);+ WRITE_VAR_FIELD(var);+ WRITE_EXPR_FIELD(lower);+ WRITE_EXPR_FIELD(upper);+ WRITE_EXPR_FIELD(step);+ WRITE_BOOL_FIELD(reverse);+ WRITE_STATEMENTS_FIELD(body);+}++static void+dump_fors(StringInfo str, PLpgSQL_stmt_fors *node)+{+ WRITE_NODE_TYPE("PLpgSQL_stmt_fors");++ WRITE_INT_FIELD(lineno);+ WRITE_STRING_FIELD(label);+ WRITE_RECORD_FIELD(rec);+ WRITE_ROW_FIELD(row);+ WRITE_STATEMENTS_FIELD(body);+ WRITE_EXPR_FIELD(query);+}++static void+dump_forc(StringInfo str, PLpgSQL_stmt_forc *node)+{+ WRITE_NODE_TYPE("PLpgSQL_stmt_forc");++ WRITE_INT_FIELD(lineno);+ WRITE_STRING_FIELD(label);+ WRITE_RECORD_FIELD(rec);+ WRITE_ROW_FIELD(row);+ WRITE_STATEMENTS_FIELD(body);+ WRITE_INT_FIELD(curvar);+ WRITE_EXPR_FIELD(argquery);+}++static void+dump_foreach_a(StringInfo str, PLpgSQL_stmt_foreach_a *node)+{+ WRITE_NODE_TYPE("PLpgSQL_stmt_foreach_a");++ WRITE_INT_FIELD(lineno);+ WRITE_STRING_FIELD(label);+ WRITE_INT_FIELD(varno);+ WRITE_INT_FIELD(slice);+ WRITE_EXPR_FIELD(expr);+ WRITE_STATEMENTS_FIELD(body);+}++static void+dump_open(StringInfo str, PLpgSQL_stmt_open *node)+{+ WRITE_NODE_TYPE("PLpgSQL_stmt_open");++ WRITE_INT_FIELD(lineno);+ WRITE_INT_FIELD(curvar);+ WRITE_INT_FIELD(cursor_options);+ WRITE_ROW_FIELD(returntype);+ WRITE_EXPR_FIELD(argquery);+ WRITE_EXPR_FIELD(query);+ WRITE_EXPR_FIELD(dynquery);+ WRITE_LIST_FIELD(params, PLpgSQL_expr, dump_expr);+}++static void+dump_fetch(StringInfo str, PLpgSQL_stmt_fetch *node)+{+ WRITE_NODE_TYPE("PLpgSQL_stmt_fetch");++ WRITE_INT_FIELD(lineno);+ WRITE_RECORD_FIELD(rec);+ WRITE_ROW_FIELD(row);+ WRITE_INT_FIELD(curvar);+ WRITE_ENUM_FIELD(direction);+ WRITE_LONG_FIELD(how_many);+ WRITE_EXPR_FIELD(expr);+ WRITE_BOOL_FIELD(is_move);+ WRITE_BOOL_FIELD(returns_multiple_rows);+}++static void+dump_close(StringInfo str, PLpgSQL_stmt_close *node)+{+ WRITE_NODE_TYPE("PLpgSQL_stmt_close");++ WRITE_INT_FIELD(lineno);+ WRITE_INT_FIELD(curvar);+}++static void+dump_perform(StringInfo str, PLpgSQL_stmt_perform *node)+{+ WRITE_NODE_TYPE("PLpgSQL_stmt_perform");++ WRITE_INT_FIELD(lineno);+ WRITE_EXPR_FIELD(expr);+}++static void+dump_exit(StringInfo str, PLpgSQL_stmt_exit *node)+{+ WRITE_NODE_TYPE("PLpgSQL_stmt_exit");++ WRITE_INT_FIELD(lineno);+ WRITE_BOOL_FIELD(is_exit);+ WRITE_STRING_FIELD(label);+ WRITE_EXPR_FIELD(cond);+}++static void+dump_return(StringInfo str, PLpgSQL_stmt_return *node)+{+ WRITE_NODE_TYPE("PLpgSQL_stmt_return");++ WRITE_INT_FIELD(lineno);+ WRITE_EXPR_FIELD(expr);+ //WRITE_INT_FIELD(retvarno);+}++static void+dump_return_next(StringInfo str, PLpgSQL_stmt_return_next *node)+{+ WRITE_NODE_TYPE("PLpgSQL_stmt_return_next");++ WRITE_INT_FIELD(lineno);+ WRITE_EXPR_FIELD(expr);+ //WRITE_INT_FIELD(retvarno);+}++static void+dump_return_query(StringInfo str, PLpgSQL_stmt_return_query *node)+{+ WRITE_NODE_TYPE("PLpgSQL_stmt_return_query");++ WRITE_INT_FIELD(lineno);+ WRITE_EXPR_FIELD(query);+ WRITE_EXPR_FIELD(dynquery);+ WRITE_LIST_FIELD(params, PLpgSQL_expr, dump_expr);+}++static void+dump_raise(StringInfo str, PLpgSQL_stmt_raise *node)+{+ WRITE_NODE_TYPE("PLpgSQL_stmt_raise");++ WRITE_INT_FIELD(lineno);+ WRITE_INT_FIELD(elog_level);+ WRITE_STRING_FIELD(condname);+ WRITE_STRING_FIELD(message);+ WRITE_LIST_FIELD(params, PLpgSQL_expr, dump_expr);+ WRITE_LIST_FIELD(options, PLpgSQL_raise_option, dump_raise_option);+}++static void+dump_raise_option(StringInfo str, PLpgSQL_raise_option *node)+{+ WRITE_NODE_TYPE("PLpgSQL_raise_option");++ WRITE_ENUM_FIELD(opt_type);+ WRITE_EXPR_FIELD(expr);+}++static void+dump_execsql(StringInfo str, PLpgSQL_stmt_execsql *node)+{+ WRITE_NODE_TYPE("PLpgSQL_stmt_execsql");++ WRITE_INT_FIELD(lineno);+ WRITE_EXPR_FIELD(sqlstmt);+ //WRITE_BOOL_FIELD(mod_stmt); // This is only populated when executing the function+ WRITE_BOOL_FIELD(into);+ WRITE_BOOL_FIELD(strict);+ WRITE_RECORD_FIELD(rec);+ WRITE_ROW_FIELD(row);+}++static void+dump_dynexecute(StringInfo str, PLpgSQL_stmt_dynexecute *node)+{+ WRITE_NODE_TYPE("PLpgSQL_stmt_dynexecute");++ WRITE_INT_FIELD(lineno);+ WRITE_EXPR_FIELD(query);+ WRITE_BOOL_FIELD(into);+ WRITE_BOOL_FIELD(strict);+ WRITE_RECORD_FIELD(rec);+ WRITE_ROW_FIELD(row);+ WRITE_LIST_FIELD(params, PLpgSQL_expr, dump_expr);+}++static void+dump_dynfors(StringInfo str, PLpgSQL_stmt_dynfors *node)+{+ WRITE_NODE_TYPE("PLpgSQL_stmt_dynfors");++ WRITE_INT_FIELD(lineno);+ WRITE_STRING_FIELD(label);+ WRITE_RECORD_FIELD(rec);+ WRITE_ROW_FIELD(row);+ WRITE_STATEMENTS_FIELD(body);+ WRITE_EXPR_FIELD(query);+ WRITE_LIST_FIELD(params, PLpgSQL_expr, dump_expr);+}++static void+dump_getdiag(StringInfo str, PLpgSQL_stmt_getdiag *node)+{+ WRITE_NODE_TYPE("PLpgSQL_stmt_getdiag");++ WRITE_INT_FIELD(lineno);+ WRITE_BOOL_FIELD(is_stacked);+ WRITE_LIST_FIELD(diag_items, PLpgSQL_diag_item, dump_getdiag_item);+}++static void+dump_getdiag_item(StringInfo str, PLpgSQL_diag_item *node)+{+ WRITE_NODE_TYPE("PLpgSQL_diag_item");++ WRITE_STRING_VALUE(kind, plpgsql_getdiag_kindname(node->kind));+ WRITE_INT_FIELD(target);+}++static void+dump_expr(StringInfo str, PLpgSQL_expr *node)+{+ WRITE_NODE_TYPE("PLpgSQL_expr");++ WRITE_STRING_FIELD(query);+}++static void+dump_function(StringInfo str, PLpgSQL_function *node)+{+ int i;+ PLpgSQL_datum *d;++ WRITE_NODE_TYPE("PLpgSQL_function");++ appendStringInfoString(str, "\"datums\": ");+ appendStringInfoChar(str, '[');+ for (i = 0; i < node->ndatums; i++)+ {+ appendStringInfoChar(str, '{');+ d = node->datums[i];++ switch (d->dtype)+ {+ case PLPGSQL_DTYPE_VAR:+ dump_var(str, (PLpgSQL_var *) d);+ break;+ case PLPGSQL_DTYPE_ROW:+ dump_row(str, (PLpgSQL_row *) d);+ break;+ case PLPGSQL_DTYPE_REC:+ dump_record(str, (PLpgSQL_rec *) d);+ break;+ case PLPGSQL_DTYPE_RECFIELD:+ dump_record_field(str, (PLpgSQL_recfield *) d);+ break;+ case PLPGSQL_DTYPE_ARRAYELEM:+ dump_array_elem(str, (PLpgSQL_arrayelem *) d);+ break;+ default:+ elog(WARNING, "could not dump unrecognized dtype: %d",+ (int) d->dtype);+ }+ removeTrailingDelimiter(str);+ appendStringInfoString(str, "}}, ");+ }+ removeTrailingDelimiter(str);+ appendStringInfoString(str, "], ");++ WRITE_BLOCK_FIELD(action);+}++static void+dump_var(StringInfo str, PLpgSQL_var *node)+{+ WRITE_NODE_TYPE("PLpgSQL_var");++ WRITE_STRING_FIELD(refname);+ WRITE_INT_FIELD(lineno);+ WRITE_OBJ_FIELD(datatype, dump_type);+ WRITE_BOOL_FIELD(isconst);+ WRITE_BOOL_FIELD(notnull);+ WRITE_EXPR_FIELD(default_val);+ WRITE_EXPR_FIELD(cursor_explicit_expr);+ WRITE_INT_FIELD(cursor_explicit_argrow);+ WRITE_INT_FIELD(cursor_options);+}++static void+dump_type(StringInfo str, PLpgSQL_type *node)+{+ WRITE_NODE_TYPE("PLpgSQL_type");++ WRITE_STRING_FIELD(typname);+}++static void+dump_row(StringInfo str, PLpgSQL_row *node)+{+ int i = 0;++ WRITE_NODE_TYPE("PLpgSQL_row");++ WRITE_STRING_FIELD(refname);+ WRITE_INT_FIELD(lineno);++ appendStringInfoString(str, "\"fields\": ");+ appendStringInfoChar(str, '[');++ for (i = 0; i < node->nfields; i++)+ {+ if (node->fieldnames[i]) {+ appendStringInfoChar(str, '{');+ WRITE_STRING_VALUE(name, node->fieldnames[i]);+ WRITE_INT_VALUE(varno, node->varnos[i]);+ removeTrailingDelimiter(str);+ appendStringInfoString(str, "}, ");+ } else {+ appendStringInfoString(str, "null, ");+ }+ }+ removeTrailingDelimiter(str);++ appendStringInfoString(str, "], ");+}++static void+dump_record(StringInfo str, PLpgSQL_rec *node) {+ WRITE_NODE_TYPE("PLpgSQL_rec");++ WRITE_STRING_FIELD(refname);+ WRITE_INT_FIELD(lineno);+}++static void+dump_record_field(StringInfo str, PLpgSQL_recfield *node) {+ WRITE_NODE_TYPE("PLpgSQL_recfield");++ WRITE_STRING_FIELD(fieldname);+ WRITE_INT_FIELD(recparentno);+}++static void+dump_array_elem(StringInfo str, PLpgSQL_arrayelem *node) {+ WRITE_NODE_TYPE("PLpgSQL_arrayelem");++ WRITE_EXPR_FIELD(subscript);+ WRITE_INT_FIELD(arrayparentno);+}++char *+plpgsqlToJSON(PLpgSQL_function *func)+{+ StringInfoData str;++ initStringInfo(&str);++ appendStringInfoChar(&str, '{');++ dump_function(&str, func);++ removeTrailingDelimiter(&str);+ appendStringInfoString(&str, "}}");++ return str.data;+}
+ foreign/libpg_query/src/pg_query_json_plpgsql.h view
@@ -0,0 +1,8 @@+#ifndef PG_QUERY_JSON_PLPGSQL_H+#define PG_QUERY_JSON_PLPGSQL_H++#include "plpgsql.h"++char* plpgsqlToJSON(PLpgSQL_function* func);++#endif
+ foreign/libpg_query/src/pg_query_normalize.c view
@@ -0,0 +1,372 @@+#include "pg_query.h"+#include "pg_query_internal.h"++#include "parser/parser.h"+#include "parser/scanner.h"+#include "parser/scansup.h"+#include "mb/pg_wchar.h"+#include "nodes/nodeFuncs.h"++/*+ * Struct for tracking locations/lengths of constants during normalization+ */+typedef struct pgssLocationLen+{+ int location; /* start offset in query text */+ int length; /* length in bytes, or -1 to ignore */+} pgssLocationLen;++/*+ * Working state for constant tree walker+ */+typedef struct pgssConstLocations+{+ /* Array of locations of constants that should be removed */+ pgssLocationLen *clocations;++ /* Allocated length of clocations array */+ int clocations_buf_size;++ /* Current number of valid entries in clocations array */+ int clocations_count;+} pgssConstLocations;++/*+ * comp_location: comparator for qsorting pgssLocationLen structs by location+ */+static int+comp_location(const void *a, const void *b)+{+ int l = ((const pgssLocationLen *) a)->location;+ int r = ((const pgssLocationLen *) b)->location;++ if (l < r)+ return -1;+ else if (l > r)+ return +1;+ else+ return 0;+}++/*+ * Given a valid SQL string and an array of constant-location records,+ * fill in the textual lengths of those constants.+ *+ * The constants may use any allowed constant syntax, such as float literals,+ * bit-strings, single-quoted strings and dollar-quoted strings. This is+ * accomplished by using the public API for the core scanner.+ *+ * It is the caller's job to ensure that the string is a valid SQL statement+ * with constants at the indicated locations. Since in practice the string+ * has already been parsed, and the locations that the caller provides will+ * have originated from within the authoritative parser, this should not be+ * a problem.+ *+ * Duplicate constant pointers are possible, and will have their lengths+ * marked as '-1', so that they are later ignored. (Actually, we assume the+ * lengths were initialized as -1 to start with, and don't change them here.)+ *+ * N.B. There is an assumption that a '-' character at a Const location begins+ * a negative numeric constant. This precludes there ever being another+ * reason for a constant to start with a '-'.+ */+static void+fill_in_constant_lengths(pgssConstLocations *jstate, const char *query)+{+ pgssLocationLen *locs;+ core_yyscan_t yyscanner;+ core_yy_extra_type yyextra;+ core_YYSTYPE yylval;+ YYLTYPE yylloc;+ int last_loc = -1;+ int i;++ /*+ * Sort the records by location so that we can process them in order while+ * scanning the query text.+ */+ if (jstate->clocations_count > 1)+ qsort(jstate->clocations, jstate->clocations_count,+ sizeof(pgssLocationLen), comp_location);+ locs = jstate->clocations;++ /* initialize the flex scanner --- should match raw_parser() */+ yyscanner = scanner_init(query,+ &yyextra,+ ScanKeywords,+ NumScanKeywords);++ /* Search for each constant, in sequence */+ for (i = 0; i < jstate->clocations_count; i++)+ {+ int loc = locs[i].location;+ int tok;++ Assert(loc >= 0);++ if (loc <= last_loc)+ continue; /* Duplicate constant, ignore */++ /* Lex tokens until we find the desired constant */+ for (;;)+ {+ tok = core_yylex(&yylval, &yylloc, yyscanner);++ /* We should not hit end-of-string, but if we do, behave sanely */+ if (tok == 0)+ break; /* out of inner for-loop */++ /*+ * We should find the token position exactly, but if we somehow+ * run past it, work with that.+ */+ if (yylloc >= loc)+ {+ if (query[loc] == '-')+ {+ /*+ * It's a negative value - this is the one and only case+ * where we replace more than a single token.+ *+ * Do not compensate for the core system's special-case+ * adjustment of location to that of the leading '-'+ * operator in the event of a negative constant. It is+ * also useful for our purposes to start from the minus+ * symbol. In this way, queries like "select * from foo+ * where bar = 1" and "select * from foo where bar = -2"+ * will have identical normalized query strings.+ */+ tok = core_yylex(&yylval, &yylloc, yyscanner);+ if (tok == 0)+ break; /* out of inner for-loop */+ }++ /*+ * We now rely on the assumption that flex has placed a zero+ * byte after the text of the current token in scanbuf.+ */+ locs[i].length = (int) strlen(yyextra.scanbuf + loc);++ /* Quoted string with Unicode escapes+ *+ * The lexer consumes trailing whitespace in order to find UESCAPE, but if there+ * is no UESCAPE it has still consumed it - don't include it in constant length.+ */+ if (locs[i].length > 4 && /* U&'' */+ (yyextra.scanbuf[loc] == 'u' || yyextra.scanbuf[loc] == 'U') &&+ yyextra.scanbuf[loc + 1] == '&' && yyextra.scanbuf[loc + 2] == '\'')+ {+ int j = locs[i].length - 1; /* Skip the \0 */+ for (; j >= 0 && scanner_isspace(yyextra.scanbuf[loc + j]); j--) {}+ locs[i].length = j + 1; /* Count the \0 */+ }++ break; /* out of inner for-loop */+ }+ }++ /* If we hit end-of-string, give up, leaving remaining lengths -1 */+ if (tok == 0)+ break;++ last_loc = loc;+ }++ scanner_finish(yyscanner);+}++/*+ * Generate a normalized version of the query string that will be used to+ * represent all similar queries.+ *+ * Note that the normalized representation may well vary depending on+ * just which "equivalent" query is used to create the hashtable entry.+ * We assume this is OK.+ *+ * *query_len_p contains the input string length, and is updated with+ * the result string length (which cannot be longer) on exit.+ *+ * Returns a palloc'd string.+ */+static char *+generate_normalized_query(pgssConstLocations *jstate, const char *query,+ int *query_len_p, int encoding)+{+ char *norm_query;+ int query_len = *query_len_p;+ int i,+ len_to_wrt, /* Length (in bytes) to write */+ quer_loc = 0, /* Source query byte location */+ n_quer_loc = 0, /* Normalized query byte location */+ last_off = 0, /* Offset from start for previous tok */+ last_tok_len = 0; /* Length (in bytes) of that tok */++ /*+ * Get constants' lengths (core system only gives us locations). Note+ * this also ensures the items are sorted by location.+ */+ fill_in_constant_lengths(jstate, query);++ /* Allocate result buffer */+ norm_query = palloc(query_len + 1);++ for (i = 0; i < jstate->clocations_count; i++)+ {+ int off, /* Offset from start for cur tok */+ tok_len; /* Length (in bytes) of that tok */++ off = jstate->clocations[i].location;+ tok_len = jstate->clocations[i].length;++ if (tok_len < 0)+ continue; /* ignore any duplicates */++ /* Copy next chunk (what precedes the next constant) */+ len_to_wrt = off - last_off;+ len_to_wrt -= last_tok_len;++ Assert(len_to_wrt >= 0);+ memcpy(norm_query + n_quer_loc, query + quer_loc, len_to_wrt);+ n_quer_loc += len_to_wrt;++ /* And insert a '?' in place of the constant token */+ norm_query[n_quer_loc++] = '?';++ quer_loc = off + tok_len;+ last_off = off;+ last_tok_len = tok_len;+ }++ /*+ * We've copied up until the last ignorable constant. Copy over the+ * remaining bytes of the original query string.+ */+ len_to_wrt = query_len - quer_loc;++ Assert(len_to_wrt >= 0);+ memcpy(norm_query + n_quer_loc, query + quer_loc, len_to_wrt);+ n_quer_loc += len_to_wrt;++ Assert(n_quer_loc <= query_len);+ norm_query[n_quer_loc] = '\0';++ *query_len_p = n_quer_loc;+ return norm_query;+}++static bool const_record_walker(Node *node, pgssConstLocations *jstate)+{+ bool result;++ if (node == NULL) return false;++ if ((IsA(node, A_Const) && ((A_Const *) node)->location >= 0) || (IsA(node, DefElem) && ((DefElem *) node)->location >= 0))+ {+ /* enlarge array if needed */+ if (jstate->clocations_count >= jstate->clocations_buf_size)+ {+ jstate->clocations_buf_size *= 2;+ jstate->clocations = (pgssLocationLen *)+ repalloc(jstate->clocations,+ jstate->clocations_buf_size *+ sizeof(pgssLocationLen));+ }+ jstate->clocations[jstate->clocations_count].location = IsA(node, DefElem) ? ((DefElem *) node)->location : ((A_Const *) node)->location;+ /* initialize lengths to -1 to simplify fill_in_constant_lengths */+ jstate->clocations[jstate->clocations_count].length = -1;+ jstate->clocations_count++;+ }+ else if (IsA(node, VariableSetStmt))+ {+ return const_record_walker((Node *) ((VariableSetStmt *) node)->args, jstate);+ }+ else if (IsA(node, CopyStmt))+ {+ return const_record_walker((Node *) ((CopyStmt *) node)->query, jstate);+ }+ else if (IsA(node, ExplainStmt))+ {+ return const_record_walker((Node *) ((ExplainStmt *) node)->query, jstate);+ }+ else if (IsA(node, AlterRoleStmt))+ {+ return const_record_walker((Node *) ((AlterRoleStmt *) node)->options, jstate);+ }++ PG_TRY();+ {+ result = raw_expression_tree_walker(node, const_record_walker, (void*) jstate);+ }+ PG_CATCH();+ {+ FlushErrorState();+ result = false;+ }+ PG_END_TRY();++ return result;+}++PgQueryNormalizeResult pg_query_normalize(const char* input)+{+ MemoryContext ctx = NULL;+ PgQueryNormalizeResult result = {0};++ ctx = pg_query_enter_memory_context("pg_query_normalize");++ PG_TRY();+ {+ List *tree;+ pgssConstLocations jstate;+ int query_len;++ /* Parse query */+ tree = raw_parser(input);++ /* Set up workspace for constant recording */+ jstate.clocations_buf_size = 32;+ jstate.clocations = (pgssLocationLen *)+ palloc(jstate.clocations_buf_size * sizeof(pgssLocationLen));+ jstate.clocations_count = 0;++ /* Walk tree and record const locations */+ const_record_walker((Node *) tree, &jstate);++ /* Normalize query */+ query_len = (int) strlen(input);+ result.normalized_query = strdup(generate_normalized_query(&jstate, input, &query_len, PG_UTF8));+ }+ PG_CATCH();+ {+ ErrorData* error_data;+ PgQueryError* error;++ MemoryContextSwitchTo(ctx);+ error_data = CopyErrorData();++ error = malloc(sizeof(PgQueryError));+ error->message = strdup(error_data->message);+ error->filename = strdup(error_data->filename);+ error->lineno = error_data->lineno;+ error->cursorpos = error_data->cursorpos;++ result.error = error;+ FlushErrorState();+ }+ PG_END_TRY();++ pg_query_exit_memory_context(ctx);++ return result;+}++void pg_query_free_normalize_result(PgQueryNormalizeResult result)+{+ if (result.error) {+ free(result.error->message);+ free(result.error->filename);+ free(result.error);+ }++ free(result.normalized_query);+}
+ foreign/libpg_query/src/pg_query_parse.c view
@@ -0,0 +1,124 @@+#include "pg_query.h"+#include "pg_query_internal.h"+#include "pg_query_json.h"++#include "parser/parser.h"+#include "parser/scanner.h"+#include "parser/scansup.h"++#include <unistd.h>+#include <fcntl.h>++PgQueryInternalParsetreeAndError pg_query_raw_parse(const char* input)+{+ PgQueryInternalParsetreeAndError result = {0};+ MemoryContext parse_context = CurrentMemoryContext;++ char stderr_buffer[STDERR_BUFFER_LEN + 1] = {0};+#ifndef DEBUG+ int stderr_global;+ int stderr_pipe[2];+#endif++#ifndef DEBUG+ // Setup pipe for stderr redirection+ if (pipe(stderr_pipe) != 0) {+ PgQueryError* error = malloc(sizeof(PgQueryError));++ error->message = strdup("Failed to open pipe, too many open file descriptors")++ result.error = error;++ return result;+ }++ fcntl(stderr_pipe[0], F_SETFL, fcntl(stderr_pipe[0], F_GETFL) | O_NONBLOCK);++ // Redirect stderr to the pipe+ stderr_global = dup(STDERR_FILENO);+ dup2(stderr_pipe[1], STDERR_FILENO);+ close(stderr_pipe[1]);+#endif++ PG_TRY();+ {+ result.tree = raw_parser(input);++#ifndef DEBUG+ // Save stderr for result+ read(stderr_pipe[0], stderr_buffer, STDERR_BUFFER_LEN);+#endif++ result.stderr_buffer = strdup(stderr_buffer);+ }+ PG_CATCH();+ {+ ErrorData* error_data;+ PgQueryError* error;++ MemoryContextSwitchTo(parse_context);+ error_data = CopyErrorData();++ // Note: This is intentionally malloc so exiting the memory context doesn't free this+ error = malloc(sizeof(PgQueryError));+ error->message = strdup(error_data->message);+ error->filename = strdup(error_data->filename);+ error->funcname = strdup(error_data->funcname);+ error->context = NULL;+ error->lineno = error_data->lineno;+ error->cursorpos = error_data->cursorpos;++ result.error = error;+ FlushErrorState();+ }+ PG_END_TRY();++#ifndef DEBUG+ // Restore stderr, close pipe+ dup2(stderr_global, STDERR_FILENO);+ close(stderr_pipe[0]);+ close(stderr_global);+#endif++ return result;+}++PgQueryParseResult pg_query_parse(const char* input)+{+ MemoryContext ctx = NULL;+ PgQueryInternalParsetreeAndError parsetree_and_error;+ PgQueryParseResult result = {0};++ ctx = pg_query_enter_memory_context("pg_query_parse");++ parsetree_and_error = pg_query_raw_parse(input);++ // These are all malloc-ed and will survive exiting the memory context, the caller is responsible to free them now+ result.stderr_buffer = parsetree_and_error.stderr_buffer;+ result.error = parsetree_and_error.error;++ if (parsetree_and_error.tree != NULL) {+ char *tree_json;++ tree_json = pg_query_nodes_to_json(parsetree_and_error.tree);++ result.parse_tree = strdup(tree_json);+ pfree(tree_json);+ } else {+ result.parse_tree = strdup("[]");+ }++ pg_query_exit_memory_context(ctx);++ return result;+}++void pg_query_free_parse_result(PgQueryParseResult result)+{+ if (result.error) {+ pg_query_free_error(result.error);+ }++ free(result.parse_tree);+ free(result.stderr_buffer);+}
+ foreign/libpg_query/src/pg_query_parse_plpgsql.c view
@@ -0,0 +1,450 @@+#include "pg_query.h"+#include "pg_query_internal.h"+#include "pg_query_json_plpgsql.h"++#include <assert.h>++#include <catalog/pg_type.h>+#include <catalog/pg_proc_fn.h>+#include <nodes/parsenodes.h>+#include <nodes/nodeFuncs.h>++#define _GNU_SOURCE // Necessary to get asprintf (which is a GNU extension)+#include <stdio.h>++typedef struct {+ PLpgSQL_function *func;+ PgQueryError* error;+} PgQueryInternalPlpgsqlFuncAndError;++static PgQueryInternalPlpgsqlFuncAndError pg_query_raw_parse_plpgsql(CreateFunctionStmt* stmt);++static int datums_alloc;+extern __thread int plpgsql_nDatums;+extern __thread PLpgSQL_datum **plpgsql_Datums;+static int datums_last = 0;++static void add_dummy_return(PLpgSQL_function *function)+{+ /*+ * If the outer block has an EXCEPTION clause, we need to make a new outer+ * block, since the added RETURN shouldn't act like it is inside the+ * EXCEPTION clause.+ */+ if (function->action->exceptions != NULL)+ {+ PLpgSQL_stmt_block *new;++ new = palloc0(sizeof(PLpgSQL_stmt_block));+ new->cmd_type = PLPGSQL_STMT_BLOCK;+ new->body = list_make1(function->action);++ function->action = new;+ }+ if (function->action->body == NIL ||+ ((PLpgSQL_stmt *) llast(function->action->body))->cmd_type != PLPGSQL_STMT_RETURN)+ {+ PLpgSQL_stmt_return *new;++ new = palloc0(sizeof(PLpgSQL_stmt_return));+ new->cmd_type = PLPGSQL_STMT_RETURN;+ new->expr = NULL;+ new->retvarno = function->out_param_varno;++ function->action->body = lappend(function->action->body, new);+ }+}++static void plpgsql_compile_error_callback(void *arg)+{+ if (arg)+ {+ /*+ * Try to convert syntax error position to reference text of original+ * CREATE FUNCTION or DO command.+ */+ if (function_parse_error_transpose((const char *) arg))+ return;++ /*+ * Done if a syntax error position was reported; otherwise we have to+ * fall back to a "near line N" report.+ */+ }++ if (plpgsql_error_funcname)+ errcontext("compilation of PL/pgSQL function \"%s\" near line %d",+ plpgsql_error_funcname, plpgsql_latest_lineno());+}++static PLpgSQL_function *compile_create_function_stmt(CreateFunctionStmt* stmt)+{+ char *func_name;+ char *proc_source;+ PLpgSQL_function *function;+ ErrorContextCallback plerrcontext;+ PLpgSQL_variable *var;+ int parse_rc;+ MemoryContext func_cxt;+ int i;+ PLpgSQL_rec *rec;+ const ListCell *lc, *lc2, *lc3;+ bool is_trigger = false;+ bool is_setof = false;++ assert(IsA(stmt, CreateFunctionStmt));++ func_name = strVal(linitial(stmt->funcname));++ foreach(lc, stmt->options)+ {+ DefElem* elem = (DefElem*) lfirst(lc);++ if (strcmp(elem->defname, "as") == 0) {+ const ListCell *lc2;++ assert(IsA(elem->arg, List));++ foreach(lc2, (List*) elem->arg)+ {+ proc_source = strVal(lfirst(lc2));+ }+ }+ }++ if (stmt->returnType != NULL) {+ foreach(lc3, stmt->returnType->names)+ {+ char* val = strVal(lfirst(lc3));++ if (strcmp(val, "trigger") == 0) {+ is_trigger = true;+ }+ }++ if (stmt->returnType->setof) {+ is_setof = true;+ }+ }++ /*+ * Setup the scanner input and error info. We assume that this function+ * cannot be invoked recursively, so there's no need to save and restore+ * the static variables used here.+ */+ plpgsql_scanner_init(proc_source);++ plpgsql_error_funcname = func_name;++ /*+ * Setup error traceback support for ereport()+ */+ plerrcontext.callback = plpgsql_compile_error_callback;+ plerrcontext.arg = proc_source;+ plerrcontext.previous = error_context_stack;+ error_context_stack = &plerrcontext;++ /* Do extra syntax checking if check_function_bodies is on */+ plpgsql_check_syntax = true;++ /* Function struct does not live past current statement */+ function = (PLpgSQL_function *) palloc0(sizeof(PLpgSQL_function));++ plpgsql_curr_compile = function;++ /*+ * All the rest of the compile-time storage (e.g. parse tree) is kept in+ * its own memory context, so it can be reclaimed easily.+ */+ func_cxt = AllocSetContextCreate(CurrentMemoryContext,+ "PL/pgSQL function context",+ ALLOCSET_DEFAULT_MINSIZE,+ ALLOCSET_DEFAULT_INITSIZE,+ ALLOCSET_DEFAULT_MAXSIZE);+ compile_tmp_cxt = MemoryContextSwitchTo(func_cxt);++ function->fn_signature = pstrdup(func_name);+ function->fn_is_trigger = PLPGSQL_NOT_TRIGGER;+ function->fn_input_collation = InvalidOid;+ function->fn_cxt = func_cxt;+ function->out_param_varno = -1; /* set up for no OUT param */+ function->resolve_option = plpgsql_variable_conflict;+ function->print_strict_params = plpgsql_print_strict_params;++ /*+ * don't do extra validation for inline code as we don't want to add spam+ * at runtime+ */+ function->extra_warnings = 0;+ function->extra_errors = 0;++ plpgsql_ns_init();+ plpgsql_ns_push(func_name);+ plpgsql_DumpExecTree = false;++ datums_alloc = 128;+ plpgsql_nDatums = 0;+ plpgsql_Datums = palloc(sizeof(PLpgSQL_datum *) * datums_alloc);+ datums_last = 0;++ /* Set up as though in a function returning VOID */+ function->fn_rettype = VOIDOID;+ function->fn_retset = is_setof;+ function->fn_retistuple = false;+ /* a bit of hardwired knowledge about type VOID here */+ function->fn_retbyval = true;+ function->fn_rettyplen = sizeof(int32);++ /*+ * Remember if function is STABLE/IMMUTABLE. XXX would it be better to+ * set this TRUE inside a read-only transaction? Not clear.+ */+ function->fn_readonly = false;++ /*+ * Create the magic FOUND variable.+ */+ var = plpgsql_build_variable("found", 0,+ plpgsql_build_datatype(BOOLOID,+ -1,+ InvalidOid),+ true);+ function->found_varno = var->dno;++ if (is_trigger) {+ /* Add the record for referencing NEW */+ rec = plpgsql_build_record("new", 0, true);+ function->new_varno = rec->dno;++ /* Add the record for referencing OLD */+ rec = plpgsql_build_record("old", 0, true);+ function->old_varno = rec->dno;+ }++ /*+ * Now parse the function's text+ */+ parse_rc = plpgsql_yyparse();+ if (parse_rc != 0)+ elog(ERROR, "plpgsql parser returned %d", parse_rc);+ function->action = plpgsql_parse_result;++ plpgsql_scanner_finish();++ /*+ * If it returns VOID (always true at the moment), we allow control to+ * fall off the end without an explicit RETURN statement.+ */+ if (function->fn_rettype == VOIDOID)+ add_dummy_return(function);++ /*+ * Complete the function's info+ */+ function->fn_nargs = 0;+ function->ndatums = plpgsql_nDatums;+ function->datums = palloc(sizeof(PLpgSQL_datum *) * plpgsql_nDatums);+ for (i = 0; i < plpgsql_nDatums; i++)+ function->datums[i] = plpgsql_Datums[i];++ /*+ * Pop the error context stack+ */+ error_context_stack = plerrcontext.previous;+ plpgsql_error_funcname = NULL;++ plpgsql_check_syntax = false;++ MemoryContextSwitchTo(compile_tmp_cxt);+ compile_tmp_cxt = NULL;+ return function;+}++PgQueryInternalPlpgsqlFuncAndError pg_query_raw_parse_plpgsql(CreateFunctionStmt* stmt)+{+ PgQueryInternalPlpgsqlFuncAndError result = {0};+ MemoryContext parse_context = CurrentMemoryContext;++ char stderr_buffer[STDERR_BUFFER_LEN + 1] = {0};+#ifndef DEBUG+ int stderr_global;+ int stderr_pipe[2];+#endif++#ifndef DEBUG+ // Setup pipe for stderr redirection+ if (pipe(stderr_pipe) != 0) {+ PgQueryError* error = malloc(sizeof(PgQueryError));++ error->message = strdup("Failed to open pipe, too many open file descriptors")++ result.error = error;++ return result;+ }++ fcntl(stderr_pipe[0], F_SETFL, fcntl(stderr_pipe[0], F_GETFL) | O_NONBLOCK);++ // Redirect stderr to the pipe+ stderr_global = dup(STDERR_FILENO);+ dup2(stderr_pipe[1], STDERR_FILENO);+ close(stderr_pipe[1]);+#endif++ PG_TRY();+ {+ result.func = compile_create_function_stmt(stmt);++#ifndef DEBUG+ // Save stderr for result+ read(stderr_pipe[0], stderr_buffer, STDERR_BUFFER_LEN);+#endif++ if (strlen(stderr_buffer) > 0) {+ PgQueryError* error = malloc(sizeof(PgQueryError));+ error->message = strdup(stderr_buffer);+ error->filename = "";+ error->funcname = "";+ error->context = "";+ result.error = error;+ }+ }+ PG_CATCH();+ {+ ErrorData* error_data;+ PgQueryError* error;++ MemoryContextSwitchTo(parse_context);+ error_data = CopyErrorData();++ // Note: This is intentionally malloc so exiting the memory context doesn't free this+ error = malloc(sizeof(PgQueryError));+ error->message = strdup(error_data->message);+ error->filename = strdup(error_data->filename);+ error->funcname = strdup(error_data->funcname);+ error->context = strdup(error_data->context);+ error->lineno = error_data->lineno;+ error->cursorpos = error_data->cursorpos;++ result.error = error;+ FlushErrorState();+ }+ PG_END_TRY();++#ifndef DEBUG+ // Restore stderr, close pipe+ dup2(stderr_global, STDERR_FILENO);+ close(stderr_pipe[0]);+ close(stderr_global);+#endif++ return result;+}++typedef struct createFunctionStmts+{+ CreateFunctionStmt **stmts;+ int stmts_buf_size;+ int stmts_count;+} createFunctionStmts;++static bool create_function_stmts_walker(Node *node, createFunctionStmts *state)+{+ bool result;++ if (node == NULL) return false;++ if (IsA(node, CreateFunctionStmt))+ {+ if (state->stmts_count >= state->stmts_buf_size)+ {+ state->stmts_buf_size *= 2;+ state->stmts = (CreateFunctionStmt**) repalloc(state->stmts, state->stmts_buf_size * sizeof(CreateFunctionStmt*));+ }+ state->stmts[state->stmts_count] = (CreateFunctionStmt *) node;+ state->stmts_count++;+ }++ PG_TRY();+ {+ result = raw_expression_tree_walker(node, create_function_stmts_walker, (void*) state);+ }+ PG_CATCH();+ {+ FlushErrorState();+ result = false;+ }+ PG_END_TRY();++ return result;+}++PgQueryPlpgsqlParseResult pg_query_parse_plpgsql(const char* input)+{+ MemoryContext ctx = NULL;+ PgQueryPlpgsqlParseResult result = {0};+ PgQueryInternalParsetreeAndError parse_result;+ createFunctionStmts statements;+ size_t i;++ ctx = pg_query_enter_memory_context("pg_query_parse_plpgsql");++ parse_result = pg_query_raw_parse(input);+ result.error = parse_result.error;+ if (result.error != NULL) {+ pg_query_exit_memory_context(ctx);+ return result;+ }++ statements.stmts_buf_size = 100;+ statements.stmts = (CreateFunctionStmt**) palloc(statements.stmts_buf_size * sizeof(CreateFunctionStmt*));+ statements.stmts_count = 0;++ create_function_stmts_walker((Node*) parse_result.tree, &statements);++ result.plpgsql_funcs = strdup("[\n");++ for (i = 0; i < statements.stmts_count; i++) {+ PgQueryInternalPlpgsqlFuncAndError func_and_error;++ func_and_error = pg_query_raw_parse_plpgsql(statements.stmts[i]);++ // These are all malloc-ed and will survive exiting the memory context, the caller is responsible to free them now+ result.error = func_and_error.error;++ if (result.error != NULL) {+ pg_query_exit_memory_context(ctx);+ return result;+ }++ if (func_and_error.func != NULL) {+ char *func_json;+ char *new_out;++ func_json = plpgsqlToJSON(func_and_error.func);+ plpgsql_free_function_memory(func_and_error.func);++ asprintf(&new_out, "%s%s,\n", result.plpgsql_funcs, func_json);+ free(result.plpgsql_funcs);+ result.plpgsql_funcs = new_out;++ pfree(func_json);+ }+ }++ result.plpgsql_funcs[strlen(result.plpgsql_funcs) - 2] = '\n';+ result.plpgsql_funcs[strlen(result.plpgsql_funcs) - 1] = ']';++ pg_query_exit_memory_context(ctx);++ return result;+}++void pg_query_free_plpgsql_parse_result(PgQueryPlpgsqlParseResult result)+{+ if (result.error) {+ pg_query_free_error(result.error);+ }++ free(result.plpgsql_funcs);+}
+ foreign/libpg_query/src/postgres/contrib_pgcrypto_sha1.c view
@@ -0,0 +1,352 @@+/*--------------------------------------------------------------------+ * Symbols referenced in this file:+ * - sha1_result+ * - sha1_pad+ * - sha1_step+ * - _K+ * - sha1_init+ * - sha1_loop+ *--------------------------------------------------------------------+ */++/* $KAME: sha1.c,v 1.3 2000/02/22 14:01:18 itojun Exp $ */++/*+ * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.+ * All rights reserved.+ *+ * Redistribution and use in source and binary forms, with or without+ * modification, are permitted provided that the following conditions+ * are met:+ * 1. Redistributions of source code must retain the above copyright+ * notice, this list of conditions and the following disclaimer.+ * 2. Redistributions in binary form must reproduce the above copyright+ * notice, this list of conditions and the following disclaimer in the+ * documentation and/or other materials provided with the distribution.+ * 3. Neither the name of the project nor the names of its contributors+ * may be used to endorse or promote products derived from this software+ * without specific prior written permission.+ *+ * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE+ * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF+ * SUCH DAMAGE.+ *+ * contrib/pgcrypto/sha1.c+ */+/*+ * FIPS pub 180-1: Secure Hash Algorithm (SHA-1)+ * based on: http://www.itl.nist.gov/fipspubs/fip180-1.htm+ * implemented by Jun-ichiro itojun Itoh <itojun@itojun.org>+ */++#include "postgres.h"++#include <sys/param.h>++#include "sha1.h"++/* constant table */+static uint32 _K[] = {0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xca62c1d6};++#define K(t) _K[(t) / 20]++#define F0(b, c, d) (((b) & (c)) | ((~(b)) & (d)))+#define F1(b, c, d) (((b) ^ (c)) ^ (d))+#define F2(b, c, d) (((b) & (c)) | ((b) & (d)) | ((c) & (d)))+#define F3(b, c, d) (((b) ^ (c)) ^ (d))++#define S(n, x) (((x) << (n)) | ((x) >> (32 - (n))))++#define H(n) (ctxt->h.b32[(n)])+#define COUNT (ctxt->count)+#define BCOUNT (ctxt->c.b64[0] / 8)+#define W(n) (ctxt->m.b32[(n)])++#define PUTBYTE(x) \+do { \+ ctxt->m.b8[(COUNT % 64)] = (x); \+ COUNT++; \+ COUNT %= 64; \+ ctxt->c.b64[0] += 8; \+ if (COUNT % 64 == 0) \+ sha1_step(ctxt); \+} while (0)++#define PUTPAD(x) \+do { \+ ctxt->m.b8[(COUNT % 64)] = (x); \+ COUNT++; \+ COUNT %= 64; \+ if (COUNT % 64 == 0) \+ sha1_step(ctxt); \+} while (0)++static void sha1_step(struct sha1_ctxt *);++static void+sha1_step(struct sha1_ctxt * ctxt)+{+ uint32 a,+ b,+ c,+ d,+ e;+ size_t t,+ s;+ uint32 tmp;++#ifndef WORDS_BIGENDIAN+ struct sha1_ctxt tctxt;++ memmove(&tctxt.m.b8[0], &ctxt->m.b8[0], 64);+ ctxt->m.b8[0] = tctxt.m.b8[3];+ ctxt->m.b8[1] = tctxt.m.b8[2];+ ctxt->m.b8[2] = tctxt.m.b8[1];+ ctxt->m.b8[3] = tctxt.m.b8[0];+ ctxt->m.b8[4] = tctxt.m.b8[7];+ ctxt->m.b8[5] = tctxt.m.b8[6];+ ctxt->m.b8[6] = tctxt.m.b8[5];+ ctxt->m.b8[7] = tctxt.m.b8[4];+ ctxt->m.b8[8] = tctxt.m.b8[11];+ ctxt->m.b8[9] = tctxt.m.b8[10];+ ctxt->m.b8[10] = tctxt.m.b8[9];+ ctxt->m.b8[11] = tctxt.m.b8[8];+ ctxt->m.b8[12] = tctxt.m.b8[15];+ ctxt->m.b8[13] = tctxt.m.b8[14];+ ctxt->m.b8[14] = tctxt.m.b8[13];+ ctxt->m.b8[15] = tctxt.m.b8[12];+ ctxt->m.b8[16] = tctxt.m.b8[19];+ ctxt->m.b8[17] = tctxt.m.b8[18];+ ctxt->m.b8[18] = tctxt.m.b8[17];+ ctxt->m.b8[19] = tctxt.m.b8[16];+ ctxt->m.b8[20] = tctxt.m.b8[23];+ ctxt->m.b8[21] = tctxt.m.b8[22];+ ctxt->m.b8[22] = tctxt.m.b8[21];+ ctxt->m.b8[23] = tctxt.m.b8[20];+ ctxt->m.b8[24] = tctxt.m.b8[27];+ ctxt->m.b8[25] = tctxt.m.b8[26];+ ctxt->m.b8[26] = tctxt.m.b8[25];+ ctxt->m.b8[27] = tctxt.m.b8[24];+ ctxt->m.b8[28] = tctxt.m.b8[31];+ ctxt->m.b8[29] = tctxt.m.b8[30];+ ctxt->m.b8[30] = tctxt.m.b8[29];+ ctxt->m.b8[31] = tctxt.m.b8[28];+ ctxt->m.b8[32] = tctxt.m.b8[35];+ ctxt->m.b8[33] = tctxt.m.b8[34];+ ctxt->m.b8[34] = tctxt.m.b8[33];+ ctxt->m.b8[35] = tctxt.m.b8[32];+ ctxt->m.b8[36] = tctxt.m.b8[39];+ ctxt->m.b8[37] = tctxt.m.b8[38];+ ctxt->m.b8[38] = tctxt.m.b8[37];+ ctxt->m.b8[39] = tctxt.m.b8[36];+ ctxt->m.b8[40] = tctxt.m.b8[43];+ ctxt->m.b8[41] = tctxt.m.b8[42];+ ctxt->m.b8[42] = tctxt.m.b8[41];+ ctxt->m.b8[43] = tctxt.m.b8[40];+ ctxt->m.b8[44] = tctxt.m.b8[47];+ ctxt->m.b8[45] = tctxt.m.b8[46];+ ctxt->m.b8[46] = tctxt.m.b8[45];+ ctxt->m.b8[47] = tctxt.m.b8[44];+ ctxt->m.b8[48] = tctxt.m.b8[51];+ ctxt->m.b8[49] = tctxt.m.b8[50];+ ctxt->m.b8[50] = tctxt.m.b8[49];+ ctxt->m.b8[51] = tctxt.m.b8[48];+ ctxt->m.b8[52] = tctxt.m.b8[55];+ ctxt->m.b8[53] = tctxt.m.b8[54];+ ctxt->m.b8[54] = tctxt.m.b8[53];+ ctxt->m.b8[55] = tctxt.m.b8[52];+ ctxt->m.b8[56] = tctxt.m.b8[59];+ ctxt->m.b8[57] = tctxt.m.b8[58];+ ctxt->m.b8[58] = tctxt.m.b8[57];+ ctxt->m.b8[59] = tctxt.m.b8[56];+ ctxt->m.b8[60] = tctxt.m.b8[63];+ ctxt->m.b8[61] = tctxt.m.b8[62];+ ctxt->m.b8[62] = tctxt.m.b8[61];+ ctxt->m.b8[63] = tctxt.m.b8[60];+#endif++ a = H(0);+ b = H(1);+ c = H(2);+ d = H(3);+ e = H(4);++ for (t = 0; t < 20; t++)+ {+ s = t & 0x0f;+ if (t >= 16)+ W(s) = S(1, W((s + 13) & 0x0f) ^ W((s + 8) & 0x0f) ^ W((s + 2) & 0x0f) ^ W(s));+ tmp = S(5, a) + F0(b, c, d) + e + W(s) + K(t);+ e = d;+ d = c;+ c = S(30, b);+ b = a;+ a = tmp;+ }+ for (t = 20; t < 40; t++)+ {+ s = t & 0x0f;+ W(s) = S(1, W((s + 13) & 0x0f) ^ W((s + 8) & 0x0f) ^ W((s + 2) & 0x0f) ^ W(s));+ tmp = S(5, a) + F1(b, c, d) + e + W(s) + K(t);+ e = d;+ d = c;+ c = S(30, b);+ b = a;+ a = tmp;+ }+ for (t = 40; t < 60; t++)+ {+ s = t & 0x0f;+ W(s) = S(1, W((s + 13) & 0x0f) ^ W((s + 8) & 0x0f) ^ W((s + 2) & 0x0f) ^ W(s));+ tmp = S(5, a) + F2(b, c, d) + e + W(s) + K(t);+ e = d;+ d = c;+ c = S(30, b);+ b = a;+ a = tmp;+ }+ for (t = 60; t < 80; t++)+ {+ s = t & 0x0f;+ W(s) = S(1, W((s + 13) & 0x0f) ^ W((s + 8) & 0x0f) ^ W((s + 2) & 0x0f) ^ W(s));+ tmp = S(5, a) + F3(b, c, d) + e + W(s) + K(t);+ e = d;+ d = c;+ c = S(30, b);+ b = a;+ a = tmp;+ }++ H(0) = H(0) + a;+ H(1) = H(1) + b;+ H(2) = H(2) + c;+ H(3) = H(3) + d;+ H(4) = H(4) + e;++ memset(&ctxt->m.b8[0], 0, 64);+}++/*------------------------------------------------------------*/++void+sha1_init(struct sha1_ctxt * ctxt)+{+ memset(ctxt, 0, sizeof(struct sha1_ctxt));+ H(0) = 0x67452301;+ H(1) = 0xefcdab89;+ H(2) = 0x98badcfe;+ H(3) = 0x10325476;+ H(4) = 0xc3d2e1f0;+}++void+sha1_pad(struct sha1_ctxt * ctxt)+{+ size_t padlen; /* pad length in bytes */+ size_t padstart;++ PUTPAD(0x80);++ padstart = COUNT % 64;+ padlen = 64 - padstart;+ if (padlen < 8)+ {+ memset(&ctxt->m.b8[padstart], 0, padlen);+ COUNT += padlen;+ COUNT %= 64;+ sha1_step(ctxt);+ padstart = COUNT % 64; /* should be 0 */+ padlen = 64 - padstart; /* should be 64 */+ }+ memset(&ctxt->m.b8[padstart], 0, padlen - 8);+ COUNT += (padlen - 8);+ COUNT %= 64;+#ifdef WORDS_BIGENDIAN+ PUTPAD(ctxt->c.b8[0]);+ PUTPAD(ctxt->c.b8[1]);+ PUTPAD(ctxt->c.b8[2]);+ PUTPAD(ctxt->c.b8[3]);+ PUTPAD(ctxt->c.b8[4]);+ PUTPAD(ctxt->c.b8[5]);+ PUTPAD(ctxt->c.b8[6]);+ PUTPAD(ctxt->c.b8[7]);+#else+ PUTPAD(ctxt->c.b8[7]);+ PUTPAD(ctxt->c.b8[6]);+ PUTPAD(ctxt->c.b8[5]);+ PUTPAD(ctxt->c.b8[4]);+ PUTPAD(ctxt->c.b8[3]);+ PUTPAD(ctxt->c.b8[2]);+ PUTPAD(ctxt->c.b8[1]);+ PUTPAD(ctxt->c.b8[0]);+#endif+}++void+sha1_loop(struct sha1_ctxt * ctxt, const uint8 *input0, size_t len)+{+ const uint8 *input;+ size_t gaplen;+ size_t gapstart;+ size_t off;+ size_t copysiz;++ input = (const uint8 *) input0;+ off = 0;++ while (off < len)+ {+ gapstart = COUNT % 64;+ gaplen = 64 - gapstart;++ copysiz = (gaplen < len - off) ? gaplen : len - off;+ memmove(&ctxt->m.b8[gapstart], &input[off], copysiz);+ COUNT += copysiz;+ COUNT %= 64;+ ctxt->c.b64[0] += copysiz * 8;+ if (COUNT % 64 == 0)+ sha1_step(ctxt);+ off += copysiz;+ }+}++void+sha1_result(struct sha1_ctxt * ctxt, uint8 *digest0)+{+ uint8 *digest;++ digest = (uint8 *) digest0;+ sha1_pad(ctxt);+#ifdef WORDS_BIGENDIAN+ memmove(digest, &ctxt->h.b8[0], 20);+#else+ digest[0] = ctxt->h.b8[3];+ digest[1] = ctxt->h.b8[2];+ digest[2] = ctxt->h.b8[1];+ digest[3] = ctxt->h.b8[0];+ digest[4] = ctxt->h.b8[7];+ digest[5] = ctxt->h.b8[6];+ digest[6] = ctxt->h.b8[5];+ digest[7] = ctxt->h.b8[4];+ digest[8] = ctxt->h.b8[11];+ digest[9] = ctxt->h.b8[10];+ digest[10] = ctxt->h.b8[9];+ digest[11] = ctxt->h.b8[8];+ digest[12] = ctxt->h.b8[15];+ digest[13] = ctxt->h.b8[14];+ digest[14] = ctxt->h.b8[13];+ digest[15] = ctxt->h.b8[12];+ digest[16] = ctxt->h.b8[19];+ digest[17] = ctxt->h.b8[18];+ digest[18] = ctxt->h.b8[17];+ digest[19] = ctxt->h.b8[16];+#endif+}
+ foreign/libpg_query/src/postgres/guc-file.c view
+ foreign/libpg_query/src/postgres/include/access/attnum.h view
@@ -0,0 +1,64 @@+/*-------------------------------------------------------------------------+ *+ * attnum.h+ * POSTGRES attribute number definitions.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/access/attnum.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef ATTNUM_H+#define ATTNUM_H+++/*+ * user defined attribute numbers start at 1. -ay 2/95+ */+typedef int16 AttrNumber;++#define InvalidAttrNumber 0+#define MaxAttrNumber 32767++/* ----------------+ * support macros+ * ----------------+ */+/*+ * AttributeNumberIsValid+ * True iff the attribute number is valid.+ */+#define AttributeNumberIsValid(attributeNumber) \+ ((bool) ((attributeNumber) != InvalidAttrNumber))++/*+ * AttrNumberIsForUserDefinedAttr+ * True iff the attribute number corresponds to an user defined attribute.+ */+#define AttrNumberIsForUserDefinedAttr(attributeNumber) \+ ((bool) ((attributeNumber) > 0))++/*+ * AttrNumberGetAttrOffset+ * Returns the attribute offset for an attribute number.+ *+ * Note:+ * Assumes the attribute number is for a user defined attribute.+ */+#define AttrNumberGetAttrOffset(attNum) \+( \+ AssertMacro(AttrNumberIsForUserDefinedAttr(attNum)), \+ ((attNum) - 1) \+)++/*+ * AttributeOffsetGetAttributeNumber+ * Returns the attribute number for an attribute offset.+ */+#define AttrOffsetGetAttrNumber(attributeOffset) \+ ((AttrNumber) (1 + (attributeOffset)))++#endif /* ATTNUM_H */
+ foreign/libpg_query/src/postgres/include/access/commit_ts.h view
@@ -0,0 +1,69 @@+/*+ * commit_ts.h+ *+ * PostgreSQL commit timestamp manager+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/access/commit_ts.h+ */+#ifndef COMMIT_TS_H+#define COMMIT_TS_H++#include "access/xlog.h"+#include "datatype/timestamp.h"+#include "replication/origin.h"+#include "utils/guc.h"+++extern PGDLLIMPORT bool track_commit_timestamp;++extern bool check_track_commit_timestamp(bool *newval, void **extra,+ GucSource source);++extern void TransactionTreeSetCommitTsData(TransactionId xid, int nsubxids,+ TransactionId *subxids, TimestampTz timestamp,+ RepOriginId nodeid, bool write_xlog);+extern bool TransactionIdGetCommitTsData(TransactionId xid,+ TimestampTz *ts, RepOriginId *nodeid);+extern TransactionId GetLatestCommitTsData(TimestampTz *ts,+ RepOriginId *nodeid);++extern Size CommitTsShmemBuffers(void);+extern Size CommitTsShmemSize(void);+extern void CommitTsShmemInit(void);+extern void BootStrapCommitTs(void);+extern void StartupCommitTs(void);+extern void CommitTsParameterChange(bool xlrecvalue, bool pgcontrolvalue);+extern void CompleteCommitTsInitialization(void);+extern void ShutdownCommitTs(void);+extern void CheckPointCommitTs(void);+extern void ExtendCommitTs(TransactionId newestXact);+extern void TruncateCommitTs(TransactionId oldestXact);+extern void SetCommitTsLimit(TransactionId oldestXact,+ TransactionId newestXact);+extern void AdvanceOldestCommitTsXid(TransactionId oldestXact);++/* XLOG stuff */+#define COMMIT_TS_ZEROPAGE 0x00+#define COMMIT_TS_TRUNCATE 0x10+#define COMMIT_TS_SETTS 0x20++typedef struct xl_commit_ts_set+{+ TimestampTz timestamp;+ RepOriginId nodeid;+ TransactionId mainxid;+ /* subxact Xids follow */+} xl_commit_ts_set;++#define SizeOfCommitTsSet (offsetof(xl_commit_ts_set, mainxid) + \+ sizeof(TransactionId))+++extern void commit_ts_redo(XLogReaderState *record);+extern void commit_ts_desc(StringInfo buf, XLogReaderState *record);+extern const char *commit_ts_identify(uint8 info);++#endif /* COMMIT_TS_H */
+ foreign/libpg_query/src/postgres/include/access/genam.h view
@@ -0,0 +1,193 @@+/*-------------------------------------------------------------------------+ *+ * genam.h+ * POSTGRES generalized index access method definitions.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/access/genam.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef GENAM_H+#define GENAM_H++#include "access/sdir.h"+#include "access/skey.h"+#include "nodes/tidbitmap.h"+#include "storage/lock.h"+#include "utils/relcache.h"+#include "utils/snapshot.h"++/*+ * Struct for statistics returned by ambuild+ */+typedef struct IndexBuildResult+{+ double heap_tuples; /* # of tuples seen in parent table */+ double index_tuples; /* # of tuples inserted into index */+} IndexBuildResult;++/*+ * Struct for input arguments passed to ambulkdelete and amvacuumcleanup+ *+ * num_heap_tuples is accurate only when estimated_count is false;+ * otherwise it's just an estimate (currently, the estimate is the+ * prior value of the relation's pg_class.reltuples field). It will+ * always just be an estimate during ambulkdelete.+ */+typedef struct IndexVacuumInfo+{+ Relation index; /* the index being vacuumed */+ bool analyze_only; /* ANALYZE (without any actual vacuum) */+ bool estimated_count; /* num_heap_tuples is an estimate */+ int message_level; /* ereport level for progress messages */+ double num_heap_tuples; /* tuples remaining in heap */+ BufferAccessStrategy strategy; /* access strategy for reads */+} IndexVacuumInfo;++/*+ * Struct for statistics returned by ambulkdelete and amvacuumcleanup+ *+ * This struct is normally allocated by the first ambulkdelete call and then+ * passed along through subsequent ones until amvacuumcleanup; however,+ * amvacuumcleanup must be prepared to allocate it in the case where no+ * ambulkdelete calls were made (because no tuples needed deletion).+ * Note that an index AM could choose to return a larger struct+ * of which this is just the first field; this provides a way for ambulkdelete+ * to communicate additional private data to amvacuumcleanup.+ *+ * Note: pages_removed is the amount by which the index physically shrank,+ * if any (ie the change in its total size on disk). pages_deleted and+ * pages_free refer to free space within the index file. Some index AMs+ * may compute num_index_tuples by reference to num_heap_tuples, in which+ * case they should copy the estimated_count field from IndexVacuumInfo.+ */+typedef struct IndexBulkDeleteResult+{+ BlockNumber num_pages; /* pages remaining in index */+ BlockNumber pages_removed; /* # removed during vacuum operation */+ bool estimated_count; /* num_index_tuples is an estimate */+ double num_index_tuples; /* tuples remaining */+ double tuples_removed; /* # removed during vacuum operation */+ BlockNumber pages_deleted; /* # unused pages in index */+ BlockNumber pages_free; /* # pages available for reuse */+} IndexBulkDeleteResult;++/* Typedef for callback function to determine if a tuple is bulk-deletable */+typedef bool (*IndexBulkDeleteCallback) (ItemPointer itemptr, void *state);++/* struct definitions appear in relscan.h */+typedef struct IndexScanDescData *IndexScanDesc;+typedef struct SysScanDescData *SysScanDesc;++/*+ * Enumeration specifying the type of uniqueness check to perform in+ * index_insert().+ *+ * UNIQUE_CHECK_YES is the traditional Postgres immediate check, possibly+ * blocking to see if a conflicting transaction commits.+ *+ * For deferrable unique constraints, UNIQUE_CHECK_PARTIAL is specified at+ * insertion time. The index AM should test if the tuple is unique, but+ * should not throw error, block, or prevent the insertion if the tuple+ * appears not to be unique. We'll recheck later when it is time for the+ * constraint to be enforced. The AM must return true if the tuple is+ * known unique, false if it is possibly non-unique. In the "true" case+ * it is safe to omit the later recheck.+ *+ * When it is time to recheck the deferred constraint, a pseudo-insertion+ * call is made with UNIQUE_CHECK_EXISTING. The tuple is already in the+ * index in this case, so it should not be inserted again. Rather, just+ * check for conflicting live tuples (possibly blocking).+ */+typedef enum IndexUniqueCheck+{+ UNIQUE_CHECK_NO, /* Don't do any uniqueness checking */+ UNIQUE_CHECK_YES, /* Enforce uniqueness at insertion time */+ UNIQUE_CHECK_PARTIAL, /* Test uniqueness, but no error */+ UNIQUE_CHECK_EXISTING /* Check if existing tuple is unique */+} IndexUniqueCheck;+++/*+ * generalized index_ interface routines (in indexam.c)+ */++/*+ * IndexScanIsValid+ * True iff the index scan is valid.+ */+#define IndexScanIsValid(scan) PointerIsValid(scan)++extern Relation index_open(Oid relationId, LOCKMODE lockmode);+extern void index_close(Relation relation, LOCKMODE lockmode);++extern bool index_insert(Relation indexRelation,+ Datum *values, bool *isnull,+ ItemPointer heap_t_ctid,+ Relation heapRelation,+ IndexUniqueCheck checkUnique);++extern IndexScanDesc index_beginscan(Relation heapRelation,+ Relation indexRelation,+ Snapshot snapshot,+ int nkeys, int norderbys);+extern IndexScanDesc index_beginscan_bitmap(Relation indexRelation,+ Snapshot snapshot,+ int nkeys);+extern void index_rescan(IndexScanDesc scan,+ ScanKey keys, int nkeys,+ ScanKey orderbys, int norderbys);+extern void index_endscan(IndexScanDesc scan);+extern void index_markpos(IndexScanDesc scan);+extern void index_restrpos(IndexScanDesc scan);+extern ItemPointer index_getnext_tid(IndexScanDesc scan,+ ScanDirection direction);+extern HeapTuple index_fetch_heap(IndexScanDesc scan);+extern HeapTuple index_getnext(IndexScanDesc scan, ScanDirection direction);+extern int64 index_getbitmap(IndexScanDesc scan, TIDBitmap *bitmap);++extern IndexBulkDeleteResult *index_bulk_delete(IndexVacuumInfo *info,+ IndexBulkDeleteResult *stats,+ IndexBulkDeleteCallback callback,+ void *callback_state);+extern IndexBulkDeleteResult *index_vacuum_cleanup(IndexVacuumInfo *info,+ IndexBulkDeleteResult *stats);+extern bool index_can_return(Relation indexRelation, int attno);+extern RegProcedure index_getprocid(Relation irel, AttrNumber attnum,+ uint16 procnum);+extern FmgrInfo *index_getprocinfo(Relation irel, AttrNumber attnum,+ uint16 procnum);++/*+ * index access method support routines (in genam.c)+ */+extern IndexScanDesc RelationGetIndexScan(Relation indexRelation,+ int nkeys, int norderbys);+extern void IndexScanEnd(IndexScanDesc scan);+extern char *BuildIndexValueDescription(Relation indexRelation,+ Datum *values, bool *isnull);++/*+ * heap-or-index access to system catalogs (in genam.c)+ */+extern SysScanDesc systable_beginscan(Relation heapRelation,+ Oid indexId,+ bool indexOK,+ Snapshot snapshot,+ int nkeys, ScanKey key);+extern HeapTuple systable_getnext(SysScanDesc sysscan);+extern bool systable_recheck_tuple(SysScanDesc sysscan, HeapTuple tup);+extern void systable_endscan(SysScanDesc sysscan);+extern SysScanDesc systable_beginscan_ordered(Relation heapRelation,+ Relation indexRelation,+ Snapshot snapshot,+ int nkeys, ScanKey key);+extern HeapTuple systable_getnext_ordered(SysScanDesc sysscan,+ ScanDirection direction);+extern void systable_endscan_ordered(SysScanDesc sysscan);++#endif /* GENAM_H */
+ foreign/libpg_query/src/postgres/include/access/gin.h view
@@ -0,0 +1,83 @@+/*--------------------------------------------------------------------------+ * gin.h+ * Public header file for Generalized Inverted Index access method.+ *+ * Copyright (c) 2006-2015, PostgreSQL Global Development Group+ *+ * src/include/access/gin.h+ *--------------------------------------------------------------------------+ */+#ifndef GIN_H+#define GIN_H++#include "access/xlogreader.h"+#include "lib/stringinfo.h"+#include "storage/block.h"+#include "utils/relcache.h"+++/*+ * amproc indexes for inverted indexes.+ */+#define GIN_COMPARE_PROC 1+#define GIN_EXTRACTVALUE_PROC 2+#define GIN_EXTRACTQUERY_PROC 3+#define GIN_CONSISTENT_PROC 4+#define GIN_COMPARE_PARTIAL_PROC 5+#define GIN_TRICONSISTENT_PROC 6+#define GINNProcs 6++/*+ * searchMode settings for extractQueryFn.+ */+#define GIN_SEARCH_MODE_DEFAULT 0+#define GIN_SEARCH_MODE_INCLUDE_EMPTY 1+#define GIN_SEARCH_MODE_ALL 2+#define GIN_SEARCH_MODE_EVERYTHING 3 /* for internal use only */++/*+ * GinStatsData represents stats data for planner use+ */+typedef struct GinStatsData+{+ BlockNumber nPendingPages;+ BlockNumber nTotalPages;+ BlockNumber nEntryPages;+ BlockNumber nDataPages;+ int64 nEntries;+ int32 ginVersion;+} GinStatsData;++/*+ * A ternary value used by tri-consistent functions.+ *+ * For convenience, this is compatible with booleans. A boolean can be+ * safely cast to a GinTernaryValue.+ */+typedef char GinTernaryValue;++#define GIN_FALSE 0 /* item is not present / does not match */+#define GIN_TRUE 1 /* item is present / matches */+#define GIN_MAYBE 2 /* don't know if item is present / don't know+ * if matches */++#define DatumGetGinTernaryValue(X) ((GinTernaryValue)(X))+#define GinTernaryValueGetDatum(X) ((Datum)(X))+#define PG_RETURN_GIN_TERNARY_VALUE(x) return GinTernaryValueGetDatum(x)++/* GUC parameters */+extern PGDLLIMPORT int GinFuzzySearchLimit;+extern int gin_pending_list_limit;++/* ginutil.c */+extern void ginGetStats(Relation index, GinStatsData *stats);+extern void ginUpdateStats(Relation index, const GinStatsData *stats);++/* ginxlog.c */+extern void gin_redo(XLogReaderState *record);+extern void gin_desc(StringInfo buf, XLogReaderState *record);+extern const char *gin_identify(uint8 info);+extern void gin_xlog_startup(void);+extern void gin_xlog_cleanup(void);++#endif /* GIN_H */
+ foreign/libpg_query/src/postgres/include/access/hash.h view
@@ -0,0 +1,363 @@+/*-------------------------------------------------------------------------+ *+ * hash.h+ * header file for postgres hash access method implementation+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/access/hash.h+ *+ * NOTES+ * modeled after Margo Seltzer's hash implementation for unix.+ *+ *-------------------------------------------------------------------------+ */+#ifndef HASH_H+#define HASH_H++#include "access/genam.h"+#include "access/itup.h"+#include "access/sdir.h"+#include "access/xlogreader.h"+#include "fmgr.h"+#include "lib/stringinfo.h"+#include "storage/bufmgr.h"+#include "storage/lock.h"+#include "utils/relcache.h"++/*+ * Mapping from hash bucket number to physical block number of bucket's+ * starting page. Beware of multiple evaluations of argument!+ */+typedef uint32 Bucket;++#define BUCKET_TO_BLKNO(metap,B) \+ ((BlockNumber) ((B) + ((B) ? (metap)->hashm_spares[_hash_log2((B)+1)-1] : 0)) + 1)++/*+ * Special space for hash index pages.+ *+ * hasho_flag tells us which type of page we're looking at. For+ * example, knowing overflow pages from bucket pages is necessary+ * information when you're deleting tuples from a page. If all the+ * tuples are deleted from an overflow page, the overflow is made+ * available to other buckets by calling _hash_freeovflpage(). If all+ * the tuples are deleted from a bucket page, no additional action is+ * necessary.+ */+#define LH_UNUSED_PAGE (0)+#define LH_OVERFLOW_PAGE (1 << 0)+#define LH_BUCKET_PAGE (1 << 1)+#define LH_BITMAP_PAGE (1 << 2)+#define LH_META_PAGE (1 << 3)++typedef struct HashPageOpaqueData+{+ BlockNumber hasho_prevblkno; /* previous ovfl (or bucket) blkno */+ BlockNumber hasho_nextblkno; /* next ovfl blkno */+ Bucket hasho_bucket; /* bucket number this pg belongs to */+ uint16 hasho_flag; /* page type code, see above */+ uint16 hasho_page_id; /* for identification of hash indexes */+} HashPageOpaqueData;++typedef HashPageOpaqueData *HashPageOpaque;++/*+ * The page ID is for the convenience of pg_filedump and similar utilities,+ * which otherwise would have a hard time telling pages of different index+ * types apart. It should be the last 2 bytes on the page. This is more or+ * less "free" due to alignment considerations.+ */+#define HASHO_PAGE_ID 0xFF80++/*+ * HashScanOpaqueData is private state for a hash index scan.+ */+typedef struct HashScanOpaqueData+{+ /* Hash value of the scan key, ie, the hash key we seek */+ uint32 hashso_sk_hash;++ /*+ * By definition, a hash scan should be examining only one bucket. We+ * record the bucket number here as soon as it is known.+ */+ Bucket hashso_bucket;+ bool hashso_bucket_valid;++ /*+ * If we have a share lock on the bucket, we record it here. When+ * hashso_bucket_blkno is zero, we have no such lock.+ */+ BlockNumber hashso_bucket_blkno;++ /*+ * We also want to remember which buffer we're currently examining in the+ * scan. We keep the buffer pinned (but not locked) across hashgettuple+ * calls, in order to avoid doing a ReadBuffer() for every tuple in the+ * index.+ */+ Buffer hashso_curbuf;++ /* Current position of the scan, as an index TID */+ ItemPointerData hashso_curpos;++ /* Current position of the scan, as a heap TID */+ ItemPointerData hashso_heappos;+} HashScanOpaqueData;++typedef HashScanOpaqueData *HashScanOpaque;++/*+ * Definitions for metapage.+ */++#define HASH_METAPAGE 0 /* metapage is always block 0 */++#define HASH_MAGIC 0x6440640+#define HASH_VERSION 2 /* 2 signifies only hash key value is stored */++/*+ * Spares[] holds the number of overflow pages currently allocated at or+ * before a certain splitpoint. For example, if spares[3] = 7 then there are+ * 7 ovflpages before splitpoint 3 (compare BUCKET_TO_BLKNO macro). The+ * value in spares[ovflpoint] increases as overflow pages are added at the+ * end of the index. Once ovflpoint increases (ie, we have actually allocated+ * the bucket pages belonging to that splitpoint) the number of spares at the+ * prior splitpoint cannot change anymore.+ *+ * ovflpages that have been recycled for reuse can be found by looking at+ * bitmaps that are stored within ovflpages dedicated for the purpose.+ * The blknos of these bitmap pages are kept in bitmaps[]; nmaps is the+ * number of currently existing bitmaps.+ *+ * The limitation on the size of spares[] comes from the fact that there's+ * no point in having more than 2^32 buckets with only uint32 hashcodes.+ * There is no particular upper limit on the size of mapp[], other than+ * needing to fit into the metapage. (With 8K block size, 128 bitmaps+ * limit us to 64 Gb of overflow space...)+ */+#define HASH_MAX_SPLITPOINTS 32+#define HASH_MAX_BITMAPS 128++typedef struct HashMetaPageData+{+ uint32 hashm_magic; /* magic no. for hash tables */+ uint32 hashm_version; /* version ID */+ double hashm_ntuples; /* number of tuples stored in the table */+ uint16 hashm_ffactor; /* target fill factor (tuples/bucket) */+ uint16 hashm_bsize; /* index page size (bytes) */+ uint16 hashm_bmsize; /* bitmap array size (bytes) - must be a power+ * of 2 */+ uint16 hashm_bmshift; /* log2(bitmap array size in BITS) */+ uint32 hashm_maxbucket; /* ID of maximum bucket in use */+ uint32 hashm_highmask; /* mask to modulo into entire table */+ uint32 hashm_lowmask; /* mask to modulo into lower half of table */+ uint32 hashm_ovflpoint;/* splitpoint from which ovflpgs being+ * allocated */+ uint32 hashm_firstfree; /* lowest-number free ovflpage (bit#) */+ uint32 hashm_nmaps; /* number of bitmap pages */+ RegProcedure hashm_procid; /* hash procedure id from pg_proc */+ uint32 hashm_spares[HASH_MAX_SPLITPOINTS]; /* spare pages before+ * each splitpoint */+ BlockNumber hashm_mapp[HASH_MAX_BITMAPS]; /* blknos of ovfl bitmaps */+} HashMetaPageData;++typedef HashMetaPageData *HashMetaPage;++/*+ * Maximum size of a hash index item (it's okay to have only one per page)+ */+#define HashMaxItemSize(page) \+ MAXALIGN_DOWN(PageGetPageSize(page) - \+ SizeOfPageHeaderData - \+ sizeof(ItemIdData) - \+ MAXALIGN(sizeof(HashPageOpaqueData)))++#define HASH_MIN_FILLFACTOR 10+#define HASH_DEFAULT_FILLFACTOR 75++/*+ * Constants+ */+#define BYTE_TO_BIT 3 /* 2^3 bits/byte */+#define ALL_SET ((uint32) ~0)++/*+ * Bitmap pages do not contain tuples. They do contain the standard+ * page headers and trailers; however, everything in between is a+ * giant bit array. The number of bits that fit on a page obviously+ * depends on the page size and the header/trailer overhead. We require+ * the number of bits per page to be a power of 2.+ */+#define BMPGSZ_BYTE(metap) ((metap)->hashm_bmsize)+#define BMPGSZ_BIT(metap) ((metap)->hashm_bmsize << BYTE_TO_BIT)+#define BMPG_SHIFT(metap) ((metap)->hashm_bmshift)+#define BMPG_MASK(metap) (BMPGSZ_BIT(metap) - 1)++#define HashPageGetBitmap(page) \+ ((uint32 *) PageGetContents(page))++#define HashGetMaxBitmapSize(page) \+ (PageGetPageSize((Page) page) - \+ (MAXALIGN(SizeOfPageHeaderData) + MAXALIGN(sizeof(HashPageOpaqueData))))++#define HashPageGetMeta(page) \+ ((HashMetaPage) PageGetContents(page))++/*+ * The number of bits in an ovflpage bitmap word.+ */+#define BITS_PER_MAP 32 /* Number of bits in uint32 */++/* Given the address of the beginning of a bit map, clear/set the nth bit */+#define CLRBIT(A, N) ((A)[(N)/BITS_PER_MAP] &= ~(1<<((N)%BITS_PER_MAP)))+#define SETBIT(A, N) ((A)[(N)/BITS_PER_MAP] |= (1<<((N)%BITS_PER_MAP)))+#define ISSET(A, N) ((A)[(N)/BITS_PER_MAP] & (1<<((N)%BITS_PER_MAP)))++/*+ * page-level and high-level locking modes (see README)+ */+#define HASH_READ BUFFER_LOCK_SHARE+#define HASH_WRITE BUFFER_LOCK_EXCLUSIVE+#define HASH_NOLOCK (-1)++#define HASH_SHARE ShareLock+#define HASH_EXCLUSIVE ExclusiveLock++/*+ * Strategy number. There's only one valid strategy for hashing: equality.+ */+#define HTEqualStrategyNumber 1+#define HTMaxStrategyNumber 1++/*+ * When a new operator class is declared, we require that the user supply+ * us with an amproc procudure for hashing a key of the new type.+ * Since we only have one such proc in amproc, it's number 1.+ */+#define HASHPROC 1+++/* public routines */++extern Datum hashbuild(PG_FUNCTION_ARGS);+extern Datum hashbuildempty(PG_FUNCTION_ARGS);+extern Datum hashinsert(PG_FUNCTION_ARGS);+extern Datum hashbeginscan(PG_FUNCTION_ARGS);+extern Datum hashgettuple(PG_FUNCTION_ARGS);+extern Datum hashgetbitmap(PG_FUNCTION_ARGS);+extern Datum hashrescan(PG_FUNCTION_ARGS);+extern Datum hashendscan(PG_FUNCTION_ARGS);+extern Datum hashmarkpos(PG_FUNCTION_ARGS);+extern Datum hashrestrpos(PG_FUNCTION_ARGS);+extern Datum hashbulkdelete(PG_FUNCTION_ARGS);+extern Datum hashvacuumcleanup(PG_FUNCTION_ARGS);+extern Datum hashoptions(PG_FUNCTION_ARGS);++/*+ * Datatype-specific hash functions in hashfunc.c.+ *+ * These support both hash indexes and hash joins.+ *+ * NOTE: some of these are also used by catcache operations, without+ * any direct connection to hash indexes. Also, the common hash_any+ * routine is also used by dynahash tables.+ */+extern Datum hashchar(PG_FUNCTION_ARGS);+extern Datum hashint2(PG_FUNCTION_ARGS);+extern Datum hashint4(PG_FUNCTION_ARGS);+extern Datum hashint8(PG_FUNCTION_ARGS);+extern Datum hashoid(PG_FUNCTION_ARGS);+extern Datum hashenum(PG_FUNCTION_ARGS);+extern Datum hashfloat4(PG_FUNCTION_ARGS);+extern Datum hashfloat8(PG_FUNCTION_ARGS);+extern Datum hashoidvector(PG_FUNCTION_ARGS);+extern Datum hashint2vector(PG_FUNCTION_ARGS);+extern Datum hashname(PG_FUNCTION_ARGS);+extern Datum hashtext(PG_FUNCTION_ARGS);+extern Datum hashvarlena(PG_FUNCTION_ARGS);+extern Datum hash_any(register const unsigned char *k, register int keylen);+extern Datum hash_uint32(uint32 k);++/* private routines */++/* hashinsert.c */+extern void _hash_doinsert(Relation rel, IndexTuple itup);+extern OffsetNumber _hash_pgaddtup(Relation rel, Buffer buf,+ Size itemsize, IndexTuple itup);++/* hashovfl.c */+extern Buffer _hash_addovflpage(Relation rel, Buffer metabuf, Buffer buf);+extern BlockNumber _hash_freeovflpage(Relation rel, Buffer ovflbuf,+ BufferAccessStrategy bstrategy);+extern void _hash_initbitmap(Relation rel, HashMetaPage metap,+ BlockNumber blkno, ForkNumber forkNum);+extern void _hash_squeezebucket(Relation rel,+ Bucket bucket, BlockNumber bucket_blkno,+ BufferAccessStrategy bstrategy);++/* hashpage.c */+extern void _hash_getlock(Relation rel, BlockNumber whichlock, int access);+extern bool _hash_try_getlock(Relation rel, BlockNumber whichlock, int access);+extern void _hash_droplock(Relation rel, BlockNumber whichlock, int access);+extern Buffer _hash_getbuf(Relation rel, BlockNumber blkno,+ int access, int flags);+extern Buffer _hash_getinitbuf(Relation rel, BlockNumber blkno);+extern Buffer _hash_getnewbuf(Relation rel, BlockNumber blkno,+ ForkNumber forkNum);+extern Buffer _hash_getbuf_with_strategy(Relation rel, BlockNumber blkno,+ int access, int flags,+ BufferAccessStrategy bstrategy);+extern void _hash_relbuf(Relation rel, Buffer buf);+extern void _hash_dropbuf(Relation rel, Buffer buf);+extern void _hash_wrtbuf(Relation rel, Buffer buf);+extern void _hash_chgbufaccess(Relation rel, Buffer buf, int from_access,+ int to_access);+extern uint32 _hash_metapinit(Relation rel, double num_tuples,+ ForkNumber forkNum);+extern void _hash_pageinit(Page page, Size size);+extern void _hash_expandtable(Relation rel, Buffer metabuf);++/* hashscan.c */+extern void _hash_regscan(IndexScanDesc scan);+extern void _hash_dropscan(IndexScanDesc scan);+extern bool _hash_has_active_scan(Relation rel, Bucket bucket);+extern void ReleaseResources_hash(void);++/* hashsearch.c */+extern bool _hash_next(IndexScanDesc scan, ScanDirection dir);+extern bool _hash_first(IndexScanDesc scan, ScanDirection dir);+extern bool _hash_step(IndexScanDesc scan, Buffer *bufP, ScanDirection dir);++/* hashsort.c */+typedef struct HSpool HSpool; /* opaque struct in hashsort.c */++extern HSpool *_h_spoolinit(Relation heap, Relation index, uint32 num_buckets);+extern void _h_spooldestroy(HSpool *hspool);+extern void _h_spool(HSpool *hspool, ItemPointer self,+ Datum *values, bool *isnull);+extern void _h_indexbuild(HSpool *hspool);++/* hashutil.c */+extern bool _hash_checkqual(IndexScanDesc scan, IndexTuple itup);+extern uint32 _hash_datum2hashkey(Relation rel, Datum key);+extern uint32 _hash_datum2hashkey_type(Relation rel, Datum key, Oid keytype);+extern Bucket _hash_hashkey2bucket(uint32 hashkey, uint32 maxbucket,+ uint32 highmask, uint32 lowmask);+extern uint32 _hash_log2(uint32 num);+extern void _hash_checkpage(Relation rel, Buffer buf, int flags);+extern uint32 _hash_get_indextuple_hashkey(IndexTuple itup);+extern IndexTuple _hash_form_tuple(Relation index,+ Datum *values, bool *isnull);+extern OffsetNumber _hash_binsearch(Page page, uint32 hash_value);+extern OffsetNumber _hash_binsearch_last(Page page, uint32 hash_value);++/* hash.c */+extern void hash_redo(XLogReaderState *record);+extern void hash_desc(StringInfo buf, XLogReaderState *record);+extern const char *hash_identify(uint8 info);++#endif /* HASH_H */
+ foreign/libpg_query/src/postgres/include/access/heapam.h view
@@ -0,0 +1,192 @@+/*-------------------------------------------------------------------------+ *+ * heapam.h+ * POSTGRES heap access method definitions.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/access/heapam.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef HEAPAM_H+#define HEAPAM_H++#include "access/sdir.h"+#include "access/skey.h"+#include "nodes/lockoptions.h"+#include "nodes/primnodes.h"+#include "storage/bufpage.h"+#include "storage/lock.h"+#include "utils/relcache.h"+#include "utils/snapshot.h"+++/* "options" flag bits for heap_insert */+#define HEAP_INSERT_SKIP_WAL 0x0001+#define HEAP_INSERT_SKIP_FSM 0x0002+#define HEAP_INSERT_FROZEN 0x0004+#define HEAP_INSERT_SPECULATIVE 0x0008++typedef struct BulkInsertStateData *BulkInsertState;++/*+ * Possible lock modes for a tuple.+ */+typedef enum LockTupleMode+{+ /* SELECT FOR KEY SHARE */+ LockTupleKeyShare,+ /* SELECT FOR SHARE */+ LockTupleShare,+ /* SELECT FOR NO KEY UPDATE, and UPDATEs that don't modify key columns */+ LockTupleNoKeyExclusive,+ /* SELECT FOR UPDATE, UPDATEs that modify key columns, and DELETE */+ LockTupleExclusive+} LockTupleMode;++#define MaxLockTupleMode LockTupleExclusive++/*+ * When heap_update, heap_delete, or heap_lock_tuple fail because the target+ * tuple is already outdated, they fill in this struct to provide information+ * to the caller about what happened.+ * ctid is the target's ctid link: it is the same as the target's TID if the+ * target was deleted, or the location of the replacement tuple if the target+ * was updated.+ * xmax is the outdating transaction's XID. If the caller wants to visit the+ * replacement tuple, it must check that this matches before believing the+ * replacement is really a match.+ * cmax is the outdating command's CID, but only when the failure code is+ * HeapTupleSelfUpdated (i.e., something in the current transaction outdated+ * the tuple); otherwise cmax is zero. (We make this restriction because+ * HeapTupleHeaderGetCmax doesn't work for tuples outdated in other+ * transactions.)+ */+typedef struct HeapUpdateFailureData+{+ ItemPointerData ctid;+ TransactionId xmax;+ CommandId cmax;+} HeapUpdateFailureData;+++/* ----------------+ * function prototypes for heap access method+ *+ * heap_create, heap_create_with_catalog, and heap_drop_with_catalog+ * are declared in catalog/heap.h+ * ----------------+ */++/* in heap/heapam.c */+extern Relation relation_open(Oid relationId, LOCKMODE lockmode);+extern Relation try_relation_open(Oid relationId, LOCKMODE lockmode);+extern Relation relation_openrv(const RangeVar *relation, LOCKMODE lockmode);+extern Relation relation_openrv_extended(const RangeVar *relation,+ LOCKMODE lockmode, bool missing_ok);+extern void relation_close(Relation relation, LOCKMODE lockmode);++extern Relation heap_open(Oid relationId, LOCKMODE lockmode);+extern Relation heap_openrv(const RangeVar *relation, LOCKMODE lockmode);+extern Relation heap_openrv_extended(const RangeVar *relation,+ LOCKMODE lockmode, bool missing_ok);++#define heap_close(r,l) relation_close(r,l)++/* struct definition appears in relscan.h */+typedef struct HeapScanDescData *HeapScanDesc;++/*+ * HeapScanIsValid+ * True iff the heap scan is valid.+ */+#define HeapScanIsValid(scan) PointerIsValid(scan)++extern HeapScanDesc heap_beginscan(Relation relation, Snapshot snapshot,+ int nkeys, ScanKey key);+extern HeapScanDesc heap_beginscan_catalog(Relation relation, int nkeys,+ ScanKey key);+extern HeapScanDesc heap_beginscan_strat(Relation relation, Snapshot snapshot,+ int nkeys, ScanKey key,+ bool allow_strat, bool allow_sync);+extern HeapScanDesc heap_beginscan_bm(Relation relation, Snapshot snapshot,+ int nkeys, ScanKey key);+extern HeapScanDesc heap_beginscan_sampling(Relation relation,+ Snapshot snapshot, int nkeys, ScanKey key,+ bool allow_strat, bool allow_sync, bool allow_pagemode);+extern void heap_setscanlimits(HeapScanDesc scan, BlockNumber startBlk,+ BlockNumber endBlk);+extern void heapgetpage(HeapScanDesc scan, BlockNumber page);+extern void heap_rescan(HeapScanDesc scan, ScanKey key);+extern void heap_rescan_set_params(HeapScanDesc scan, ScanKey key,+ bool allow_strat, bool allow_sync, bool allow_pagemode);+extern void heap_endscan(HeapScanDesc scan);+extern HeapTuple heap_getnext(HeapScanDesc scan, ScanDirection direction);++extern bool heap_fetch(Relation relation, Snapshot snapshot,+ HeapTuple tuple, Buffer *userbuf, bool keep_buf,+ Relation stats_relation);+extern bool heap_hot_search_buffer(ItemPointer tid, Relation relation,+ Buffer buffer, Snapshot snapshot, HeapTuple heapTuple,+ bool *all_dead, bool first_call);+extern bool heap_hot_search(ItemPointer tid, Relation relation,+ Snapshot snapshot, bool *all_dead);++extern void heap_get_latest_tid(Relation relation, Snapshot snapshot,+ ItemPointer tid);+extern void setLastTid(const ItemPointer tid);++extern BulkInsertState GetBulkInsertState(void);+extern void FreeBulkInsertState(BulkInsertState);++extern Oid heap_insert(Relation relation, HeapTuple tup, CommandId cid,+ int options, BulkInsertState bistate);+extern void heap_multi_insert(Relation relation, HeapTuple *tuples, int ntuples,+ CommandId cid, int options, BulkInsertState bistate);+extern HTSU_Result heap_delete(Relation relation, ItemPointer tid,+ CommandId cid, Snapshot crosscheck, bool wait,+ HeapUpdateFailureData *hufd);+extern void heap_finish_speculative(Relation relation, HeapTuple tuple);+extern void heap_abort_speculative(Relation relation, HeapTuple tuple);+extern HTSU_Result heap_update(Relation relation, ItemPointer otid,+ HeapTuple newtup,+ CommandId cid, Snapshot crosscheck, bool wait,+ HeapUpdateFailureData *hufd, LockTupleMode *lockmode);+extern HTSU_Result heap_lock_tuple(Relation relation, HeapTuple tuple,+ CommandId cid, LockTupleMode mode, LockWaitPolicy wait_policy,+ bool follow_update,+ Buffer *buffer, HeapUpdateFailureData *hufd);+extern void heap_inplace_update(Relation relation, HeapTuple tuple);+extern bool heap_freeze_tuple(HeapTupleHeader tuple, TransactionId cutoff_xid,+ TransactionId cutoff_multi);+extern bool heap_tuple_needs_freeze(HeapTupleHeader tuple, TransactionId cutoff_xid,+ MultiXactId cutoff_multi, Buffer buf);++extern Oid simple_heap_insert(Relation relation, HeapTuple tup);+extern void simple_heap_delete(Relation relation, ItemPointer tid);+extern void simple_heap_update(Relation relation, ItemPointer otid,+ HeapTuple tup);++extern void heap_sync(Relation relation);++/* in heap/pruneheap.c */+extern void heap_page_prune_opt(Relation relation, Buffer buffer);+extern int heap_page_prune(Relation relation, Buffer buffer,+ TransactionId OldestXmin,+ bool report_stats, TransactionId *latestRemovedXid);+extern void heap_page_prune_execute(Buffer buffer,+ OffsetNumber *redirected, int nredirected,+ OffsetNumber *nowdead, int ndead,+ OffsetNumber *nowunused, int nunused);+extern void heap_get_root_tuples(Page page, OffsetNumber *root_offsets);++/* in heap/syncscan.c */+extern void ss_report_location(Relation rel, BlockNumber location);+extern BlockNumber ss_get_location(Relation rel, BlockNumber relnblocks);+extern void SyncScanShmemInit(void);+extern Size SyncScanShmemSize(void);++#endif /* HEAPAM_H */
+ foreign/libpg_query/src/postgres/include/access/htup.h view
@@ -0,0 +1,88 @@+/*-------------------------------------------------------------------------+ *+ * htup.h+ * POSTGRES heap tuple definitions.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/access/htup.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef HTUP_H+#define HTUP_H++#include "storage/itemptr.h"++/* typedefs and forward declarations for structs defined in htup_details.h */++typedef struct HeapTupleHeaderData HeapTupleHeaderData;++typedef HeapTupleHeaderData *HeapTupleHeader;++typedef struct MinimalTupleData MinimalTupleData;++typedef MinimalTupleData *MinimalTuple;+++/*+ * HeapTupleData is an in-memory data structure that points to a tuple.+ *+ * There are several ways in which this data structure is used:+ *+ * * Pointer to a tuple in a disk buffer: t_data points directly into the+ * buffer (which the code had better be holding a pin on, but this is not+ * reflected in HeapTupleData itself).+ *+ * * Pointer to nothing: t_data is NULL. This is used as a failure indication+ * in some functions.+ *+ * * Part of a palloc'd tuple: the HeapTupleData itself and the tuple+ * form a single palloc'd chunk. t_data points to the memory location+ * immediately following the HeapTupleData struct (at offset HEAPTUPLESIZE).+ * This is the output format of heap_form_tuple and related routines.+ *+ * * Separately allocated tuple: t_data points to a palloc'd chunk that+ * is not adjacent to the HeapTupleData. (This case is deprecated since+ * it's difficult to tell apart from case #1. It should be used only in+ * limited contexts where the code knows that case #1 will never apply.)+ *+ * * Separately allocated minimal tuple: t_data points MINIMAL_TUPLE_OFFSET+ * bytes before the start of a MinimalTuple. As with the previous case,+ * this can't be told apart from case #1 by inspection; code setting up+ * or destroying this representation has to know what it's doing.+ *+ * t_len should always be valid, except in the pointer-to-nothing case.+ * t_self and t_tableOid should be valid if the HeapTupleData points to+ * a disk buffer, or if it represents a copy of a tuple on disk. They+ * should be explicitly set invalid in manufactured tuples.+ */+typedef struct HeapTupleData+{+ uint32 t_len; /* length of *t_data */+ ItemPointerData t_self; /* SelfItemPointer */+ Oid t_tableOid; /* table the tuple came from */+ HeapTupleHeader t_data; /* -> tuple header and data */+} HeapTupleData;++typedef HeapTupleData *HeapTuple;++#define HEAPTUPLESIZE MAXALIGN(sizeof(HeapTupleData))++/*+ * Accessor macros to be used with HeapTuple pointers.+ */+#define HeapTupleIsValid(tuple) PointerIsValid(tuple)++/* HeapTupleHeader functions implemented in utils/time/combocid.c */+extern CommandId HeapTupleHeaderGetCmin(HeapTupleHeader tup);+extern CommandId HeapTupleHeaderGetCmax(HeapTupleHeader tup);+extern void HeapTupleHeaderAdjustCmax(HeapTupleHeader tup,+ CommandId *cmax, bool *iscombo);++/* Prototype for HeapTupleHeader accessors in heapam.c */+extern TransactionId HeapTupleGetUpdateXid(HeapTupleHeader tuple);++#endif /* HTUP_H */
+ foreign/libpg_query/src/postgres/include/access/htup_details.h view
@@ -0,0 +1,804 @@+/*-------------------------------------------------------------------------+ *+ * htup_details.h+ * POSTGRES heap tuple header definitions.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/access/htup_details.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef HTUP_DETAILS_H+#define HTUP_DETAILS_H++#include "access/htup.h"+#include "access/tupdesc.h"+#include "access/tupmacs.h"+#include "access/transam.h"+#include "storage/bufpage.h"++/*+ * MaxTupleAttributeNumber limits the number of (user) columns in a tuple.+ * The key limit on this value is that the size of the fixed overhead for+ * a tuple, plus the size of the null-values bitmap (at 1 bit per column),+ * plus MAXALIGN alignment, must fit into t_hoff which is uint8. On most+ * machines the upper limit without making t_hoff wider would be a little+ * over 1700. We use round numbers here and for MaxHeapAttributeNumber+ * so that alterations in HeapTupleHeaderData layout won't change the+ * supported max number of columns.+ */+#define MaxTupleAttributeNumber 1664 /* 8 * 208 */++/*+ * MaxHeapAttributeNumber limits the number of (user) columns in a table.+ * This should be somewhat less than MaxTupleAttributeNumber. It must be+ * at least one less, else we will fail to do UPDATEs on a maximal-width+ * table (because UPDATE has to form working tuples that include CTID).+ * In practice we want some additional daylight so that we can gracefully+ * support operations that add hidden "resjunk" columns, for example+ * SELECT * FROM wide_table ORDER BY foo, bar, baz.+ * In any case, depending on column data types you will likely be running+ * into the disk-block-based limit on overall tuple size if you have more+ * than a thousand or so columns. TOAST won't help.+ */+#define MaxHeapAttributeNumber 1600 /* 8 * 200 */++/*+ * Heap tuple header. To avoid wasting space, the fields should be+ * laid out in such a way as to avoid structure padding.+ *+ * Datums of composite types (row types) share the same general structure+ * as on-disk tuples, so that the same routines can be used to build and+ * examine them. However the requirements are slightly different: a Datum+ * does not need any transaction visibility information, and it does need+ * a length word and some embedded type information. We can achieve this+ * by overlaying the xmin/cmin/xmax/cmax/xvac fields of a heap tuple+ * with the fields needed in the Datum case. Typically, all tuples built+ * in-memory will be initialized with the Datum fields; but when a tuple is+ * about to be inserted in a table, the transaction fields will be filled,+ * overwriting the datum fields.+ *+ * The overall structure of a heap tuple looks like:+ * fixed fields (HeapTupleHeaderData struct)+ * nulls bitmap (if HEAP_HASNULL is set in t_infomask)+ * alignment padding (as needed to make user data MAXALIGN'd)+ * object ID (if HEAP_HASOID is set in t_infomask)+ * user data fields+ *+ * We store five "virtual" fields Xmin, Cmin, Xmax, Cmax, and Xvac in three+ * physical fields. Xmin and Xmax are always really stored, but Cmin, Cmax+ * and Xvac share a field. This works because we know that Cmin and Cmax+ * are only interesting for the lifetime of the inserting and deleting+ * transaction respectively. If a tuple is inserted and deleted in the same+ * transaction, we store a "combo" command id that can be mapped to the real+ * cmin and cmax, but only by use of local state within the originating+ * backend. See combocid.c for more details. Meanwhile, Xvac is only set by+ * old-style VACUUM FULL, which does not have any command sub-structure and so+ * does not need either Cmin or Cmax. (This requires that old-style VACUUM+ * FULL never try to move a tuple whose Cmin or Cmax is still interesting,+ * ie, an insert-in-progress or delete-in-progress tuple.)+ *+ * A word about t_ctid: whenever a new tuple is stored on disk, its t_ctid+ * is initialized with its own TID (location). If the tuple is ever updated,+ * its t_ctid is changed to point to the replacement version of the tuple.+ * Thus, a tuple is the latest version of its row iff XMAX is invalid or+ * t_ctid points to itself (in which case, if XMAX is valid, the tuple is+ * either locked or deleted). One can follow the chain of t_ctid links+ * to find the newest version of the row. Beware however that VACUUM might+ * erase the pointed-to (newer) tuple before erasing the pointing (older)+ * tuple. Hence, when following a t_ctid link, it is necessary to check+ * to see if the referenced slot is empty or contains an unrelated tuple.+ * Check that the referenced tuple has XMIN equal to the referencing tuple's+ * XMAX to verify that it is actually the descendant version and not an+ * unrelated tuple stored into a slot recently freed by VACUUM. If either+ * check fails, one may assume that there is no live descendant version.+ *+ * t_ctid is sometimes used to store a speculative insertion token, instead+ * of a real TID. A speculative token is set on a tuple that's being+ * inserted, until the inserter is sure that it wants to go ahead with the+ * insertion. Hence a token should only be seen on a tuple with an XMAX+ * that's still in-progress, or invalid/aborted. The token is replaced with+ * the tuple's real TID when the insertion is confirmed. One should never+ * see a speculative insertion token while following a chain of t_ctid links,+ * because they are not used on updates, only insertions.+ *+ * Following the fixed header fields, the nulls bitmap is stored (beginning+ * at t_bits). The bitmap is *not* stored if t_infomask shows that there+ * are no nulls in the tuple. If an OID field is present (as indicated by+ * t_infomask), then it is stored just before the user data, which begins at+ * the offset shown by t_hoff. Note that t_hoff must be a multiple of+ * MAXALIGN.+ */++typedef struct HeapTupleFields+{+ TransactionId t_xmin; /* inserting xact ID */+ TransactionId t_xmax; /* deleting or locking xact ID */++ union+ {+ CommandId t_cid; /* inserting or deleting command ID, or both */+ TransactionId t_xvac; /* old-style VACUUM FULL xact ID */+ } t_field3;+} HeapTupleFields;++typedef struct DatumTupleFields+{+ int32 datum_len_; /* varlena header (do not touch directly!) */++ int32 datum_typmod; /* -1, or identifier of a record type */++ Oid datum_typeid; /* composite type OID, or RECORDOID */++ /*+ * Note: field ordering is chosen with thought that Oid might someday+ * widen to 64 bits.+ */+} DatumTupleFields;++struct HeapTupleHeaderData+{+ union+ {+ HeapTupleFields t_heap;+ DatumTupleFields t_datum;+ } t_choice;++ ItemPointerData t_ctid; /* current TID of this or newer tuple (or a+ * speculative insertion token) */++ /* Fields below here must match MinimalTupleData! */++ uint16 t_infomask2; /* number of attributes + various flags */++ uint16 t_infomask; /* various flag bits, see below */++ uint8 t_hoff; /* sizeof header incl. bitmap, padding */++ /* ^ - 23 bytes - ^ */++ bits8 t_bits[FLEXIBLE_ARRAY_MEMBER]; /* bitmap of NULLs */++ /* MORE DATA FOLLOWS AT END OF STRUCT */+};++/* typedef appears in tupbasics.h */++#define SizeofHeapTupleHeader offsetof(HeapTupleHeaderData, t_bits)++/*+ * information stored in t_infomask:+ */+#define HEAP_HASNULL 0x0001 /* has null attribute(s) */+#define HEAP_HASVARWIDTH 0x0002 /* has variable-width attribute(s) */+#define HEAP_HASEXTERNAL 0x0004 /* has external stored attribute(s) */+#define HEAP_HASOID 0x0008 /* has an object-id field */+#define HEAP_XMAX_KEYSHR_LOCK 0x0010 /* xmax is a key-shared locker */+#define HEAP_COMBOCID 0x0020 /* t_cid is a combo cid */+#define HEAP_XMAX_EXCL_LOCK 0x0040 /* xmax is exclusive locker */+#define HEAP_XMAX_LOCK_ONLY 0x0080 /* xmax, if valid, is only a locker */++ /* xmax is a shared locker */+#define HEAP_XMAX_SHR_LOCK (HEAP_XMAX_EXCL_LOCK | HEAP_XMAX_KEYSHR_LOCK)++#define HEAP_LOCK_MASK (HEAP_XMAX_SHR_LOCK | HEAP_XMAX_EXCL_LOCK | \+ HEAP_XMAX_KEYSHR_LOCK)+#define HEAP_XMIN_COMMITTED 0x0100 /* t_xmin committed */+#define HEAP_XMIN_INVALID 0x0200 /* t_xmin invalid/aborted */+#define HEAP_XMIN_FROZEN (HEAP_XMIN_COMMITTED|HEAP_XMIN_INVALID)+#define HEAP_XMAX_COMMITTED 0x0400 /* t_xmax committed */+#define HEAP_XMAX_INVALID 0x0800 /* t_xmax invalid/aborted */+#define HEAP_XMAX_IS_MULTI 0x1000 /* t_xmax is a MultiXactId */+#define HEAP_UPDATED 0x2000 /* this is UPDATEd version of row */+#define HEAP_MOVED_OFF 0x4000 /* moved to another place by pre-9.0+ * VACUUM FULL; kept for binary+ * upgrade support */+#define HEAP_MOVED_IN 0x8000 /* moved from another place by pre-9.0+ * VACUUM FULL; kept for binary+ * upgrade support */+#define HEAP_MOVED (HEAP_MOVED_OFF | HEAP_MOVED_IN)++#define HEAP_XACT_MASK 0xFFF0 /* visibility-related bits */++/*+ * A tuple is only locked (i.e. not updated by its Xmax) if the+ * HEAP_XMAX_LOCK_ONLY bit is set; or, for pg_upgrade's sake, if the Xmax is+ * not a multi and the EXCL_LOCK bit is set.+ *+ * See also HeapTupleHeaderIsOnlyLocked, which also checks for a possible+ * aborted updater transaction.+ *+ * Beware of multiple evaluations of the argument.+ */+#define HEAP_XMAX_IS_LOCKED_ONLY(infomask) \+ (((infomask) & HEAP_XMAX_LOCK_ONLY) || \+ (((infomask) & (HEAP_XMAX_IS_MULTI | HEAP_LOCK_MASK)) == HEAP_XMAX_EXCL_LOCK))++/*+ * Use these to test whether a particular lock is applied to a tuple+ */+#define HEAP_XMAX_IS_SHR_LOCKED(infomask) \+ (((infomask) & HEAP_LOCK_MASK) == HEAP_XMAX_SHR_LOCK)+#define HEAP_XMAX_IS_EXCL_LOCKED(infomask) \+ (((infomask) & HEAP_LOCK_MASK) == HEAP_XMAX_EXCL_LOCK)+#define HEAP_XMAX_IS_KEYSHR_LOCKED(infomask) \+ (((infomask) & HEAP_LOCK_MASK) == HEAP_XMAX_KEYSHR_LOCK)++/* turn these all off when Xmax is to change */+#define HEAP_XMAX_BITS (HEAP_XMAX_COMMITTED | HEAP_XMAX_INVALID | \+ HEAP_XMAX_IS_MULTI | HEAP_LOCK_MASK | HEAP_XMAX_LOCK_ONLY)++/*+ * information stored in t_infomask2:+ */+#define HEAP_NATTS_MASK 0x07FF /* 11 bits for number of attributes */+/* bits 0x1800 are available */+#define HEAP_KEYS_UPDATED 0x2000 /* tuple was updated and key cols+ * modified, or tuple deleted */+#define HEAP_HOT_UPDATED 0x4000 /* tuple was HOT-updated */+#define HEAP_ONLY_TUPLE 0x8000 /* this is heap-only tuple */++#define HEAP2_XACT_MASK 0xE000 /* visibility-related bits */++/*+ * HEAP_TUPLE_HAS_MATCH is a temporary flag used during hash joins. It is+ * only used in tuples that are in the hash table, and those don't need+ * any visibility information, so we can overlay it on a visibility flag+ * instead of using up a dedicated bit.+ */+#define HEAP_TUPLE_HAS_MATCH HEAP_ONLY_TUPLE /* tuple has a join match */++/*+ * Special value used in t_ctid.ip_posid, to indicate that it holds a+ * speculative insertion token rather than a real TID. This must be higher+ * than MaxOffsetNumber, so that it can be distinguished from a valid+ * offset number in a regular item pointer.+ */+#define SpecTokenOffsetNumber 0xfffe++/*+ * HeapTupleHeader accessor macros+ *+ * Note: beware of multiple evaluations of "tup" argument. But the Set+ * macros evaluate their other argument only once.+ */++/*+ * HeapTupleHeaderGetRawXmin returns the "raw" xmin field, which is the xid+ * originally used to insert the tuple. However, the tuple might actually+ * be frozen (via HeapTupleHeaderSetXminFrozen) in which case the tuple's xmin+ * is visible to every snapshot. Prior to PostgreSQL 9.4, we actually changed+ * the xmin to FrozenTransactionId, and that value may still be encountered+ * on disk.+ */+#define HeapTupleHeaderGetRawXmin(tup) \+( \+ (tup)->t_choice.t_heap.t_xmin \+)++#define HeapTupleHeaderGetXmin(tup) \+( \+ HeapTupleHeaderXminFrozen(tup) ? \+ FrozenTransactionId : HeapTupleHeaderGetRawXmin(tup) \+)++#define HeapTupleHeaderSetXmin(tup, xid) \+( \+ (tup)->t_choice.t_heap.t_xmin = (xid) \+)++#define HeapTupleHeaderXminCommitted(tup) \+( \+ (tup)->t_infomask & HEAP_XMIN_COMMITTED \+)++#define HeapTupleHeaderXminInvalid(tup) \+( \+ ((tup)->t_infomask & (HEAP_XMIN_COMMITTED|HEAP_XMIN_INVALID)) == \+ HEAP_XMIN_INVALID \+)++#define HeapTupleHeaderXminFrozen(tup) \+( \+ ((tup)->t_infomask & (HEAP_XMIN_FROZEN)) == HEAP_XMIN_FROZEN \+)++#define HeapTupleHeaderSetXminCommitted(tup) \+( \+ AssertMacro(!HeapTupleHeaderXminInvalid(tup)), \+ ((tup)->t_infomask |= HEAP_XMIN_COMMITTED) \+)++#define HeapTupleHeaderSetXminInvalid(tup) \+( \+ AssertMacro(!HeapTupleHeaderXminCommitted(tup)), \+ ((tup)->t_infomask |= HEAP_XMIN_INVALID) \+)++#define HeapTupleHeaderSetXminFrozen(tup) \+( \+ AssertMacro(!HeapTupleHeaderXminInvalid(tup)), \+ ((tup)->t_infomask |= HEAP_XMIN_FROZEN) \+)++/*+ * HeapTupleHeaderGetRawXmax gets you the raw Xmax field. To find out the Xid+ * that updated a tuple, you might need to resolve the MultiXactId if certain+ * bits are set. HeapTupleHeaderGetUpdateXid checks those bits and takes care+ * to resolve the MultiXactId if necessary. This might involve multixact I/O,+ * so it should only be used if absolutely necessary.+ */+#define HeapTupleHeaderGetUpdateXid(tup) \+( \+ (!((tup)->t_infomask & HEAP_XMAX_INVALID) && \+ ((tup)->t_infomask & HEAP_XMAX_IS_MULTI) && \+ !((tup)->t_infomask & HEAP_XMAX_LOCK_ONLY)) ? \+ HeapTupleGetUpdateXid(tup) \+ : \+ HeapTupleHeaderGetRawXmax(tup) \+)++#define HeapTupleHeaderGetRawXmax(tup) \+( \+ (tup)->t_choice.t_heap.t_xmax \+)++#define HeapTupleHeaderSetXmax(tup, xid) \+( \+ (tup)->t_choice.t_heap.t_xmax = (xid) \+)++/*+ * HeapTupleHeaderGetRawCommandId will give you what's in the header whether+ * it is useful or not. Most code should use HeapTupleHeaderGetCmin or+ * HeapTupleHeaderGetCmax instead, but note that those Assert that you can+ * get a legitimate result, ie you are in the originating transaction!+ */+#define HeapTupleHeaderGetRawCommandId(tup) \+( \+ (tup)->t_choice.t_heap.t_field3.t_cid \+)++/* SetCmin is reasonably simple since we never need a combo CID */+#define HeapTupleHeaderSetCmin(tup, cid) \+do { \+ Assert(!((tup)->t_infomask & HEAP_MOVED)); \+ (tup)->t_choice.t_heap.t_field3.t_cid = (cid); \+ (tup)->t_infomask &= ~HEAP_COMBOCID; \+} while (0)++/* SetCmax must be used after HeapTupleHeaderAdjustCmax; see combocid.c */+#define HeapTupleHeaderSetCmax(tup, cid, iscombo) \+do { \+ Assert(!((tup)->t_infomask & HEAP_MOVED)); \+ (tup)->t_choice.t_heap.t_field3.t_cid = (cid); \+ if (iscombo) \+ (tup)->t_infomask |= HEAP_COMBOCID; \+ else \+ (tup)->t_infomask &= ~HEAP_COMBOCID; \+} while (0)++#define HeapTupleHeaderGetXvac(tup) \+( \+ ((tup)->t_infomask & HEAP_MOVED) ? \+ (tup)->t_choice.t_heap.t_field3.t_xvac \+ : \+ InvalidTransactionId \+)++#define HeapTupleHeaderSetXvac(tup, xid) \+do { \+ Assert((tup)->t_infomask & HEAP_MOVED); \+ (tup)->t_choice.t_heap.t_field3.t_xvac = (xid); \+} while (0)++#define HeapTupleHeaderIsSpeculative(tup) \+( \+ (tup)->t_ctid.ip_posid == SpecTokenOffsetNumber \+)++#define HeapTupleHeaderGetSpeculativeToken(tup) \+( \+ AssertMacro(HeapTupleHeaderIsSpeculative(tup)), \+ ItemPointerGetBlockNumber(&(tup)->t_ctid) \+)++#define HeapTupleHeaderSetSpeculativeToken(tup, token) \+( \+ ItemPointerSet(&(tup)->t_ctid, token, SpecTokenOffsetNumber) \+)++#define HeapTupleHeaderGetDatumLength(tup) \+ VARSIZE(tup)++#define HeapTupleHeaderSetDatumLength(tup, len) \+ SET_VARSIZE(tup, len)++#define HeapTupleHeaderGetTypeId(tup) \+( \+ (tup)->t_choice.t_datum.datum_typeid \+)++#define HeapTupleHeaderSetTypeId(tup, typeid) \+( \+ (tup)->t_choice.t_datum.datum_typeid = (typeid) \+)++#define HeapTupleHeaderGetTypMod(tup) \+( \+ (tup)->t_choice.t_datum.datum_typmod \+)++#define HeapTupleHeaderSetTypMod(tup, typmod) \+( \+ (tup)->t_choice.t_datum.datum_typmod = (typmod) \+)++#define HeapTupleHeaderGetOid(tup) \+( \+ ((tup)->t_infomask & HEAP_HASOID) ? \+ *((Oid *) ((char *)(tup) + (tup)->t_hoff - sizeof(Oid))) \+ : \+ InvalidOid \+)++#define HeapTupleHeaderSetOid(tup, oid) \+do { \+ Assert((tup)->t_infomask & HEAP_HASOID); \+ *((Oid *) ((char *)(tup) + (tup)->t_hoff - sizeof(Oid))) = (oid); \+} while (0)++/*+ * Note that we stop considering a tuple HOT-updated as soon as it is known+ * aborted or the would-be updating transaction is known aborted. For best+ * efficiency, check tuple visibility before using this macro, so that the+ * INVALID bits will be as up to date as possible.+ */+#define HeapTupleHeaderIsHotUpdated(tup) \+( \+ ((tup)->t_infomask2 & HEAP_HOT_UPDATED) != 0 && \+ ((tup)->t_infomask & HEAP_XMAX_INVALID) == 0 && \+ !HeapTupleHeaderXminInvalid(tup) \+)++#define HeapTupleHeaderSetHotUpdated(tup) \+( \+ (tup)->t_infomask2 |= HEAP_HOT_UPDATED \+)++#define HeapTupleHeaderClearHotUpdated(tup) \+( \+ (tup)->t_infomask2 &= ~HEAP_HOT_UPDATED \+)++#define HeapTupleHeaderIsHeapOnly(tup) \+( \+ (tup)->t_infomask2 & HEAP_ONLY_TUPLE \+)++#define HeapTupleHeaderSetHeapOnly(tup) \+( \+ (tup)->t_infomask2 |= HEAP_ONLY_TUPLE \+)++#define HeapTupleHeaderClearHeapOnly(tup) \+( \+ (tup)->t_infomask2 &= ~HEAP_ONLY_TUPLE \+)++#define HeapTupleHeaderHasMatch(tup) \+( \+ (tup)->t_infomask2 & HEAP_TUPLE_HAS_MATCH \+)++#define HeapTupleHeaderSetMatch(tup) \+( \+ (tup)->t_infomask2 |= HEAP_TUPLE_HAS_MATCH \+)++#define HeapTupleHeaderClearMatch(tup) \+( \+ (tup)->t_infomask2 &= ~HEAP_TUPLE_HAS_MATCH \+)++#define HeapTupleHeaderGetNatts(tup) \+ ((tup)->t_infomask2 & HEAP_NATTS_MASK)++#define HeapTupleHeaderSetNatts(tup, natts) \+( \+ (tup)->t_infomask2 = ((tup)->t_infomask2 & ~HEAP_NATTS_MASK) | (natts) \+)++#define HeapTupleHeaderHasExternal(tup) \+ (((tup)->t_infomask & HEAP_HASEXTERNAL) != 0)+++/*+ * BITMAPLEN(NATTS) -+ * Computes size of null bitmap given number of data columns.+ */+#define BITMAPLEN(NATTS) (((int)(NATTS) + 7) / 8)++/*+ * MaxHeapTupleSize is the maximum allowed size of a heap tuple, including+ * header and MAXALIGN alignment padding. Basically it's BLCKSZ minus the+ * other stuff that has to be on a disk page. Since heap pages use no+ * "special space", there's no deduction for that.+ *+ * NOTE: we allow for the ItemId that must point to the tuple, ensuring that+ * an otherwise-empty page can indeed hold a tuple of this size. Because+ * ItemIds and tuples have different alignment requirements, don't assume that+ * you can, say, fit 2 tuples of size MaxHeapTupleSize/2 on the same page.+ */+#define MaxHeapTupleSize (BLCKSZ - MAXALIGN(SizeOfPageHeaderData + sizeof(ItemIdData)))+#define MinHeapTupleSize MAXALIGN(SizeofHeapTupleHeader)++/*+ * MaxHeapTuplesPerPage is an upper bound on the number of tuples that can+ * fit on one heap page. (Note that indexes could have more, because they+ * use a smaller tuple header.) We arrive at the divisor because each tuple+ * must be maxaligned, and it must have an associated item pointer.+ *+ * Note: with HOT, there could theoretically be more line pointers (not actual+ * tuples) than this on a heap page. However we constrain the number of line+ * pointers to this anyway, to avoid excessive line-pointer bloat and not+ * require increases in the size of work arrays.+ */+#define MaxHeapTuplesPerPage \+ ((int) ((BLCKSZ - SizeOfPageHeaderData) / \+ (MAXALIGN(SizeofHeapTupleHeader) + sizeof(ItemIdData))))++/*+ * MaxAttrSize is a somewhat arbitrary upper limit on the declared size of+ * data fields of char(n) and similar types. It need not have anything+ * directly to do with the *actual* upper limit of varlena values, which+ * is currently 1Gb (see TOAST structures in postgres.h). I've set it+ * at 10Mb which seems like a reasonable number --- tgl 8/6/00.+ */+#define MaxAttrSize (10 * 1024 * 1024)+++/*+ * MinimalTuple is an alternative representation that is used for transient+ * tuples inside the executor, in places where transaction status information+ * is not required, the tuple rowtype is known, and shaving off a few bytes+ * is worthwhile because we need to store many tuples. The representation+ * is chosen so that tuple access routines can work with either full or+ * minimal tuples via a HeapTupleData pointer structure. The access routines+ * see no difference, except that they must not access the transaction status+ * or t_ctid fields because those aren't there.+ *+ * For the most part, MinimalTuples should be accessed via TupleTableSlot+ * routines. These routines will prevent access to the "system columns"+ * and thereby prevent accidental use of the nonexistent fields.+ *+ * MinimalTupleData contains a length word, some padding, and fields matching+ * HeapTupleHeaderData beginning with t_infomask2. The padding is chosen so+ * that offsetof(t_infomask2) is the same modulo MAXIMUM_ALIGNOF in both+ * structs. This makes data alignment rules equivalent in both cases.+ *+ * When a minimal tuple is accessed via a HeapTupleData pointer, t_data is+ * set to point MINIMAL_TUPLE_OFFSET bytes before the actual start of the+ * minimal tuple --- that is, where a full tuple matching the minimal tuple's+ * data would start. This trick is what makes the structs seem equivalent.+ *+ * Note that t_hoff is computed the same as in a full tuple, hence it includes+ * the MINIMAL_TUPLE_OFFSET distance. t_len does not include that, however.+ *+ * MINIMAL_TUPLE_DATA_OFFSET is the offset to the first useful (non-pad) data+ * other than the length word. tuplesort.c and tuplestore.c use this to avoid+ * writing the padding to disk.+ */+#define MINIMAL_TUPLE_OFFSET \+ ((offsetof(HeapTupleHeaderData, t_infomask2) - sizeof(uint32)) / MAXIMUM_ALIGNOF * MAXIMUM_ALIGNOF)+#define MINIMAL_TUPLE_PADDING \+ ((offsetof(HeapTupleHeaderData, t_infomask2) - sizeof(uint32)) % MAXIMUM_ALIGNOF)+#define MINIMAL_TUPLE_DATA_OFFSET \+ offsetof(MinimalTupleData, t_infomask2)++struct MinimalTupleData+{+ uint32 t_len; /* actual length of minimal tuple */++ char mt_padding[MINIMAL_TUPLE_PADDING];++ /* Fields below here must match HeapTupleHeaderData! */++ uint16 t_infomask2; /* number of attributes + various flags */++ uint16 t_infomask; /* various flag bits, see below */++ uint8 t_hoff; /* sizeof header incl. bitmap, padding */++ /* ^ - 23 bytes - ^ */++ bits8 t_bits[FLEXIBLE_ARRAY_MEMBER]; /* bitmap of NULLs */++ /* MORE DATA FOLLOWS AT END OF STRUCT */+};++/* typedef appears in htup.h */++#define SizeofMinimalTupleHeader offsetof(MinimalTupleData, t_bits)+++/*+ * GETSTRUCT - given a HeapTuple pointer, return address of the user data+ */+#define GETSTRUCT(TUP) ((char *) ((TUP)->t_data) + (TUP)->t_data->t_hoff)++/*+ * Accessor macros to be used with HeapTuple pointers.+ */++#define HeapTupleHasNulls(tuple) \+ (((tuple)->t_data->t_infomask & HEAP_HASNULL) != 0)++#define HeapTupleNoNulls(tuple) \+ (!((tuple)->t_data->t_infomask & HEAP_HASNULL))++#define HeapTupleHasVarWidth(tuple) \+ (((tuple)->t_data->t_infomask & HEAP_HASVARWIDTH) != 0)++#define HeapTupleAllFixed(tuple) \+ (!((tuple)->t_data->t_infomask & HEAP_HASVARWIDTH))++#define HeapTupleHasExternal(tuple) \+ (((tuple)->t_data->t_infomask & HEAP_HASEXTERNAL) != 0)++#define HeapTupleIsHotUpdated(tuple) \+ HeapTupleHeaderIsHotUpdated((tuple)->t_data)++#define HeapTupleSetHotUpdated(tuple) \+ HeapTupleHeaderSetHotUpdated((tuple)->t_data)++#define HeapTupleClearHotUpdated(tuple) \+ HeapTupleHeaderClearHotUpdated((tuple)->t_data)++#define HeapTupleIsHeapOnly(tuple) \+ HeapTupleHeaderIsHeapOnly((tuple)->t_data)++#define HeapTupleSetHeapOnly(tuple) \+ HeapTupleHeaderSetHeapOnly((tuple)->t_data)++#define HeapTupleClearHeapOnly(tuple) \+ HeapTupleHeaderClearHeapOnly((tuple)->t_data)++#define HeapTupleGetOid(tuple) \+ HeapTupleHeaderGetOid((tuple)->t_data)++#define HeapTupleSetOid(tuple, oid) \+ HeapTupleHeaderSetOid((tuple)->t_data, (oid))+++/* ----------------+ * fastgetattr+ *+ * Fetch a user attribute's value as a Datum (might be either a+ * value, or a pointer into the data area of the tuple).+ *+ * This must not be used when a system attribute might be requested.+ * Furthermore, the passed attnum MUST be valid. Use heap_getattr()+ * instead, if in doubt.+ *+ * This gets called many times, so we macro the cacheable and NULL+ * lookups, and call nocachegetattr() for the rest.+ * ----------------+ */++#if !defined(DISABLE_COMPLEX_MACRO)++#define fastgetattr(tup, attnum, tupleDesc, isnull) \+( \+ AssertMacro((attnum) > 0), \+ (*(isnull) = false), \+ HeapTupleNoNulls(tup) ? \+ ( \+ (tupleDesc)->attrs[(attnum)-1]->attcacheoff >= 0 ? \+ ( \+ fetchatt((tupleDesc)->attrs[(attnum)-1], \+ (char *) (tup)->t_data + (tup)->t_data->t_hoff + \+ (tupleDesc)->attrs[(attnum)-1]->attcacheoff) \+ ) \+ : \+ nocachegetattr((tup), (attnum), (tupleDesc)) \+ ) \+ : \+ ( \+ att_isnull((attnum)-1, (tup)->t_data->t_bits) ? \+ ( \+ (*(isnull) = true), \+ (Datum)NULL \+ ) \+ : \+ ( \+ nocachegetattr((tup), (attnum), (tupleDesc)) \+ ) \+ ) \+)+#else /* defined(DISABLE_COMPLEX_MACRO) */++extern Datum fastgetattr(HeapTuple tup, int attnum, TupleDesc tupleDesc,+ bool *isnull);+#endif /* defined(DISABLE_COMPLEX_MACRO) */+++/* ----------------+ * heap_getattr+ *+ * Extract an attribute of a heap tuple and return it as a Datum.+ * This works for either system or user attributes. The given attnum+ * is properly range-checked.+ *+ * If the field in question has a NULL value, we return a zero Datum+ * and set *isnull == true. Otherwise, we set *isnull == false.+ *+ * <tup> is the pointer to the heap tuple. <attnum> is the attribute+ * number of the column (field) caller wants. <tupleDesc> is a+ * pointer to the structure describing the row and all its fields.+ * ----------------+ */+#define heap_getattr(tup, attnum, tupleDesc, isnull) \+ ( \+ ((attnum) > 0) ? \+ ( \+ ((attnum) > (int) HeapTupleHeaderGetNatts((tup)->t_data)) ? \+ ( \+ (*(isnull) = true), \+ (Datum)NULL \+ ) \+ : \+ fastgetattr((tup), (attnum), (tupleDesc), (isnull)) \+ ) \+ : \+ heap_getsysattr((tup), (attnum), (tupleDesc), (isnull)) \+ )+++/* prototypes for functions in common/heaptuple.c */+extern Size heap_compute_data_size(TupleDesc tupleDesc,+ Datum *values, bool *isnull);+extern void heap_fill_tuple(TupleDesc tupleDesc,+ Datum *values, bool *isnull,+ char *data, Size data_size,+ uint16 *infomask, bits8 *bit);+extern bool heap_attisnull(HeapTuple tup, int attnum);+extern Datum nocachegetattr(HeapTuple tup, int attnum,+ TupleDesc att);+extern Datum heap_getsysattr(HeapTuple tup, int attnum, TupleDesc tupleDesc,+ bool *isnull);+extern HeapTuple heap_copytuple(HeapTuple tuple);+extern void heap_copytuple_with_tuple(HeapTuple src, HeapTuple dest);+extern Datum heap_copy_tuple_as_datum(HeapTuple tuple, TupleDesc tupleDesc);+extern HeapTuple heap_form_tuple(TupleDesc tupleDescriptor,+ Datum *values, bool *isnull);+extern HeapTuple heap_modify_tuple(HeapTuple tuple,+ TupleDesc tupleDesc,+ Datum *replValues,+ bool *replIsnull,+ bool *doReplace);+extern void heap_deform_tuple(HeapTuple tuple, TupleDesc tupleDesc,+ Datum *values, bool *isnull);++/* these three are deprecated versions of the three above: */+extern HeapTuple heap_formtuple(TupleDesc tupleDescriptor,+ Datum *values, char *nulls);+extern HeapTuple heap_modifytuple(HeapTuple tuple,+ TupleDesc tupleDesc,+ Datum *replValues,+ char *replNulls,+ char *replActions);+extern void heap_deformtuple(HeapTuple tuple, TupleDesc tupleDesc,+ Datum *values, char *nulls);+extern void heap_freetuple(HeapTuple htup);+extern MinimalTuple heap_form_minimal_tuple(TupleDesc tupleDescriptor,+ Datum *values, bool *isnull);+extern void heap_free_minimal_tuple(MinimalTuple mtup);+extern MinimalTuple heap_copy_minimal_tuple(MinimalTuple mtup);+extern HeapTuple heap_tuple_from_minimal_tuple(MinimalTuple mtup);+extern MinimalTuple minimal_tuple_from_heap_tuple(HeapTuple htup);++#endif /* HTUP_DETAILS_H */
+ foreign/libpg_query/src/postgres/include/access/itup.h view
@@ -0,0 +1,151 @@+/*-------------------------------------------------------------------------+ *+ * itup.h+ * POSTGRES index tuple definitions.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/access/itup.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef ITUP_H+#define ITUP_H++#include "access/tupdesc.h"+#include "access/tupmacs.h"+#include "storage/bufpage.h"+#include "storage/itemptr.h"++/*+ * Index tuple header structure+ *+ * All index tuples start with IndexTupleData. If the HasNulls bit is set,+ * this is followed by an IndexAttributeBitMapData. The index attribute+ * values follow, beginning at a MAXALIGN boundary.+ *+ * Note that the space allocated for the bitmap does not vary with the number+ * of attributes; that is because we don't have room to store the number of+ * attributes in the header. Given the MAXALIGN constraint there's no space+ * savings to be had anyway, for usual values of INDEX_MAX_KEYS.+ */++typedef struct IndexTupleData+{+ ItemPointerData t_tid; /* reference TID to heap tuple */++ /* ---------------+ * t_info is laid out in the following fashion:+ *+ * 15th (high) bit: has nulls+ * 14th bit: has var-width attributes+ * 13th bit: unused+ * 12-0 bit: size of tuple+ * ---------------+ */++ unsigned short t_info; /* various info about tuple */++} IndexTupleData; /* MORE DATA FOLLOWS AT END OF STRUCT */++typedef IndexTupleData *IndexTuple;++typedef struct IndexAttributeBitMapData+{+ bits8 bits[(INDEX_MAX_KEYS + 8 - 1) / 8];+} IndexAttributeBitMapData;++typedef IndexAttributeBitMapData *IndexAttributeBitMap;++/*+ * t_info manipulation macros+ */+#define INDEX_SIZE_MASK 0x1FFF+/* bit 0x2000 is not used at present */+#define INDEX_VAR_MASK 0x4000+#define INDEX_NULL_MASK 0x8000++#define IndexTupleSize(itup) ((Size) (((IndexTuple) (itup))->t_info & INDEX_SIZE_MASK))+#define IndexTupleDSize(itup) ((Size) ((itup).t_info & INDEX_SIZE_MASK))+#define IndexTupleHasNulls(itup) ((((IndexTuple) (itup))->t_info & INDEX_NULL_MASK))+#define IndexTupleHasVarwidths(itup) ((((IndexTuple) (itup))->t_info & INDEX_VAR_MASK))+++/*+ * Takes an infomask as argument (primarily because this needs to be usable+ * at index_form_tuple time so enough space is allocated).+ */+#define IndexInfoFindDataOffset(t_info) \+( \+ (!((t_info) & INDEX_NULL_MASK)) ? \+ ( \+ (Size)MAXALIGN(sizeof(IndexTupleData)) \+ ) \+ : \+ ( \+ (Size)MAXALIGN(sizeof(IndexTupleData) + sizeof(IndexAttributeBitMapData)) \+ ) \+)++/* ----------------+ * index_getattr+ *+ * This gets called many times, so we macro the cacheable and NULL+ * lookups, and call nocache_index_getattr() for the rest.+ *+ * ----------------+ */+#define index_getattr(tup, attnum, tupleDesc, isnull) \+( \+ AssertMacro(PointerIsValid(isnull) && (attnum) > 0), \+ *(isnull) = false, \+ !IndexTupleHasNulls(tup) ? \+ ( \+ (tupleDesc)->attrs[(attnum)-1]->attcacheoff >= 0 ? \+ ( \+ fetchatt((tupleDesc)->attrs[(attnum)-1], \+ (char *) (tup) + IndexInfoFindDataOffset((tup)->t_info) \+ + (tupleDesc)->attrs[(attnum)-1]->attcacheoff) \+ ) \+ : \+ nocache_index_getattr((tup), (attnum), (tupleDesc)) \+ ) \+ : \+ ( \+ (att_isnull((attnum)-1, (char *)(tup) + sizeof(IndexTupleData))) ? \+ ( \+ *(isnull) = true, \+ (Datum)NULL \+ ) \+ : \+ ( \+ nocache_index_getattr((tup), (attnum), (tupleDesc)) \+ ) \+ ) \+)++/*+ * MaxIndexTuplesPerPage is an upper bound on the number of tuples that can+ * fit on one index page. An index tuple must have either data or a null+ * bitmap, so we can safely assume it's at least 1 byte bigger than a bare+ * IndexTupleData struct. We arrive at the divisor because each tuple+ * must be maxaligned, and it must have an associated item pointer.+ */+#define MinIndexTupleSize MAXALIGN(sizeof(IndexTupleData) + 1)+#define MaxIndexTuplesPerPage \+ ((int) ((BLCKSZ - SizeOfPageHeaderData) / \+ (MAXALIGN(sizeof(IndexTupleData) + 1) + sizeof(ItemIdData))))+++/* routines in indextuple.c */+extern IndexTuple index_form_tuple(TupleDesc tupleDescriptor,+ Datum *values, bool *isnull);+extern Datum nocache_index_getattr(IndexTuple tup, int attnum,+ TupleDesc tupleDesc);+extern void index_deform_tuple(IndexTuple tup, TupleDesc tupleDescriptor,+ Datum *values, bool *isnull);+extern IndexTuple CopyIndexTuple(IndexTuple source);++#endif /* ITUP_H */
+ foreign/libpg_query/src/postgres/include/access/parallel.h view
@@ -0,0 +1,69 @@+/*-------------------------------------------------------------------------+ *+ * parallel.h+ * Infrastructure for launching parallel workers+ *+ * Portions Copyright (c) 1996-2014, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/access/parallel.h+ *+ *-------------------------------------------------------------------------+ */++#ifndef PARALLEL_H+#define PARALLEL_H++#include "access/xlogdefs.h"+#include "lib/ilist.h"+#include "postmaster/bgworker.h"+#include "storage/shm_mq.h"+#include "storage/shm_toc.h"+#include "utils/elog.h"++typedef void (*parallel_worker_main_type) (dsm_segment *seg, shm_toc *toc);++typedef struct ParallelWorkerInfo+{+ BackgroundWorkerHandle *bgwhandle;+ shm_mq_handle *error_mqh;+ int32 pid;+} ParallelWorkerInfo;++typedef struct ParallelContext+{+ dlist_node node;+ SubTransactionId subid;+ int nworkers;+ parallel_worker_main_type entrypoint;+ char *library_name;+ char *function_name;+ ErrorContextCallback *error_context_stack;+ shm_toc_estimator estimator;+ dsm_segment *seg;+ void *private_memory;+ shm_toc *toc;+ ParallelWorkerInfo *worker;+} ParallelContext;++extern bool ParallelMessagePending;+extern int ParallelWorkerNumber;+extern bool InitializingParallelWorker;++#define IsParallelWorker() (ParallelWorkerNumber >= 0)++extern ParallelContext *CreateParallelContext(parallel_worker_main_type entrypoint, int nworkers);+extern ParallelContext *CreateParallelContextForExternalFunction(char *library_name, char *function_name, int nworkers);+extern void InitializeParallelDSM(ParallelContext *);+extern void LaunchParallelWorkers(ParallelContext *);+extern void WaitForParallelWorkersToFinish(ParallelContext *);+extern void DestroyParallelContext(ParallelContext *);+extern bool ParallelContextActive(void);++extern void HandleParallelMessageInterrupt(void);+extern void HandleParallelMessages(void);+extern void AtEOXact_Parallel(bool isCommit);+extern void AtEOSubXact_Parallel(bool isCommit, SubTransactionId mySubId);+extern void ParallelWorkerReportLastRecEnd(XLogRecPtr);++#endif /* PARALLEL_H */
+ foreign/libpg_query/src/postgres/include/access/printtup.h view
@@ -0,0 +1,35 @@+/*-------------------------------------------------------------------------+ *+ * printtup.h+ *+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/access/printtup.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef PRINTTUP_H+#define PRINTTUP_H++#include "utils/portal.h"++extern DestReceiver *printtup_create_DR(CommandDest dest);++extern void SetRemoteDestReceiverParams(DestReceiver *self, Portal portal);++extern void SendRowDescriptionMessage(TupleDesc typeinfo, List *targetlist,+ int16 *formats);++extern void debugStartup(DestReceiver *self, int operation,+ TupleDesc typeinfo);+extern void debugtup(TupleTableSlot *slot, DestReceiver *self);++/* XXX these are really in executor/spi.c */+extern void spi_dest_startup(DestReceiver *self, int operation,+ TupleDesc typeinfo);+extern void spi_printtup(TupleTableSlot *slot, DestReceiver *self);++#endif /* PRINTTUP_H */
+ foreign/libpg_query/src/postgres/include/access/rmgr.h view
@@ -0,0 +1,35 @@+/*+ * rmgr.h+ *+ * Resource managers definition+ *+ * src/include/access/rmgr.h+ */+#ifndef RMGR_H+#define RMGR_H++typedef uint8 RmgrId;++/*+ * Built-in resource managers+ *+ * The actual numerical values for each rmgr ID are defined by the order+ * of entries in rmgrlist.h.+ *+ * Note: RM_MAX_ID must fit in RmgrId; widening that type will affect the XLOG+ * file format.+ */+#define PG_RMGR(symname,name,redo,desc,identify,startup,cleanup) \+ symname,++typedef enum RmgrIds+{+#include "access/rmgrlist.h"+ RM_NEXT_ID+} RmgrIds;++#undef PG_RMGR++#define RM_MAX_ID (RM_NEXT_ID - 1)++#endif /* RMGR_H */
+ foreign/libpg_query/src/postgres/include/access/rmgrlist.h view
@@ -0,0 +1,47 @@+/*---------------------------------------------------------------------------+ * rmgrlist.h+ *+ * The resource manager list is kept in its own source file for possible+ * use by automatic tools. The exact representation of a rmgr is determined+ * by the PG_RMGR macro, which is not defined in this file; it can be+ * defined by the caller for special purposes.+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/access/rmgrlist.h+ *---------------------------------------------------------------------------+ */++/* there is deliberately not an #ifndef RMGRLIST_H here */++/*+ * List of resource manager entries. Note that order of entries defines the+ * numerical values of each rmgr's ID, which is stored in WAL records. New+ * entries should be added at the end, to avoid changing IDs of existing+ * entries.+ *+ * Changes to this list possibly need an XLOG_PAGE_MAGIC bump.+ */++/* symbol name, textual name, redo, desc, identify, startup, cleanup */+PG_RMGR(RM_XLOG_ID, "XLOG", xlog_redo, xlog_desc, xlog_identify, NULL, NULL)+PG_RMGR(RM_XACT_ID, "Transaction", xact_redo, xact_desc, xact_identify, NULL, NULL)+PG_RMGR(RM_SMGR_ID, "Storage", smgr_redo, smgr_desc, smgr_identify, NULL, NULL)+PG_RMGR(RM_CLOG_ID, "CLOG", clog_redo, clog_desc, clog_identify, NULL, NULL)+PG_RMGR(RM_DBASE_ID, "Database", dbase_redo, dbase_desc, dbase_identify, NULL, NULL)+PG_RMGR(RM_TBLSPC_ID, "Tablespace", tblspc_redo, tblspc_desc, tblspc_identify, NULL, NULL)+PG_RMGR(RM_MULTIXACT_ID, "MultiXact", multixact_redo, multixact_desc, multixact_identify, NULL, NULL)+PG_RMGR(RM_RELMAP_ID, "RelMap", relmap_redo, relmap_desc, relmap_identify, NULL, NULL)+PG_RMGR(RM_STANDBY_ID, "Standby", standby_redo, standby_desc, standby_identify, NULL, NULL)+PG_RMGR(RM_HEAP2_ID, "Heap2", heap2_redo, heap2_desc, heap2_identify, NULL, NULL)+PG_RMGR(RM_HEAP_ID, "Heap", heap_redo, heap_desc, heap_identify, NULL, NULL)+PG_RMGR(RM_BTREE_ID, "Btree", btree_redo, btree_desc, btree_identify, NULL, NULL)+PG_RMGR(RM_HASH_ID, "Hash", hash_redo, hash_desc, hash_identify, NULL, NULL)+PG_RMGR(RM_GIN_ID, "Gin", gin_redo, gin_desc, gin_identify, gin_xlog_startup, gin_xlog_cleanup)+PG_RMGR(RM_GIST_ID, "Gist", gist_redo, gist_desc, gist_identify, gist_xlog_startup, gist_xlog_cleanup)+PG_RMGR(RM_SEQ_ID, "Sequence", seq_redo, seq_desc, seq_identify, NULL, NULL)+PG_RMGR(RM_SPGIST_ID, "SPGist", spg_redo, spg_desc, spg_identify, spg_xlog_startup, spg_xlog_cleanup)+PG_RMGR(RM_BRIN_ID, "BRIN", brin_redo, brin_desc, brin_identify, NULL, NULL)+PG_RMGR(RM_COMMIT_TS_ID, "CommitTs", commit_ts_redo, commit_ts_desc, commit_ts_identify, NULL, NULL)+PG_RMGR(RM_REPLORIGIN_ID, "ReplicationOrigin", replorigin_redo, replorigin_desc, replorigin_identify, NULL, NULL)
+ foreign/libpg_query/src/postgres/include/access/sdir.h view
@@ -0,0 +1,58 @@+/*-------------------------------------------------------------------------+ *+ * sdir.h+ * POSTGRES scan direction definitions.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/access/sdir.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef SDIR_H+#define SDIR_H+++/*+ * ScanDirection was an int8 for no apparent reason. I kept the original+ * values because I'm not sure if I'll break anything otherwise. -ay 2/95+ */+typedef enum ScanDirection+{+ BackwardScanDirection = -1,+ NoMovementScanDirection = 0,+ ForwardScanDirection = 1+} ScanDirection;++/*+ * ScanDirectionIsValid+ * True iff scan direction is valid.+ */+#define ScanDirectionIsValid(direction) \+ ((bool) (BackwardScanDirection <= (direction) && \+ (direction) <= ForwardScanDirection))++/*+ * ScanDirectionIsBackward+ * True iff scan direction is backward.+ */+#define ScanDirectionIsBackward(direction) \+ ((bool) ((direction) == BackwardScanDirection))++/*+ * ScanDirectionIsNoMovement+ * True iff scan direction indicates no movement.+ */+#define ScanDirectionIsNoMovement(direction) \+ ((bool) ((direction) == NoMovementScanDirection))++/*+ * ScanDirectionIsForward+ * True iff scan direction is forward.+ */+#define ScanDirectionIsForward(direction) \+ ((bool) ((direction) == ForwardScanDirection))++#endif /* SDIR_H */
+ foreign/libpg_query/src/postgres/include/access/skey.h view
@@ -0,0 +1,152 @@+/*-------------------------------------------------------------------------+ *+ * skey.h+ * POSTGRES scan key definitions.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/access/skey.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef SKEY_H+#define SKEY_H++#include "access/attnum.h"+#include "access/stratnum.h"+#include "fmgr.h"+++/*+ * A ScanKey represents the application of a comparison operator between+ * a table or index column and a constant. When it's part of an array of+ * ScanKeys, the comparison conditions are implicitly ANDed. The index+ * column is the left argument of the operator, if it's a binary operator.+ * (The data structure can support unary indexable operators too; in that+ * case sk_argument would go unused. This is not currently implemented.)+ *+ * For an index scan, sk_strategy and sk_subtype must be set correctly for+ * the operator. When using a ScanKey in a heap scan, these fields are not+ * used and may be set to InvalidStrategy/InvalidOid.+ *+ * If the operator is collation-sensitive, sk_collation must be set+ * correctly as well.+ *+ * A ScanKey can also represent a ScalarArrayOpExpr, that is a condition+ * "column op ANY(ARRAY[...])". This is signaled by the SK_SEARCHARRAY+ * flag bit. The sk_argument is not a value of the operator's right-hand+ * argument type, but rather an array of such values, and the per-element+ * comparisons are to be ORed together.+ *+ * A ScanKey can also represent a condition "column IS NULL" or "column+ * IS NOT NULL"; these cases are signaled by the SK_SEARCHNULL and+ * SK_SEARCHNOTNULL flag bits respectively. The argument is always NULL,+ * and the sk_strategy, sk_subtype, sk_collation, and sk_func fields are+ * not used (unless set by the index AM).+ *+ * SK_SEARCHARRAY, SK_SEARCHNULL and SK_SEARCHNOTNULL are supported only+ * for index scans, not heap scans; and not all index AMs support them,+ * only those that set amsearcharray or amsearchnulls respectively.+ *+ * A ScanKey can also represent an ordering operator invocation, that is+ * an ordering requirement "ORDER BY indexedcol op constant". This looks+ * the same as a comparison operator, except that the operator doesn't+ * (usually) yield boolean. We mark such ScanKeys with SK_ORDER_BY.+ * SK_SEARCHARRAY, SK_SEARCHNULL, SK_SEARCHNOTNULL cannot be used here.+ *+ * Note: in some places, ScanKeys are used as a convenient representation+ * for the invocation of an access method support procedure. In this case+ * sk_strategy/sk_subtype are not meaningful (but sk_collation can be); and+ * sk_func may refer to a function that returns something other than boolean.+ */+typedef struct ScanKeyData+{+ int sk_flags; /* flags, see below */+ AttrNumber sk_attno; /* table or index column number */+ StrategyNumber sk_strategy; /* operator strategy number */+ Oid sk_subtype; /* strategy subtype */+ Oid sk_collation; /* collation to use, if needed */+ FmgrInfo sk_func; /* lookup info for function to call */+ Datum sk_argument; /* data to compare */+} ScanKeyData;++typedef ScanKeyData *ScanKey;++/*+ * About row comparisons:+ *+ * The ScanKey data structure also supports row comparisons, that is ordered+ * tuple comparisons like (x, y) > (c1, c2), having the SQL-spec semantics+ * "x > c1 OR (x = c1 AND y > c2)". Note that this is currently only+ * implemented for btree index searches, not for heapscans or any other index+ * type. A row comparison is represented by a "header" ScanKey entry plus+ * a separate array of ScanKeys, one for each column of the row comparison.+ * The header entry has these properties:+ * sk_flags = SK_ROW_HEADER+ * sk_attno = index column number for leading column of row comparison+ * sk_strategy = btree strategy code for semantics of row comparison+ * (ie, < <= > or >=)+ * sk_subtype, sk_collation, sk_func: not used+ * sk_argument: pointer to subsidiary ScanKey array+ * If the header is part of a ScanKey array that's sorted by attno, it+ * must be sorted according to the leading column number.+ *+ * The subsidiary ScanKey array appears in logical column order of the row+ * comparison, which may be different from index column order. The array+ * elements are like a normal ScanKey array except that:+ * sk_flags must include SK_ROW_MEMBER, plus SK_ROW_END in the last+ * element (needed since row header does not include a count)+ * sk_func points to the btree comparison support function for the+ * opclass, NOT the operator's implementation function.+ * sk_strategy must be the same in all elements of the subsidiary array,+ * that is, the same as in the header entry.+ * SK_SEARCHARRAY, SK_SEARCHNULL, SK_SEARCHNOTNULL cannot be used here.+ */++/*+ * ScanKeyData sk_flags+ *+ * sk_flags bits 0-15 are reserved for system-wide use (symbols for those+ * bits should be defined here). Bits 16-31 are reserved for use within+ * individual index access methods.+ */+#define SK_ISNULL 0x0001 /* sk_argument is NULL */+#define SK_UNARY 0x0002 /* unary operator (not supported!) */+#define SK_ROW_HEADER 0x0004 /* row comparison header (see above) */+#define SK_ROW_MEMBER 0x0008 /* row comparison member (see above) */+#define SK_ROW_END 0x0010 /* last row comparison member */+#define SK_SEARCHARRAY 0x0020 /* scankey represents ScalarArrayOp */+#define SK_SEARCHNULL 0x0040 /* scankey represents "col IS NULL" */+#define SK_SEARCHNOTNULL 0x0080 /* scankey represents "col IS NOT+ * NULL" */+#define SK_ORDER_BY 0x0100 /* scankey is for ORDER BY op */+++/*+ * prototypes for functions in access/common/scankey.c+ */+extern void ScanKeyInit(ScanKey entry,+ AttrNumber attributeNumber,+ StrategyNumber strategy,+ RegProcedure procedure,+ Datum argument);+extern void ScanKeyEntryInitialize(ScanKey entry,+ int flags,+ AttrNumber attributeNumber,+ StrategyNumber strategy,+ Oid subtype,+ Oid collation,+ RegProcedure procedure,+ Datum argument);+extern void ScanKeyEntryInitializeWithInfo(ScanKey entry,+ int flags,+ AttrNumber attributeNumber,+ StrategyNumber strategy,+ Oid subtype,+ Oid collation,+ FmgrInfo *finfo,+ Datum argument);++#endif /* SKEY_H */
+ foreign/libpg_query/src/postgres/include/access/stratnum.h view
@@ -0,0 +1,75 @@+/*-------------------------------------------------------------------------+ *+ * stratnum.h+ * POSTGRES strategy number definitions.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/access/stratnum.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef STRATNUM_H+#define STRATNUM_H++/*+ * Strategy numbers identify the semantics that particular operators have+ * with respect to particular operator classes. In some cases a strategy+ * subtype (an OID) is used as further information.+ */+typedef uint16 StrategyNumber;++#define InvalidStrategy ((StrategyNumber) 0)++/*+ * Strategy numbers for B-tree indexes.+ */+#define BTLessStrategyNumber 1+#define BTLessEqualStrategyNumber 2+#define BTEqualStrategyNumber 3+#define BTGreaterEqualStrategyNumber 4+#define BTGreaterStrategyNumber 5++#define BTMaxStrategyNumber 5+++/*+ * Strategy numbers common to (some) GiST, SP-GiST and BRIN opclasses.+ *+ * The first few of these come from the R-Tree indexing method (hence the+ * names); the others have been added over time as they have been needed.+ */+#define RTLeftStrategyNumber 1 /* for << */+#define RTOverLeftStrategyNumber 2 /* for &< */+#define RTOverlapStrategyNumber 3 /* for && */+#define RTOverRightStrategyNumber 4 /* for &> */+#define RTRightStrategyNumber 5 /* for >> */+#define RTSameStrategyNumber 6 /* for ~= */+#define RTContainsStrategyNumber 7 /* for @> */+#define RTContainedByStrategyNumber 8 /* for <@ */+#define RTOverBelowStrategyNumber 9 /* for &<| */+#define RTBelowStrategyNumber 10 /* for <<| */+#define RTAboveStrategyNumber 11 /* for |>> */+#define RTOverAboveStrategyNumber 12 /* for |&> */+#define RTOldContainsStrategyNumber 13 /* for old spelling of @> */+#define RTOldContainedByStrategyNumber 14 /* for old spelling of <@ */+#define RTKNNSearchStrategyNumber 15 /* for <-> (distance) */+#define RTContainsElemStrategyNumber 16 /* for range types @> elem */+#define RTAdjacentStrategyNumber 17 /* for -|- */+#define RTEqualStrategyNumber 18 /* for = */+#define RTNotEqualStrategyNumber 19 /* for != */+#define RTLessStrategyNumber 20 /* for < */+#define RTLessEqualStrategyNumber 21 /* for <= */+#define RTGreaterStrategyNumber 22 /* for > */+#define RTGreaterEqualStrategyNumber 23 /* for >= */+#define RTSubStrategyNumber 24 /* for inet >> */+#define RTSubEqualStrategyNumber 25 /* for inet <<= */+#define RTSuperStrategyNumber 26 /* for inet << */+#define RTSuperEqualStrategyNumber 27 /* for inet >>= */++#define RTMaxStrategyNumber 27+++#endif /* STRATNUM_H */
+ foreign/libpg_query/src/postgres/include/access/sysattr.h view
@@ -0,0 +1,30 @@+/*-------------------------------------------------------------------------+ *+ * sysattr.h+ * POSTGRES system attribute definitions.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/access/sysattr.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef SYSATTR_H+#define SYSATTR_H+++/*+ * Attribute numbers for the system-defined attributes+ */+#define SelfItemPointerAttributeNumber (-1)+#define ObjectIdAttributeNumber (-2)+#define MinTransactionIdAttributeNumber (-3)+#define MinCommandIdAttributeNumber (-4)+#define MaxTransactionIdAttributeNumber (-5)+#define MaxCommandIdAttributeNumber (-6)+#define TableOidAttributeNumber (-7)+#define FirstLowInvalidHeapAttributeNumber (-8)++#endif /* SYSATTR_H */
+ foreign/libpg_query/src/postgres/include/access/transam.h view
@@ -0,0 +1,179 @@+/*-------------------------------------------------------------------------+ *+ * transam.h+ * postgres transaction access method support code+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/access/transam.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef TRANSAM_H+#define TRANSAM_H++#include "access/xlogdefs.h"+++/* ----------------+ * Special transaction ID values+ *+ * BootstrapTransactionId is the XID for "bootstrap" operations, and+ * FrozenTransactionId is used for very old tuples. Both should+ * always be considered valid.+ *+ * FirstNormalTransactionId is the first "normal" transaction id.+ * Note: if you need to change it, you must change pg_class.h as well.+ * ----------------+ */+#define InvalidTransactionId ((TransactionId) 0)+#define BootstrapTransactionId ((TransactionId) 1)+#define FrozenTransactionId ((TransactionId) 2)+#define FirstNormalTransactionId ((TransactionId) 3)+#define MaxTransactionId ((TransactionId) 0xFFFFFFFF)++/* ----------------+ * transaction ID manipulation macros+ * ----------------+ */+#define TransactionIdIsValid(xid) ((xid) != InvalidTransactionId)+#define TransactionIdIsNormal(xid) ((xid) >= FirstNormalTransactionId)+#define TransactionIdEquals(id1, id2) ((id1) == (id2))+#define TransactionIdStore(xid, dest) (*(dest) = (xid))+#define StoreInvalidTransactionId(dest) (*(dest) = InvalidTransactionId)++/* advance a transaction ID variable, handling wraparound correctly */+#define TransactionIdAdvance(dest) \+ do { \+ (dest)++; \+ if ((dest) < FirstNormalTransactionId) \+ (dest) = FirstNormalTransactionId; \+ } while(0)++/* back up a transaction ID variable, handling wraparound correctly */+#define TransactionIdRetreat(dest) \+ do { \+ (dest)--; \+ } while ((dest) < FirstNormalTransactionId)++/* compare two XIDs already known to be normal; this is a macro for speed */+#define NormalTransactionIdPrecedes(id1, id2) \+ (AssertMacro(TransactionIdIsNormal(id1) && TransactionIdIsNormal(id2)), \+ (int32) ((id1) - (id2)) < 0)++/* compare two XIDs already known to be normal; this is a macro for speed */+#define NormalTransactionIdFollows(id1, id2) \+ (AssertMacro(TransactionIdIsNormal(id1) && TransactionIdIsNormal(id2)), \+ (int32) ((id1) - (id2)) > 0)++/* ----------+ * Object ID (OID) zero is InvalidOid.+ *+ * OIDs 1-9999 are reserved for manual assignment (see the files+ * in src/include/catalog/).+ *+ * OIDS 10000-16383 are reserved for assignment during initdb+ * using the OID generator. (We start the generator at 10000.)+ *+ * OIDs beginning at 16384 are assigned from the OID generator+ * during normal multiuser operation. (We force the generator up to+ * 16384 as soon as we are in normal operation.)+ *+ * The choices of 10000 and 16384 are completely arbitrary, and can be moved+ * if we run low on OIDs in either category. Changing the macros below+ * should be sufficient to do this.+ *+ * NOTE: if the OID generator wraps around, we skip over OIDs 0-16383+ * and resume with 16384. This minimizes the odds of OID conflict, by not+ * reassigning OIDs that might have been assigned during initdb.+ * ----------+ */+#define FirstBootstrapObjectId 10000+#define FirstNormalObjectId 16384++/*+ * VariableCache is a data structure in shared memory that is used to track+ * OID and XID assignment state. For largely historical reasons, there is+ * just one struct with different fields that are protected by different+ * LWLocks.+ *+ * Note: xidWrapLimit and oldestXidDB are not "active" values, but are+ * used just to generate useful messages when xidWarnLimit or xidStopLimit+ * are exceeded.+ */+typedef struct VariableCacheData+{+ /*+ * These fields are protected by OidGenLock.+ */+ Oid nextOid; /* next OID to assign */+ uint32 oidCount; /* OIDs available before must do XLOG work */++ /*+ * These fields are protected by XidGenLock.+ */+ TransactionId nextXid; /* next XID to assign */++ TransactionId oldestXid; /* cluster-wide minimum datfrozenxid */+ TransactionId xidVacLimit; /* start forcing autovacuums here */+ TransactionId xidWarnLimit; /* start complaining here */+ TransactionId xidStopLimit; /* refuse to advance nextXid beyond here */+ TransactionId xidWrapLimit; /* where the world ends */+ Oid oldestXidDB; /* database with minimum datfrozenxid */++ /*+ * These fields are protected by CommitTsLock+ */+ TransactionId oldestCommitTsXid;+ TransactionId newestCommitTsXid;++ /*+ * These fields are protected by ProcArrayLock.+ */+ TransactionId latestCompletedXid; /* newest XID that has committed or+ * aborted */+} VariableCacheData;++typedef VariableCacheData *VariableCache;+++/* ----------------+ * extern declarations+ * ----------------+ */++/* in transam/xact.c */+extern bool TransactionStartedDuringRecovery(void);++/* in transam/varsup.c */+extern PGDLLIMPORT VariableCache ShmemVariableCache;++/*+ * prototypes for functions in transam/transam.c+ */+extern bool TransactionIdDidCommit(TransactionId transactionId);+extern bool TransactionIdDidAbort(TransactionId transactionId);+extern bool TransactionIdIsKnownCompleted(TransactionId transactionId);+extern void TransactionIdAbort(TransactionId transactionId);+extern void TransactionIdCommitTree(TransactionId xid, int nxids, TransactionId *xids);+extern void TransactionIdAsyncCommitTree(TransactionId xid, int nxids, TransactionId *xids, XLogRecPtr lsn);+extern void TransactionIdAbortTree(TransactionId xid, int nxids, TransactionId *xids);+extern bool TransactionIdPrecedes(TransactionId id1, TransactionId id2);+extern bool TransactionIdPrecedesOrEquals(TransactionId id1, TransactionId id2);+extern bool TransactionIdFollows(TransactionId id1, TransactionId id2);+extern bool TransactionIdFollowsOrEquals(TransactionId id1, TransactionId id2);+extern TransactionId TransactionIdLatest(TransactionId mainxid,+ int nxids, const TransactionId *xids);+extern XLogRecPtr TransactionIdGetCommitLSN(TransactionId xid);++/* in transam/varsup.c */+extern TransactionId GetNewTransactionId(bool isSubXact);+extern TransactionId ReadNewTransactionId(void);+extern void SetTransactionIdLimit(TransactionId oldest_datfrozenxid,+ Oid oldest_datoid);+extern bool ForceTransactionIdLimitUpdate(void);+extern Oid GetNewObjectId(void);++#endif /* TRAMSAM_H */
+ foreign/libpg_query/src/postgres/include/access/tupdesc.h view
@@ -0,0 +1,130 @@+/*-------------------------------------------------------------------------+ *+ * tupdesc.h+ * POSTGRES tuple descriptor definitions.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/access/tupdesc.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef TUPDESC_H+#define TUPDESC_H++#include "access/attnum.h"+#include "catalog/pg_attribute.h"+#include "nodes/pg_list.h"+++typedef struct attrDefault+{+ AttrNumber adnum;+ char *adbin; /* nodeToString representation of expr */+} AttrDefault;++typedef struct constrCheck+{+ char *ccname;+ char *ccbin; /* nodeToString representation of expr */+ bool ccvalid;+ bool ccnoinherit; /* this is a non-inheritable constraint */+} ConstrCheck;++/* This structure contains constraints of a tuple */+typedef struct tupleConstr+{+ AttrDefault *defval; /* array */+ ConstrCheck *check; /* array */+ uint16 num_defval;+ uint16 num_check;+ bool has_not_null;+} TupleConstr;++/*+ * This struct is passed around within the backend to describe the structure+ * of tuples. For tuples coming from on-disk relations, the information is+ * collected from the pg_attribute, pg_attrdef, and pg_constraint catalogs.+ * Transient row types (such as the result of a join query) have anonymous+ * TupleDesc structs that generally omit any constraint info; therefore the+ * structure is designed to let the constraints be omitted efficiently.+ *+ * Note that only user attributes, not system attributes, are mentioned in+ * TupleDesc; with the exception that tdhasoid indicates if OID is present.+ *+ * If the tupdesc is known to correspond to a named rowtype (such as a table's+ * rowtype) then tdtypeid identifies that type and tdtypmod is -1. Otherwise+ * tdtypeid is RECORDOID, and tdtypmod can be either -1 for a fully anonymous+ * row type, or a value >= 0 to allow the rowtype to be looked up in the+ * typcache.c type cache.+ *+ * Tuple descriptors that live in caches (relcache or typcache, at present)+ * are reference-counted: they can be deleted when their reference count goes+ * to zero. Tuple descriptors created by the executor need no reference+ * counting, however: they are simply created in the appropriate memory+ * context and go away when the context is freed. We set the tdrefcount+ * field of such a descriptor to -1, while reference-counted descriptors+ * always have tdrefcount >= 0.+ */+typedef struct tupleDesc+{+ int natts; /* number of attributes in the tuple */+ Form_pg_attribute *attrs;+ /* attrs[N] is a pointer to the description of Attribute Number N+1 */+ TupleConstr *constr; /* constraints, or NULL if none */+ Oid tdtypeid; /* composite type ID for tuple type */+ int32 tdtypmod; /* typmod for tuple type */+ bool tdhasoid; /* tuple has oid attribute in its header */+ int tdrefcount; /* reference count, or -1 if not counting */+} *TupleDesc;+++extern TupleDesc CreateTemplateTupleDesc(int natts, bool hasoid);++extern TupleDesc CreateTupleDesc(int natts, bool hasoid,+ Form_pg_attribute *attrs);++extern TupleDesc CreateTupleDescCopy(TupleDesc tupdesc);++extern TupleDesc CreateTupleDescCopyConstr(TupleDesc tupdesc);++extern void TupleDescCopyEntry(TupleDesc dst, AttrNumber dstAttno,+ TupleDesc src, AttrNumber srcAttno);++extern void FreeTupleDesc(TupleDesc tupdesc);++extern void IncrTupleDescRefCount(TupleDesc tupdesc);+extern void DecrTupleDescRefCount(TupleDesc tupdesc);++#define PinTupleDesc(tupdesc) \+ do { \+ if ((tupdesc)->tdrefcount >= 0) \+ IncrTupleDescRefCount(tupdesc); \+ } while (0)++#define ReleaseTupleDesc(tupdesc) \+ do { \+ if ((tupdesc)->tdrefcount >= 0) \+ DecrTupleDescRefCount(tupdesc); \+ } while (0)++extern bool equalTupleDescs(TupleDesc tupdesc1, TupleDesc tupdesc2);++extern void TupleDescInitEntry(TupleDesc desc,+ AttrNumber attributeNumber,+ const char *attributeName,+ Oid oidtypeid,+ int32 typmod,+ int attdim);++extern void TupleDescInitEntryCollation(TupleDesc desc,+ AttrNumber attributeNumber,+ Oid collationid);++extern TupleDesc BuildDescForRelation(List *schema);++extern TupleDesc BuildDescFromLists(List *names, List *types, List *typmods, List *collations);++#endif /* TUPDESC_H */
+ foreign/libpg_query/src/postgres/include/access/tupmacs.h view
@@ -0,0 +1,243 @@+/*-------------------------------------------------------------------------+ *+ * tupmacs.h+ * Tuple macros used by both index tuples and heap tuples.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/access/tupmacs.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef TUPMACS_H+#define TUPMACS_H+++/*+ * check to see if the ATT'th bit of an array of 8-bit bytes is set.+ */+#define att_isnull(ATT, BITS) (!((BITS)[(ATT) >> 3] & (1 << ((ATT) & 0x07))))++/*+ * Given a Form_pg_attribute and a pointer into a tuple's data area,+ * return the correct value or pointer.+ *+ * We return a Datum value in all cases. If the attribute has "byval" false,+ * we return the same pointer into the tuple data area that we're passed.+ * Otherwise, we return the correct number of bytes fetched from the data+ * area and extended to Datum form.+ *+ * On machines where Datum is 8 bytes, we support fetching 8-byte byval+ * attributes; otherwise, only 1, 2, and 4-byte values are supported.+ *+ * Note that T must already be properly aligned for this to work correctly.+ */+#define fetchatt(A,T) fetch_att(T, (A)->attbyval, (A)->attlen)++/*+ * Same, but work from byval/len parameters rather than Form_pg_attribute.+ */+#if SIZEOF_DATUM == 8++#define fetch_att(T,attbyval,attlen) \+( \+ (attbyval) ? \+ ( \+ (attlen) == (int) sizeof(Datum) ? \+ *((Datum *)(T)) \+ : \+ ( \+ (attlen) == (int) sizeof(int32) ? \+ Int32GetDatum(*((int32 *)(T))) \+ : \+ ( \+ (attlen) == (int) sizeof(int16) ? \+ Int16GetDatum(*((int16 *)(T))) \+ : \+ ( \+ AssertMacro((attlen) == 1), \+ CharGetDatum(*((char *)(T))) \+ ) \+ ) \+ ) \+ ) \+ : \+ PointerGetDatum((char *) (T)) \+)+#else /* SIZEOF_DATUM != 8 */++#define fetch_att(T,attbyval,attlen) \+( \+ (attbyval) ? \+ ( \+ (attlen) == (int) sizeof(int32) ? \+ Int32GetDatum(*((int32 *)(T))) \+ : \+ ( \+ (attlen) == (int) sizeof(int16) ? \+ Int16GetDatum(*((int16 *)(T))) \+ : \+ ( \+ AssertMacro((attlen) == 1), \+ CharGetDatum(*((char *)(T))) \+ ) \+ ) \+ ) \+ : \+ PointerGetDatum((char *) (T)) \+)+#endif /* SIZEOF_DATUM == 8 */++/*+ * att_align_datum aligns the given offset as needed for a datum of alignment+ * requirement attalign and typlen attlen. attdatum is the Datum variable+ * we intend to pack into a tuple (it's only accessed if we are dealing with+ * a varlena type). Note that this assumes the Datum will be stored as-is;+ * callers that are intending to convert non-short varlena datums to short+ * format have to account for that themselves.+ */+#define att_align_datum(cur_offset, attalign, attlen, attdatum) \+( \+ ((attlen) == -1 && VARATT_IS_SHORT(DatumGetPointer(attdatum))) ? \+ (uintptr_t) (cur_offset) : \+ att_align_nominal(cur_offset, attalign) \+)++/*+ * att_align_pointer performs the same calculation as att_align_datum,+ * but is used when walking a tuple. attptr is the current actual data+ * pointer; when accessing a varlena field we have to "peek" to see if we+ * are looking at a pad byte or the first byte of a 1-byte-header datum.+ * (A zero byte must be either a pad byte, or the first byte of a correctly+ * aligned 4-byte length word; in either case we can align safely. A non-zero+ * byte must be either a 1-byte length word, or the first byte of a correctly+ * aligned 4-byte length word; in either case we need not align.)+ *+ * Note: some callers pass a "char *" pointer for cur_offset. This is+ * a bit of a hack but should work all right as long as uintptr_t is the+ * correct width.+ */+#define att_align_pointer(cur_offset, attalign, attlen, attptr) \+( \+ ((attlen) == -1 && VARATT_NOT_PAD_BYTE(attptr)) ? \+ (uintptr_t) (cur_offset) : \+ att_align_nominal(cur_offset, attalign) \+)++/*+ * att_align_nominal aligns the given offset as needed for a datum of alignment+ * requirement attalign, ignoring any consideration of packed varlena datums.+ * There are three main use cases for using this macro directly:+ * * we know that the att in question is not varlena (attlen != -1);+ * in this case it is cheaper than the above macros and just as good.+ * * we need to estimate alignment padding cost abstractly, ie without+ * reference to a real tuple. We must assume the worst case that+ * all varlenas are aligned.+ * * within arrays, we unconditionally align varlenas (XXX this should be+ * revisited, probably).+ *+ * The attalign cases are tested in what is hopefully something like their+ * frequency of occurrence.+ */+#define att_align_nominal(cur_offset, attalign) \+( \+ ((attalign) == 'i') ? INTALIGN(cur_offset) : \+ (((attalign) == 'c') ? (uintptr_t) (cur_offset) : \+ (((attalign) == 'd') ? DOUBLEALIGN(cur_offset) : \+ ( \+ AssertMacro((attalign) == 's'), \+ SHORTALIGN(cur_offset) \+ ))) \+)++/*+ * att_addlength_datum increments the given offset by the space needed for+ * the given Datum variable. attdatum is only accessed if we are dealing+ * with a variable-length attribute.+ */+#define att_addlength_datum(cur_offset, attlen, attdatum) \+ att_addlength_pointer(cur_offset, attlen, DatumGetPointer(attdatum))++/*+ * att_addlength_pointer performs the same calculation as att_addlength_datum,+ * but is used when walking a tuple --- attptr is the pointer to the field+ * within the tuple.+ *+ * Note: some callers pass a "char *" pointer for cur_offset. This is+ * actually perfectly OK, but probably should be cleaned up along with+ * the same practice for att_align_pointer.+ */+#define att_addlength_pointer(cur_offset, attlen, attptr) \+( \+ ((attlen) > 0) ? \+ ( \+ (cur_offset) + (attlen) \+ ) \+ : (((attlen) == -1) ? \+ ( \+ (cur_offset) + VARSIZE_ANY(attptr) \+ ) \+ : \+ ( \+ AssertMacro((attlen) == -2), \+ (cur_offset) + (strlen((char *) (attptr)) + 1) \+ )) \+)++/*+ * store_att_byval is a partial inverse of fetch_att: store a given Datum+ * value into a tuple data area at the specified address. However, it only+ * handles the byval case, because in typical usage the caller needs to+ * distinguish by-val and by-ref cases anyway, and so a do-it-all macro+ * wouldn't be convenient.+ */+#if SIZEOF_DATUM == 8++#define store_att_byval(T,newdatum,attlen) \+ do { \+ switch (attlen) \+ { \+ case sizeof(char): \+ *(char *) (T) = DatumGetChar(newdatum); \+ break; \+ case sizeof(int16): \+ *(int16 *) (T) = DatumGetInt16(newdatum); \+ break; \+ case sizeof(int32): \+ *(int32 *) (T) = DatumGetInt32(newdatum); \+ break; \+ case sizeof(Datum): \+ *(Datum *) (T) = (newdatum); \+ break; \+ default: \+ elog(ERROR, "unsupported byval length: %d", \+ (int) (attlen)); \+ break; \+ } \+ } while (0)+#else /* SIZEOF_DATUM != 8 */++#define store_att_byval(T,newdatum,attlen) \+ do { \+ switch (attlen) \+ { \+ case sizeof(char): \+ *(char *) (T) = DatumGetChar(newdatum); \+ break; \+ case sizeof(int16): \+ *(int16 *) (T) = DatumGetInt16(newdatum); \+ break; \+ case sizeof(int32): \+ *(int32 *) (T) = DatumGetInt32(newdatum); \+ break; \+ default: \+ elog(ERROR, "unsupported byval length: %d", \+ (int) (attlen)); \+ break; \+ } \+ } while (0)+#endif /* SIZEOF_DATUM == 8 */++#endif
+ foreign/libpg_query/src/postgres/include/access/twophase.h view
@@ -0,0 +1,59 @@+/*-------------------------------------------------------------------------+ *+ * twophase.h+ * Two-phase-commit related declarations.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/access/twophase.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef TWOPHASE_H+#define TWOPHASE_H++#include "access/xlogdefs.h"+#include "datatype/timestamp.h"+#include "storage/lock.h"++/*+ * GlobalTransactionData is defined in twophase.c; other places have no+ * business knowing the internal definition.+ */+typedef struct GlobalTransactionData *GlobalTransaction;++/* GUC variable */+extern int max_prepared_xacts;++extern Size TwoPhaseShmemSize(void);+extern void TwoPhaseShmemInit(void);++extern void AtAbort_Twophase(void);+extern void PostPrepare_Twophase(void);++extern PGPROC *TwoPhaseGetDummyProc(TransactionId xid);+extern BackendId TwoPhaseGetDummyBackendId(TransactionId xid);++extern GlobalTransaction MarkAsPreparing(TransactionId xid, const char *gid,+ TimestampTz prepared_at,+ Oid owner, Oid databaseid);++extern void StartPrepare(GlobalTransaction gxact);+extern void EndPrepare(GlobalTransaction gxact);+extern bool StandbyTransactionIdIsPrepared(TransactionId xid);++extern TransactionId PrescanPreparedTransactions(TransactionId **xids_p,+ int *nxids_p);+extern void StandbyRecoverPreparedTransactions(bool overwriteOK);+extern void RecoverPreparedTransactions(void);++extern void RecreateTwoPhaseFile(TransactionId xid, void *content, int len);+extern void RemoveTwoPhaseFile(TransactionId xid, bool giveWarning);++extern void CheckPointTwoPhase(XLogRecPtr redo_horizon);++extern void FinishPreparedTransaction(const char *gid, bool isCommit);++#endif /* TWOPHASE_H */
+ foreign/libpg_query/src/postgres/include/access/xact.h view
@@ -0,0 +1,383 @@+/*-------------------------------------------------------------------------+ *+ * xact.h+ * postgres transaction system definitions+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/access/xact.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef XACT_H+#define XACT_H++#include "access/xlogreader.h"+#include "lib/stringinfo.h"+#include "nodes/pg_list.h"+#include "storage/relfilenode.h"+#include "storage/sinval.h"+#include "utils/datetime.h"+++/*+ * Xact isolation levels+ */+#define XACT_READ_UNCOMMITTED 0+#define XACT_READ_COMMITTED 1+#define XACT_REPEATABLE_READ 2+#define XACT_SERIALIZABLE 3++extern int DefaultXactIsoLevel;+extern PGDLLIMPORT int XactIsoLevel;++/*+ * We implement three isolation levels internally.+ * The two stronger ones use one snapshot per database transaction;+ * the others use one snapshot per statement.+ * Serializable uses predicate locks in addition to snapshots.+ * These macros should be used to check which isolation level is selected.+ */+#define IsolationUsesXactSnapshot() (XactIsoLevel >= XACT_REPEATABLE_READ)+#define IsolationIsSerializable() (XactIsoLevel == XACT_SERIALIZABLE)++/* Xact read-only state */+extern bool DefaultXactReadOnly;+extern bool XactReadOnly;++/*+ * Xact is deferrable -- only meaningful (currently) for read only+ * SERIALIZABLE transactions+ */+extern bool DefaultXactDeferrable;+extern bool XactDeferrable;++typedef enum+{+ SYNCHRONOUS_COMMIT_OFF, /* asynchronous commit */+ SYNCHRONOUS_COMMIT_LOCAL_FLUSH, /* wait for local flush only */+ SYNCHRONOUS_COMMIT_REMOTE_WRITE, /* wait for local flush and remote+ * write */+ SYNCHRONOUS_COMMIT_REMOTE_FLUSH /* wait for local and remote flush */+} SyncCommitLevel;++/* Define the default setting for synchonous_commit */+#define SYNCHRONOUS_COMMIT_ON SYNCHRONOUS_COMMIT_REMOTE_FLUSH++/* Synchronous commit level */+extern int synchronous_commit;++/* Kluge for 2PC support */+extern bool MyXactAccessedTempRel;++/*+ * start- and end-of-transaction callbacks for dynamically loaded modules+ */+typedef enum+{+ XACT_EVENT_COMMIT,+ XACT_EVENT_PARALLEL_COMMIT,+ XACT_EVENT_ABORT,+ XACT_EVENT_PARALLEL_ABORT,+ XACT_EVENT_PREPARE,+ XACT_EVENT_PRE_COMMIT,+ XACT_EVENT_PARALLEL_PRE_COMMIT,+ XACT_EVENT_PRE_PREPARE+} XactEvent;++typedef void (*XactCallback) (XactEvent event, void *arg);++typedef enum+{+ SUBXACT_EVENT_START_SUB,+ SUBXACT_EVENT_COMMIT_SUB,+ SUBXACT_EVENT_ABORT_SUB,+ SUBXACT_EVENT_PRE_COMMIT_SUB+} SubXactEvent;++typedef void (*SubXactCallback) (SubXactEvent event, SubTransactionId mySubid,+ SubTransactionId parentSubid, void *arg);+++/* ----------------+ * transaction-related XLOG entries+ * ----------------+ */++/*+ * XLOG allows to store some information in high 4 bits of log record xl_info+ * field. We use 3 for the opcode, and one about an optional flag variable.+ */+#define XLOG_XACT_COMMIT 0x00+#define XLOG_XACT_PREPARE 0x10+#define XLOG_XACT_ABORT 0x20+#define XLOG_XACT_COMMIT_PREPARED 0x30+#define XLOG_XACT_ABORT_PREPARED 0x40+#define XLOG_XACT_ASSIGNMENT 0x50+/* free opcode 0x60 */+/* free opcode 0x70 */++/* mask for filtering opcodes out of xl_info */+#define XLOG_XACT_OPMASK 0x70++/* does this record have a 'xinfo' field or not */+#define XLOG_XACT_HAS_INFO 0x80++/*+ * The following flags, stored in xinfo, determine which information is+ * contained in commit/abort records.+ */+#define XACT_XINFO_HAS_DBINFO (1U << 0)+#define XACT_XINFO_HAS_SUBXACTS (1U << 1)+#define XACT_XINFO_HAS_RELFILENODES (1U << 2)+#define XACT_XINFO_HAS_INVALS (1U << 3)+#define XACT_XINFO_HAS_TWOPHASE (1U << 4)+#define XACT_XINFO_HAS_ORIGIN (1U << 5)++/*+ * Also stored in xinfo, these indicating a variety of additional actions that+ * need to occur when emulating transaction effects during recovery.+ *+ * They are named XactCompletion... to differentiate them from+ * EOXact... routines which run at the end of the original transaction+ * completion.+ */+#define XACT_COMPLETION_UPDATE_RELCACHE_FILE (1U << 30)+#define XACT_COMPLETION_FORCE_SYNC_COMMIT (1U << 31)++/* Access macros for above flags */+#define XactCompletionRelcacheInitFileInval(xinfo) \+ (!!(xinfo & XACT_COMPLETION_UPDATE_RELCACHE_FILE))+#define XactCompletionForceSyncCommit(xinfo) \+ (!!(xinfo & XACT_COMPLETION_FORCE_SYNC_COMMIT))++typedef struct xl_xact_assignment+{+ TransactionId xtop; /* assigned XID's top-level XID */+ int nsubxacts; /* number of subtransaction XIDs */+ TransactionId xsub[FLEXIBLE_ARRAY_MEMBER]; /* assigned subxids */+} xl_xact_assignment;++#define MinSizeOfXactAssignment offsetof(xl_xact_assignment, xsub)++/*+ * Commit and abort records can contain a lot of information. But a large+ * portion of the records won't need all possible pieces of information. So we+ * only include what's needed.+ *+ * A minimal commit/abort record only consists of a xl_xact_commit/abort+ * struct. The presence of additional information is indicated by bits set in+ * 'xl_xact_xinfo->xinfo'. The presence of the xinfo field itself is signalled+ * by a set XLOG_XACT_HAS_INFO bit in the xl_info field.+ *+ * NB: All the individual data chunks should be sized to multiples of+ * sizeof(int) and only require int32 alignment. If they require bigger+ * alignment, they need to be copied upon reading.+ */++/* sub-records for commit/abort */++typedef struct xl_xact_xinfo+{+ /*+ * Even though we right now only require 1 byte of space in xinfo we use+ * four so following records don't have to care about alignment. Commit+ * records can be large, so copying large portions isn't attractive.+ */+ uint32 xinfo;+} xl_xact_xinfo;++typedef struct xl_xact_dbinfo+{+ Oid dbId; /* MyDatabaseId */+ Oid tsId; /* MyDatabaseTableSpace */+} xl_xact_dbinfo;++typedef struct xl_xact_subxacts+{+ int nsubxacts; /* number of subtransaction XIDs */+ TransactionId subxacts[FLEXIBLE_ARRAY_MEMBER];+} xl_xact_subxacts;+#define MinSizeOfXactSubxacts offsetof(xl_xact_subxacts, subxacts)++typedef struct xl_xact_relfilenodes+{+ int nrels; /* number of subtransaction XIDs */+ RelFileNode xnodes[FLEXIBLE_ARRAY_MEMBER];+} xl_xact_relfilenodes;+#define MinSizeOfXactRelfilenodes offsetof(xl_xact_relfilenodes, xnodes)++typedef struct xl_xact_invals+{+ int nmsgs; /* number of shared inval msgs */+ SharedInvalidationMessage msgs[FLEXIBLE_ARRAY_MEMBER];+} xl_xact_invals;+#define MinSizeOfXactInvals offsetof(xl_xact_invals, msgs)++typedef struct xl_xact_twophase+{+ TransactionId xid;+} xl_xact_twophase;+#define MinSizeOfXactInvals offsetof(xl_xact_invals, msgs)++typedef struct xl_xact_origin+{+ XLogRecPtr origin_lsn;+ TimestampTz origin_timestamp;+} xl_xact_origin;++typedef struct xl_xact_commit+{+ TimestampTz xact_time; /* time of commit */++ /* xl_xact_xinfo follows if XLOG_XACT_HAS_INFO */+ /* xl_xact_dbinfo follows if XINFO_HAS_DBINFO */+ /* xl_xact_subxacts follows if XINFO_HAS_SUBXACT */+ /* xl_xact_relfilenodes follows if XINFO_HAS_RELFILENODES */+ /* xl_xact_invals follows if XINFO_HAS_INVALS */+ /* xl_xact_twophase follows if XINFO_HAS_TWOPHASE */+ /* xl_xact_origin follows if XINFO_HAS_ORIGIN, stored unaligned! */+} xl_xact_commit;+#define MinSizeOfXactCommit (offsetof(xl_xact_commit, xact_time) + sizeof(TimestampTz))++typedef struct xl_xact_abort+{+ TimestampTz xact_time; /* time of abort */++ /* xl_xact_xinfo follows if XLOG_XACT_HAS_INFO */+ /* No db_info required */+ /* xl_xact_subxacts follows if HAS_SUBXACT */+ /* xl_xact_relfilenodes follows if HAS_RELFILENODES */+ /* No invalidation messages needed. */+ /* xl_xact_twophase follows if XINFO_HAS_TWOPHASE */+} xl_xact_abort;+#define MinSizeOfXactAbort sizeof(xl_xact_abort)++/*+ * Commit/Abort records in the above form are a bit verbose to parse, so+ * there's a deconstructed versions generated by ParseCommit/AbortRecord() for+ * easier consumption.+ */+typedef struct xl_xact_parsed_commit+{+ TimestampTz xact_time;++ uint32 xinfo;++ Oid dbId; /* MyDatabaseId */+ Oid tsId; /* MyDatabaseTableSpace */++ int nsubxacts;+ TransactionId *subxacts;++ int nrels;+ RelFileNode *xnodes;++ int nmsgs;+ SharedInvalidationMessage *msgs;++ TransactionId twophase_xid; /* only for 2PC */++ XLogRecPtr origin_lsn;+ TimestampTz origin_timestamp;+} xl_xact_parsed_commit;++typedef struct xl_xact_parsed_abort+{+ TimestampTz xact_time;+ uint32 xinfo;++ int nsubxacts;+ TransactionId *subxacts;++ int nrels;+ RelFileNode *xnodes;++ TransactionId twophase_xid; /* only for 2PC */+} xl_xact_parsed_abort;+++/* ----------------+ * extern definitions+ * ----------------+ */+extern bool IsTransactionState(void);+extern bool IsAbortedTransactionBlockState(void);+extern TransactionId GetTopTransactionId(void);+extern TransactionId GetTopTransactionIdIfAny(void);+extern TransactionId GetCurrentTransactionId(void);+extern TransactionId GetCurrentTransactionIdIfAny(void);+extern TransactionId GetStableLatestTransactionId(void);+extern SubTransactionId GetCurrentSubTransactionId(void);+extern void MarkCurrentTransactionIdLoggedIfAny(void);+extern bool SubTransactionIsActive(SubTransactionId subxid);+extern CommandId GetCurrentCommandId(bool used);+extern TimestampTz GetCurrentTransactionStartTimestamp(void);+extern TimestampTz GetCurrentStatementStartTimestamp(void);+extern TimestampTz GetCurrentTransactionStopTimestamp(void);+extern void SetCurrentStatementStartTimestamp(void);+extern int GetCurrentTransactionNestLevel(void);+extern bool TransactionIdIsCurrentTransactionId(TransactionId xid);+extern void CommandCounterIncrement(void);+extern void ForceSyncCommit(void);+extern void StartTransactionCommand(void);+extern void CommitTransactionCommand(void);+extern void AbortCurrentTransaction(void);+extern void BeginTransactionBlock(void);+extern bool EndTransactionBlock(void);+extern bool PrepareTransactionBlock(char *gid);+extern void UserAbortTransactionBlock(void);+extern void ReleaseSavepoint(List *options);+extern void DefineSavepoint(char *name);+extern void RollbackToSavepoint(List *options);+extern void BeginInternalSubTransaction(char *name);+extern void ReleaseCurrentSubTransaction(void);+extern void RollbackAndReleaseCurrentSubTransaction(void);+extern bool IsSubTransaction(void);+extern Size EstimateTransactionStateSpace(void);+extern void SerializeTransactionState(Size maxsize, char *start_address);+extern void StartParallelWorkerTransaction(char *tstatespace);+extern void EndParallelWorkerTransaction(void);+extern bool IsTransactionBlock(void);+extern bool IsTransactionOrTransactionBlock(void);+extern char TransactionBlockStatusCode(void);+extern void AbortOutOfAnyTransaction(void);+extern void PreventTransactionChain(bool isTopLevel, const char *stmtType);+extern void RequireTransactionChain(bool isTopLevel, const char *stmtType);+extern void WarnNoTransactionChain(bool isTopLevel, const char *stmtType);+extern bool IsInTransactionChain(bool isTopLevel);+extern void RegisterXactCallback(XactCallback callback, void *arg);+extern void UnregisterXactCallback(XactCallback callback, void *arg);+extern void RegisterSubXactCallback(SubXactCallback callback, void *arg);+extern void UnregisterSubXactCallback(SubXactCallback callback, void *arg);++extern int xactGetCommittedChildren(TransactionId **ptr);++extern XLogRecPtr XactLogCommitRecord(TimestampTz commit_time,+ int nsubxacts, TransactionId *subxacts,+ int nrels, RelFileNode *rels,+ int nmsgs, SharedInvalidationMessage *msgs,+ bool relcacheInval, bool forceSync,+ TransactionId twophase_xid);++extern XLogRecPtr XactLogAbortRecord(TimestampTz abort_time,+ int nsubxacts, TransactionId *subxacts,+ int nrels, RelFileNode *rels,+ TransactionId twophase_xid);+extern void xact_redo(XLogReaderState *record);++/* xactdesc.c */+extern void xact_desc(StringInfo buf, XLogReaderState *record);+extern const char *xact_identify(uint8 info);++/* also in xactdesc.c, so they can be shared between front/backend code */+extern void ParseCommitRecord(uint8 info, xl_xact_commit *xlrec, xl_xact_parsed_commit *parsed);+extern void ParseAbortRecord(uint8 info, xl_xact_abort *xlrec, xl_xact_parsed_abort *parsed);++extern void EnterParallelMode(void);+extern void ExitParallelMode(void);+extern bool IsInParallelMode(void);++#endif /* XACT_H */
+ foreign/libpg_query/src/postgres/include/access/xlog.h view
@@ -0,0 +1,291 @@+/*+ * xlog.h+ *+ * PostgreSQL transaction log manager+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/access/xlog.h+ */+#ifndef XLOG_H+#define XLOG_H++#include "access/rmgr.h"+#include "access/xlogdefs.h"+#include "access/xloginsert.h"+#include "access/xlogreader.h"+#include "datatype/timestamp.h"+#include "lib/stringinfo.h"+#include "nodes/pg_list.h"+#include "storage/fd.h"+++/* Sync methods */+#define SYNC_METHOD_FSYNC 0+#define SYNC_METHOD_FDATASYNC 1+#define SYNC_METHOD_OPEN 2 /* for O_SYNC */+#define SYNC_METHOD_FSYNC_WRITETHROUGH 3+#define SYNC_METHOD_OPEN_DSYNC 4 /* for O_DSYNC */+extern int sync_method;++extern PGDLLIMPORT TimeLineID ThisTimeLineID; /* current TLI */++/*+ * Prior to 8.4, all activity during recovery was carried out by the startup+ * process. This local variable continues to be used in many parts of the+ * code to indicate actions taken by RecoveryManagers. Other processes that+ * potentially perform work during recovery should check RecoveryInProgress().+ * See XLogCtl notes in xlog.c.+ */+extern bool InRecovery;++/*+ * Like InRecovery, standbyState is only valid in the startup process.+ * In all other processes it will have the value STANDBY_DISABLED (so+ * InHotStandby will read as FALSE).+ *+ * In DISABLED state, we're performing crash recovery or hot standby was+ * disabled in postgresql.conf.+ *+ * In INITIALIZED state, we've run InitRecoveryTransactionEnvironment, but+ * we haven't yet processed a RUNNING_XACTS or shutdown-checkpoint WAL record+ * to initialize our master-transaction tracking system.+ *+ * When the transaction tracking is initialized, we enter the SNAPSHOT_PENDING+ * state. The tracked information might still be incomplete, so we can't allow+ * connections yet, but redo functions must update the in-memory state when+ * appropriate.+ *+ * In SNAPSHOT_READY mode, we have full knowledge of transactions that are+ * (or were) running in the master at the current WAL location. Snapshots+ * can be taken, and read-only queries can be run.+ */+typedef enum+{+ STANDBY_DISABLED,+ STANDBY_INITIALIZED,+ STANDBY_SNAPSHOT_PENDING,+ STANDBY_SNAPSHOT_READY+} HotStandbyState;++extern HotStandbyState standbyState;++#define InHotStandby (standbyState >= STANDBY_SNAPSHOT_PENDING)++/*+ * Recovery target type.+ * Only set during a Point in Time recovery, not when standby_mode = on+ */+typedef enum+{+ RECOVERY_TARGET_UNSET,+ RECOVERY_TARGET_XID,+ RECOVERY_TARGET_TIME,+ RECOVERY_TARGET_NAME,+ RECOVERY_TARGET_IMMEDIATE+} RecoveryTargetType;++extern XLogRecPtr XactLastRecEnd;+extern PGDLLIMPORT XLogRecPtr XactLastCommitEnd;++extern bool reachedConsistency;++/* these variables are GUC parameters related to XLOG */+extern int min_wal_size;+extern int max_wal_size;+extern int wal_keep_segments;+extern int XLOGbuffers;+extern int XLogArchiveTimeout;+extern int wal_retrieve_retry_interval;+extern char *XLogArchiveCommand;+extern bool EnableHotStandby;+extern bool fullPageWrites;+extern bool wal_log_hints;+extern bool wal_compression;+extern bool log_checkpoints;++extern int CheckPointSegments;++/* Archive modes */+typedef enum ArchiveMode+{+ ARCHIVE_MODE_OFF = 0, /* disabled */+ ARCHIVE_MODE_ON, /* enabled while server is running normally */+ ARCHIVE_MODE_ALWAYS /* enabled always (even during recovery) */+} ArchiveMode;+extern int XLogArchiveMode;++/* WAL levels */+typedef enum WalLevel+{+ WAL_LEVEL_MINIMAL = 0,+ WAL_LEVEL_ARCHIVE,+ WAL_LEVEL_HOT_STANDBY,+ WAL_LEVEL_LOGICAL+} WalLevel;+extern int wal_level;++/* Is WAL archiving enabled (always or only while server is running normally)? */+#define XLogArchivingActive() \+ (XLogArchiveMode > ARCHIVE_MODE_OFF && wal_level >= WAL_LEVEL_ARCHIVE)+/* Is WAL archiving enabled always (even during recovery)? */+#define XLogArchivingAlways() \+ (XLogArchiveMode == ARCHIVE_MODE_ALWAYS && wal_level >= WAL_LEVEL_ARCHIVE)+#define XLogArchiveCommandSet() (XLogArchiveCommand[0] != '\0')++/*+ * Is WAL-logging necessary for archival or log-shipping, or can we skip+ * WAL-logging if we fsync() the data before committing instead?+ */+#define XLogIsNeeded() (wal_level >= WAL_LEVEL_ARCHIVE)++/*+ * Is a full-page image needed for hint bit updates?+ *+ * Normally, we don't WAL-log hint bit updates, but if checksums are enabled,+ * we have to protect them against torn page writes. When you only set+ * individual bits on a page, it's still consistent no matter what combination+ * of the bits make it to disk, but the checksum wouldn't match. Also WAL-log+ * them if forced by wal_log_hints=on.+ */+#define XLogHintBitIsNeeded() (DataChecksumsEnabled() || wal_log_hints)++/* Do we need to WAL-log information required only for Hot Standby and logical replication? */+#define XLogStandbyInfoActive() (wal_level >= WAL_LEVEL_HOT_STANDBY)++/* Do we need to WAL-log information required only for logical replication? */+#define XLogLogicalInfoActive() (wal_level >= WAL_LEVEL_LOGICAL)++#ifdef WAL_DEBUG+extern bool XLOG_DEBUG;+#endif++/*+ * OR-able request flag bits for checkpoints. The "cause" bits are used only+ * for logging purposes. Note: the flags must be defined so that it's+ * sensible to OR together request flags arising from different requestors.+ */++/* These directly affect the behavior of CreateCheckPoint and subsidiaries */+#define CHECKPOINT_IS_SHUTDOWN 0x0001 /* Checkpoint is for shutdown */+#define CHECKPOINT_END_OF_RECOVERY 0x0002 /* Like shutdown checkpoint,+ * but issued at end of WAL+ * recovery */+#define CHECKPOINT_IMMEDIATE 0x0004 /* Do it without delays */+#define CHECKPOINT_FORCE 0x0008 /* Force even if no activity */+#define CHECKPOINT_FLUSH_ALL 0x0010 /* Flush all pages, including those+ * belonging to unlogged tables */+/* These are important to RequestCheckpoint */+#define CHECKPOINT_WAIT 0x0020 /* Wait for completion */+/* These indicate the cause of a checkpoint request */+#define CHECKPOINT_CAUSE_XLOG 0x0040 /* XLOG consumption */+#define CHECKPOINT_CAUSE_TIME 0x0080 /* Elapsed time */++/* Checkpoint statistics */+typedef struct CheckpointStatsData+{+ TimestampTz ckpt_start_t; /* start of checkpoint */+ TimestampTz ckpt_write_t; /* start of flushing buffers */+ TimestampTz ckpt_sync_t; /* start of fsyncs */+ TimestampTz ckpt_sync_end_t; /* end of fsyncs */+ TimestampTz ckpt_end_t; /* end of checkpoint */++ int ckpt_bufs_written; /* # of buffers written */++ int ckpt_segs_added; /* # of new xlog segments created */+ int ckpt_segs_removed; /* # of xlog segments deleted */+ int ckpt_segs_recycled; /* # of xlog segments recycled */++ int ckpt_sync_rels; /* # of relations synced */+ uint64 ckpt_longest_sync; /* Longest sync for one relation */+ uint64 ckpt_agg_sync_time; /* The sum of all the individual sync+ * times, which is not necessarily the+ * same as the total elapsed time for+ * the entire sync phase. */+} CheckpointStatsData;++extern CheckpointStatsData CheckpointStats;++struct XLogRecData;++extern XLogRecPtr XLogInsertRecord(struct XLogRecData *rdata, XLogRecPtr fpw_lsn);+extern void XLogFlush(XLogRecPtr RecPtr);+extern bool XLogBackgroundFlush(void);+extern bool XLogNeedsFlush(XLogRecPtr RecPtr);+extern int XLogFileInit(XLogSegNo segno, bool *use_existent, bool use_lock);+extern int XLogFileOpen(XLogSegNo segno);++extern void CheckXLogRemoved(XLogSegNo segno, TimeLineID tli);+extern XLogSegNo XLogGetLastRemovedSegno(void);+extern void XLogSetAsyncXactLSN(XLogRecPtr record);+extern void XLogSetReplicationSlotMinimumLSN(XLogRecPtr lsn);++extern void xlog_redo(XLogReaderState *record);+extern void xlog_desc(StringInfo buf, XLogReaderState *record);+extern const char *xlog_identify(uint8 info);++extern void issue_xlog_fsync(int fd, XLogSegNo segno);++extern bool RecoveryInProgress(void);+extern bool HotStandbyActive(void);+extern bool HotStandbyActiveInReplay(void);+extern bool XLogInsertAllowed(void);+extern void GetXLogReceiptTime(TimestampTz *rtime, bool *fromStream);+extern XLogRecPtr GetXLogReplayRecPtr(TimeLineID *replayTLI);+extern XLogRecPtr GetXLogInsertRecPtr(void);+extern XLogRecPtr GetXLogWriteRecPtr(void);+extern bool RecoveryIsPaused(void);+extern void SetRecoveryPause(bool recoveryPause);+extern TimestampTz GetLatestXTime(void);+extern TimestampTz GetCurrentChunkReplayStartTime(void);+extern char *XLogFileNameP(TimeLineID tli, XLogSegNo segno);++extern void UpdateControlFile(void);+extern uint64 GetSystemIdentifier(void);+extern bool DataChecksumsEnabled(void);+extern XLogRecPtr GetFakeLSNForUnloggedRel(void);+extern Size XLOGShmemSize(void);+extern void XLOGShmemInit(void);+extern void BootStrapXLOG(void);+extern void StartupXLOG(void);+extern void ShutdownXLOG(int code, Datum arg);+extern void InitXLOGAccess(void);+extern void CreateCheckPoint(int flags);+extern bool CreateRestartPoint(int flags);+extern void XLogPutNextOid(Oid nextOid);+extern XLogRecPtr XLogRestorePoint(const char *rpName);+extern void UpdateFullPageWrites(void);+extern void GetFullPageWriteInfo(XLogRecPtr *RedoRecPtr_p, bool *doPageWrites_p);+extern XLogRecPtr GetRedoRecPtr(void);+extern XLogRecPtr GetInsertRecPtr(void);+extern XLogRecPtr GetFlushRecPtr(void);+extern void GetNextXidAndEpoch(TransactionId *xid, uint32 *epoch);+extern void RemovePromoteSignalFiles(void);++extern bool CheckPromoteSignal(void);+extern void WakeupRecovery(void);+extern void SetWalWriterSleeping(bool sleeping);++extern void assign_max_wal_size(int newval, void *extra);+extern void assign_checkpoint_completion_target(double newval, void *extra);++/*+ * Starting/stopping a base backup+ */+extern XLogRecPtr do_pg_start_backup(const char *backupidstr, bool fast,+ TimeLineID *starttli_p, char **labelfile, DIR *tblspcdir,+ List **tablespaces, char **tblspcmapfile, bool infotbssize,+ bool needtblspcmapfile);+extern XLogRecPtr do_pg_stop_backup(char *labelfile, bool waitforarchive,+ TimeLineID *stoptli_p);+extern void do_pg_abort_backup(void);++/* File path names (all relative to $PGDATA) */+#define BACKUP_LABEL_FILE "backup_label"+#define BACKUP_LABEL_OLD "backup_label.old"++#define TABLESPACE_MAP "tablespace_map"+#define TABLESPACE_MAP_OLD "tablespace_map.old"++#endif /* XLOG_H */
+ foreign/libpg_query/src/postgres/include/access/xlogdefs.h view
@@ -0,0 +1,102 @@+/*+ * xlogdefs.h+ *+ * Postgres transaction log manager record pointer and+ * timeline number definitions+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/access/xlogdefs.h+ */+#ifndef XLOG_DEFS_H+#define XLOG_DEFS_H++#include <fcntl.h> /* need open() flags */++/*+ * Pointer to a location in the XLOG. These pointers are 64 bits wide,+ * because we don't want them ever to overflow.+ */+typedef uint64 XLogRecPtr;++/*+ * Zero is used indicate an invalid pointer. Bootstrap skips the first possible+ * WAL segment, initializing the first WAL page at XLOG_SEG_SIZE, so no XLOG+ * record can begin at zero.+ */+#define InvalidXLogRecPtr 0+#define XLogRecPtrIsInvalid(r) ((r) == InvalidXLogRecPtr)++/*+ * XLogSegNo - physical log file sequence number.+ */+typedef uint64 XLogSegNo;++/*+ * TimeLineID (TLI) - identifies different database histories to prevent+ * confusion after restoring a prior state of a database installation.+ * TLI does not change in a normal stop/restart of the database (including+ * crash-and-recover cases); but we must assign a new TLI after doing+ * a recovery to a prior state, a/k/a point-in-time recovery. This makes+ * the new WAL logfile sequence we generate distinguishable from the+ * sequence that was generated in the previous incarnation.+ */+typedef uint32 TimeLineID;++/*+ * Replication origin id - this is located in this file to avoid having to+ * include origin.h in a bunch of xlog related places.+ */+typedef uint16 RepOriginId;++/*+ * Because O_DIRECT bypasses the kernel buffers, and because we never+ * read those buffers except during crash recovery or if wal_level != minimal,+ * it is a win to use it in all cases where we sync on each write(). We could+ * allow O_DIRECT with fsync(), but it is unclear if fsync() could process+ * writes not buffered in the kernel. Also, O_DIRECT is never enough to force+ * data to the drives, it merely tries to bypass the kernel cache, so we still+ * need O_SYNC/O_DSYNC.+ */+#ifdef O_DIRECT+#define PG_O_DIRECT O_DIRECT+#else+#define PG_O_DIRECT 0+#endif++/*+ * This chunk of hackery attempts to determine which file sync methods+ * are available on the current platform, and to choose an appropriate+ * default method. We assume that fsync() is always available, and that+ * configure determined whether fdatasync() is.+ */+#if defined(O_SYNC)+#define OPEN_SYNC_FLAG O_SYNC+#elif defined(O_FSYNC)+#define OPEN_SYNC_FLAG O_FSYNC+#endif++#if defined(O_DSYNC)+#if defined(OPEN_SYNC_FLAG)+/* O_DSYNC is distinct? */+#if O_DSYNC != OPEN_SYNC_FLAG+#define OPEN_DATASYNC_FLAG O_DSYNC+#endif+#else /* !defined(OPEN_SYNC_FLAG) */+/* Win32 only has O_DSYNC */+#define OPEN_DATASYNC_FLAG O_DSYNC+#endif+#endif++#if defined(PLATFORM_DEFAULT_SYNC_METHOD)+#define DEFAULT_SYNC_METHOD PLATFORM_DEFAULT_SYNC_METHOD+#elif defined(OPEN_DATASYNC_FLAG)+#define DEFAULT_SYNC_METHOD SYNC_METHOD_OPEN_DSYNC+#elif defined(HAVE_FDATASYNC)+#define DEFAULT_SYNC_METHOD SYNC_METHOD_FDATASYNC+#else+#define DEFAULT_SYNC_METHOD SYNC_METHOD_FSYNC+#endif++#endif /* XLOG_DEFS_H */
+ foreign/libpg_query/src/postgres/include/access/xloginsert.h view
@@ -0,0 +1,62 @@+/*+ * xloginsert.h+ *+ * Functions for generating WAL records+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/access/xloginsert.h+ */+#ifndef XLOGINSERT_H+#define XLOGINSERT_H++#include "access/rmgr.h"+#include "access/xlogdefs.h"+#include "storage/block.h"+#include "storage/buf.h"+#include "storage/relfilenode.h"++/*+ * The minimum size of the WAL construction working area. If you need to+ * register more than XLR_NORMAL_MAX_BLOCK_ID block references or have more+ * than XLR_NORMAL_RDATAS data chunks in a single WAL record, you must call+ * XLogEnsureRecordSpace() first to allocate more working memory.+ */+#define XLR_NORMAL_MAX_BLOCK_ID 4+#define XLR_NORMAL_RDATAS 20++/* flags for XLogRegisterBuffer */+#define REGBUF_FORCE_IMAGE 0x01 /* force a full-page image */+#define REGBUF_NO_IMAGE 0x02 /* don't take a full-page image */+#define REGBUF_WILL_INIT (0x04 | 0x02) /* page will be re-initialized+ * at replay (implies+ * NO_IMAGE) */+#define REGBUF_STANDARD 0x08/* page follows "standard" page layout, (data+ * between pd_lower and pd_upper will be+ * skipped) */+#define REGBUF_KEEP_DATA 0x10/* include data even if a full-page image is+ * taken */++/* prototypes for public functions in xloginsert.c: */+extern void XLogBeginInsert(void);+extern void XLogIncludeOrigin(void);+extern XLogRecPtr XLogInsert(RmgrId rmid, uint8 info);+extern void XLogEnsureRecordSpace(int nbuffers, int ndatas);+extern void XLogRegisterData(char *data, int len);+extern void XLogRegisterBuffer(uint8 block_id, Buffer buffer, uint8 flags);+extern void XLogRegisterBlock(uint8 block_id, RelFileNode *rnode,+ ForkNumber forknum, BlockNumber blknum, char *page,+ uint8 flags);+extern void XLogRegisterBufData(uint8 block_id, char *data, int len);+extern void XLogResetInsertion(void);+extern bool XLogCheckBufferNeedsBackup(Buffer buffer);++extern XLogRecPtr log_newpage(RelFileNode *rnode, ForkNumber forkNum,+ BlockNumber blk, char *page, bool page_std);+extern XLogRecPtr log_newpage_buffer(Buffer buffer, bool page_std);+extern XLogRecPtr XLogSaveBufferForHint(Buffer buffer, bool buffer_std);++extern void InitXLogInsert(void);++#endif /* XLOGINSERT_H */
+ foreign/libpg_query/src/postgres/include/access/xlogreader.h view
@@ -0,0 +1,206 @@+/*-------------------------------------------------------------------------+ *+ * xlogreader.h+ * Definitions for the generic XLog reading facility+ *+ * Portions Copyright (c) 2013-2015, PostgreSQL Global Development Group+ *+ * IDENTIFICATION+ * src/include/access/xlogreader.h+ *+ * NOTES+ * See the definition of the XLogReaderState struct for instructions on+ * how to use the XLogReader infrastructure.+ *+ * The basic idea is to allocate an XLogReaderState via+ * XLogReaderAllocate(), and call XLogReadRecord() until it returns NULL.+ *+ * After reading a record with XLogReadRecord(), it's decomposed into+ * the per-block and main data parts, and the parts can be accessed+ * with the XLogRec* macros and functions. You can also decode a+ * record that's already constructed in memory, without reading from+ * disk, by calling the DecodeXLogRecord() function.+ *-------------------------------------------------------------------------+ */+#ifndef XLOGREADER_H+#define XLOGREADER_H++#include "access/xlogrecord.h"++typedef struct XLogReaderState XLogReaderState;++/* Function type definition for the read_page callback */+typedef int (*XLogPageReadCB) (XLogReaderState *xlogreader,+ XLogRecPtr targetPagePtr,+ int reqLen,+ XLogRecPtr targetRecPtr,+ char *readBuf,+ TimeLineID *pageTLI);++typedef struct+{+ /* Is this block ref in use? */+ bool in_use;++ /* Identify the block this refers to */+ RelFileNode rnode;+ ForkNumber forknum;+ BlockNumber blkno;++ /* copy of the fork_flags field from the XLogRecordBlockHeader */+ uint8 flags;++ /* Information on full-page image, if any */+ bool has_image;+ char *bkp_image;+ uint16 hole_offset;+ uint16 hole_length;+ uint16 bimg_len;+ uint8 bimg_info;++ /* Buffer holding the rmgr-specific data associated with this block */+ bool has_data;+ char *data;+ uint16 data_len;+ uint16 data_bufsz;+} DecodedBkpBlock;++struct XLogReaderState+{+ /* ----------------------------------------+ * Public parameters+ * ----------------------------------------+ */++ /*+ * Data input callback (mandatory).+ *+ * This callback shall read at least reqLen valid bytes of the xlog page+ * starting at targetPagePtr, and store them in readBuf. The callback+ * shall return the number of bytes read (never more than XLOG_BLCKSZ), or+ * -1 on failure. The callback shall sleep, if necessary, to wait for the+ * requested bytes to become available. The callback will not be invoked+ * again for the same page unless more than the returned number of bytes+ * are needed.+ *+ * targetRecPtr is the position of the WAL record we're reading. Usually+ * it is equal to targetPagePtr + reqLen, but sometimes xlogreader needs+ * to read and verify the page or segment header, before it reads the+ * actual WAL record it's interested in. In that case, targetRecPtr can+ * be used to determine which timeline to read the page from.+ *+ * The callback shall set *pageTLI to the TLI of the file the page was+ * read from. It is currently used only for error reporting purposes, to+ * reconstruct the name of the WAL file where an error occurred.+ */+ XLogPageReadCB read_page;++ /*+ * System identifier of the xlog files we're about to read. Set to zero+ * (the default value) if unknown or unimportant.+ */+ uint64 system_identifier;++ /*+ * Opaque data for callbacks to use. Not used by XLogReader.+ */+ void *private_data;++ /*+ * Start and end point of last record read. EndRecPtr is also used as the+ * position to read next, if XLogReadRecord receives an invalid recptr.+ */+ XLogRecPtr ReadRecPtr; /* start of last record read */+ XLogRecPtr EndRecPtr; /* end+1 of last record read */+++ /* ----------------------------------------+ * Decoded representation of current record+ *+ * Use XLogRecGet* functions to investigate the record; these fields+ * should not be accessed directly.+ * ----------------------------------------+ */+ XLogRecord *decoded_record; /* currently decoded record */++ char *main_data; /* record's main data portion */+ uint32 main_data_len; /* main data portion's length */+ uint32 main_data_bufsz; /* allocated size of the buffer */++ RepOriginId record_origin;++ /* information about blocks referenced by the record. */+ DecodedBkpBlock blocks[XLR_MAX_BLOCK_ID + 1];++ int max_block_id; /* highest block_id in use (-1 if none) */++ /* ----------------------------------------+ * private/internal state+ * ----------------------------------------+ */++ /* Buffer for currently read page (XLOG_BLCKSZ bytes) */+ char *readBuf;++ /* last read segment, segment offset, read length, TLI */+ XLogSegNo readSegNo;+ uint32 readOff;+ uint32 readLen;+ TimeLineID readPageTLI;++ /* beginning of last page read, and its TLI */+ XLogRecPtr latestPagePtr;+ TimeLineID latestPageTLI;++ /* beginning of the WAL record being read. */+ XLogRecPtr currRecPtr;++ /* Buffer for current ReadRecord result (expandable) */+ char *readRecordBuf;+ uint32 readRecordBufSize;++ /* Buffer to hold error message */+ char *errormsg_buf;+};++/* Get a new XLogReader */+extern XLogReaderState *XLogReaderAllocate(XLogPageReadCB pagereadfunc,+ void *private_data);++/* Free an XLogReader */+extern void XLogReaderFree(XLogReaderState *state);++/* Read the next XLog record. Returns NULL on end-of-WAL or failure */+extern struct XLogRecord *XLogReadRecord(XLogReaderState *state,+ XLogRecPtr recptr, char **errormsg);++#ifdef FRONTEND+extern XLogRecPtr XLogFindNextRecord(XLogReaderState *state, XLogRecPtr RecPtr);+#endif /* FRONTEND */++/* Functions for decoding an XLogRecord */++extern bool DecodeXLogRecord(XLogReaderState *state, XLogRecord *record,+ char **errmsg);++#define XLogRecGetTotalLen(decoder) ((decoder)->decoded_record->xl_tot_len)+#define XLogRecGetPrev(decoder) ((decoder)->decoded_record->xl_prev)+#define XLogRecGetInfo(decoder) ((decoder)->decoded_record->xl_info)+#define XLogRecGetRmid(decoder) ((decoder)->decoded_record->xl_rmid)+#define XLogRecGetXid(decoder) ((decoder)->decoded_record->xl_xid)+#define XLogRecGetOrigin(decoder) ((decoder)->record_origin)+#define XLogRecGetData(decoder) ((decoder)->main_data)+#define XLogRecGetDataLen(decoder) ((decoder)->main_data_len)+#define XLogRecHasAnyBlockRefs(decoder) ((decoder)->max_block_id >= 0)+#define XLogRecHasBlockRef(decoder, block_id) \+ ((decoder)->blocks[block_id].in_use)+#define XLogRecHasBlockImage(decoder, block_id) \+ ((decoder)->blocks[block_id].has_image)++extern bool RestoreBlockImage(XLogReaderState *recoder, uint8 block_id, char *dst);+extern char *XLogRecGetBlockData(XLogReaderState *record, uint8 block_id, Size *len);+extern bool XLogRecGetBlockTag(XLogReaderState *record, uint8 block_id,+ RelFileNode *rnode, ForkNumber *forknum,+ BlockNumber *blknum);++#endif /* XLOGREADER_H */
+ foreign/libpg_query/src/postgres/include/access/xlogrecord.h view
@@ -0,0 +1,217 @@+/*+ * xlogrecord.h+ *+ * Definitions for the WAL record format.+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/access/xlogrecord.h+ */+#ifndef XLOGRECORD_H+#define XLOGRECORD_H++#include "access/rmgr.h"+#include "access/xlogdefs.h"+#include "port/pg_crc32c.h"+#include "storage/block.h"+#include "storage/relfilenode.h"++/*+ * The overall layout of an XLOG record is:+ * Fixed-size header (XLogRecord struct)+ * XLogRecordBlockHeader struct+ * XLogRecordBlockHeader struct+ * ...+ * XLogRecordDataHeader[Short|Long] struct+ * block data+ * block data+ * ...+ * main data+ *+ * There can be zero or more XLogRecordBlockHeaders, and 0 or more bytes of+ * rmgr-specific data not associated with a block. XLogRecord structs+ * always start on MAXALIGN boundaries in the WAL files, but the rest of+ * the fields are not aligned.+ *+ * The XLogRecordBlockHeader, XLogRecordDataHeaderShort and+ * XLogRecordDataHeaderLong structs all begin with a single 'id' byte. It's+ * used to distinguish between block references, and the main data structs.+ */+typedef struct XLogRecord+{+ uint32 xl_tot_len; /* total len of entire record */+ TransactionId xl_xid; /* xact id */+ XLogRecPtr xl_prev; /* ptr to previous record in log */+ uint8 xl_info; /* flag bits, see below */+ RmgrId xl_rmid; /* resource manager for this record */+ /* 2 bytes of padding here, initialize to zero */+ pg_crc32c xl_crc; /* CRC for this record */++ /* XLogRecordBlockHeaders and XLogRecordDataHeader follow, no padding */++} XLogRecord;++#define SizeOfXLogRecord (offsetof(XLogRecord, xl_crc) + sizeof(pg_crc32c))++/*+ * The high 4 bits in xl_info may be used freely by rmgr. The+ * XLR_SPECIAL_REL_UPDATE bit can be passed by XLogInsert caller. The rest+ * are set internally by XLogInsert.+ */+#define XLR_INFO_MASK 0x0F+#define XLR_RMGR_INFO_MASK 0xF0++/*+ * If a WAL record modifies any relation files, in ways not covered by the+ * usual block references, this flag is set. This is not used for anything+ * by PostgreSQL itself, but it allows external tools that read WAL and keep+ * track of modified blocks to recognize such special record types.+ */+#define XLR_SPECIAL_REL_UPDATE 0x01++/*+ * Header info for block data appended to an XLOG record.+ *+ * 'data_length' is the length of the rmgr-specific payload data associated+ * with this block. It does not include the possible full page image, nor+ * XLogRecordBlockHeader struct itself.+ *+ * Note that we don't attempt to align the XLogRecordBlockHeader struct!+ * So, the struct must be copied to aligned local storage before use.+ */+typedef struct XLogRecordBlockHeader+{+ uint8 id; /* block reference ID */+ uint8 fork_flags; /* fork within the relation, and flags */+ uint16 data_length; /* number of payload bytes (not including page+ * image) */++ /* If BKPBLOCK_HAS_IMAGE, an XLogRecordBlockImageHeader struct follows */+ /* If BKPBLOCK_SAME_REL is not set, a RelFileNode follows */+ /* BlockNumber follows */+} XLogRecordBlockHeader;++#define SizeOfXLogRecordBlockHeader (offsetof(XLogRecordBlockHeader, data_length) + sizeof(uint16))++/*+ * Additional header information when a full-page image is included+ * (i.e. when BKPBLOCK_HAS_IMAGE is set).+ *+ * As a trivial form of data compression, the XLOG code is aware that+ * PG data pages usually contain an unused "hole" in the middle, which+ * contains only zero bytes. If the length of "hole" > 0 then we have removed+ * such a "hole" from the stored data (and it's not counted in the+ * XLOG record's CRC, either). Hence, the amount of block data actually+ * present is BLCKSZ - the length of "hole" bytes.+ *+ * When wal_compression is enabled, a full page image which "hole" was+ * removed is additionally compressed using PGLZ compression algorithm.+ * This can reduce the WAL volume, but at some extra cost of CPU spent+ * on the compression during WAL logging. In this case, since the "hole"+ * length cannot be calculated by subtracting the number of page image bytes+ * from BLCKSZ, basically it needs to be stored as an extra information.+ * But when no "hole" exists, we can assume that the "hole" length is zero+ * and no such an extra information needs to be stored. Note that+ * the original version of page image is stored in WAL instead of the+ * compressed one if the number of bytes saved by compression is less than+ * the length of extra information. Hence, when a page image is successfully+ * compressed, the amount of block data actually present is less than+ * BLCKSZ - the length of "hole" bytes - the length of extra information.+ */+typedef struct XLogRecordBlockImageHeader+{+ uint16 length; /* number of page image bytes */+ uint16 hole_offset; /* number of bytes before "hole" */+ uint8 bimg_info; /* flag bits, see below */++ /*+ * If BKPIMAGE_HAS_HOLE and BKPIMAGE_IS_COMPRESSED, an+ * XLogRecordBlockCompressHeader struct follows.+ */+} XLogRecordBlockImageHeader;++#define SizeOfXLogRecordBlockImageHeader \+ (offsetof(XLogRecordBlockImageHeader, bimg_info) + sizeof(uint8))++/* Information stored in bimg_info */+#define BKPIMAGE_HAS_HOLE 0x01 /* page image has "hole" */+#define BKPIMAGE_IS_COMPRESSED 0x02 /* page image is compressed */++/*+ * Extra header information used when page image has "hole" and+ * is compressed.+ */+typedef struct XLogRecordBlockCompressHeader+{+ uint16 hole_length; /* number of bytes in "hole" */+} XLogRecordBlockCompressHeader;++#define SizeOfXLogRecordBlockCompressHeader \+ sizeof(XLogRecordBlockCompressHeader)++/*+ * Maximum size of the header for a block reference. This is used to size a+ * temporary buffer for constructing the header.+ */+#define MaxSizeOfXLogRecordBlockHeader \+ (SizeOfXLogRecordBlockHeader + \+ SizeOfXLogRecordBlockImageHeader + \+ SizeOfXLogRecordBlockCompressHeader + \+ sizeof(RelFileNode) + \+ sizeof(BlockNumber))++/*+ * The fork number fits in the lower 4 bits in the fork_flags field. The upper+ * bits are used for flags.+ */+#define BKPBLOCK_FORK_MASK 0x0F+#define BKPBLOCK_FLAG_MASK 0xF0+#define BKPBLOCK_HAS_IMAGE 0x10 /* block data is an XLogRecordBlockImage */+#define BKPBLOCK_HAS_DATA 0x20+#define BKPBLOCK_WILL_INIT 0x40 /* redo will re-init the page */+#define BKPBLOCK_SAME_REL 0x80 /* RelFileNode omitted, same as previous */++/*+ * XLogRecordDataHeaderShort/Long are used for the "main data" portion of+ * the record. If the length of the data is less than 256 bytes, the short+ * form is used, with a single byte to hold the length. Otherwise the long+ * form is used.+ *+ * (These structs are currently not used in the code, they are here just for+ * documentation purposes).+ */+typedef struct XLogRecordDataHeaderShort+{+ uint8 id; /* XLR_BLOCK_ID_DATA_SHORT */+ uint8 data_length; /* number of payload bytes */+} XLogRecordDataHeaderShort;++#define SizeOfXLogRecordDataHeaderShort (sizeof(uint8) * 2)++typedef struct XLogRecordDataHeaderLong+{+ uint8 id; /* XLR_BLOCK_ID_DATA_LONG */+ /* followed by uint32 data_length, unaligned */+} XLogRecordDataHeaderLong;++#define SizeOfXLogRecordDataHeaderLong (sizeof(uint8) + sizeof(uint32))++/*+ * Block IDs used to distinguish different kinds of record fragments. Block+ * references are numbered from 0 to XLR_MAX_BLOCK_ID. A rmgr is free to use+ * any ID number in that range (although you should stick to small numbers,+ * because the WAL machinery is optimized for that case). A couple of ID+ * numbers are reserved to denote the "main" data portion of the record.+ *+ * The maximum is currently set at 32, quite arbitrarily. Most records only+ * need a handful of block references, but there are a few exceptions that+ * need more.+ */+#define XLR_MAX_BLOCK_ID 32++#define XLR_BLOCK_ID_DATA_SHORT 255+#define XLR_BLOCK_ID_DATA_LONG 254+#define XLR_BLOCK_ID_ORIGIN 253++#endif /* XLOGRECORD_H */
+ foreign/libpg_query/src/postgres/include/bootstrap/bootstrap.h view
@@ -0,0 +1,66 @@+/*-------------------------------------------------------------------------+ *+ * bootstrap.h+ * include file for the bootstrapping code+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/bootstrap/bootstrap.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef BOOTSTRAP_H+#define BOOTSTRAP_H++#include "nodes/execnodes.h"+++/*+ * MAXATTR is the maximum number of attributes in a relation supported+ * at bootstrap time (i.e., the max possible in a system table).+ */+#define MAXATTR 40++#define BOOTCOL_NULL_AUTO 1+#define BOOTCOL_NULL_FORCE_NULL 2+#define BOOTCOL_NULL_FORCE_NOT_NULL 3++extern Relation boot_reldesc;+extern Form_pg_attribute attrtypes[MAXATTR];+extern int numattr;+++extern void AuxiliaryProcessMain(int argc, char *argv[]) pg_attribute_noreturn();++extern void err_out(void);++extern void closerel(char *name);+extern void boot_openrel(char *name);++extern void DefineAttr(char *name, char *type, int attnum, int nullness);+extern void InsertOneTuple(Oid objectid);+extern void InsertOneValue(char *value, int i);+extern void InsertOneNull(int i);++extern char *MapArrayTypeName(const char *s);++extern void index_register(Oid heap, Oid ind, IndexInfo *indexInfo);+extern void build_indices(void);++extern void boot_get_type_io_data(Oid typid,+ int16 *typlen,+ bool *typbyval,+ char *typalign,+ char *typdelim,+ Oid *typioparam,+ Oid *typinput,+ Oid *typoutput);++extern int boot_yyparse(void);++extern int boot_yylex(void);+extern void boot_yyerror(const char *str) pg_attribute_noreturn();++#endif /* BOOTSTRAP_H */
+ foreign/libpg_query/src/postgres/include/c.h view
@@ -0,0 +1,1116 @@+/*-------------------------------------------------------------------------+ *+ * c.h+ * Fundamental C definitions. This is included by every .c file in+ * PostgreSQL (via either postgres.h or postgres_fe.h, as appropriate).+ *+ * Note that the definitions here are not intended to be exposed to clients+ * of the frontend interface libraries --- so we don't worry much about+ * polluting the namespace with lots of stuff...+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/c.h+ *+ *-------------------------------------------------------------------------+ */+/*+ *----------------------------------------------------------------+ * TABLE OF CONTENTS+ *+ * When adding stuff to this file, please try to put stuff+ * into the relevant section, or add new sections as appropriate.+ *+ * section description+ * ------- ------------------------------------------------+ * 0) pg_config.h and standard system headers+ * 1) hacks to cope with non-ANSI C compilers+ * 2) bool, true, false, TRUE, FALSE, NULL+ * 3) standard system types+ * 4) IsValid macros for system types+ * 5) offsetof, lengthof, endof, alignment+ * 6) assertions+ * 7) widely useful macros+ * 8) random stuff+ * 9) system-specific hacks+ *+ * NOTE: since this file is included by both frontend and backend modules, it's+ * almost certainly wrong to put an "extern" declaration here. typedefs and+ * macros are the kind of thing that might go here.+ *+ *----------------------------------------------------------------+ */+#ifndef C_H+#define C_H++#include "postgres_ext.h"++/* Must undef pg_config_ext.h symbols before including pg_config.h */+#undef PG_INT64_TYPE++#include "pg_config.h"+#include "pg_config_manual.h" /* must be after pg_config.h */++/*+ * We always rely on the WIN32 macro being set by our build system,+ * but _WIN32 is the compiler pre-defined macro. So make sure we define+ * WIN32 whenever _WIN32 is set, to facilitate standalone building.+ */+#if defined(_WIN32) && !defined(WIN32)+#define WIN32+#endif++#if !defined(WIN32) && !defined(__CYGWIN__) /* win32 includes further down */+#include "pg_config_os.h" /* must be before any system header files */+#endif++#if _MSC_VER >= 1400 || defined(HAVE_CRTDEFS_H)+#define errcode __msvc_errcode+#include <crtdefs.h>+#undef errcode+#endif++/*+ * We have to include stdlib.h here because it defines many of these macros+ * on some platforms, and we only want our definitions used if stdlib.h doesn't+ * have its own. The same goes for stddef and stdarg if present.+ */++#include <stdio.h>+#include <stdlib.h>+#include <string.h>+#include <stddef.h>+#include <stdarg.h>+#ifdef HAVE_STRINGS_H+#include <strings.h>+#endif+#ifdef HAVE_STDINT_H+#include <stdint.h>+#endif+#include <sys/types.h>++#include <errno.h>+#if defined(WIN32) || defined(__CYGWIN__)+#include <fcntl.h> /* ensure O_BINARY is available */+#endif++#if defined(WIN32) || defined(__CYGWIN__)+/* We have to redefine some system functions after they are included above. */+#include "pg_config_os.h"+#endif++/* Must be before gettext() games below */+#include <locale.h>++#define _(x) gettext(x)++#ifdef ENABLE_NLS+#include <libintl.h>+#else+#define gettext(x) (x)+#define dgettext(d,x) (x)+#define ngettext(s,p,n) ((n) == 1 ? (s) : (p))+#define dngettext(d,s,p,n) ((n) == 1 ? (s) : (p))+#endif++/*+ * Use this to mark string constants as needing translation at some later+ * time, rather than immediately. This is useful for cases where you need+ * access to the original string and translated string, and for cases where+ * immediate translation is not possible, like when initializing global+ * variables.+ * http://www.gnu.org/software/autoconf/manual/gettext/Special-cases.html+ */+#define gettext_noop(x) (x)+++/* ----------------------------------------------------------------+ * Section 1: hacks to cope with non-ANSI C compilers+ *+ * type prefixes (const, signed, volatile, inline) are handled in pg_config.h.+ * ----------------------------------------------------------------+ */++/*+ * CppAsString+ * Convert the argument to a string, using the C preprocessor.+ * CppConcat+ * Concatenate two arguments together, using the C preprocessor.+ *+ * Note: There used to be support here for pre-ANSI C compilers that didn't+ * support # and ##. Nowadays, these macros are just for clarity and/or+ * backward compatibility with existing PostgreSQL code.+ */+#define CppAsString(identifier) #identifier+#define CppConcat(x, y) x##y++/*+ * dummyret is used to set return values in macros that use ?: to make+ * assignments. gcc wants these to be void, other compilers like char+ */+#ifdef __GNUC__ /* GNU cc */+#define dummyret void+#else+#define dummyret char+#endif++/* ----------------------------------------------------------------+ * Section 2: bool, true, false, TRUE, FALSE, NULL+ * ----------------------------------------------------------------+ */++/*+ * bool+ * Boolean value, either true or false.+ *+ * XXX for C++ compilers, we assume the compiler has a compatible+ * built-in definition of bool.+ */++#ifndef __cplusplus++#ifndef bool+typedef char bool;+#endif++#ifndef true+#define true ((bool) 1)+#endif++#ifndef false+#define false ((bool) 0)+#endif+#endif /* not C++ */++typedef bool *BoolPtr;++#ifndef TRUE+#define TRUE 1+#endif++#ifndef FALSE+#define FALSE 0+#endif++/*+ * NULL+ * Null pointer.+ */+#ifndef NULL+#define NULL ((void *) 0)+#endif+++/* ----------------------------------------------------------------+ * Section 3: standard system types+ * ----------------------------------------------------------------+ */++/*+ * Pointer+ * Variable holding address of any memory resident object.+ *+ * XXX Pointer arithmetic is done with this, so it can't be void *+ * under "true" ANSI compilers.+ */+typedef char *Pointer;++/*+ * intN+ * Signed integer, EXACTLY N BITS IN SIZE,+ * used for numerical computations and the+ * frontend/backend protocol.+ */+#ifndef HAVE_INT8+typedef signed char int8; /* == 8 bits */+typedef signed short int16; /* == 16 bits */+typedef signed int int32; /* == 32 bits */+#endif /* not HAVE_INT8 */++/*+ * uintN+ * Unsigned integer, EXACTLY N BITS IN SIZE,+ * used for numerical computations and the+ * frontend/backend protocol.+ */+#ifndef HAVE_UINT8+typedef unsigned char uint8; /* == 8 bits */+typedef unsigned short uint16; /* == 16 bits */+typedef unsigned int uint32; /* == 32 bits */+#endif /* not HAVE_UINT8 */++/*+ * bitsN+ * Unit of bitwise operation, AT LEAST N BITS IN SIZE.+ */+typedef uint8 bits8; /* >= 8 bits */+typedef uint16 bits16; /* >= 16 bits */+typedef uint32 bits32; /* >= 32 bits */++/*+ * 64-bit integers+ */+#ifdef HAVE_LONG_INT_64+/* Plain "long int" fits, use it */++#ifndef HAVE_INT64+typedef long int int64;+#endif+#ifndef HAVE_UINT64+typedef unsigned long int uint64;+#endif+#elif defined(HAVE_LONG_LONG_INT_64)+/* We have working support for "long long int", use that */++#ifndef HAVE_INT64+typedef long long int int64;+#endif+#ifndef HAVE_UINT64+typedef unsigned long long int uint64;+#endif+#else+/* neither HAVE_LONG_INT_64 nor HAVE_LONG_LONG_INT_64 */+#error must have a working 64-bit integer datatype+#endif++/* Decide if we need to decorate 64-bit constants */+#ifdef HAVE_LL_CONSTANTS+#define INT64CONST(x) ((int64) x##LL)+#define UINT64CONST(x) ((uint64) x##ULL)+#else+#define INT64CONST(x) ((int64) x)+#define UINT64CONST(x) ((uint64) x)+#endif++/* snprintf format strings to use for 64-bit integers */+#define INT64_FORMAT "%" INT64_MODIFIER "d"+#define UINT64_FORMAT "%" INT64_MODIFIER "u"++/*+ * 128-bit signed and unsigned integers+ * There currently is only a limited support for the type. E.g. 128bit+ * literals and snprintf are not supported; but math is.+ */+#if defined(PG_INT128_TYPE)+#define HAVE_INT128+typedef PG_INT128_TYPE int128;+typedef unsigned PG_INT128_TYPE uint128;+#endif++/*+ * stdint.h limits aren't guaranteed to be present and aren't guaranteed to+ * have compatible types with our fixed width types. So just define our own.+ */+#define PG_INT8_MIN (-0x7F-1)+#define PG_INT8_MAX (0x7F)+#define PG_UINT8_MAX (0xFF)+#define PG_INT16_MIN (-0x7FFF-1)+#define PG_INT16_MAX (0x7FFF)+#define PG_UINT16_MAX (0xFFFF)+#define PG_INT32_MIN (-0x7FFFFFFF-1)+#define PG_INT32_MAX (0x7FFFFFFF)+#define PG_UINT32_MAX (0xFFFFFFFF)+#define PG_INT64_MIN (-INT64CONST(0x7FFFFFFFFFFFFFFF) - 1)+#define PG_INT64_MAX INT64CONST(0x7FFFFFFFFFFFFFFF)+#define PG_UINT64_MAX UINT64CONST(0xFFFFFFFFFFFFFFFF)++/* Select timestamp representation (float8 or int64) */+#ifdef USE_INTEGER_DATETIMES+#define HAVE_INT64_TIMESTAMP+#endif++/* sig_atomic_t is required by ANSI C, but may be missing on old platforms */+#ifndef HAVE_SIG_ATOMIC_T+typedef int sig_atomic_t;+#endif++/*+ * Size+ * Size of any memory resident object, as returned by sizeof.+ */+typedef size_t Size;++/*+ * Index+ * Index into any memory resident array.+ *+ * Note:+ * Indices are non negative.+ */+typedef unsigned int Index;++/*+ * Offset+ * Offset into any memory resident array.+ *+ * Note:+ * This differs from an Index in that an Index is always+ * non negative, whereas Offset may be negative.+ */+typedef signed int Offset;++/*+ * Common Postgres datatype names (as used in the catalogs)+ */+typedef float float4;+typedef double float8;++/*+ * Oid, RegProcedure, TransactionId, SubTransactionId, MultiXactId,+ * CommandId+ */++/* typedef Oid is in postgres_ext.h */++/*+ * regproc is the type name used in the include/catalog headers, but+ * RegProcedure is the preferred name in C code.+ */+typedef Oid regproc;+typedef regproc RegProcedure;++typedef uint32 TransactionId;++typedef uint32 LocalTransactionId;++typedef uint32 SubTransactionId;++#define InvalidSubTransactionId ((SubTransactionId) 0)+#define TopSubTransactionId ((SubTransactionId) 1)++/* MultiXactId must be equivalent to TransactionId, to fit in t_xmax */+typedef TransactionId MultiXactId;++typedef uint32 MultiXactOffset;++typedef uint32 CommandId;++#define FirstCommandId ((CommandId) 0)+#define InvalidCommandId (~(CommandId)0)++/*+ * Array indexing support+ */+#define MAXDIM 6+typedef struct+{+ int indx[MAXDIM];+} IntArray;++/* ----------------+ * Variable-length datatypes all share the 'struct varlena' header.+ *+ * NOTE: for TOASTable types, this is an oversimplification, since the value+ * may be compressed or moved out-of-line. However datatype-specific routines+ * are mostly content to deal with de-TOASTed values only, and of course+ * client-side routines should never see a TOASTed value. But even in a+ * de-TOASTed value, beware of touching vl_len_ directly, as its representation+ * is no longer convenient. It's recommended that code always use the VARDATA,+ * VARSIZE, and SET_VARSIZE macros instead of relying on direct mentions of+ * the struct fields. See postgres.h for details of the TOASTed form.+ * ----------------+ */+struct varlena+{+ char vl_len_[4]; /* Do not touch this field directly! */+ char vl_dat[FLEXIBLE_ARRAY_MEMBER]; /* Data content is here */+};++#define VARHDRSZ ((int32) sizeof(int32))++/*+ * These widely-used datatypes are just a varlena header and the data bytes.+ * There is no terminating null or anything like that --- the data length is+ * always VARSIZE(ptr) - VARHDRSZ.+ */+typedef struct varlena bytea;+typedef struct varlena text;+typedef struct varlena BpChar; /* blank-padded char, ie SQL char(n) */+typedef struct varlena VarChar; /* var-length char, ie SQL varchar(n) */++/*+ * Specialized array types. These are physically laid out just the same+ * as regular arrays (so that the regular array subscripting code works+ * with them). They exist as distinct types mostly for historical reasons:+ * they have nonstandard I/O behavior which we don't want to change for fear+ * of breaking applications that look at the system catalogs. There is also+ * an implementation issue for oidvector: it's part of the primary key for+ * pg_proc, and we can't use the normal btree array support routines for that+ * without circularity.+ */+typedef struct+{+ int32 vl_len_; /* these fields must match ArrayType! */+ int ndim; /* always 1 for int2vector */+ int32 dataoffset; /* always 0 for int2vector */+ Oid elemtype;+ int dim1;+ int lbound1;+ int16 values[FLEXIBLE_ARRAY_MEMBER];+} int2vector;++typedef struct+{+ int32 vl_len_; /* these fields must match ArrayType! */+ int ndim; /* always 1 for oidvector */+ int32 dataoffset; /* always 0 for oidvector */+ Oid elemtype;+ int dim1;+ int lbound1;+ Oid values[FLEXIBLE_ARRAY_MEMBER];+} oidvector;++/*+ * Representation of a Name: effectively just a C string, but null-padded to+ * exactly NAMEDATALEN bytes. The use of a struct is historical.+ */+typedef struct nameData+{+ char data[NAMEDATALEN];+} NameData;+typedef NameData *Name;++#define NameStr(name) ((name).data)++/*+ * Support macros for escaping strings. escape_backslash should be TRUE+ * if generating a non-standard-conforming string. Prefixing a string+ * with ESCAPE_STRING_SYNTAX guarantees it is non-standard-conforming.+ * Beware of multiple evaluation of the "ch" argument!+ */+#define SQL_STR_DOUBLE(ch, escape_backslash) \+ ((ch) == '\'' || ((ch) == '\\' && (escape_backslash)))++#define ESCAPE_STRING_SYNTAX 'E'++/* ----------------------------------------------------------------+ * Section 4: IsValid macros for system types+ * ----------------------------------------------------------------+ */+/*+ * BoolIsValid+ * True iff bool is valid.+ */+#define BoolIsValid(boolean) ((boolean) == false || (boolean) == true)++/*+ * PointerIsValid+ * True iff pointer is valid.+ */+#define PointerIsValid(pointer) ((const void*)(pointer) != NULL)++/*+ * PointerIsAligned+ * True iff pointer is properly aligned to point to the given type.+ */+#define PointerIsAligned(pointer, type) \+ (((uintptr_t)(pointer) % (sizeof (type))) == 0)++#define OidIsValid(objectId) ((bool) ((objectId) != InvalidOid))++#define RegProcedureIsValid(p) OidIsValid(p)+++/* ----------------------------------------------------------------+ * Section 5: offsetof, lengthof, endof, alignment+ * ----------------------------------------------------------------+ */+/*+ * offsetof+ * Offset of a structure/union field within that structure/union.+ *+ * XXX This is supposed to be part of stddef.h, but isn't on+ * some systems (like SunOS 4).+ */+#ifndef offsetof+#define offsetof(type, field) ((long) &((type *)0)->field)+#endif /* offsetof */++/*+ * lengthof+ * Number of elements in an array.+ */+#define lengthof(array) (sizeof (array) / sizeof ((array)[0]))++/*+ * endof+ * Address of the element one past the last in an array.+ */+#define endof(array) (&(array)[lengthof(array)])++/* ----------------+ * Alignment macros: align a length or address appropriately for a given type.+ * The fooALIGN() macros round up to a multiple of the required alignment,+ * while the fooALIGN_DOWN() macros round down. The latter are more useful+ * for problems like "how many X-sized structures will fit in a page?".+ *+ * NOTE: TYPEALIGN[_DOWN] will not work if ALIGNVAL is not a power of 2.+ * That case seems extremely unlikely to be needed in practice, however.+ * ----------------+ */++#define TYPEALIGN(ALIGNVAL,LEN) \+ (((uintptr_t) (LEN) + ((ALIGNVAL) - 1)) & ~((uintptr_t) ((ALIGNVAL) - 1)))++#define SHORTALIGN(LEN) TYPEALIGN(ALIGNOF_SHORT, (LEN))+#define INTALIGN(LEN) TYPEALIGN(ALIGNOF_INT, (LEN))+#define LONGALIGN(LEN) TYPEALIGN(ALIGNOF_LONG, (LEN))+#define DOUBLEALIGN(LEN) TYPEALIGN(ALIGNOF_DOUBLE, (LEN))+#define MAXALIGN(LEN) TYPEALIGN(MAXIMUM_ALIGNOF, (LEN))+/* MAXALIGN covers only built-in types, not buffers */+#define BUFFERALIGN(LEN) TYPEALIGN(ALIGNOF_BUFFER, (LEN))+#define CACHELINEALIGN(LEN) TYPEALIGN(PG_CACHE_LINE_SIZE, (LEN))++#define TYPEALIGN_DOWN(ALIGNVAL,LEN) \+ (((uintptr_t) (LEN)) & ~((uintptr_t) ((ALIGNVAL) - 1)))++#define SHORTALIGN_DOWN(LEN) TYPEALIGN_DOWN(ALIGNOF_SHORT, (LEN))+#define INTALIGN_DOWN(LEN) TYPEALIGN_DOWN(ALIGNOF_INT, (LEN))+#define LONGALIGN_DOWN(LEN) TYPEALIGN_DOWN(ALIGNOF_LONG, (LEN))+#define DOUBLEALIGN_DOWN(LEN) TYPEALIGN_DOWN(ALIGNOF_DOUBLE, (LEN))+#define MAXALIGN_DOWN(LEN) TYPEALIGN_DOWN(MAXIMUM_ALIGNOF, (LEN))++/*+ * The above macros will not work with types wider than uintptr_t, like with+ * uint64 on 32-bit platforms. That's not problem for the usual use where a+ * pointer or a length is aligned, but for the odd case that you need to+ * align something (potentially) wider, use TYPEALIGN64.+ */+#define TYPEALIGN64(ALIGNVAL,LEN) \+ (((uint64) (LEN) + ((ALIGNVAL) - 1)) & ~((uint64) ((ALIGNVAL) - 1)))++/* we don't currently need wider versions of the other ALIGN macros */+#define MAXALIGN64(LEN) TYPEALIGN64(MAXIMUM_ALIGNOF, (LEN))++/* ----------------+ * Attribute macros+ *+ * GCC: https://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html+ * GCC: https://gcc.gnu.org/onlinedocs/gcc/Type-Attributes.html+ * Sunpro: https://docs.oracle.com/cd/E18659_01/html/821-1384/gjzke.html+ * XLC: http://www-01.ibm.com/support/knowledgecenter/SSGH2K_11.1.0/com.ibm.xlc111.aix.doc/language_ref/function_attributes.html+ * XLC: http://www-01.ibm.com/support/knowledgecenter/SSGH2K_11.1.0/com.ibm.xlc111.aix.doc/language_ref/type_attrib.html+ * ----------------+ */++/* only GCC supports the unused attribute */+#ifdef __GNUC__+#define pg_attribute_unused() __attribute__((unused))+#else+#define pg_attribute_unused()+#endif++/* GCC and XLC support format attributes */+#if defined(__GNUC__) || defined(__IBMC__)+#define pg_attribute_format_arg(a) __attribute__((format_arg(a)))+#define pg_attribute_printf(f,a) __attribute__((format(PG_PRINTF_ATTRIBUTE, f, a)))+#else+#define pg_attribute_format_arg(a)+#define pg_attribute_printf(f,a)+#endif++/* GCC, Sunpro and XLC support aligned, packed and noreturn */+#if defined(__GNUC__) || defined(__SUNPRO_C) || defined(__IBMC__)+#define pg_attribute_aligned(a) __attribute__((aligned(a)))+#define pg_attribute_noreturn() __attribute__((noreturn))+#define pg_attribute_packed() __attribute__((packed))+#define HAVE_PG_ATTRIBUTE_NORETURN 1+#else+/*+ * NB: aligned and packed are not given default definitions because they+ * affect code functionality; they *must* be implemented by the compiler+ * if they are to be used.+ */+#define pg_attribute_noreturn()+#endif++/* ----------------------------------------------------------------+ * Section 6: assertions+ * ----------------------------------------------------------------+ */++/*+ * USE_ASSERT_CHECKING, if defined, turns on all the assertions.+ * - plai 9/5/90+ *+ * It should _NOT_ be defined in releases or in benchmark copies+ */++/*+ * Assert() can be used in both frontend and backend code. In frontend code it+ * just calls the standard assert, if it's available. If use of assertions is+ * not configured, it does nothing.+ */+#ifndef USE_ASSERT_CHECKING++#define Assert(condition) ((void)true)+#define AssertMacro(condition) ((void)true)+#define AssertArg(condition) ((void)true)+#define AssertState(condition) ((void)true)+#define AssertPointerAlignment(ptr, bndr) ((void)true)+#define Trap(condition, errorType) ((void)true)+#define TrapMacro(condition, errorType) (true)++#elif defined(FRONTEND)++#include <assert.h>+#define Assert(p) assert(p)+#define AssertMacro(p) ((void) assert(p))+#define AssertArg(condition) assert(condition)+#define AssertState(condition) assert(condition)+#define AssertPointerAlignment(ptr, bndr) ((void)true)+#else /* USE_ASSERT_CHECKING && !FRONTEND */++/*+ * Trap+ * Generates an exception if the given condition is true.+ */+#define Trap(condition, errorType) \+ do { \+ if (condition) \+ ExceptionalCondition(CppAsString(condition), (errorType), \+ __FILE__, __LINE__); \+ } while (0)++/*+ * TrapMacro is the same as Trap but it's intended for use in macros:+ *+ * #define foo(x) (AssertMacro(x != 0), bar(x))+ *+ * Isn't CPP fun?+ */+#define TrapMacro(condition, errorType) \+ ((bool) (! (condition) || \+ (ExceptionalCondition(CppAsString(condition), (errorType), \+ __FILE__, __LINE__), 0)))++#define Assert(condition) \+ Trap(!(condition), "FailedAssertion")++#define AssertMacro(condition) \+ ((void) TrapMacro(!(condition), "FailedAssertion"))++#define AssertArg(condition) \+ Trap(!(condition), "BadArgument")++#define AssertState(condition) \+ Trap(!(condition), "BadState")++/*+ * Check that `ptr' is `bndr' aligned.+ */+#define AssertPointerAlignment(ptr, bndr) \+ Trap(TYPEALIGN(bndr, (uintptr_t)(ptr)) != (uintptr_t)(ptr), \+ "UnalignedPointer")++#endif /* USE_ASSERT_CHECKING && !FRONTEND */++/*+ * Macros to support compile-time assertion checks.+ *+ * If the "condition" (a compile-time-constant expression) evaluates to false,+ * throw a compile error using the "errmessage" (a string literal).+ *+ * gcc 4.6 and up supports _Static_assert(), but there are bizarre syntactic+ * placement restrictions. These macros make it safe to use as a statement+ * or in an expression, respectively.+ *+ * Otherwise we fall back on a kluge that assumes the compiler will complain+ * about a negative width for a struct bit-field. This will not include a+ * helpful error message, but it beats not getting an error at all.+ */+#ifdef HAVE__STATIC_ASSERT+#define StaticAssertStmt(condition, errmessage) \+ do { _Static_assert(condition, errmessage); } while(0)+#define StaticAssertExpr(condition, errmessage) \+ ({ StaticAssertStmt(condition, errmessage); true; })+#else /* !HAVE__STATIC_ASSERT */+#define StaticAssertStmt(condition, errmessage) \+ ((void) sizeof(struct { int static_assert_failure : (condition) ? 1 : -1; }))+#define StaticAssertExpr(condition, errmessage) \+ StaticAssertStmt(condition, errmessage)+#endif /* HAVE__STATIC_ASSERT */+++/*+ * Compile-time checks that a variable (or expression) has the specified type.+ *+ * AssertVariableIsOfType() can be used as a statement.+ * AssertVariableIsOfTypeMacro() is intended for use in macros, eg+ * #define foo(x) (AssertVariableIsOfTypeMacro(x, int), bar(x))+ *+ * If we don't have __builtin_types_compatible_p, we can still assert that+ * the types have the same size. This is far from ideal (especially on 32-bit+ * platforms) but it provides at least some coverage.+ */+#ifdef HAVE__BUILTIN_TYPES_COMPATIBLE_P+#define AssertVariableIsOfType(varname, typename) \+ StaticAssertStmt(__builtin_types_compatible_p(__typeof__(varname), typename), \+ CppAsString(varname) " does not have type " CppAsString(typename))+#define AssertVariableIsOfTypeMacro(varname, typename) \+ ((void) StaticAssertExpr(__builtin_types_compatible_p(__typeof__(varname), typename), \+ CppAsString(varname) " does not have type " CppAsString(typename)))+#else /* !HAVE__BUILTIN_TYPES_COMPATIBLE_P */+#define AssertVariableIsOfType(varname, typename) \+ StaticAssertStmt(sizeof(varname) == sizeof(typename), \+ CppAsString(varname) " does not have type " CppAsString(typename))+#define AssertVariableIsOfTypeMacro(varname, typename) \+ ((void) StaticAssertExpr(sizeof(varname) == sizeof(typename), \+ CppAsString(varname) " does not have type " CppAsString(typename)))+#endif /* HAVE__BUILTIN_TYPES_COMPATIBLE_P */+++/* ----------------------------------------------------------------+ * Section 7: widely useful macros+ * ----------------------------------------------------------------+ */+/*+ * Max+ * Return the maximum of two numbers.+ */+#define Max(x, y) ((x) > (y) ? (x) : (y))++/*+ * Min+ * Return the minimum of two numbers.+ */+#define Min(x, y) ((x) < (y) ? (x) : (y))++/*+ * Abs+ * Return the absolute value of the argument.+ */+#define Abs(x) ((x) >= 0 ? (x) : -(x))++/*+ * StrNCpy+ * Like standard library function strncpy(), except that result string+ * is guaranteed to be null-terminated --- that is, at most N-1 bytes+ * of the source string will be kept.+ * Also, the macro returns no result (too hard to do that without+ * evaluating the arguments multiple times, which seems worse).+ *+ * BTW: when you need to copy a non-null-terminated string (like a text+ * datum) and add a null, do not do it with StrNCpy(..., len+1). That+ * might seem to work, but it fetches one byte more than there is in the+ * text object. One fine day you'll have a SIGSEGV because there isn't+ * another byte before the end of memory. Don't laugh, we've had real+ * live bug reports from real live users over exactly this mistake.+ * Do it honestly with "memcpy(dst,src,len); dst[len] = '\0';", instead.+ */+#define StrNCpy(dst,src,len) \+ do \+ { \+ char * _dst = (dst); \+ Size _len = (len); \+\+ if (_len > 0) \+ { \+ strncpy(_dst, (src), _len); \+ _dst[_len-1] = '\0'; \+ } \+ } while (0)+++/* Get a bit mask of the bits set in non-long aligned addresses */+#define LONG_ALIGN_MASK (sizeof(long) - 1)++/*+ * MemSet+ * Exactly the same as standard library function memset(), but considerably+ * faster for zeroing small word-aligned structures (such as parsetree nodes).+ * This has to be a macro because the main point is to avoid function-call+ * overhead. However, we have also found that the loop is faster than+ * native libc memset() on some platforms, even those with assembler+ * memset() functions. More research needs to be done, perhaps with+ * MEMSET_LOOP_LIMIT tests in configure.+ */+#define MemSet(start, val, len) \+ do \+ { \+ /* must be void* because we don't know if it is integer aligned yet */ \+ void *_vstart = (void *) (start); \+ int _val = (val); \+ Size _len = (len); \+\+ if ((((uintptr_t) _vstart) & LONG_ALIGN_MASK) == 0 && \+ (_len & LONG_ALIGN_MASK) == 0 && \+ _val == 0 && \+ _len <= MEMSET_LOOP_LIMIT && \+ /* \+ * If MEMSET_LOOP_LIMIT == 0, optimizer should find \+ * the whole "if" false at compile time. \+ */ \+ MEMSET_LOOP_LIMIT != 0) \+ { \+ long *_start = (long *) _vstart; \+ long *_stop = (long *) ((char *) _start + _len); \+ while (_start < _stop) \+ *_start++ = 0; \+ } \+ else \+ memset(_vstart, _val, _len); \+ } while (0)++/*+ * MemSetAligned is the same as MemSet except it omits the test to see if+ * "start" is word-aligned. This is okay to use if the caller knows a-priori+ * that the pointer is suitably aligned (typically, because he just got it+ * from palloc(), which always delivers a max-aligned pointer).+ */+#define MemSetAligned(start, val, len) \+ do \+ { \+ long *_start = (long *) (start); \+ int _val = (val); \+ Size _len = (len); \+\+ if ((_len & LONG_ALIGN_MASK) == 0 && \+ _val == 0 && \+ _len <= MEMSET_LOOP_LIMIT && \+ MEMSET_LOOP_LIMIT != 0) \+ { \+ long *_stop = (long *) ((char *) _start + _len); \+ while (_start < _stop) \+ *_start++ = 0; \+ } \+ else \+ memset(_start, _val, _len); \+ } while (0)+++/*+ * MemSetTest/MemSetLoop are a variant version that allow all the tests in+ * MemSet to be done at compile time in cases where "val" and "len" are+ * constants *and* we know the "start" pointer must be word-aligned.+ * If MemSetTest succeeds, then it is okay to use MemSetLoop, otherwise use+ * MemSetAligned. Beware of multiple evaluations of the arguments when using+ * this approach.+ */+#define MemSetTest(val, len) \+ ( ((len) & LONG_ALIGN_MASK) == 0 && \+ (len) <= MEMSET_LOOP_LIMIT && \+ MEMSET_LOOP_LIMIT != 0 && \+ (val) == 0 )++#define MemSetLoop(start, val, len) \+ do \+ { \+ long * _start = (long *) (start); \+ long * _stop = (long *) ((char *) _start + (Size) (len)); \+ \+ while (_start < _stop) \+ *_start++ = 0; \+ } while (0)+++/*+ * Mark a point as unreachable in a portable fashion. This should preferably+ * be something that the compiler understands, to aid code generation.+ * In assert-enabled builds, we prefer abort() for debugging reasons.+ */+#if defined(HAVE__BUILTIN_UNREACHABLE) && !defined(USE_ASSERT_CHECKING)+#define pg_unreachable() __builtin_unreachable()+#elif defined(_MSC_VER) && !defined(USE_ASSERT_CHECKING)+#define pg_unreachable() __assume(0)+#else+#define pg_unreachable() abort()+#endif+++/*+ * Function inlining support -- Allow modules to define functions that may be+ * inlined, if the compiler supports it.+ *+ * The function bodies must be defined in the module header prefixed by+ * STATIC_IF_INLINE, protected by a cpp symbol that the module's .c file must+ * define. If the compiler doesn't support inline functions, the function+ * definitions are pulled in by the .c file as regular (not inline) symbols.+ *+ * The header must also declare the functions' prototypes, protected by+ * !PG_USE_INLINE.+ */++/* declarations which are only visible when not inlining and in the .c file */+#ifdef PG_USE_INLINE+#define STATIC_IF_INLINE static inline+#else+#define STATIC_IF_INLINE+#endif /* PG_USE_INLINE */++/* declarations which are marked inline when inlining, extern otherwise */+#ifdef PG_USE_INLINE+#define STATIC_IF_INLINE_DECLARE static inline+#else+#define STATIC_IF_INLINE_DECLARE extern+#endif /* PG_USE_INLINE */+++/* ----------------------------------------------------------------+ * Section 8: random stuff+ * ----------------------------------------------------------------+ */++/* msb for char */+#define HIGHBIT (0x80)+#define IS_HIGHBIT_SET(ch) ((unsigned char)(ch) & HIGHBIT)++#define STATUS_OK (0)+#define STATUS_ERROR (-1)+#define STATUS_EOF (-2)+#define STATUS_FOUND (1)+#define STATUS_WAITING (2)+++/*+ * Append PG_USED_FOR_ASSERTS_ONLY to definitions of variables that are only+ * used in assert-enabled builds, to avoid compiler warnings about unused+ * variables in assert-disabled builds.+ */+#ifdef USE_ASSERT_CHECKING+#define PG_USED_FOR_ASSERTS_ONLY+#else+#define PG_USED_FOR_ASSERTS_ONLY pg_attribute_unused()+#endif+++/* gettext domain name mangling */++/*+ * To better support parallel installations of major PostgeSQL+ * versions as well as parallel installations of major library soname+ * versions, we mangle the gettext domain name by appending those+ * version numbers. The coding rule ought to be that wherever the+ * domain name is mentioned as a literal, it must be wrapped into+ * PG_TEXTDOMAIN(). The macros below do not work on non-literals; but+ * that is somewhat intentional because it avoids having to worry+ * about multiple states of premangling and postmangling as the values+ * are being passed around.+ *+ * Make sure this matches the installation rules in nls-global.mk.+ */++/* need a second indirection because we want to stringize the macro value, not the name */+#define CppAsString2(x) CppAsString(x)++#ifdef SO_MAJOR_VERSION+#define PG_TEXTDOMAIN(domain) (domain CppAsString2(SO_MAJOR_VERSION) "-" PG_MAJORVERSION)+#else+#define PG_TEXTDOMAIN(domain) (domain "-" PG_MAJORVERSION)+#endif+++/* ----------------------------------------------------------------+ * Section 9: system-specific hacks+ *+ * This should be limited to things that absolutely have to be+ * included in every source file. The port-specific header file+ * is usually a better place for this sort of thing.+ * ----------------------------------------------------------------+ */++/*+ * NOTE: this is also used for opening text files.+ * WIN32 treats Control-Z as EOF in files opened in text mode.+ * Therefore, we open files in binary mode on Win32 so we can read+ * literal control-Z. The other affect is that we see CRLF, but+ * that is OK because we can already handle those cleanly.+ */+#if defined(WIN32) || defined(__CYGWIN__)+#define PG_BINARY O_BINARY+#define PG_BINARY_A "ab"+#define PG_BINARY_R "rb"+#define PG_BINARY_W "wb"+#else+#define PG_BINARY 0+#define PG_BINARY_A "a"+#define PG_BINARY_R "r"+#define PG_BINARY_W "w"+#endif++/*+ * Provide prototypes for routines not present in a particular machine's+ * standard C library.+ */++#if !HAVE_DECL_SNPRINTF+extern int snprintf(char *str, size_t count, const char *fmt,...) pg_attribute_printf(3, 4);+#endif++#if !HAVE_DECL_VSNPRINTF+extern int vsnprintf(char *str, size_t count, const char *fmt, va_list args);+#endif++#if !defined(HAVE_MEMMOVE) && !defined(memmove)+#define memmove(d, s, c) bcopy(s, d, c)+#endif++/* no special DLL markers on most ports */+#ifndef PGDLLIMPORT+#define PGDLLIMPORT+#endif+#ifndef PGDLLEXPORT+#define PGDLLEXPORT+#endif++/*+ * The following is used as the arg list for signal handlers. Any ports+ * that take something other than an int argument should override this in+ * their pg_config_os.h file. Note that variable names are required+ * because it is used in both the prototypes as well as the definitions.+ * Note also the long name. We expect that this won't collide with+ * other names causing compiler warnings.+ */++#ifndef SIGNAL_ARGS+#define SIGNAL_ARGS int postgres_signal_arg+#endif++/*+ * When there is no sigsetjmp, its functionality is provided by plain+ * setjmp. Incidentally, nothing provides setjmp's functionality in+ * that case.+ */+#ifndef HAVE_SIGSETJMP+#define sigjmp_buf jmp_buf+#define sigsetjmp(x,y) setjmp(x)+#define siglongjmp longjmp+#endif++#if defined(HAVE_FDATASYNC) && !HAVE_DECL_FDATASYNC+extern int fdatasync(int fildes);+#endif++/* If strtoq() exists, rename it to the more standard strtoll() */+#if defined(HAVE_LONG_LONG_INT_64) && !defined(HAVE_STRTOLL) && defined(HAVE_STRTOQ)+#define strtoll strtoq+#define HAVE_STRTOLL 1+#endif++/* If strtouq() exists, rename it to the more standard strtoull() */+#if defined(HAVE_LONG_LONG_INT_64) && !defined(HAVE_STRTOULL) && defined(HAVE_STRTOUQ)+#define strtoull strtouq+#define HAVE_STRTOULL 1+#endif++/*+ * We assume if we have these two functions, we have their friends too, and+ * can use the wide-character functions.+ */+#if defined(HAVE_WCSTOMBS) && defined(HAVE_TOWLOWER)+#define USE_WIDE_UPPER_LOWER+#endif++/* EXEC_BACKEND defines */+#ifdef EXEC_BACKEND+#define NON_EXEC_STATIC+#else+#define NON_EXEC_STATIC static+#endif++/* /port compatibility functions */+#include "port.h"++#endif /* C_H */
+ foreign/libpg_query/src/postgres/include/catalog/dependency.h view
@@ -0,0 +1,269 @@+/*-------------------------------------------------------------------------+ *+ * dependency.h+ * Routines to support inter-object dependencies.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/catalog/dependency.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef DEPENDENCY_H+#define DEPENDENCY_H++#include "catalog/objectaddress.h"+++/*+ * Precise semantics of a dependency relationship are specified by the+ * DependencyType code (which is stored in a "char" field in pg_depend,+ * so we assign ASCII-code values to the enumeration members).+ *+ * In all cases, a dependency relationship indicates that the referenced+ * object may not be dropped without also dropping the dependent object.+ * However, there are several subflavors:+ *+ * DEPENDENCY_NORMAL ('n'): normal relationship between separately-created+ * objects. The dependent object may be dropped without affecting the+ * referenced object. The referenced object may only be dropped by+ * specifying CASCADE, in which case the dependent object is dropped too.+ * Example: a table column has a normal dependency on its datatype.+ *+ * DEPENDENCY_AUTO ('a'): the dependent object can be dropped separately+ * from the referenced object, and should be automatically dropped+ * (regardless of RESTRICT or CASCADE mode) if the referenced object+ * is dropped.+ * Example: a named constraint on a table is made auto-dependent on+ * the table, so that it will go away if the table is dropped.+ *+ * DEPENDENCY_INTERNAL ('i'): the dependent object was created as part+ * of creation of the referenced object, and is really just a part of+ * its internal implementation. A DROP of the dependent object will be+ * disallowed outright (we'll tell the user to issue a DROP against the+ * referenced object, instead). A DROP of the referenced object will be+ * propagated through to drop the dependent object whether CASCADE is+ * specified or not.+ * Example: a trigger that's created to enforce a foreign-key constraint+ * is made internally dependent on the constraint's pg_constraint entry.+ *+ * DEPENDENCY_EXTENSION ('e'): the dependent object is a member of the+ * extension that is the referenced object. The dependent object can be+ * dropped only via DROP EXTENSION on the referenced object. Functionally+ * this dependency type acts the same as an internal dependency, but it's+ * kept separate for clarity and to simplify pg_dump.+ *+ * DEPENDENCY_PIN ('p'): there is no dependent object; this type of entry+ * is a signal that the system itself depends on the referenced object,+ * and so that object must never be deleted. Entries of this type are+ * created only during initdb. The fields for the dependent object+ * contain zeroes.+ *+ * Other dependency flavors may be needed in future.+ */++typedef enum DependencyType+{+ DEPENDENCY_NORMAL = 'n',+ DEPENDENCY_AUTO = 'a',+ DEPENDENCY_INTERNAL = 'i',+ DEPENDENCY_EXTENSION = 'e',+ DEPENDENCY_PIN = 'p'+} DependencyType;++/*+ * There is also a SharedDependencyType enum type that determines the exact+ * semantics of an entry in pg_shdepend. Just like regular dependency entries,+ * any pg_shdepend entry means that the referenced object cannot be dropped+ * unless the dependent object is dropped at the same time. There are some+ * additional rules however:+ *+ * (a) For a SHARED_DEPENDENCY_PIN entry, there is no dependent object --+ * rather, the referenced object is an essential part of the system. This+ * applies to the initdb-created superuser. Entries of this type are only+ * created by initdb; objects in this category don't need further pg_shdepend+ * entries if more objects come to depend on them.+ *+ * (b) a SHARED_DEPENDENCY_OWNER entry means that the referenced object is+ * the role owning the dependent object. The referenced object must be+ * a pg_authid entry.+ *+ * (c) a SHARED_DEPENDENCY_ACL entry means that the referenced object is+ * a role mentioned in the ACL field of the dependent object. The referenced+ * object must be a pg_authid entry. (SHARED_DEPENDENCY_ACL entries are not+ * created for the owner of an object; hence two objects may be linked by+ * one or the other, but not both, of these dependency types.)+ *+ * (d) a SHARED_DEPENDENCY_POLICY entry means that the referenced object is+ * a role mentioned in a policy object. The referenced object must be a+ * pg_authid entry.+ *+ * SHARED_DEPENDENCY_INVALID is a value used as a parameter in internal+ * routines, and is not valid in the catalog itself.+ */+typedef enum SharedDependencyType+{+ SHARED_DEPENDENCY_PIN = 'p',+ SHARED_DEPENDENCY_OWNER = 'o',+ SHARED_DEPENDENCY_ACL = 'a',+ SHARED_DEPENDENCY_POLICY = 'r',+ SHARED_DEPENDENCY_INVALID = 0+} SharedDependencyType;++/* expansible list of ObjectAddresses (private in dependency.c) */+typedef struct ObjectAddresses ObjectAddresses;++/*+ * This enum covers all system catalogs whose OIDs can appear in+ * pg_depend.classId or pg_shdepend.classId. Keep object_classes[] in sync.+ */+typedef enum ObjectClass+{+ OCLASS_CLASS, /* pg_class */+ OCLASS_PROC, /* pg_proc */+ OCLASS_TYPE, /* pg_type */+ OCLASS_CAST, /* pg_cast */+ OCLASS_COLLATION, /* pg_collation */+ OCLASS_CONSTRAINT, /* pg_constraint */+ OCLASS_CONVERSION, /* pg_conversion */+ OCLASS_DEFAULT, /* pg_attrdef */+ OCLASS_LANGUAGE, /* pg_language */+ OCLASS_LARGEOBJECT, /* pg_largeobject */+ OCLASS_OPERATOR, /* pg_operator */+ OCLASS_OPCLASS, /* pg_opclass */+ OCLASS_OPFAMILY, /* pg_opfamily */+ OCLASS_AMOP, /* pg_amop */+ OCLASS_AMPROC, /* pg_amproc */+ OCLASS_REWRITE, /* pg_rewrite */+ OCLASS_TRIGGER, /* pg_trigger */+ OCLASS_SCHEMA, /* pg_namespace */+ OCLASS_TSPARSER, /* pg_ts_parser */+ OCLASS_TSDICT, /* pg_ts_dict */+ OCLASS_TSTEMPLATE, /* pg_ts_template */+ OCLASS_TSCONFIG, /* pg_ts_config */+ OCLASS_ROLE, /* pg_authid */+ OCLASS_DATABASE, /* pg_database */+ OCLASS_TBLSPACE, /* pg_tablespace */+ OCLASS_FDW, /* pg_foreign_data_wrapper */+ OCLASS_FOREIGN_SERVER, /* pg_foreign_server */+ OCLASS_USER_MAPPING, /* pg_user_mapping */+ OCLASS_DEFACL, /* pg_default_acl */+ OCLASS_EXTENSION, /* pg_extension */+ OCLASS_EVENT_TRIGGER, /* pg_event_trigger */+ OCLASS_POLICY, /* pg_policy */+ OCLASS_TRANSFORM /* pg_transform */+} ObjectClass;++#define LAST_OCLASS OCLASS_TRANSFORM+++/* in dependency.c */++#define PERFORM_DELETION_INTERNAL 0x0001+#define PERFORM_DELETION_CONCURRENTLY 0x0002++extern void performDeletion(const ObjectAddress *object,+ DropBehavior behavior, int flags);++extern void performMultipleDeletions(const ObjectAddresses *objects,+ DropBehavior behavior, int flags);++extern void deleteWhatDependsOn(const ObjectAddress *object,+ bool showNotices);++extern void recordDependencyOnExpr(const ObjectAddress *depender,+ Node *expr, List *rtable,+ DependencyType behavior);++extern void recordDependencyOnSingleRelExpr(const ObjectAddress *depender,+ Node *expr, Oid relId,+ DependencyType behavior,+ DependencyType self_behavior);++extern ObjectClass getObjectClass(const ObjectAddress *object);++extern ObjectAddresses *new_object_addresses(void);++extern void add_exact_object_address(const ObjectAddress *object,+ ObjectAddresses *addrs);++extern bool object_address_present(const ObjectAddress *object,+ const ObjectAddresses *addrs);++extern void record_object_address_dependencies(const ObjectAddress *depender,+ ObjectAddresses *referenced,+ DependencyType behavior);++extern void free_object_addresses(ObjectAddresses *addrs);++/* in pg_depend.c */++extern void recordDependencyOn(const ObjectAddress *depender,+ const ObjectAddress *referenced,+ DependencyType behavior);++extern void recordMultipleDependencies(const ObjectAddress *depender,+ const ObjectAddress *referenced,+ int nreferenced,+ DependencyType behavior);++extern void recordDependencyOnCurrentExtension(const ObjectAddress *object,+ bool isReplace);++extern long deleteDependencyRecordsFor(Oid classId, Oid objectId,+ bool skipExtensionDeps);++extern long deleteDependencyRecordsForClass(Oid classId, Oid objectId,+ Oid refclassId, char deptype);++extern long changeDependencyFor(Oid classId, Oid objectId,+ Oid refClassId, Oid oldRefObjectId,+ Oid newRefObjectId);++extern Oid getExtensionOfObject(Oid classId, Oid objectId);++extern bool sequenceIsOwned(Oid seqId, Oid *tableId, int32 *colId);++extern void markSequenceUnowned(Oid seqId);++extern List *getOwnedSequences(Oid relid);++extern Oid get_constraint_index(Oid constraintId);++extern Oid get_index_constraint(Oid indexId);++/* in pg_shdepend.c */++extern void recordSharedDependencyOn(ObjectAddress *depender,+ ObjectAddress *referenced,+ SharedDependencyType deptype);++extern void deleteSharedDependencyRecordsFor(Oid classId, Oid objectId,+ int32 objectSubId);++extern void recordDependencyOnOwner(Oid classId, Oid objectId, Oid owner);++extern void changeDependencyOnOwner(Oid classId, Oid objectId,+ Oid newOwnerId);++extern void updateAclDependencies(Oid classId, Oid objectId, int32 objectSubId,+ Oid ownerId,+ int noldmembers, Oid *oldmembers,+ int nnewmembers, Oid *newmembers);++extern bool checkSharedDependencies(Oid classId, Oid objectId,+ char **detail_msg, char **detail_log_msg);++extern void shdepLockAndCheckObject(Oid classId, Oid objectId);++extern void copyTemplateDependencies(Oid templateDbId, Oid newDbId);++extern void dropDatabaseDependencies(Oid databaseId);++extern void shdepDropOwned(List *relids, DropBehavior behavior);++extern void shdepReassignOwned(List *relids, Oid newrole);++#endif /* DEPENDENCY_H */
+ foreign/libpg_query/src/postgres/include/catalog/genbki.h view
@@ -0,0 +1,50 @@+/*-------------------------------------------------------------------------+ *+ * genbki.h+ * Required include file for all POSTGRES catalog header files+ *+ * genbki.h defines CATALOG(), DATA(), BKI_BOOTSTRAP and related macros+ * so that the catalog header files can be read by the C compiler.+ * (These same words are recognized by genbki.pl to build the BKI+ * bootstrap file from these header files.)+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/catalog/genbki.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef GENBKI_H+#define GENBKI_H++/* Introduces a catalog's structure definition */+#define CATALOG(name,oid) typedef struct CppConcat(FormData_,name)++/* Options that may appear after CATALOG (on the same line) */+#define BKI_BOOTSTRAP+#define BKI_SHARED_RELATION+#define BKI_WITHOUT_OIDS+#define BKI_ROWTYPE_OID(oid)+#define BKI_SCHEMA_MACRO+#define BKI_FORCE_NULL+#define BKI_FORCE_NOT_NULL++/*+ * This is never defined; it's here only for documentation.+ *+ * Variable-length catalog fields (except possibly the first not nullable one)+ * should not be visible in C structures, so they are made invisible by #ifdefs+ * of an undefined symbol. See also MARKNOTNULL in bootstrap.c for how this is+ * handled.+ */+#undef CATALOG_VARLEN++/* Declarations that provide the initial content of a catalog */+/* In C, these need to expand into some harmless, repeatable declaration */+#define DATA(x) extern int no_such_variable+#define DESCR(x) extern int no_such_variable+#define SHDESCR(x) extern int no_such_variable++#endif /* GENBKI_H */
+ foreign/libpg_query/src/postgres/include/catalog/index.h view
@@ -0,0 +1,134 @@+/*-------------------------------------------------------------------------+ *+ * index.h+ * prototypes for catalog/index.c.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/catalog/index.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef INDEX_H+#define INDEX_H++#include "catalog/objectaddress.h"+#include "nodes/execnodes.h"+++#define DEFAULT_INDEX_TYPE "btree"++/* Typedef for callback function for IndexBuildHeapScan */+typedef void (*IndexBuildCallback) (Relation index,+ HeapTuple htup,+ Datum *values,+ bool *isnull,+ bool tupleIsAlive,+ void *state);++/* Action code for index_set_state_flags */+typedef enum+{+ INDEX_CREATE_SET_READY,+ INDEX_CREATE_SET_VALID,+ INDEX_DROP_CLEAR_VALID,+ INDEX_DROP_SET_DEAD+} IndexStateFlagsAction;+++extern void index_check_primary_key(Relation heapRel,+ IndexInfo *indexInfo,+ bool is_alter_table);++extern Oid index_create(Relation heapRelation,+ const char *indexRelationName,+ Oid indexRelationId,+ Oid relFileNode,+ IndexInfo *indexInfo,+ List *indexColNames,+ Oid accessMethodObjectId,+ Oid tableSpaceId,+ Oid *collationObjectId,+ Oid *classObjectId,+ int16 *coloptions,+ Datum reloptions,+ bool isprimary,+ bool isconstraint,+ bool deferrable,+ bool initdeferred,+ bool allow_system_table_mods,+ bool skip_build,+ bool concurrent,+ bool is_internal,+ bool if_not_exists);++extern ObjectAddress index_constraint_create(Relation heapRelation,+ Oid indexRelationId,+ IndexInfo *indexInfo,+ const char *constraintName,+ char constraintType,+ bool deferrable,+ bool initdeferred,+ bool mark_as_primary,+ bool update_pgindex,+ bool remove_old_dependencies,+ bool allow_system_table_mods,+ bool is_internal);++extern void index_drop(Oid indexId, bool concurrent);++extern IndexInfo *BuildIndexInfo(Relation index);++extern void BuildSpeculativeIndexInfo(Relation index, IndexInfo *ii);++extern void FormIndexDatum(IndexInfo *indexInfo,+ TupleTableSlot *slot,+ EState *estate,+ Datum *values,+ bool *isnull);++extern void index_build(Relation heapRelation,+ Relation indexRelation,+ IndexInfo *indexInfo,+ bool isprimary,+ bool isreindex);++extern double IndexBuildHeapScan(Relation heapRelation,+ Relation indexRelation,+ IndexInfo *indexInfo,+ bool allow_sync,+ IndexBuildCallback callback,+ void *callback_state);+extern double IndexBuildHeapRangeScan(Relation heapRelation,+ Relation indexRelation,+ IndexInfo *indexInfo,+ bool allow_sync,+ bool anyvisible,+ BlockNumber start_blockno,+ BlockNumber end_blockno,+ IndexBuildCallback callback,+ void *callback_state);++extern void validate_index(Oid heapId, Oid indexId, Snapshot snapshot);++extern void index_set_state_flags(Oid indexId, IndexStateFlagsAction action);++extern void reindex_index(Oid indexId, bool skip_constraint_checks,+ char relpersistence, int options);++/* Flag bits for reindex_relation(): */+#define REINDEX_REL_PROCESS_TOAST 0x01+#define REINDEX_REL_SUPPRESS_INDEX_USE 0x02+#define REINDEX_REL_CHECK_CONSTRAINTS 0x04+#define REINDEX_REL_FORCE_INDEXES_UNLOGGED 0x08+#define REINDEX_REL_FORCE_INDEXES_PERMANENT 0x10++extern bool reindex_relation(Oid relid, int flags, int options);++extern bool ReindexIsProcessingHeap(Oid heapOid);+extern bool ReindexIsProcessingIndex(Oid indexOid);+extern Oid IndexGetRelation(Oid indexId, bool missing_ok);++#endif /* INDEX_H */
+ foreign/libpg_query/src/postgres/include/catalog/indexing.h view
@@ -0,0 +1,322 @@+/*-------------------------------------------------------------------------+ *+ * indexing.h+ * This file provides some definitions to support indexing+ * on system catalogs+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/catalog/indexing.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef INDEXING_H+#define INDEXING_H++#include "access/htup.h"+#include "utils/relcache.h"++/*+ * The state object used by CatalogOpenIndexes and friends is actually the+ * same as the executor's ResultRelInfo, but we give it another type name+ * to decouple callers from that fact.+ */+typedef struct ResultRelInfo *CatalogIndexState;++/*+ * indexing.c prototypes+ */+extern CatalogIndexState CatalogOpenIndexes(Relation heapRel);+extern void CatalogCloseIndexes(CatalogIndexState indstate);+extern void CatalogIndexInsert(CatalogIndexState indstate,+ HeapTuple heapTuple);+extern void CatalogUpdateIndexes(Relation heapRel, HeapTuple heapTuple);+++/*+ * These macros are just to keep the C compiler from spitting up on the+ * upcoming commands for genbki.pl.+ */+#define DECLARE_INDEX(name,oid,decl) extern int no_such_variable+#define DECLARE_UNIQUE_INDEX(name,oid,decl) extern int no_such_variable+#define BUILD_INDICES+++/*+ * What follows are lines processed by genbki.pl to create the statements+ * the bootstrap parser will turn into DefineIndex calls.+ *+ * The keyword is DECLARE_INDEX or DECLARE_UNIQUE_INDEX. The first two+ * arguments are the index name and OID, the rest is much like a standard+ * 'create index' SQL command.+ *+ * For each index, we also provide a #define for its OID. References to+ * the index in the C code should always use these #defines, not the actual+ * index name (much less the numeric OID).+ */++DECLARE_UNIQUE_INDEX(pg_aggregate_fnoid_index, 2650, on pg_aggregate using btree(aggfnoid oid_ops));+#define AggregateFnoidIndexId 2650++DECLARE_UNIQUE_INDEX(pg_am_name_index, 2651, on pg_am using btree(amname name_ops));+#define AmNameIndexId 2651+DECLARE_UNIQUE_INDEX(pg_am_oid_index, 2652, on pg_am using btree(oid oid_ops));+#define AmOidIndexId 2652++DECLARE_UNIQUE_INDEX(pg_amop_fam_strat_index, 2653, on pg_amop using btree(amopfamily oid_ops, amoplefttype oid_ops, amoprighttype oid_ops, amopstrategy int2_ops));+#define AccessMethodStrategyIndexId 2653+DECLARE_UNIQUE_INDEX(pg_amop_opr_fam_index, 2654, on pg_amop using btree(amopopr oid_ops, amoppurpose char_ops, amopfamily oid_ops));+#define AccessMethodOperatorIndexId 2654+DECLARE_UNIQUE_INDEX(pg_amop_oid_index, 2756, on pg_amop using btree(oid oid_ops));+#define AccessMethodOperatorOidIndexId 2756++DECLARE_UNIQUE_INDEX(pg_amproc_fam_proc_index, 2655, on pg_amproc using btree(amprocfamily oid_ops, amproclefttype oid_ops, amprocrighttype oid_ops, amprocnum int2_ops));+#define AccessMethodProcedureIndexId 2655+DECLARE_UNIQUE_INDEX(pg_amproc_oid_index, 2757, on pg_amproc using btree(oid oid_ops));+#define AccessMethodProcedureOidIndexId 2757++DECLARE_UNIQUE_INDEX(pg_attrdef_adrelid_adnum_index, 2656, on pg_attrdef using btree(adrelid oid_ops, adnum int2_ops));+#define AttrDefaultIndexId 2656+DECLARE_UNIQUE_INDEX(pg_attrdef_oid_index, 2657, on pg_attrdef using btree(oid oid_ops));+#define AttrDefaultOidIndexId 2657++DECLARE_UNIQUE_INDEX(pg_attribute_relid_attnam_index, 2658, on pg_attribute using btree(attrelid oid_ops, attname name_ops));+#define AttributeRelidNameIndexId 2658+DECLARE_UNIQUE_INDEX(pg_attribute_relid_attnum_index, 2659, on pg_attribute using btree(attrelid oid_ops, attnum int2_ops));+#define AttributeRelidNumIndexId 2659++DECLARE_UNIQUE_INDEX(pg_authid_rolname_index, 2676, on pg_authid using btree(rolname name_ops));+#define AuthIdRolnameIndexId 2676+DECLARE_UNIQUE_INDEX(pg_authid_oid_index, 2677, on pg_authid using btree(oid oid_ops));+#define AuthIdOidIndexId 2677++DECLARE_UNIQUE_INDEX(pg_auth_members_role_member_index, 2694, on pg_auth_members using btree(roleid oid_ops, member oid_ops));+#define AuthMemRoleMemIndexId 2694+DECLARE_UNIQUE_INDEX(pg_auth_members_member_role_index, 2695, on pg_auth_members using btree(member oid_ops, roleid oid_ops));+#define AuthMemMemRoleIndexId 2695++DECLARE_UNIQUE_INDEX(pg_cast_oid_index, 2660, on pg_cast using btree(oid oid_ops));+#define CastOidIndexId 2660+DECLARE_UNIQUE_INDEX(pg_cast_source_target_index, 2661, on pg_cast using btree(castsource oid_ops, casttarget oid_ops));+#define CastSourceTargetIndexId 2661++DECLARE_UNIQUE_INDEX(pg_class_oid_index, 2662, on pg_class using btree(oid oid_ops));+#define ClassOidIndexId 2662+DECLARE_UNIQUE_INDEX(pg_class_relname_nsp_index, 2663, on pg_class using btree(relname name_ops, relnamespace oid_ops));+#define ClassNameNspIndexId 2663+DECLARE_INDEX(pg_class_tblspc_relfilenode_index, 3455, on pg_class using btree(reltablespace oid_ops, relfilenode oid_ops));+#define ClassTblspcRelfilenodeIndexId 3455++DECLARE_UNIQUE_INDEX(pg_collation_name_enc_nsp_index, 3164, on pg_collation using btree(collname name_ops, collencoding int4_ops, collnamespace oid_ops));+#define CollationNameEncNspIndexId 3164+DECLARE_UNIQUE_INDEX(pg_collation_oid_index, 3085, on pg_collation using btree(oid oid_ops));+#define CollationOidIndexId 3085++DECLARE_INDEX(pg_constraint_conname_nsp_index, 2664, on pg_constraint using btree(conname name_ops, connamespace oid_ops));+#define ConstraintNameNspIndexId 2664+DECLARE_INDEX(pg_constraint_conrelid_index, 2665, on pg_constraint using btree(conrelid oid_ops));+#define ConstraintRelidIndexId 2665+DECLARE_INDEX(pg_constraint_contypid_index, 2666, on pg_constraint using btree(contypid oid_ops));+#define ConstraintTypidIndexId 2666+DECLARE_UNIQUE_INDEX(pg_constraint_oid_index, 2667, on pg_constraint using btree(oid oid_ops));+#define ConstraintOidIndexId 2667++DECLARE_UNIQUE_INDEX(pg_conversion_default_index, 2668, on pg_conversion using btree(connamespace oid_ops, conforencoding int4_ops, contoencoding int4_ops, oid oid_ops));+#define ConversionDefaultIndexId 2668+DECLARE_UNIQUE_INDEX(pg_conversion_name_nsp_index, 2669, on pg_conversion using btree(conname name_ops, connamespace oid_ops));+#define ConversionNameNspIndexId 2669+DECLARE_UNIQUE_INDEX(pg_conversion_oid_index, 2670, on pg_conversion using btree(oid oid_ops));+#define ConversionOidIndexId 2670++DECLARE_UNIQUE_INDEX(pg_database_datname_index, 2671, on pg_database using btree(datname name_ops));+#define DatabaseNameIndexId 2671+DECLARE_UNIQUE_INDEX(pg_database_oid_index, 2672, on pg_database using btree(oid oid_ops));+#define DatabaseOidIndexId 2672++DECLARE_INDEX(pg_depend_depender_index, 2673, on pg_depend using btree(classid oid_ops, objid oid_ops, objsubid int4_ops));+#define DependDependerIndexId 2673+DECLARE_INDEX(pg_depend_reference_index, 2674, on pg_depend using btree(refclassid oid_ops, refobjid oid_ops, refobjsubid int4_ops));+#define DependReferenceIndexId 2674++DECLARE_UNIQUE_INDEX(pg_description_o_c_o_index, 2675, on pg_description using btree(objoid oid_ops, classoid oid_ops, objsubid int4_ops));+#define DescriptionObjIndexId 2675+DECLARE_UNIQUE_INDEX(pg_shdescription_o_c_index, 2397, on pg_shdescription using btree(objoid oid_ops, classoid oid_ops));+#define SharedDescriptionObjIndexId 2397++DECLARE_UNIQUE_INDEX(pg_enum_oid_index, 3502, on pg_enum using btree(oid oid_ops));+#define EnumOidIndexId 3502+DECLARE_UNIQUE_INDEX(pg_enum_typid_label_index, 3503, on pg_enum using btree(enumtypid oid_ops, enumlabel name_ops));+#define EnumTypIdLabelIndexId 3503+DECLARE_UNIQUE_INDEX(pg_enum_typid_sortorder_index, 3534, on pg_enum using btree(enumtypid oid_ops, enumsortorder float4_ops));+#define EnumTypIdSortOrderIndexId 3534++DECLARE_INDEX(pg_index_indrelid_index, 2678, on pg_index using btree(indrelid oid_ops));+#define IndexIndrelidIndexId 2678+DECLARE_UNIQUE_INDEX(pg_index_indexrelid_index, 2679, on pg_index using btree(indexrelid oid_ops));+#define IndexRelidIndexId 2679++DECLARE_UNIQUE_INDEX(pg_inherits_relid_seqno_index, 2680, on pg_inherits using btree(inhrelid oid_ops, inhseqno int4_ops));+#define InheritsRelidSeqnoIndexId 2680+DECLARE_INDEX(pg_inherits_parent_index, 2187, on pg_inherits using btree(inhparent oid_ops));+#define InheritsParentIndexId 2187++DECLARE_UNIQUE_INDEX(pg_language_name_index, 2681, on pg_language using btree(lanname name_ops));+#define LanguageNameIndexId 2681+DECLARE_UNIQUE_INDEX(pg_language_oid_index, 2682, on pg_language using btree(oid oid_ops));+#define LanguageOidIndexId 2682++DECLARE_UNIQUE_INDEX(pg_largeobject_loid_pn_index, 2683, on pg_largeobject using btree(loid oid_ops, pageno int4_ops));+#define LargeObjectLOidPNIndexId 2683++DECLARE_UNIQUE_INDEX(pg_largeobject_metadata_oid_index, 2996, on pg_largeobject_metadata using btree(oid oid_ops));+#define LargeObjectMetadataOidIndexId 2996++DECLARE_UNIQUE_INDEX(pg_namespace_nspname_index, 2684, on pg_namespace using btree(nspname name_ops));+#define NamespaceNameIndexId 2684+DECLARE_UNIQUE_INDEX(pg_namespace_oid_index, 2685, on pg_namespace using btree(oid oid_ops));+#define NamespaceOidIndexId 2685++DECLARE_UNIQUE_INDEX(pg_opclass_am_name_nsp_index, 2686, on pg_opclass using btree(opcmethod oid_ops, opcname name_ops, opcnamespace oid_ops));+#define OpclassAmNameNspIndexId 2686+DECLARE_UNIQUE_INDEX(pg_opclass_oid_index, 2687, on pg_opclass using btree(oid oid_ops));+#define OpclassOidIndexId 2687++DECLARE_UNIQUE_INDEX(pg_operator_oid_index, 2688, on pg_operator using btree(oid oid_ops));+#define OperatorOidIndexId 2688+DECLARE_UNIQUE_INDEX(pg_operator_oprname_l_r_n_index, 2689, on pg_operator using btree(oprname name_ops, oprleft oid_ops, oprright oid_ops, oprnamespace oid_ops));+#define OperatorNameNspIndexId 2689++DECLARE_UNIQUE_INDEX(pg_opfamily_am_name_nsp_index, 2754, on pg_opfamily using btree(opfmethod oid_ops, opfname name_ops, opfnamespace oid_ops));+#define OpfamilyAmNameNspIndexId 2754+DECLARE_UNIQUE_INDEX(pg_opfamily_oid_index, 2755, on pg_opfamily using btree(oid oid_ops));+#define OpfamilyOidIndexId 2755++DECLARE_UNIQUE_INDEX(pg_pltemplate_name_index, 1137, on pg_pltemplate using btree(tmplname name_ops));+#define PLTemplateNameIndexId 1137++DECLARE_UNIQUE_INDEX(pg_proc_oid_index, 2690, on pg_proc using btree(oid oid_ops));+#define ProcedureOidIndexId 2690+DECLARE_UNIQUE_INDEX(pg_proc_proname_args_nsp_index, 2691, on pg_proc using btree(proname name_ops, proargtypes oidvector_ops, pronamespace oid_ops));+#define ProcedureNameArgsNspIndexId 2691++DECLARE_UNIQUE_INDEX(pg_rewrite_oid_index, 2692, on pg_rewrite using btree(oid oid_ops));+#define RewriteOidIndexId 2692+DECLARE_UNIQUE_INDEX(pg_rewrite_rel_rulename_index, 2693, on pg_rewrite using btree(ev_class oid_ops, rulename name_ops));+#define RewriteRelRulenameIndexId 2693++DECLARE_INDEX(pg_shdepend_depender_index, 1232, on pg_shdepend using btree(dbid oid_ops, classid oid_ops, objid oid_ops, objsubid int4_ops));+#define SharedDependDependerIndexId 1232+DECLARE_INDEX(pg_shdepend_reference_index, 1233, on pg_shdepend using btree(refclassid oid_ops, refobjid oid_ops));+#define SharedDependReferenceIndexId 1233++DECLARE_UNIQUE_INDEX(pg_statistic_relid_att_inh_index, 2696, on pg_statistic using btree(starelid oid_ops, staattnum int2_ops, stainherit bool_ops));+#define StatisticRelidAttnumInhIndexId 2696++DECLARE_UNIQUE_INDEX(pg_tablespace_oid_index, 2697, on pg_tablespace using btree(oid oid_ops));+#define TablespaceOidIndexId 2697+DECLARE_UNIQUE_INDEX(pg_tablespace_spcname_index, 2698, on pg_tablespace using btree(spcname name_ops));+#define TablespaceNameIndexId 2698++DECLARE_UNIQUE_INDEX(pg_transform_oid_index, 3574, on pg_transform using btree(oid oid_ops));+#define TransformOidIndexId 3574+DECLARE_UNIQUE_INDEX(pg_transform_type_lang_index, 3575, on pg_transform using btree(trftype oid_ops, trflang oid_ops));+#define TransformTypeLangIndexId 3575++DECLARE_INDEX(pg_trigger_tgconstraint_index, 2699, on pg_trigger using btree(tgconstraint oid_ops));+#define TriggerConstraintIndexId 2699+DECLARE_UNIQUE_INDEX(pg_trigger_tgrelid_tgname_index, 2701, on pg_trigger using btree(tgrelid oid_ops, tgname name_ops));+#define TriggerRelidNameIndexId 2701+DECLARE_UNIQUE_INDEX(pg_trigger_oid_index, 2702, on pg_trigger using btree(oid oid_ops));+#define TriggerOidIndexId 2702++DECLARE_UNIQUE_INDEX(pg_event_trigger_evtname_index, 3467, on pg_event_trigger using btree(evtname name_ops));+#define EventTriggerNameIndexId 3467+DECLARE_UNIQUE_INDEX(pg_event_trigger_oid_index, 3468, on pg_event_trigger using btree(oid oid_ops));+#define EventTriggerOidIndexId 3468++DECLARE_UNIQUE_INDEX(pg_ts_config_cfgname_index, 3608, on pg_ts_config using btree(cfgname name_ops, cfgnamespace oid_ops));+#define TSConfigNameNspIndexId 3608+DECLARE_UNIQUE_INDEX(pg_ts_config_oid_index, 3712, on pg_ts_config using btree(oid oid_ops));+#define TSConfigOidIndexId 3712++DECLARE_UNIQUE_INDEX(pg_ts_config_map_index, 3609, on pg_ts_config_map using btree(mapcfg oid_ops, maptokentype int4_ops, mapseqno int4_ops));+#define TSConfigMapIndexId 3609++DECLARE_UNIQUE_INDEX(pg_ts_dict_dictname_index, 3604, on pg_ts_dict using btree(dictname name_ops, dictnamespace oid_ops));+#define TSDictionaryNameNspIndexId 3604+DECLARE_UNIQUE_INDEX(pg_ts_dict_oid_index, 3605, on pg_ts_dict using btree(oid oid_ops));+#define TSDictionaryOidIndexId 3605++DECLARE_UNIQUE_INDEX(pg_ts_parser_prsname_index, 3606, on pg_ts_parser using btree(prsname name_ops, prsnamespace oid_ops));+#define TSParserNameNspIndexId 3606+DECLARE_UNIQUE_INDEX(pg_ts_parser_oid_index, 3607, on pg_ts_parser using btree(oid oid_ops));+#define TSParserOidIndexId 3607++DECLARE_UNIQUE_INDEX(pg_ts_template_tmplname_index, 3766, on pg_ts_template using btree(tmplname name_ops, tmplnamespace oid_ops));+#define TSTemplateNameNspIndexId 3766+DECLARE_UNIQUE_INDEX(pg_ts_template_oid_index, 3767, on pg_ts_template using btree(oid oid_ops));+#define TSTemplateOidIndexId 3767++DECLARE_UNIQUE_INDEX(pg_type_oid_index, 2703, on pg_type using btree(oid oid_ops));+#define TypeOidIndexId 2703+DECLARE_UNIQUE_INDEX(pg_type_typname_nsp_index, 2704, on pg_type using btree(typname name_ops, typnamespace oid_ops));+#define TypeNameNspIndexId 2704++DECLARE_UNIQUE_INDEX(pg_foreign_data_wrapper_oid_index, 112, on pg_foreign_data_wrapper using btree(oid oid_ops));+#define ForeignDataWrapperOidIndexId 112+DECLARE_UNIQUE_INDEX(pg_foreign_data_wrapper_name_index, 548, on pg_foreign_data_wrapper using btree(fdwname name_ops));+#define ForeignDataWrapperNameIndexId 548++DECLARE_UNIQUE_INDEX(pg_foreign_server_oid_index, 113, on pg_foreign_server using btree(oid oid_ops));+#define ForeignServerOidIndexId 113+DECLARE_UNIQUE_INDEX(pg_foreign_server_name_index, 549, on pg_foreign_server using btree(srvname name_ops));+#define ForeignServerNameIndexId 549++DECLARE_UNIQUE_INDEX(pg_user_mapping_oid_index, 174, on pg_user_mapping using btree(oid oid_ops));+#define UserMappingOidIndexId 174+DECLARE_UNIQUE_INDEX(pg_user_mapping_user_server_index, 175, on pg_user_mapping using btree(umuser oid_ops, umserver oid_ops));+#define UserMappingUserServerIndexId 175++DECLARE_UNIQUE_INDEX(pg_foreign_table_relid_index, 3119, on pg_foreign_table using btree(ftrelid oid_ops));+#define ForeignTableRelidIndexId 3119++DECLARE_UNIQUE_INDEX(pg_default_acl_role_nsp_obj_index, 827, on pg_default_acl using btree(defaclrole oid_ops, defaclnamespace oid_ops, defaclobjtype char_ops));+#define DefaultAclRoleNspObjIndexId 827+DECLARE_UNIQUE_INDEX(pg_default_acl_oid_index, 828, on pg_default_acl using btree(oid oid_ops));+#define DefaultAclOidIndexId 828++DECLARE_UNIQUE_INDEX(pg_db_role_setting_databaseid_rol_index, 2965, on pg_db_role_setting using btree(setdatabase oid_ops, setrole oid_ops));+#define DbRoleSettingDatidRolidIndexId 2965++DECLARE_UNIQUE_INDEX(pg_seclabel_object_index, 3597, on pg_seclabel using btree(objoid oid_ops, classoid oid_ops, objsubid int4_ops, provider text_pattern_ops));+#define SecLabelObjectIndexId 3597++DECLARE_UNIQUE_INDEX(pg_shseclabel_object_index, 3593, on pg_shseclabel using btree(objoid oid_ops, classoid oid_ops, provider text_pattern_ops));+#define SharedSecLabelObjectIndexId 3593++DECLARE_UNIQUE_INDEX(pg_extension_oid_index, 3080, on pg_extension using btree(oid oid_ops));+#define ExtensionOidIndexId 3080+DECLARE_UNIQUE_INDEX(pg_extension_name_index, 3081, on pg_extension using btree(extname name_ops));+#define ExtensionNameIndexId 3081++DECLARE_UNIQUE_INDEX(pg_range_rngtypid_index, 3542, on pg_range using btree(rngtypid oid_ops));+#define RangeTypidIndexId 3542++DECLARE_UNIQUE_INDEX(pg_policy_oid_index, 3257, on pg_policy using btree(oid oid_ops));+#define PolicyOidIndexId 3257++DECLARE_UNIQUE_INDEX(pg_policy_polrelid_polname_index, 3258, on pg_policy using btree(polrelid oid_ops, polname name_ops));+#define PolicyPolrelidPolnameIndexId 3258++DECLARE_UNIQUE_INDEX(pg_replication_origin_roiident_index, 6001, on pg_replication_origin using btree(roident oid_ops));+#define ReplicationOriginIdentIndex 6001++DECLARE_UNIQUE_INDEX(pg_replication_origin_roname_index, 6002, on pg_replication_origin using btree(roname text_pattern_ops));+#define ReplicationOriginNameIndex 6002++/* last step of initialization script: build the indexes declared above */+BUILD_INDICES++#endif /* INDEXING_H */
+ foreign/libpg_query/src/postgres/include/catalog/namespace.h view
@@ -0,0 +1,153 @@+/*-------------------------------------------------------------------------+ *+ * namespace.h+ * prototypes for functions in backend/catalog/namespace.c+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/catalog/namespace.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef NAMESPACE_H+#define NAMESPACE_H++#include "nodes/primnodes.h"+#include "storage/lock.h"+++/*+ * This structure holds a list of possible functions or operators+ * found by namespace lookup. Each function/operator is identified+ * by OID and by argument types; the list must be pruned by type+ * resolution rules that are embodied in the parser, not here.+ * See FuncnameGetCandidates's comments for more info.+ */+typedef struct _FuncCandidateList+{+ struct _FuncCandidateList *next;+ int pathpos; /* for internal use of namespace lookup */+ Oid oid; /* the function or operator's OID */+ int nargs; /* number of arg types returned */+ int nvargs; /* number of args to become variadic array */+ int ndargs; /* number of defaulted args */+ int *argnumbers; /* args' positional indexes, if named call */+ Oid args[FLEXIBLE_ARRAY_MEMBER]; /* arg types */+} *FuncCandidateList;++/*+ * Structure for xxxOverrideSearchPath functions+ */+typedef struct OverrideSearchPath+{+ List *schemas; /* OIDs of explicitly named schemas */+ bool addCatalog; /* implicitly prepend pg_catalog? */+ bool addTemp; /* implicitly prepend temp schema? */+} OverrideSearchPath;++typedef void (*RangeVarGetRelidCallback) (const RangeVar *relation, Oid relId,+ Oid oldRelId, void *callback_arg);++#define RangeVarGetRelid(relation, lockmode, missing_ok) \+ RangeVarGetRelidExtended(relation, lockmode, missing_ok, false, NULL, NULL)++extern Oid RangeVarGetRelidExtended(const RangeVar *relation,+ LOCKMODE lockmode, bool missing_ok, bool nowait,+ RangeVarGetRelidCallback callback,+ void *callback_arg);+extern Oid RangeVarGetCreationNamespace(const RangeVar *newRelation);+extern Oid RangeVarGetAndCheckCreationNamespace(RangeVar *newRelation,+ LOCKMODE lockmode,+ Oid *existing_relation_id);+extern void RangeVarAdjustRelationPersistence(RangeVar *newRelation, Oid nspid);+extern Oid RelnameGetRelid(const char *relname);+extern bool RelationIsVisible(Oid relid);++extern Oid TypenameGetTypid(const char *typname);+extern bool TypeIsVisible(Oid typid);++extern FuncCandidateList FuncnameGetCandidates(List *names,+ int nargs, List *argnames,+ bool expand_variadic,+ bool expand_defaults,+ bool missing_ok);+extern bool FunctionIsVisible(Oid funcid);++extern Oid OpernameGetOprid(List *names, Oid oprleft, Oid oprright);+extern FuncCandidateList OpernameGetCandidates(List *names, char oprkind,+ bool missing_schema_ok);+extern bool OperatorIsVisible(Oid oprid);++extern Oid OpclassnameGetOpcid(Oid amid, const char *opcname);+extern bool OpclassIsVisible(Oid opcid);++extern Oid OpfamilynameGetOpfid(Oid amid, const char *opfname);+extern bool OpfamilyIsVisible(Oid opfid);++extern Oid CollationGetCollid(const char *collname);+extern bool CollationIsVisible(Oid collid);++extern Oid ConversionGetConid(const char *conname);+extern bool ConversionIsVisible(Oid conid);++extern Oid get_ts_parser_oid(List *names, bool missing_ok);+extern bool TSParserIsVisible(Oid prsId);++extern Oid get_ts_dict_oid(List *names, bool missing_ok);+extern bool TSDictionaryIsVisible(Oid dictId);++extern Oid get_ts_template_oid(List *names, bool missing_ok);+extern bool TSTemplateIsVisible(Oid tmplId);++extern Oid get_ts_config_oid(List *names, bool missing_ok);+extern bool TSConfigIsVisible(Oid cfgid);++extern void DeconstructQualifiedName(List *names,+ char **nspname_p,+ char **objname_p);+extern Oid LookupNamespaceNoError(const char *nspname);+extern Oid LookupExplicitNamespace(const char *nspname, bool missing_ok);+extern Oid get_namespace_oid(const char *nspname, bool missing_ok);++extern Oid LookupCreationNamespace(const char *nspname);+extern void CheckSetNamespace(Oid oldNspOid, Oid nspOid, Oid classid,+ Oid objid);+extern Oid QualifiedNameGetCreationNamespace(List *names, char **objname_p);+extern RangeVar *makeRangeVarFromNameList(List *names);+extern char *NameListToString(List *names);+extern char *NameListToQuotedString(List *names);++extern bool isTempNamespace(Oid namespaceId);+extern bool isTempToastNamespace(Oid namespaceId);+extern bool isTempOrTempToastNamespace(Oid namespaceId);+extern bool isAnyTempNamespace(Oid namespaceId);+extern bool isOtherTempNamespace(Oid namespaceId);+extern int GetTempNamespaceBackendId(Oid namespaceId);+extern Oid GetTempToastNamespace(void);+extern void ResetTempTableNamespace(void);++extern OverrideSearchPath *GetOverrideSearchPath(MemoryContext context);+extern OverrideSearchPath *CopyOverrideSearchPath(OverrideSearchPath *path);+extern bool OverrideSearchPathMatchesCurrent(OverrideSearchPath *path);+extern void PushOverrideSearchPath(OverrideSearchPath *newpath);+extern void PopOverrideSearchPath(void);++extern Oid get_collation_oid(List *collname, bool missing_ok);+extern Oid get_conversion_oid(List *conname, bool missing_ok);+extern Oid FindDefaultConversionProc(int32 for_encoding, int32 to_encoding);++/* initialization & transaction cleanup code */+extern void InitializeSearchPath(void);+extern void AtEOXact_Namespace(bool isCommit, bool parallel);+extern void AtEOSubXact_Namespace(bool isCommit, SubTransactionId mySubid,+ SubTransactionId parentSubid);++/* stuff for search_path GUC variable */+extern char *namespace_search_path;++extern List *fetch_search_path(bool includeImplicit);+extern int fetch_search_path_array(Oid *sarray, int sarray_len);++#endif /* NAMESPACE_H */
+ foreign/libpg_query/src/postgres/include/catalog/objectaccess.h view
@@ -0,0 +1,185 @@+/*+ * objectaccess.h+ *+ * Object access hooks.+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ */++#ifndef OBJECTACCESS_H+#define OBJECTACCESS_H++/*+ * Object access hooks are intended to be called just before or just after+ * performing certain actions on a SQL object. This is intended as+ * infrastructure for security or logging plugins.+ *+ * OAT_POST_CREATE should be invoked just after the object is created.+ * Typically, this is done after inserting the primary catalog records and+ * associated dependencies.+ *+ * OAT_DROP should be invoked just before deletion of objects; typically+ * deleteOneObject(). Its arguments are packed within ObjectAccessDrop.+ *+ * OAT_POST_ALTER should be invoked just after the object is altered,+ * but before the command counter is incremented. An extension using the+ * hook can use a current MVCC snapshot to get the old version of the tuple,+ * and can use SnapshotSelf to get the new version of the tuple.+ *+ * OAT_NAMESPACE_SEARCH should be invoked prior to object name lookup under+ * a particular namespace. This event is equivalent to usage permission+ * on a schema under the default access control mechanism.+ *+ * OAT_FUNCTION_EXECUTE should be invoked prior to function execution.+ * This event is almost equivalent to execute permission on functions,+ * except for the case when execute permission is checked during object+ * creation or altering, because OAT_POST_CREATE or OAT_POST_ALTER are+ * sufficient for extensions to track these kind of checks.+ *+ * Other types may be added in the future.+ */+typedef enum ObjectAccessType+{+ OAT_POST_CREATE,+ OAT_DROP,+ OAT_POST_ALTER,+ OAT_NAMESPACE_SEARCH,+ OAT_FUNCTION_EXECUTE+} ObjectAccessType;++/*+ * Arguments of OAT_POST_CREATE event+ */+typedef struct+{+ /*+ * This flag informs extensions whether the context of this creation is+ * invoked by user's operations, or not. E.g, it shall be dealt as+ * internal stuff on toast tables or indexes due to type changes.+ */+ bool is_internal;+} ObjectAccessPostCreate;++/*+ * Arguments of OAT_DROP event+ */+typedef struct+{+ /*+ * Flags to inform extensions the context of this deletion. Also see+ * PERFORM_DELETION_* in dependency.h+ */+ int dropflags;+} ObjectAccessDrop;++/*+ * Arguments of OAT_POST_ALTER event+ */+typedef struct+{+ /*+ * This identifier is used when system catalog takes two IDs to identify a+ * particular tuple of the catalog. It is only used when the caller want+ * to identify an entry of pg_inherits, pg_db_role_setting or+ * pg_user_mapping. Elsewhere, InvalidOid should be set.+ */+ Oid auxiliary_id;++ /*+ * If this flag is set, the user hasn't requested that the object be+ * altered, but we're doing it anyway for some internal reason.+ * Permissions-checking hooks may want to skip checks if, say, we're alter+ * the constraints of a temporary heap during CLUSTER.+ */+ bool is_internal;+} ObjectAccessPostAlter;++/*+ * Arguments of OAT_NAMESPACE_SEARCH+ */+typedef struct+{+ /*+ * If true, hook should report an error when permission to search this+ * schema is denied.+ */+ bool ereport_on_violation;++ /*+ * This is, in essence, an out parameter. Core code should initialize+ * this to true, and any extension that wants to deny access should reset+ * it to false. But an extension should be careful never to store a true+ * value here, so that in case there are multiple extensions access is+ * only allowed if all extensions agree.+ */+ bool result;+} ObjectAccessNamespaceSearch;++/* Plugin provides a hook function matching this signature. */+typedef void (*object_access_hook_type) (ObjectAccessType access,+ Oid classId,+ Oid objectId,+ int subId,+ void *arg);++/* Plugin sets this variable to a suitable hook function. */+extern PGDLLIMPORT object_access_hook_type object_access_hook;++/* Core code uses these functions to call the hook (see macros below). */+extern void RunObjectPostCreateHook(Oid classId, Oid objectId, int subId,+ bool is_internal);+extern void RunObjectDropHook(Oid classId, Oid objectId, int subId,+ int dropflags);+extern void RunObjectPostAlterHook(Oid classId, Oid objectId, int subId,+ Oid auxiliaryId, bool is_internal);+extern bool RunNamespaceSearchHook(Oid objectId, bool ereport_on_volation);+extern void RunFunctionExecuteHook(Oid objectId);++/*+ * The following macros are wrappers around the functions above; these should+ * normally be used to invoke the hook in lieu of calling the above functions+ * directly.+ */++#define InvokeObjectPostCreateHook(classId,objectId,subId) \+ InvokeObjectPostCreateHookArg((classId),(objectId),(subId),false)+#define InvokeObjectPostCreateHookArg(classId,objectId,subId,is_internal) \+ do { \+ if (object_access_hook) \+ RunObjectPostCreateHook((classId),(objectId),(subId), \+ (is_internal)); \+ } while(0)++#define InvokeObjectDropHook(classId,objectId,subId) \+ InvokeObjectDropHookArg((classId),(objectId),(subId),0)+#define InvokeObjectDropHookArg(classId,objectId,subId,dropflags) \+ do { \+ if (object_access_hook) \+ RunObjectDropHook((classId),(objectId),(subId), \+ (dropflags)); \+ } while(0)++#define InvokeObjectPostAlterHook(classId,objectId,subId) \+ InvokeObjectPostAlterHookArg((classId),(objectId),(subId), \+ InvalidOid,false)+#define InvokeObjectPostAlterHookArg(classId,objectId,subId, \+ auxiliaryId,is_internal) \+ do { \+ if (object_access_hook) \+ RunObjectPostAlterHook((classId),(objectId),(subId), \+ (auxiliaryId),(is_internal)); \+ } while(0)++#define InvokeNamespaceSearchHook(objectId, ereport_on_violation) \+ (!object_access_hook \+ ? true \+ : RunNamespaceSearchHook((objectId), (ereport_on_violation)))++#define InvokeFunctionExecuteHook(objectId) \+ do { \+ if (object_access_hook) \+ RunFunctionExecuteHook(objectId); \+ } while(0)++#endif /* OBJECTACCESS_H */
+ foreign/libpg_query/src/postgres/include/catalog/objectaddress.h view
@@ -0,0 +1,77 @@+/*-------------------------------------------------------------------------+ *+ * objectaddress.h+ * functions for working with object addresses+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/catalog/objectaddress.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef OBJECTADDRESS_H+#define OBJECTADDRESS_H++#include "nodes/pg_list.h"+#include "storage/lock.h"+#include "utils/acl.h"+#include "utils/relcache.h"++/*+ * An ObjectAddress represents a database object of any type.+ */+typedef struct ObjectAddress+{+ Oid classId; /* Class Id from pg_class */+ Oid objectId; /* OID of the object */+ int32 objectSubId; /* Subitem within object (eg column), or 0 */+} ObjectAddress;++extern const ObjectAddress InvalidObjectAddress;++#define ObjectAddressSubSet(addr, class_id, object_id, object_sub_id) \+ do { \+ (addr).classId = (class_id); \+ (addr).objectId = (object_id); \+ (addr).objectSubId = (object_sub_id); \+ } while (0)++#define ObjectAddressSet(addr, class_id, object_id) \+ ObjectAddressSubSet(addr, class_id, object_id, 0)++extern ObjectAddress get_object_address(ObjectType objtype, List *objname,+ List *objargs, Relation *relp,+ LOCKMODE lockmode, bool missing_ok);++extern void check_object_ownership(Oid roleid,+ ObjectType objtype, ObjectAddress address,+ List *objname, List *objargs, Relation relation);++extern Oid get_object_namespace(const ObjectAddress *address);++extern bool is_objectclass_supported(Oid class_id);+extern Oid get_object_oid_index(Oid class_id);+extern int get_object_catcache_oid(Oid class_id);+extern int get_object_catcache_name(Oid class_id);+extern AttrNumber get_object_attnum_name(Oid class_id);+extern AttrNumber get_object_attnum_namespace(Oid class_id);+extern AttrNumber get_object_attnum_owner(Oid class_id);+extern AttrNumber get_object_attnum_acl(Oid class_id);+extern AclObjectKind get_object_aclkind(Oid class_id);+extern bool get_object_namensp_unique(Oid class_id);++extern HeapTuple get_catalog_object_by_oid(Relation catalog,+ Oid objectId);++extern char *getObjectDescription(const ObjectAddress *object);+extern char *getObjectDescriptionOids(Oid classid, Oid objid);++extern int read_objtype_from_string(const char *objtype);+extern char *getObjectTypeDescription(const ObjectAddress *object);+extern char *getObjectIdentity(const ObjectAddress *address);+extern char *getObjectIdentityParts(const ObjectAddress *address,+ List **objname, List **objargs);+extern ArrayType *strlist_to_textarray(List *list);++#endif /* OBJECTADDRESS_H */
+ foreign/libpg_query/src/postgres/include/catalog/pg_aggregate.h view
@@ -0,0 +1,338 @@+/*-------------------------------------------------------------------------+ *+ * pg_aggregate.h+ * definition of the system "aggregate" relation (pg_aggregate)+ * along with the relation's initial contents.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/catalog/pg_aggregate.h+ *+ * NOTES+ * the genbki.pl script reads this file and generates .bki+ * information from the DATA() statements.+ *+ *-------------------------------------------------------------------------+ */+#ifndef PG_AGGREGATE_H+#define PG_AGGREGATE_H++#include "catalog/genbki.h"+#include "catalog/objectaddress.h"+#include "nodes/pg_list.h"++/* ----------------------------------------------------------------+ * pg_aggregate definition.+ *+ * cpp turns this into typedef struct FormData_pg_aggregate+ *+ * aggfnoid pg_proc OID of the aggregate itself+ * aggkind aggregate kind, see AGGKIND_ categories below+ * aggnumdirectargs number of arguments that are "direct" arguments+ * aggtransfn transition function+ * aggfinalfn final function (0 if none)+ * aggmtransfn forward function for moving-aggregate mode (0 if none)+ * aggminvtransfn inverse function for moving-aggregate mode (0 if none)+ * aggmfinalfn final function for moving-aggregate mode (0 if none)+ * aggfinalextra true to pass extra dummy arguments to aggfinalfn+ * aggmfinalextra true to pass extra dummy arguments to aggmfinalfn+ * aggsortop associated sort operator (0 if none)+ * aggtranstype type of aggregate's transition (state) data+ * aggtransspace estimated size of state data (0 for default estimate)+ * aggmtranstype type of moving-aggregate state data (0 if none)+ * aggmtransspace estimated size of moving-agg state (0 for default est)+ * agginitval initial value for transition state (can be NULL)+ * aggminitval initial value for moving-agg state (can be NULL)+ * ----------------------------------------------------------------+ */+#define AggregateRelationId 2600++CATALOG(pg_aggregate,2600) BKI_WITHOUT_OIDS+{+ regproc aggfnoid;+ char aggkind;+ int16 aggnumdirectargs;+ regproc aggtransfn;+ regproc aggfinalfn;+ regproc aggmtransfn;+ regproc aggminvtransfn;+ regproc aggmfinalfn;+ bool aggfinalextra;+ bool aggmfinalextra;+ Oid aggsortop;+ Oid aggtranstype;+ int32 aggtransspace;+ Oid aggmtranstype;+ int32 aggmtransspace;++#ifdef CATALOG_VARLEN /* variable-length fields start here */+ text agginitval;+ text aggminitval;+#endif+} FormData_pg_aggregate;++/* ----------------+ * Form_pg_aggregate corresponds to a pointer to a tuple with+ * the format of pg_aggregate relation.+ * ----------------+ */+typedef FormData_pg_aggregate *Form_pg_aggregate;++/* ----------------+ * compiler constants for pg_aggregate+ * ----------------+ */++#define Natts_pg_aggregate 17+#define Anum_pg_aggregate_aggfnoid 1+#define Anum_pg_aggregate_aggkind 2+#define Anum_pg_aggregate_aggnumdirectargs 3+#define Anum_pg_aggregate_aggtransfn 4+#define Anum_pg_aggregate_aggfinalfn 5+#define Anum_pg_aggregate_aggmtransfn 6+#define Anum_pg_aggregate_aggminvtransfn 7+#define Anum_pg_aggregate_aggmfinalfn 8+#define Anum_pg_aggregate_aggfinalextra 9+#define Anum_pg_aggregate_aggmfinalextra 10+#define Anum_pg_aggregate_aggsortop 11+#define Anum_pg_aggregate_aggtranstype 12+#define Anum_pg_aggregate_aggtransspace 13+#define Anum_pg_aggregate_aggmtranstype 14+#define Anum_pg_aggregate_aggmtransspace 15+#define Anum_pg_aggregate_agginitval 16+#define Anum_pg_aggregate_aggminitval 17++/*+ * Symbolic values for aggkind column. We distinguish normal aggregates+ * from ordered-set aggregates (which have two sets of arguments, namely+ * direct and aggregated arguments) and from hypothetical-set aggregates+ * (which are a subclass of ordered-set aggregates in which the last+ * direct arguments have to match up in number and datatypes with the+ * aggregated arguments).+ */+#define AGGKIND_NORMAL 'n'+#define AGGKIND_ORDERED_SET 'o'+#define AGGKIND_HYPOTHETICAL 'h'++/* Use this macro to test for "ordered-set agg including hypothetical case" */+#define AGGKIND_IS_ORDERED_SET(kind) ((kind) != AGGKIND_NORMAL)+++/* ----------------+ * initial contents of pg_aggregate+ * ---------------+ */++/* avg */+DATA(insert ( 2100 n 0 int8_avg_accum numeric_poly_avg int8_avg_accum int8_avg_accum_inv numeric_poly_avg f f 0 2281 48 2281 48 _null_ _null_ ));+DATA(insert ( 2101 n 0 int4_avg_accum int8_avg int4_avg_accum int4_avg_accum_inv int8_avg f f 0 1016 0 1016 0 "{0,0}" "{0,0}" ));+DATA(insert ( 2102 n 0 int2_avg_accum int8_avg int2_avg_accum int2_avg_accum_inv int8_avg f f 0 1016 0 1016 0 "{0,0}" "{0,0}" ));+DATA(insert ( 2103 n 0 numeric_avg_accum numeric_avg numeric_avg_accum numeric_accum_inv numeric_avg f f 0 2281 128 2281 128 _null_ _null_ ));+DATA(insert ( 2104 n 0 float4_accum float8_avg - - - f f 0 1022 0 0 0 "{0,0,0}" _null_ ));+DATA(insert ( 2105 n 0 float8_accum float8_avg - - - f f 0 1022 0 0 0 "{0,0,0}" _null_ ));+DATA(insert ( 2106 n 0 interval_accum interval_avg interval_accum interval_accum_inv interval_avg f f 0 1187 0 1187 0 "{0 second,0 second}" "{0 second,0 second}" ));++/* sum */+DATA(insert ( 2107 n 0 int8_avg_accum numeric_poly_sum int8_avg_accum int8_avg_accum_inv numeric_poly_sum f f 0 2281 48 2281 48 _null_ _null_ ));+DATA(insert ( 2108 n 0 int4_sum - int4_avg_accum int4_avg_accum_inv int2int4_sum f f 0 20 0 1016 0 _null_ "{0,0}" ));+DATA(insert ( 2109 n 0 int2_sum - int2_avg_accum int2_avg_accum_inv int2int4_sum f f 0 20 0 1016 0 _null_ "{0,0}" ));+DATA(insert ( 2110 n 0 float4pl - - - - f f 0 700 0 0 0 _null_ _null_ ));+DATA(insert ( 2111 n 0 float8pl - - - - f f 0 701 0 0 0 _null_ _null_ ));+DATA(insert ( 2112 n 0 cash_pl - cash_pl cash_mi - f f 0 790 0 790 0 _null_ _null_ ));+DATA(insert ( 2113 n 0 interval_pl - interval_pl interval_mi - f f 0 1186 0 1186 0 _null_ _null_ ));+DATA(insert ( 2114 n 0 numeric_avg_accum numeric_sum numeric_avg_accum numeric_accum_inv numeric_sum f f 0 2281 128 2281 128 _null_ _null_ ));++/* max */+DATA(insert ( 2115 n 0 int8larger - - - - f f 413 20 0 0 0 _null_ _null_ ));+DATA(insert ( 2116 n 0 int4larger - - - - f f 521 23 0 0 0 _null_ _null_ ));+DATA(insert ( 2117 n 0 int2larger - - - - f f 520 21 0 0 0 _null_ _null_ ));+DATA(insert ( 2118 n 0 oidlarger - - - - f f 610 26 0 0 0 _null_ _null_ ));+DATA(insert ( 2119 n 0 float4larger - - - - f f 623 700 0 0 0 _null_ _null_ ));+DATA(insert ( 2120 n 0 float8larger - - - - f f 674 701 0 0 0 _null_ _null_ ));+DATA(insert ( 2121 n 0 int4larger - - - - f f 563 702 0 0 0 _null_ _null_ ));+DATA(insert ( 2122 n 0 date_larger - - - - f f 1097 1082 0 0 0 _null_ _null_ ));+DATA(insert ( 2123 n 0 time_larger - - - - f f 1112 1083 0 0 0 _null_ _null_ ));+DATA(insert ( 2124 n 0 timetz_larger - - - - f f 1554 1266 0 0 0 _null_ _null_ ));+DATA(insert ( 2125 n 0 cashlarger - - - - f f 903 790 0 0 0 _null_ _null_ ));+DATA(insert ( 2126 n 0 timestamp_larger - - - - f f 2064 1114 0 0 0 _null_ _null_ ));+DATA(insert ( 2127 n 0 timestamptz_larger - - - - f f 1324 1184 0 0 0 _null_ _null_ ));+DATA(insert ( 2128 n 0 interval_larger - - - - f f 1334 1186 0 0 0 _null_ _null_ ));+DATA(insert ( 2129 n 0 text_larger - - - - f f 666 25 0 0 0 _null_ _null_ ));+DATA(insert ( 2130 n 0 numeric_larger - - - - f f 1756 1700 0 0 0 _null_ _null_ ));+DATA(insert ( 2050 n 0 array_larger - - - - f f 1073 2277 0 0 0 _null_ _null_ ));+DATA(insert ( 2244 n 0 bpchar_larger - - - - f f 1060 1042 0 0 0 _null_ _null_ ));+DATA(insert ( 2797 n 0 tidlarger - - - - f f 2800 27 0 0 0 _null_ _null_ ));+DATA(insert ( 3526 n 0 enum_larger - - - - f f 3519 3500 0 0 0 _null_ _null_ ));+DATA(insert ( 3564 n 0 network_larger - - - - f f 1205 869 0 0 0 _null_ _null_ ));++/* min */+DATA(insert ( 2131 n 0 int8smaller - - - - f f 412 20 0 0 0 _null_ _null_ ));+DATA(insert ( 2132 n 0 int4smaller - - - - f f 97 23 0 0 0 _null_ _null_ ));+DATA(insert ( 2133 n 0 int2smaller - - - - f f 95 21 0 0 0 _null_ _null_ ));+DATA(insert ( 2134 n 0 oidsmaller - - - - f f 609 26 0 0 0 _null_ _null_ ));+DATA(insert ( 2135 n 0 float4smaller - - - - f f 622 700 0 0 0 _null_ _null_ ));+DATA(insert ( 2136 n 0 float8smaller - - - - f f 672 701 0 0 0 _null_ _null_ ));+DATA(insert ( 2137 n 0 int4smaller - - - - f f 562 702 0 0 0 _null_ _null_ ));+DATA(insert ( 2138 n 0 date_smaller - - - - f f 1095 1082 0 0 0 _null_ _null_ ));+DATA(insert ( 2139 n 0 time_smaller - - - - f f 1110 1083 0 0 0 _null_ _null_ ));+DATA(insert ( 2140 n 0 timetz_smaller - - - - f f 1552 1266 0 0 0 _null_ _null_ ));+DATA(insert ( 2141 n 0 cashsmaller - - - - f f 902 790 0 0 0 _null_ _null_ ));+DATA(insert ( 2142 n 0 timestamp_smaller - - - - f f 2062 1114 0 0 0 _null_ _null_ ));+DATA(insert ( 2143 n 0 timestamptz_smaller - - - - f f 1322 1184 0 0 0 _null_ _null_ ));+DATA(insert ( 2144 n 0 interval_smaller - - - - f f 1332 1186 0 0 0 _null_ _null_ ));+DATA(insert ( 2145 n 0 text_smaller - - - - f f 664 25 0 0 0 _null_ _null_ ));+DATA(insert ( 2146 n 0 numeric_smaller - - - - f f 1754 1700 0 0 0 _null_ _null_ ));+DATA(insert ( 2051 n 0 array_smaller - - - - f f 1072 2277 0 0 0 _null_ _null_ ));+DATA(insert ( 2245 n 0 bpchar_smaller - - - - f f 1058 1042 0 0 0 _null_ _null_ ));+DATA(insert ( 2798 n 0 tidsmaller - - - - f f 2799 27 0 0 0 _null_ _null_ ));+DATA(insert ( 3527 n 0 enum_smaller - - - - f f 3518 3500 0 0 0 _null_ _null_ ));+DATA(insert ( 3565 n 0 network_smaller - - - - f f 1203 869 0 0 0 _null_ _null_ ));++/* count */+DATA(insert ( 2147 n 0 int8inc_any - int8inc_any int8dec_any - f f 0 20 0 20 0 "0" "0" ));+DATA(insert ( 2803 n 0 int8inc - int8inc int8dec - f f 0 20 0 20 0 "0" "0" ));++/* var_pop */+DATA(insert ( 2718 n 0 int8_accum numeric_var_pop int8_accum int8_accum_inv numeric_var_pop f f 0 2281 128 2281 128 _null_ _null_ ));+DATA(insert ( 2719 n 0 int4_accum numeric_poly_var_pop int4_accum int4_accum_inv numeric_poly_var_pop f f 0 2281 48 2281 48 _null_ _null_ ));+DATA(insert ( 2720 n 0 int2_accum numeric_poly_var_pop int2_accum int2_accum_inv numeric_poly_var_pop f f 0 2281 48 2281 48 _null_ _null_ ));+DATA(insert ( 2721 n 0 float4_accum float8_var_pop - - - f f 0 1022 0 0 0 "{0,0,0}" _null_ ));+DATA(insert ( 2722 n 0 float8_accum float8_var_pop - - - f f 0 1022 0 0 0 "{0,0,0}" _null_ ));+DATA(insert ( 2723 n 0 numeric_accum numeric_var_pop numeric_accum numeric_accum_inv numeric_var_pop f f 0 2281 128 2281 128 _null_ _null_ ));++/* var_samp */+DATA(insert ( 2641 n 0 int8_accum numeric_var_samp int8_accum int8_accum_inv numeric_var_samp f f 0 2281 128 2281 128 _null_ _null_ ));+DATA(insert ( 2642 n 0 int4_accum numeric_poly_var_samp int4_accum int4_accum_inv numeric_poly_var_samp f f 0 2281 48 2281 48 _null_ _null_ ));+DATA(insert ( 2643 n 0 int2_accum numeric_poly_var_samp int2_accum int2_accum_inv numeric_poly_var_samp f f 0 2281 48 2281 48 _null_ _null_ ));+DATA(insert ( 2644 n 0 float4_accum float8_var_samp - - - f f 0 1022 0 0 0 "{0,0,0}" _null_ ));+DATA(insert ( 2645 n 0 float8_accum float8_var_samp - - - f f 0 1022 0 0 0 "{0,0,0}" _null_ ));+DATA(insert ( 2646 n 0 numeric_accum numeric_var_samp numeric_accum numeric_accum_inv numeric_var_samp f f 0 2281 128 2281 128 _null_ _null_ ));++/* variance: historical Postgres syntax for var_samp */+DATA(insert ( 2148 n 0 int8_accum numeric_var_samp int8_accum int8_accum_inv numeric_var_samp f f 0 2281 128 2281 128 _null_ _null_ ));+DATA(insert ( 2149 n 0 int4_accum numeric_poly_var_samp int4_accum int4_accum_inv numeric_poly_var_samp f f 0 2281 48 2281 48 _null_ _null_ ));+DATA(insert ( 2150 n 0 int2_accum numeric_poly_var_samp int2_accum int2_accum_inv numeric_poly_var_samp f f 0 2281 48 2281 48 _null_ _null_ ));+DATA(insert ( 2151 n 0 float4_accum float8_var_samp - - - f f 0 1022 0 0 0 "{0,0,0}" _null_ ));+DATA(insert ( 2152 n 0 float8_accum float8_var_samp - - - f f 0 1022 0 0 0 "{0,0,0}" _null_ ));+DATA(insert ( 2153 n 0 numeric_accum numeric_var_samp numeric_accum numeric_accum_inv numeric_var_samp f f 0 2281 128 2281 128 _null_ _null_ ));++/* stddev_pop */+DATA(insert ( 2724 n 0 int8_accum numeric_stddev_pop int8_accum int8_accum_inv numeric_stddev_pop f f 0 2281 128 2281 128 _null_ _null_ ));+DATA(insert ( 2725 n 0 int4_accum numeric_poly_stddev_pop int4_accum int4_accum_inv numeric_poly_stddev_pop f f 0 2281 48 2281 48 _null_ _null_ ));+DATA(insert ( 2726 n 0 int2_accum numeric_poly_stddev_pop int2_accum int2_accum_inv numeric_poly_stddev_pop f f 0 2281 48 2281 48 _null_ _null_ ));+DATA(insert ( 2727 n 0 float4_accum float8_stddev_pop - - - f f 0 1022 0 0 0 "{0,0,0}" _null_ ));+DATA(insert ( 2728 n 0 float8_accum float8_stddev_pop - - - f f 0 1022 0 0 0 "{0,0,0}" _null_ ));+DATA(insert ( 2729 n 0 numeric_accum numeric_stddev_pop numeric_accum numeric_accum_inv numeric_stddev_pop f f 0 2281 128 2281 128 _null_ _null_ ));++/* stddev_samp */+DATA(insert ( 2712 n 0 int8_accum numeric_stddev_samp int8_accum int8_accum_inv numeric_stddev_samp f f 0 2281 128 2281 128 _null_ _null_ ));+DATA(insert ( 2713 n 0 int4_accum numeric_poly_stddev_samp int4_accum int4_accum_inv numeric_poly_stddev_samp f f 0 2281 48 2281 48 _null_ _null_ ));+DATA(insert ( 2714 n 0 int2_accum numeric_poly_stddev_samp int2_accum int2_accum_inv numeric_poly_stddev_samp f f 0 2281 48 2281 48 _null_ _null_ ));+DATA(insert ( 2715 n 0 float4_accum float8_stddev_samp - - - f f 0 1022 0 0 0 "{0,0,0}" _null_ ));+DATA(insert ( 2716 n 0 float8_accum float8_stddev_samp - - - f f 0 1022 0 0 0 "{0,0,0}" _null_ ));+DATA(insert ( 2717 n 0 numeric_accum numeric_stddev_samp numeric_accum numeric_accum_inv numeric_stddev_samp f f 0 2281 128 2281 128 _null_ _null_ ));++/* stddev: historical Postgres syntax for stddev_samp */+DATA(insert ( 2154 n 0 int8_accum numeric_stddev_samp int8_accum int8_accum_inv numeric_stddev_samp f f 0 2281 128 2281 128 _null_ _null_ ));+DATA(insert ( 2155 n 0 int4_accum numeric_poly_stddev_samp int4_accum int4_accum_inv numeric_poly_stddev_samp f f 0 2281 48 2281 48 _null_ _null_ ));+DATA(insert ( 2156 n 0 int2_accum numeric_poly_stddev_samp int2_accum int2_accum_inv numeric_poly_stddev_samp f f 0 2281 48 2281 48 _null_ _null_ ));+DATA(insert ( 2157 n 0 float4_accum float8_stddev_samp - - - f f 0 1022 0 0 0 "{0,0,0}" _null_ ));+DATA(insert ( 2158 n 0 float8_accum float8_stddev_samp - - - f f 0 1022 0 0 0 "{0,0,0}" _null_ ));+DATA(insert ( 2159 n 0 numeric_accum numeric_stddev_samp numeric_accum numeric_accum_inv numeric_stddev_samp f f 0 2281 128 2281 128 _null_ _null_ ));++/* SQL2003 binary regression aggregates */+DATA(insert ( 2818 n 0 int8inc_float8_float8 - - - - f f 0 20 0 0 0 "0" _null_ ));+DATA(insert ( 2819 n 0 float8_regr_accum float8_regr_sxx - - - f f 0 1022 0 0 0 "{0,0,0,0,0,0}" _null_ ));+DATA(insert ( 2820 n 0 float8_regr_accum float8_regr_syy - - - f f 0 1022 0 0 0 "{0,0,0,0,0,0}" _null_ ));+DATA(insert ( 2821 n 0 float8_regr_accum float8_regr_sxy - - - f f 0 1022 0 0 0 "{0,0,0,0,0,0}" _null_ ));+DATA(insert ( 2822 n 0 float8_regr_accum float8_regr_avgx - - - f f 0 1022 0 0 0 "{0,0,0,0,0,0}" _null_ ));+DATA(insert ( 2823 n 0 float8_regr_accum float8_regr_avgy - - - f f 0 1022 0 0 0 "{0,0,0,0,0,0}" _null_ ));+DATA(insert ( 2824 n 0 float8_regr_accum float8_regr_r2 - - - f f 0 1022 0 0 0 "{0,0,0,0,0,0}" _null_ ));+DATA(insert ( 2825 n 0 float8_regr_accum float8_regr_slope - - - f f 0 1022 0 0 0 "{0,0,0,0,0,0}" _null_ ));+DATA(insert ( 2826 n 0 float8_regr_accum float8_regr_intercept - - - f f 0 1022 0 0 0 "{0,0,0,0,0,0}" _null_ ));+DATA(insert ( 2827 n 0 float8_regr_accum float8_covar_pop - - - f f 0 1022 0 0 0 "{0,0,0,0,0,0}" _null_ ));+DATA(insert ( 2828 n 0 float8_regr_accum float8_covar_samp - - - f f 0 1022 0 0 0 "{0,0,0,0,0,0}" _null_ ));+DATA(insert ( 2829 n 0 float8_regr_accum float8_corr - - - f f 0 1022 0 0 0 "{0,0,0,0,0,0}" _null_ ));++/* boolean-and and boolean-or */+DATA(insert ( 2517 n 0 booland_statefunc - bool_accum bool_accum_inv bool_alltrue f f 58 16 0 2281 16 _null_ _null_ ));+DATA(insert ( 2518 n 0 boolor_statefunc - bool_accum bool_accum_inv bool_anytrue f f 59 16 0 2281 16 _null_ _null_ ));+DATA(insert ( 2519 n 0 booland_statefunc - bool_accum bool_accum_inv bool_alltrue f f 58 16 0 2281 16 _null_ _null_ ));++/* bitwise integer */+DATA(insert ( 2236 n 0 int2and - - - - f f 0 21 0 0 0 _null_ _null_ ));+DATA(insert ( 2237 n 0 int2or - - - - f f 0 21 0 0 0 _null_ _null_ ));+DATA(insert ( 2238 n 0 int4and - - - - f f 0 23 0 0 0 _null_ _null_ ));+DATA(insert ( 2239 n 0 int4or - - - - f f 0 23 0 0 0 _null_ _null_ ));+DATA(insert ( 2240 n 0 int8and - - - - f f 0 20 0 0 0 _null_ _null_ ));+DATA(insert ( 2241 n 0 int8or - - - - f f 0 20 0 0 0 _null_ _null_ ));+DATA(insert ( 2242 n 0 bitand - - - - f f 0 1560 0 0 0 _null_ _null_ ));+DATA(insert ( 2243 n 0 bitor - - - - f f 0 1560 0 0 0 _null_ _null_ ));++/* xml */+DATA(insert ( 2901 n 0 xmlconcat2 - - - - f f 0 142 0 0 0 _null_ _null_ ));++/* array */+DATA(insert ( 2335 n 0 array_agg_transfn array_agg_finalfn - - - t f 0 2281 0 0 0 _null_ _null_ ));+DATA(insert ( 4053 n 0 array_agg_array_transfn array_agg_array_finalfn - - - t f 0 2281 0 0 0 _null_ _null_ ));++/* text */+DATA(insert ( 3538 n 0 string_agg_transfn string_agg_finalfn - - - f f 0 2281 0 0 0 _null_ _null_ ));++/* bytea */+DATA(insert ( 3545 n 0 bytea_string_agg_transfn bytea_string_agg_finalfn - - - f f 0 2281 0 0 0 _null_ _null_ ));++/* json */+DATA(insert ( 3175 n 0 json_agg_transfn json_agg_finalfn - - - f f 0 2281 0 0 0 _null_ _null_ ));+DATA(insert ( 3197 n 0 json_object_agg_transfn json_object_agg_finalfn - - - f f 0 2281 0 0 0 _null_ _null_ ));++/* jsonb */+DATA(insert ( 3267 n 0 jsonb_agg_transfn jsonb_agg_finalfn - - - f f 0 2281 0 0 0 _null_ _null_ ));+DATA(insert ( 3270 n 0 jsonb_object_agg_transfn jsonb_object_agg_finalfn - - - f f 0 2281 0 0 0 _null_ _null_ ));++/* ordered-set and hypothetical-set aggregates */+DATA(insert ( 3972 o 1 ordered_set_transition percentile_disc_final - - - t f 0 2281 0 0 0 _null_ _null_ ));+DATA(insert ( 3974 o 1 ordered_set_transition percentile_cont_float8_final - - - f f 0 2281 0 0 0 _null_ _null_ ));+DATA(insert ( 3976 o 1 ordered_set_transition percentile_cont_interval_final - - - f f 0 2281 0 0 0 _null_ _null_ ));+DATA(insert ( 3978 o 1 ordered_set_transition percentile_disc_multi_final - - - t f 0 2281 0 0 0 _null_ _null_ ));+DATA(insert ( 3980 o 1 ordered_set_transition percentile_cont_float8_multi_final - - - f f 0 2281 0 0 0 _null_ _null_ ));+DATA(insert ( 3982 o 1 ordered_set_transition percentile_cont_interval_multi_final - - - f f 0 2281 0 0 0 _null_ _null_ ));+DATA(insert ( 3984 o 0 ordered_set_transition mode_final - - - t f 0 2281 0 0 0 _null_ _null_ ));+DATA(insert ( 3986 h 1 ordered_set_transition_multi rank_final - - - t f 0 2281 0 0 0 _null_ _null_ ));+DATA(insert ( 3988 h 1 ordered_set_transition_multi percent_rank_final - - - t f 0 2281 0 0 0 _null_ _null_ ));+DATA(insert ( 3990 h 1 ordered_set_transition_multi cume_dist_final - - - t f 0 2281 0 0 0 _null_ _null_ ));+DATA(insert ( 3992 h 1 ordered_set_transition_multi dense_rank_final - - - t f 0 2281 0 0 0 _null_ _null_ ));+++/*+ * prototypes for functions in pg_aggregate.c+ */+extern ObjectAddress AggregateCreate(const char *aggName,+ Oid aggNamespace,+ char aggKind,+ int numArgs,+ int numDirectArgs,+ oidvector *parameterTypes,+ Datum allParameterTypes,+ Datum parameterModes,+ Datum parameterNames,+ List *parameterDefaults,+ Oid variadicArgType,+ List *aggtransfnName,+ List *aggfinalfnName,+ List *aggmtransfnName,+ List *aggminvtransfnName,+ List *aggmfinalfnName,+ bool finalfnExtraArgs,+ bool mfinalfnExtraArgs,+ List *aggsortopName,+ Oid aggTransType,+ int32 aggTransSpace,+ Oid aggmTransType,+ int32 aggmTransSpace,+ const char *agginitval,+ const char *aggminitval);++#endif /* PG_AGGREGATE_H */
+ foreign/libpg_query/src/postgres/include/catalog/pg_am.h view
@@ -0,0 +1,139 @@+/*-------------------------------------------------------------------------+ *+ * pg_am.h+ * definition of the system "access method" relation (pg_am)+ * along with the relation's initial contents.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/catalog/pg_am.h+ *+ * NOTES+ * the genbki.pl script reads this file and generates .bki+ * information from the DATA() statements.+ *+ * XXX do NOT break up DATA() statements into multiple lines!+ * the scripts are not as smart as you might think...+ *+ *-------------------------------------------------------------------------+ */+#ifndef PG_AM_H+#define PG_AM_H++#include "catalog/genbki.h"++/* ----------------+ * pg_am definition. cpp turns this into+ * typedef struct FormData_pg_am+ * ----------------+ */+#define AccessMethodRelationId 2601++CATALOG(pg_am,2601)+{+ NameData amname; /* access method name */+ int16 amstrategies; /* total number of strategies (operators) by+ * which we can traverse/search this AM. Zero+ * if AM does not have a fixed set of strategy+ * assignments. */+ int16 amsupport; /* total number of support functions that this+ * AM uses */+ bool amcanorder; /* does AM support order by column value? */+ bool amcanorderbyop; /* does AM support order by operator result? */+ bool amcanbackward; /* does AM support backward scan? */+ bool amcanunique; /* does AM support UNIQUE indexes? */+ bool amcanmulticol; /* does AM support multi-column indexes? */+ bool amoptionalkey; /* can query omit key for the first column? */+ bool amsearcharray; /* can AM handle ScalarArrayOpExpr quals? */+ bool amsearchnulls; /* can AM search for NULL/NOT NULL entries? */+ bool amstorage; /* can storage type differ from column type? */+ bool amclusterable; /* does AM support cluster command? */+ bool ampredlocks; /* does AM handle predicate locks? */+ Oid amkeytype; /* type of data in index, or InvalidOid */+ regproc aminsert; /* "insert this tuple" function */+ regproc ambeginscan; /* "prepare for index scan" function */+ regproc amgettuple; /* "next valid tuple" function, or 0 */+ regproc amgetbitmap; /* "fetch all valid tuples" function, or 0 */+ regproc amrescan; /* "(re)start index scan" function */+ regproc amendscan; /* "end index scan" function */+ regproc ammarkpos; /* "mark current scan position" function */+ regproc amrestrpos; /* "restore marked scan position" function */+ regproc ambuild; /* "build new index" function */+ regproc ambuildempty; /* "build empty index" function */+ regproc ambulkdelete; /* bulk-delete function */+ regproc amvacuumcleanup; /* post-VACUUM cleanup function */+ regproc amcanreturn; /* can indexscan return IndexTuples? */+ regproc amcostestimate; /* estimate cost of an indexscan */+ regproc amoptions; /* parse AM-specific parameters */+} FormData_pg_am;++/* ----------------+ * Form_pg_am corresponds to a pointer to a tuple with+ * the format of pg_am relation.+ * ----------------+ */+typedef FormData_pg_am *Form_pg_am;++/* ----------------+ * compiler constants for pg_am+ * ----------------+ */+#define Natts_pg_am 30+#define Anum_pg_am_amname 1+#define Anum_pg_am_amstrategies 2+#define Anum_pg_am_amsupport 3+#define Anum_pg_am_amcanorder 4+#define Anum_pg_am_amcanorderbyop 5+#define Anum_pg_am_amcanbackward 6+#define Anum_pg_am_amcanunique 7+#define Anum_pg_am_amcanmulticol 8+#define Anum_pg_am_amoptionalkey 9+#define Anum_pg_am_amsearcharray 10+#define Anum_pg_am_amsearchnulls 11+#define Anum_pg_am_amstorage 12+#define Anum_pg_am_amclusterable 13+#define Anum_pg_am_ampredlocks 14+#define Anum_pg_am_amkeytype 15+#define Anum_pg_am_aminsert 16+#define Anum_pg_am_ambeginscan 17+#define Anum_pg_am_amgettuple 18+#define Anum_pg_am_amgetbitmap 19+#define Anum_pg_am_amrescan 20+#define Anum_pg_am_amendscan 21+#define Anum_pg_am_ammarkpos 22+#define Anum_pg_am_amrestrpos 23+#define Anum_pg_am_ambuild 24+#define Anum_pg_am_ambuildempty 25+#define Anum_pg_am_ambulkdelete 26+#define Anum_pg_am_amvacuumcleanup 27+#define Anum_pg_am_amcanreturn 28+#define Anum_pg_am_amcostestimate 29+#define Anum_pg_am_amoptions 30++/* ----------------+ * initial contents of pg_am+ * ----------------+ */++DATA(insert OID = 403 ( btree 5 2 t f t t t t t t f t t 0 btinsert btbeginscan btgettuple btgetbitmap btrescan btendscan btmarkpos btrestrpos btbuild btbuildempty btbulkdelete btvacuumcleanup btcanreturn btcostestimate btoptions ));+DESCR("b-tree index access method");+#define BTREE_AM_OID 403+DATA(insert OID = 405 ( hash 1 1 f f t f f f f f f f f 23 hashinsert hashbeginscan hashgettuple hashgetbitmap hashrescan hashendscan hashmarkpos hashrestrpos hashbuild hashbuildempty hashbulkdelete hashvacuumcleanup - hashcostestimate hashoptions ));+DESCR("hash index access method");+#define HASH_AM_OID 405+DATA(insert OID = 783 ( gist 0 9 f t f f t t f t t t f 0 gistinsert gistbeginscan gistgettuple gistgetbitmap gistrescan gistendscan gistmarkpos gistrestrpos gistbuild gistbuildempty gistbulkdelete gistvacuumcleanup gistcanreturn gistcostestimate gistoptions ));+DESCR("GiST index access method");+#define GIST_AM_OID 783+DATA(insert OID = 2742 ( gin 0 6 f f f f t t f f t f f 0 gininsert ginbeginscan - gingetbitmap ginrescan ginendscan ginmarkpos ginrestrpos ginbuild ginbuildempty ginbulkdelete ginvacuumcleanup - gincostestimate ginoptions ));+DESCR("GIN index access method");+#define GIN_AM_OID 2742+DATA(insert OID = 4000 ( spgist 0 5 f f f f f t f t f f f 0 spginsert spgbeginscan spggettuple spggetbitmap spgrescan spgendscan spgmarkpos spgrestrpos spgbuild spgbuildempty spgbulkdelete spgvacuumcleanup spgcanreturn spgcostestimate spgoptions ));+DESCR("SP-GiST index access method");+#define SPGIST_AM_OID 4000+DATA(insert OID = 3580 ( brin 0 15 f f f f t t f t t f f 0 brininsert brinbeginscan - bringetbitmap brinrescan brinendscan brinmarkpos brinrestrpos brinbuild brinbuildempty brinbulkdelete brinvacuumcleanup - brincostestimate brinoptions ));+DESCR("block range index (BRIN) access method");+#define BRIN_AM_OID 3580++#endif /* PG_AM_H */
+ foreign/libpg_query/src/postgres/include/catalog/pg_attribute.h view
@@ -0,0 +1,223 @@+/*-------------------------------------------------------------------------+ *+ * pg_attribute.h+ * definition of the system "attribute" relation (pg_attribute)+ * along with the relation's initial contents.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/catalog/pg_attribute.h+ *+ * NOTES+ * the genbki.pl script reads this file and generates .bki+ * information from the DATA() statements.+ *+ *-------------------------------------------------------------------------+ */+#ifndef PG_ATTRIBUTE_H+#define PG_ATTRIBUTE_H++#include "catalog/genbki.h"++/* ----------------+ * pg_attribute definition. cpp turns this into+ * typedef struct FormData_pg_attribute+ *+ * If you change the following, make sure you change the structs for+ * system attributes in catalog/heap.c also.+ * You may need to change catalog/genbki.pl as well.+ * ----------------+ */+#define AttributeRelationId 1249+#define AttributeRelation_Rowtype_Id 75++CATALOG(pg_attribute,1249) BKI_BOOTSTRAP BKI_WITHOUT_OIDS BKI_ROWTYPE_OID(75) BKI_SCHEMA_MACRO+{+ Oid attrelid; /* OID of relation containing this attribute */+ NameData attname; /* name of attribute */++ /*+ * atttypid is the OID of the instance in Catalog Class pg_type that+ * defines the data type of this attribute (e.g. int4). Information in+ * that instance is redundant with the attlen, attbyval, and attalign+ * attributes of this instance, so they had better match or Postgres will+ * fail.+ */+ Oid atttypid;++ /*+ * attstattarget is the target number of statistics datapoints to collect+ * during VACUUM ANALYZE of this column. A zero here indicates that we do+ * not wish to collect any stats about this column. A "-1" here indicates+ * that no value has been explicitly set for this column, so ANALYZE+ * should use the default setting.+ */+ int32 attstattarget;++ /*+ * attlen is a copy of the typlen field from pg_type for this attribute.+ * See atttypid comments above.+ */+ int16 attlen;++ /*+ * attnum is the "attribute number" for the attribute: A value that+ * uniquely identifies this attribute within its class. For user+ * attributes, Attribute numbers are greater than 0 and not greater than+ * the number of attributes in the class. I.e. if the Class pg_class says+ * that Class XYZ has 10 attributes, then the user attribute numbers in+ * Class pg_attribute must be 1-10.+ *+ * System attributes have attribute numbers less than 0 that are unique+ * within the class, but not constrained to any particular range.+ *+ * Note that (attnum - 1) is often used as the index to an array.+ */+ int16 attnum;++ /*+ * attndims is the declared number of dimensions, if an array type,+ * otherwise zero.+ */+ int32 attndims;++ /*+ * fastgetattr() uses attcacheoff to cache byte offsets of attributes in+ * heap tuples. The value actually stored in pg_attribute (-1) indicates+ * no cached value. But when we copy these tuples into a tuple+ * descriptor, we may then update attcacheoff in the copies. This speeds+ * up the attribute walking process.+ */+ int32 attcacheoff;++ /*+ * atttypmod records type-specific data supplied at table creation time+ * (for example, the max length of a varchar field). It is passed to+ * type-specific input and output functions as the third argument. The+ * value will generally be -1 for types that do not need typmod.+ */+ int32 atttypmod;++ /*+ * attbyval is a copy of the typbyval field from pg_type for this+ * attribute. See atttypid comments above.+ */+ bool attbyval;++ /*----------+ * attstorage tells for VARLENA attributes, what the heap access+ * methods can do to it if a given tuple doesn't fit into a page.+ * Possible values are+ * 'p': Value must be stored plain always+ * 'e': Value can be stored in "secondary" relation (if relation+ * has one, see pg_class.reltoastrelid)+ * 'm': Value can be stored compressed inline+ * 'x': Value can be stored compressed inline or in "secondary"+ * Note that 'm' fields can also be moved out to secondary storage,+ * but only as a last resort ('e' and 'x' fields are moved first).+ *----------+ */+ char attstorage;++ /*+ * attalign is a copy of the typalign field from pg_type for this+ * attribute. See atttypid comments above.+ */+ char attalign;++ /* This flag represents the "NOT NULL" constraint */+ bool attnotnull;++ /* Has DEFAULT value or not */+ bool atthasdef;++ /* Is dropped (ie, logically invisible) or not */+ bool attisdropped;++ /*+ * This flag specifies whether this column has ever had a local+ * definition. It is set for normal non-inherited columns, but also for+ * columns that are inherited from parents if also explicitly listed in+ * CREATE TABLE INHERITS. It is also set when inheritance is removed from+ * a table with ALTER TABLE NO INHERIT. If the flag is set, the column is+ * not dropped by a parent's DROP COLUMN even if this causes the column's+ * attinhcount to become zero.+ */+ bool attislocal;++ /* Number of times inherited from direct parent relation(s) */+ int32 attinhcount;++ /* attribute's collation */+ Oid attcollation;++#ifdef CATALOG_VARLEN /* variable-length fields start here */+ /* NOTE: The following fields are not present in tuple descriptors. */++ /* Column-level access permissions */+ aclitem attacl[1];++ /* Column-level options */+ text attoptions[1];++ /* Column-level FDW options */+ text attfdwoptions[1];+#endif+} FormData_pg_attribute;++/*+ * ATTRIBUTE_FIXED_PART_SIZE is the size of the fixed-layout,+ * guaranteed-not-null part of a pg_attribute row. This is in fact as much+ * of the row as gets copied into tuple descriptors, so don't expect you+ * can access fields beyond attcollation except in a real tuple!+ */+#define ATTRIBUTE_FIXED_PART_SIZE \+ (offsetof(FormData_pg_attribute,attcollation) + sizeof(Oid))++/* ----------------+ * Form_pg_attribute corresponds to a pointer to a tuple with+ * the format of pg_attribute relation.+ * ----------------+ */+typedef FormData_pg_attribute *Form_pg_attribute;++/* ----------------+ * compiler constants for pg_attribute+ * ----------------+ */++#define Natts_pg_attribute 21+#define Anum_pg_attribute_attrelid 1+#define Anum_pg_attribute_attname 2+#define Anum_pg_attribute_atttypid 3+#define Anum_pg_attribute_attstattarget 4+#define Anum_pg_attribute_attlen 5+#define Anum_pg_attribute_attnum 6+#define Anum_pg_attribute_attndims 7+#define Anum_pg_attribute_attcacheoff 8+#define Anum_pg_attribute_atttypmod 9+#define Anum_pg_attribute_attbyval 10+#define Anum_pg_attribute_attstorage 11+#define Anum_pg_attribute_attalign 12+#define Anum_pg_attribute_attnotnull 13+#define Anum_pg_attribute_atthasdef 14+#define Anum_pg_attribute_attisdropped 15+#define Anum_pg_attribute_attislocal 16+#define Anum_pg_attribute_attinhcount 17+#define Anum_pg_attribute_attcollation 18+#define Anum_pg_attribute_attacl 19+#define Anum_pg_attribute_attoptions 20+#define Anum_pg_attribute_attfdwoptions 21+++/* ----------------+ * initial contents of pg_attribute+ *+ * The initial contents of pg_attribute are generated at compile time by+ * genbki.pl. Only "bootstrapped" relations need be included.+ * ----------------+ */++#endif /* PG_ATTRIBUTE_H */
+ foreign/libpg_query/src/postgres/include/catalog/pg_authid.h view
@@ -0,0 +1,102 @@+/*-------------------------------------------------------------------------+ *+ * pg_authid.h+ * definition of the system "authorization identifier" relation (pg_authid)+ * along with the relation's initial contents.+ *+ * pg_shadow and pg_group are now publicly accessible views on pg_authid.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/catalog/pg_authid.h+ *+ * NOTES+ * the genbki.pl script reads this file and generates .bki+ * information from the DATA() statements.+ *+ *-------------------------------------------------------------------------+ */+#ifndef PG_AUTHID_H+#define PG_AUTHID_H++#include "catalog/genbki.h"++/*+ * The CATALOG definition has to refer to the type of rolvaliduntil as+ * "timestamptz" (lower case) so that bootstrap mode recognizes it. But+ * the C header files define this type as TimestampTz. Since the field is+ * potentially-null and therefore can't be accessed directly from C code,+ * there is no particular need for the C struct definition to show the+ * field type as TimestampTz --- instead we just make it int.+ */+#define timestamptz int+++/* ----------------+ * pg_authid definition. cpp turns this into+ * typedef struct FormData_pg_authid+ * ----------------+ */+#define AuthIdRelationId 1260+#define AuthIdRelation_Rowtype_Id 2842++CATALOG(pg_authid,1260) BKI_SHARED_RELATION BKI_ROWTYPE_OID(2842) BKI_SCHEMA_MACRO+{+ NameData rolname; /* name of role */+ bool rolsuper; /* read this field via superuser() only! */+ bool rolinherit; /* inherit privileges from other roles? */+ bool rolcreaterole; /* allowed to create more roles? */+ bool rolcreatedb; /* allowed to create databases? */+ bool rolcanlogin; /* allowed to log in as session user? */+ bool rolreplication; /* role used for streaming replication */+ bool rolbypassrls; /* bypasses row level security? */+ int32 rolconnlimit; /* max connections allowed (-1=no limit) */++ /* remaining fields may be null; use heap_getattr to read them! */+#ifdef CATALOG_VARLEN /* variable-length fields start here */+ text rolpassword; /* password, if any */+ timestamptz rolvaliduntil; /* password expiration time, if any */+#endif+} FormData_pg_authid;++#undef timestamptz+++/* ----------------+ * Form_pg_authid corresponds to a pointer to a tuple with+ * the format of pg_authid relation.+ * ----------------+ */+typedef FormData_pg_authid *Form_pg_authid;++/* ----------------+ * compiler constants for pg_authid+ * ----------------+ */+#define Natts_pg_authid 11+#define Anum_pg_authid_rolname 1+#define Anum_pg_authid_rolsuper 2+#define Anum_pg_authid_rolinherit 3+#define Anum_pg_authid_rolcreaterole 4+#define Anum_pg_authid_rolcreatedb 5+#define Anum_pg_authid_rolcanlogin 6+#define Anum_pg_authid_rolreplication 7+#define Anum_pg_authid_rolbypassrls 8+#define Anum_pg_authid_rolconnlimit 9+#define Anum_pg_authid_rolpassword 10+#define Anum_pg_authid_rolvaliduntil 11++/* ----------------+ * initial contents of pg_authid+ *+ * The uppercase quantities will be replaced at initdb time with+ * user choices.+ * ----------------+ */+DATA(insert OID = 10 ( "POSTGRES" t t t t t t t -1 _null_ _null_));++#define BOOTSTRAP_SUPERUSERID 10++#endif /* PG_AUTHID_H */
+ foreign/libpg_query/src/postgres/include/catalog/pg_class.h view
@@ -0,0 +1,180 @@+/*-------------------------------------------------------------------------+ *+ * pg_class.h+ * definition of the system "relation" relation (pg_class)+ * along with the relation's initial contents.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/catalog/pg_class.h+ *+ * NOTES+ * the genbki.pl script reads this file and generates .bki+ * information from the DATA() statements.+ *+ *-------------------------------------------------------------------------+ */+#ifndef PG_CLASS_H+#define PG_CLASS_H++#include "catalog/genbki.h"++/* ----------------+ * pg_class definition. cpp turns this into+ * typedef struct FormData_pg_class+ * ----------------+ */+#define RelationRelationId 1259+#define RelationRelation_Rowtype_Id 83++CATALOG(pg_class,1259) BKI_BOOTSTRAP BKI_ROWTYPE_OID(83) BKI_SCHEMA_MACRO+{+ NameData relname; /* class name */+ Oid relnamespace; /* OID of namespace containing this class */+ Oid reltype; /* OID of entry in pg_type for table's+ * implicit row type */+ Oid reloftype; /* OID of entry in pg_type for underlying+ * composite type */+ Oid relowner; /* class owner */+ Oid relam; /* index access method; 0 if not an index */+ Oid relfilenode; /* identifier of physical storage file */++ /* relfilenode == 0 means it is a "mapped" relation, see relmapper.c */+ Oid reltablespace; /* identifier of table space for relation */+ int32 relpages; /* # of blocks (not always up-to-date) */+ float4 reltuples; /* # of tuples (not always up-to-date) */+ int32 relallvisible; /* # of all-visible blocks (not always+ * up-to-date) */+ Oid reltoastrelid; /* OID of toast table; 0 if none */+ bool relhasindex; /* T if has (or has had) any indexes */+ bool relisshared; /* T if shared across databases */+ char relpersistence; /* see RELPERSISTENCE_xxx constants below */+ char relkind; /* see RELKIND_xxx constants below */+ int16 relnatts; /* number of user attributes */++ /*+ * Class pg_attribute must contain exactly "relnatts" user attributes+ * (with attnums ranging from 1 to relnatts) for this class. It may also+ * contain entries with negative attnums for system attributes.+ */+ int16 relchecks; /* # of CHECK constraints for class */+ bool relhasoids; /* T if we generate OIDs for rows of rel */+ bool relhaspkey; /* has (or has had) PRIMARY KEY index */+ bool relhasrules; /* has (or has had) any rules */+ bool relhastriggers; /* has (or has had) any TRIGGERs */+ bool relhassubclass; /* has (or has had) derived classes */+ bool relrowsecurity; /* row security is enabled or not */+ bool relforcerowsecurity; /* row security forced for owners or not */+ bool relispopulated; /* matview currently holds query results */+ char relreplident; /* see REPLICA_IDENTITY_xxx constants */+ TransactionId relfrozenxid; /* all Xids < this are frozen in this rel */+ TransactionId relminmxid; /* all multixacts in this rel are >= this.+ * this is really a MultiXactId */++#ifdef CATALOG_VARLEN /* variable-length fields start here */+ /* NOTE: These fields are not present in a relcache entry's rd_rel field. */+ aclitem relacl[1]; /* access permissions */+ text reloptions[1]; /* access-method-specific options */+#endif+} FormData_pg_class;++/* Size of fixed part of pg_class tuples, not counting var-length fields */+#define CLASS_TUPLE_SIZE \+ (offsetof(FormData_pg_class,relminmxid) + sizeof(TransactionId))++/* ----------------+ * Form_pg_class corresponds to a pointer to a tuple with+ * the format of pg_class relation.+ * ----------------+ */+typedef FormData_pg_class *Form_pg_class;++/* ----------------+ * compiler constants for pg_class+ * ----------------+ */++#define Natts_pg_class 31+#define Anum_pg_class_relname 1+#define Anum_pg_class_relnamespace 2+#define Anum_pg_class_reltype 3+#define Anum_pg_class_reloftype 4+#define Anum_pg_class_relowner 5+#define Anum_pg_class_relam 6+#define Anum_pg_class_relfilenode 7+#define Anum_pg_class_reltablespace 8+#define Anum_pg_class_relpages 9+#define Anum_pg_class_reltuples 10+#define Anum_pg_class_relallvisible 11+#define Anum_pg_class_reltoastrelid 12+#define Anum_pg_class_relhasindex 13+#define Anum_pg_class_relisshared 14+#define Anum_pg_class_relpersistence 15+#define Anum_pg_class_relkind 16+#define Anum_pg_class_relnatts 17+#define Anum_pg_class_relchecks 18+#define Anum_pg_class_relhasoids 19+#define Anum_pg_class_relhaspkey 20+#define Anum_pg_class_relhasrules 21+#define Anum_pg_class_relhastriggers 22+#define Anum_pg_class_relhassubclass 23+#define Anum_pg_class_relrowsecurity 24+#define Anum_pg_class_relforcerowsecurity 25+#define Anum_pg_class_relispopulated 26+#define Anum_pg_class_relreplident 27+#define Anum_pg_class_relfrozenxid 28+#define Anum_pg_class_relminmxid 29+#define Anum_pg_class_relacl 30+#define Anum_pg_class_reloptions 31++/* ----------------+ * initial contents of pg_class+ *+ * NOTE: only "bootstrapped" relations need to be declared here. Be sure that+ * the OIDs listed here match those given in their CATALOG macros, and that+ * the relnatts values are correct.+ * ----------------+ */++/*+ * Note: "3" in the relfrozenxid column stands for FirstNormalTransactionId;+ * similarly, "1" in relminmxid stands for FirstMultiXactId+ */+DATA(insert OID = 1247 ( pg_type PGNSP 71 0 PGUID 0 0 0 0 0 0 0 f f p r 30 0 t f f f f f f t n 3 1 _null_ _null_ ));+DESCR("");+DATA(insert OID = 1249 ( pg_attribute PGNSP 75 0 PGUID 0 0 0 0 0 0 0 f f p r 21 0 f f f f f f f t n 3 1 _null_ _null_ ));+DESCR("");+DATA(insert OID = 1255 ( pg_proc PGNSP 81 0 PGUID 0 0 0 0 0 0 0 f f p r 28 0 t f f f f f f t n 3 1 _null_ _null_ ));+DESCR("");+DATA(insert OID = 1259 ( pg_class PGNSP 83 0 PGUID 0 0 0 0 0 0 0 f f p r 31 0 t f f f f f f t n 3 1 _null_ _null_ ));+DESCR("");+++#define RELKIND_RELATION 'r' /* ordinary table */+#define RELKIND_INDEX 'i' /* secondary index */+#define RELKIND_SEQUENCE 'S' /* sequence object */+#define RELKIND_TOASTVALUE 't' /* for out-of-line values */+#define RELKIND_VIEW 'v' /* view */+#define RELKIND_COMPOSITE_TYPE 'c' /* composite type */+#define RELKIND_FOREIGN_TABLE 'f' /* foreign table */+#define RELKIND_MATVIEW 'm' /* materialized view */++#define RELPERSISTENCE_PERMANENT 'p' /* regular table */+#define RELPERSISTENCE_UNLOGGED 'u' /* unlogged permanent table */+#define RELPERSISTENCE_TEMP 't' /* temporary table */++/* default selection for replica identity (primary key or nothing) */+#define REPLICA_IDENTITY_DEFAULT 'd'+/* no replica identity is logged for this relation */+#define REPLICA_IDENTITY_NOTHING 'n'+/* all columns are logged as replica identity */+#define REPLICA_IDENTITY_FULL 'f'+/*+ * an explicitly chosen candidate key's columns are used as identity;+ * will still be set if the index has been dropped, in that case it+ * has the same meaning as 'd'+ */+#define REPLICA_IDENTITY_INDEX 'i'+#endif /* PG_CLASS_H */
+ foreign/libpg_query/src/postgres/include/catalog/pg_collation.h view
@@ -0,0 +1,76 @@+/*-------------------------------------------------------------------------+ *+ * pg_collation.h+ * definition of the system "collation" relation (pg_collation)+ * along with the relation's initial contents.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * IDENTIFICATION+ * src/include/catalog/pg_collation.h+ *+ * NOTES+ * the genbki.pl script reads this file and generates .bki+ * information from the DATA() statements.+ *+ *-------------------------------------------------------------------------+ */+#ifndef PG_COLLATION_H+#define PG_COLLATION_H++#include "catalog/genbki.h"++/* ----------------+ * pg_collation definition. cpp turns this into+ * typedef struct FormData_pg_collation+ * ----------------+ */+#define CollationRelationId 3456++CATALOG(pg_collation,3456)+{+ NameData collname; /* collation name */+ Oid collnamespace; /* OID of namespace containing collation */+ Oid collowner; /* owner of collation */+ int32 collencoding; /* encoding for this collation; -1 = "all" */+ NameData collcollate; /* LC_COLLATE setting */+ NameData collctype; /* LC_CTYPE setting */+} FormData_pg_collation;++/* ----------------+ * Form_pg_collation corresponds to a pointer to a row with+ * the format of pg_collation relation.+ * ----------------+ */+typedef FormData_pg_collation *Form_pg_collation;++/* ----------------+ * compiler constants for pg_collation+ * ----------------+ */+#define Natts_pg_collation 6+#define Anum_pg_collation_collname 1+#define Anum_pg_collation_collnamespace 2+#define Anum_pg_collation_collowner 3+#define Anum_pg_collation_collencoding 4+#define Anum_pg_collation_collcollate 5+#define Anum_pg_collation_collctype 6++/* ----------------+ * initial contents of pg_collation+ * ----------------+ */++DATA(insert OID = 100 ( default PGNSP PGUID -1 "" "" ));+DESCR("database's default collation");+#define DEFAULT_COLLATION_OID 100+DATA(insert OID = 950 ( C PGNSP PGUID -1 "C" "C" ));+DESCR("standard C collation");+#define C_COLLATION_OID 950+DATA(insert OID = 951 ( POSIX PGNSP PGUID -1 "POSIX" "POSIX" ));+DESCR("standard POSIX collation");+#define POSIX_COLLATION_OID 951++#endif /* PG_COLLATION_H */
+ foreign/libpg_query/src/postgres/include/catalog/pg_constraint.h view
@@ -0,0 +1,258 @@+/*-------------------------------------------------------------------------+ *+ * pg_constraint.h+ * definition of the system "constraint" relation (pg_constraint)+ * along with the relation's initial contents.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/catalog/pg_constraint.h+ *+ * NOTES+ * the genbki.pl script reads this file and generates .bki+ * information from the DATA() statements.+ *+ *-------------------------------------------------------------------------+ */+#ifndef PG_CONSTRAINT_H+#define PG_CONSTRAINT_H++#include "catalog/genbki.h"+#include "catalog/dependency.h"+#include "nodes/pg_list.h"++/* ----------------+ * pg_constraint definition. cpp turns this into+ * typedef struct FormData_pg_constraint+ * ----------------+ */+#define ConstraintRelationId 2606++CATALOG(pg_constraint,2606)+{+ /*+ * conname + connamespace is deliberately not unique; we allow, for+ * example, the same name to be used for constraints of different+ * relations. This is partly for backwards compatibility with past+ * Postgres practice, and partly because we don't want to have to obtain a+ * global lock to generate a globally unique name for a nameless+ * constraint. We associate a namespace with constraint names only for+ * SQL-spec compatibility.+ */+ NameData conname; /* name of this constraint */+ Oid connamespace; /* OID of namespace containing constraint */+ char contype; /* constraint type; see codes below */+ bool condeferrable; /* deferrable constraint? */+ bool condeferred; /* deferred by default? */+ bool convalidated; /* constraint has been validated? */++ /*+ * conrelid and conkey are only meaningful if the constraint applies to a+ * specific relation (this excludes domain constraints and assertions).+ * Otherwise conrelid is 0 and conkey is NULL.+ */+ Oid conrelid; /* relation this constraint constrains */++ /*+ * contypid links to the pg_type row for a domain if this is a domain+ * constraint. Otherwise it's 0.+ *+ * For SQL-style global ASSERTIONs, both conrelid and contypid would be+ * zero. This is not presently supported, however.+ */+ Oid contypid; /* domain this constraint constrains */++ /*+ * conindid links to the index supporting the constraint, if any;+ * otherwise it's 0. This is used for unique, primary-key, and exclusion+ * constraints, and less obviously for foreign-key constraints (where the+ * index is a unique index on the referenced relation's referenced+ * columns). Notice that the index is on conrelid in the first case but+ * confrelid in the second.+ */+ Oid conindid; /* index supporting this constraint */++ /*+ * These fields, plus confkey, are only meaningful for a foreign-key+ * constraint. Otherwise confrelid is 0 and the char fields are spaces.+ */+ Oid confrelid; /* relation referenced by foreign key */+ char confupdtype; /* foreign key's ON UPDATE action */+ char confdeltype; /* foreign key's ON DELETE action */+ char confmatchtype; /* foreign key's match type */++ /* Has a local definition (hence, do not drop when coninhcount is 0) */+ bool conislocal;++ /* Number of times inherited from direct parent relation(s) */+ int32 coninhcount;++ /* Has a local definition and cannot be inherited */+ bool connoinherit;++#ifdef CATALOG_VARLEN /* variable-length fields start here */++ /*+ * Columns of conrelid that the constraint applies to, if known (this is+ * NULL for trigger constraints)+ */+ int16 conkey[1];++ /*+ * If a foreign key, the referenced columns of confrelid+ */+ int16 confkey[1];++ /*+ * If a foreign key, the OIDs of the PK = FK equality operators for each+ * column of the constraint+ */+ Oid conpfeqop[1];++ /*+ * If a foreign key, the OIDs of the PK = PK equality operators for each+ * column of the constraint (i.e., equality for the referenced columns)+ */+ Oid conppeqop[1];++ /*+ * If a foreign key, the OIDs of the FK = FK equality operators for each+ * column of the constraint (i.e., equality for the referencing columns)+ */+ Oid conffeqop[1];++ /*+ * If an exclusion constraint, the OIDs of the exclusion operators for+ * each column of the constraint+ */+ Oid conexclop[1];++ /*+ * If a check constraint, nodeToString representation of expression+ */+ pg_node_tree conbin;++ /*+ * If a check constraint, source-text representation of expression+ */+ text consrc;+#endif+} FormData_pg_constraint;++/* ----------------+ * Form_pg_constraint corresponds to a pointer to a tuple with+ * the format of pg_constraint relation.+ * ----------------+ */+typedef FormData_pg_constraint *Form_pg_constraint;++/* ----------------+ * compiler constants for pg_constraint+ * ----------------+ */+#define Natts_pg_constraint 24+#define Anum_pg_constraint_conname 1+#define Anum_pg_constraint_connamespace 2+#define Anum_pg_constraint_contype 3+#define Anum_pg_constraint_condeferrable 4+#define Anum_pg_constraint_condeferred 5+#define Anum_pg_constraint_convalidated 6+#define Anum_pg_constraint_conrelid 7+#define Anum_pg_constraint_contypid 8+#define Anum_pg_constraint_conindid 9+#define Anum_pg_constraint_confrelid 10+#define Anum_pg_constraint_confupdtype 11+#define Anum_pg_constraint_confdeltype 12+#define Anum_pg_constraint_confmatchtype 13+#define Anum_pg_constraint_conislocal 14+#define Anum_pg_constraint_coninhcount 15+#define Anum_pg_constraint_connoinherit 16+#define Anum_pg_constraint_conkey 17+#define Anum_pg_constraint_confkey 18+#define Anum_pg_constraint_conpfeqop 19+#define Anum_pg_constraint_conppeqop 20+#define Anum_pg_constraint_conffeqop 21+#define Anum_pg_constraint_conexclop 22+#define Anum_pg_constraint_conbin 23+#define Anum_pg_constraint_consrc 24+++/* Valid values for contype */+#define CONSTRAINT_CHECK 'c'+#define CONSTRAINT_FOREIGN 'f'+#define CONSTRAINT_PRIMARY 'p'+#define CONSTRAINT_UNIQUE 'u'+#define CONSTRAINT_TRIGGER 't'+#define CONSTRAINT_EXCLUSION 'x'++/*+ * Valid values for confupdtype and confdeltype are the FKCONSTR_ACTION_xxx+ * constants defined in parsenodes.h. Valid values for confmatchtype are+ * the FKCONSTR_MATCH_xxx constants defined in parsenodes.h.+ */++/*+ * Identify constraint type for lookup purposes+ */+typedef enum ConstraintCategory+{+ CONSTRAINT_RELATION,+ CONSTRAINT_DOMAIN,+ CONSTRAINT_ASSERTION /* for future expansion */+} ConstraintCategory;++/*+ * prototypes for functions in pg_constraint.c+ */+extern Oid CreateConstraintEntry(const char *constraintName,+ Oid constraintNamespace,+ char constraintType,+ bool isDeferrable,+ bool isDeferred,+ bool isValidated,+ Oid relId,+ const int16 *constraintKey,+ int constraintNKeys,+ Oid domainId,+ Oid indexRelId,+ Oid foreignRelId,+ const int16 *foreignKey,+ const Oid *pfEqOp,+ const Oid *ppEqOp,+ const Oid *ffEqOp,+ int foreignNKeys,+ char foreignUpdateType,+ char foreignDeleteType,+ char foreignMatchType,+ const Oid *exclOp,+ Node *conExpr,+ const char *conBin,+ const char *conSrc,+ bool conIsLocal,+ int conInhCount,+ bool conNoInherit,+ bool is_internal);++extern void RemoveConstraintById(Oid conId);+extern void RenameConstraintById(Oid conId, const char *newname);+extern void SetValidatedConstraintById(Oid conId);++extern bool ConstraintNameIsUsed(ConstraintCategory conCat, Oid objId,+ Oid objNamespace, const char *conname);+extern char *ChooseConstraintName(const char *name1, const char *name2,+ const char *label, Oid namespaceid,+ List *others);++extern void AlterConstraintNamespaces(Oid ownerId, Oid oldNspId,+ Oid newNspId, bool isType, ObjectAddresses *objsMoved);+extern Oid get_relation_constraint_oid(Oid relid, const char *conname, bool missing_ok);+extern Oid get_domain_constraint_oid(Oid typid, const char *conname, bool missing_ok);++extern bool check_functional_grouping(Oid relid,+ Index varno, Index varlevelsup,+ List *grouping_columns,+ List **constraintDeps);++#endif /* PG_CONSTRAINT_H */
+ foreign/libpg_query/src/postgres/include/catalog/pg_control.h view
@@ -0,0 +1,241 @@+/*-------------------------------------------------------------------------+ *+ * pg_control.h+ * The system control file "pg_control" is not a heap relation.+ * However, we define it here so that the format is documented.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/catalog/pg_control.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef PG_CONTROL_H+#define PG_CONTROL_H++#include "access/xlogdefs.h"+#include "pgtime.h" /* for pg_time_t */+#include "port/pg_crc32c.h"+++/* Version identifier for this pg_control format */+#define PG_CONTROL_VERSION 942++/*+ * Body of CheckPoint XLOG records. This is declared here because we keep+ * a copy of the latest one in pg_control for possible disaster recovery.+ * Changing this struct requires a PG_CONTROL_VERSION bump.+ */+typedef struct CheckPoint+{+ XLogRecPtr redo; /* next RecPtr available when we began to+ * create CheckPoint (i.e. REDO start point) */+ TimeLineID ThisTimeLineID; /* current TLI */+ TimeLineID PrevTimeLineID; /* previous TLI, if this record begins a new+ * timeline (equals ThisTimeLineID otherwise) */+ bool fullPageWrites; /* current full_page_writes */+ uint32 nextXidEpoch; /* higher-order bits of nextXid */+ TransactionId nextXid; /* next free XID */+ Oid nextOid; /* next free OID */+ MultiXactId nextMulti; /* next free MultiXactId */+ MultiXactOffset nextMultiOffset; /* next free MultiXact offset */+ TransactionId oldestXid; /* cluster-wide minimum datfrozenxid */+ Oid oldestXidDB; /* database with minimum datfrozenxid */+ MultiXactId oldestMulti; /* cluster-wide minimum datminmxid */+ Oid oldestMultiDB; /* database with minimum datminmxid */+ pg_time_t time; /* time stamp of checkpoint */+ TransactionId oldestCommitTsXid; /* oldest Xid with valid commit+ * timestamp */+ TransactionId newestCommitTsXid; /* newest Xid with valid commit+ * timestamp */++ /*+ * Oldest XID still running. This is only needed to initialize hot standby+ * mode from an online checkpoint, so we only bother calculating this for+ * online checkpoints and only when wal_level is hot_standby. Otherwise+ * it's set to InvalidTransactionId.+ */+ TransactionId oldestActiveXid;+} CheckPoint;++/* XLOG info values for XLOG rmgr */+#define XLOG_CHECKPOINT_SHUTDOWN 0x00+#define XLOG_CHECKPOINT_ONLINE 0x10+#define XLOG_NOOP 0x20+#define XLOG_NEXTOID 0x30+#define XLOG_SWITCH 0x40+#define XLOG_BACKUP_END 0x50+#define XLOG_PARAMETER_CHANGE 0x60+#define XLOG_RESTORE_POINT 0x70+#define XLOG_FPW_CHANGE 0x80+#define XLOG_END_OF_RECOVERY 0x90+#define XLOG_FPI_FOR_HINT 0xA0+#define XLOG_FPI 0xB0+++/*+ * System status indicator. Note this is stored in pg_control; if you change+ * it, you must bump PG_CONTROL_VERSION+ */+typedef enum DBState+{+ DB_STARTUP = 0,+ DB_SHUTDOWNED,+ DB_SHUTDOWNED_IN_RECOVERY,+ DB_SHUTDOWNING,+ DB_IN_CRASH_RECOVERY,+ DB_IN_ARCHIVE_RECOVERY,+ DB_IN_PRODUCTION+} DBState;++/*+ * Contents of pg_control.+ *+ * NOTE: try to keep this under 512 bytes so that it will fit on one physical+ * sector of typical disk drives. This reduces the odds of corruption due to+ * power failure midway through a write.+ */++typedef struct ControlFileData+{+ /*+ * Unique system identifier --- to ensure we match up xlog files with the+ * installation that produced them.+ */+ uint64 system_identifier;++ /*+ * Version identifier information. Keep these fields at the same offset,+ * especially pg_control_version; they won't be real useful if they move+ * around. (For historical reasons they must be 8 bytes into the file+ * rather than immediately at the front.)+ *+ * pg_control_version identifies the format of pg_control itself.+ * catalog_version_no identifies the format of the system catalogs.+ *+ * There are additional version identifiers in individual files; for+ * example, WAL logs contain per-page magic numbers that can serve as+ * version cues for the WAL log.+ */+ uint32 pg_control_version; /* PG_CONTROL_VERSION */+ uint32 catalog_version_no; /* see catversion.h */++ /*+ * System status data+ */+ DBState state; /* see enum above */+ pg_time_t time; /* time stamp of last pg_control update */+ XLogRecPtr checkPoint; /* last check point record ptr */+ XLogRecPtr prevCheckPoint; /* previous check point record ptr */++ CheckPoint checkPointCopy; /* copy of last check point record */++ XLogRecPtr unloggedLSN; /* current fake LSN value, for unlogged rels */++ /*+ * These two values determine the minimum point we must recover up to+ * before starting up:+ *+ * minRecoveryPoint is updated to the latest replayed LSN whenever we+ * flush a data change during archive recovery. That guards against+ * starting archive recovery, aborting it, and restarting with an earlier+ * stop location. If we've already flushed data changes from WAL record X+ * to disk, we mustn't start up until we reach X again. Zero when not+ * doing archive recovery.+ *+ * backupStartPoint is the redo pointer of the backup start checkpoint, if+ * we are recovering from an online backup and haven't reached the end of+ * backup yet. It is reset to zero when the end of backup is reached, and+ * we mustn't start up before that. A boolean would suffice otherwise, but+ * we use the redo pointer as a cross-check when we see an end-of-backup+ * record, to make sure the end-of-backup record corresponds the base+ * backup we're recovering from.+ *+ * backupEndPoint is the backup end location, if we are recovering from an+ * online backup which was taken from the standby and haven't reached the+ * end of backup yet. It is initialized to the minimum recovery point in+ * pg_control which was backed up last. It is reset to zero when the end+ * of backup is reached, and we mustn't start up before that.+ *+ * If backupEndRequired is true, we know for sure that we're restoring+ * from a backup, and must see a backup-end record before we can safely+ * start up. If it's false, but backupStartPoint is set, a backup_label+ * file was found at startup but it may have been a leftover from a stray+ * pg_start_backup() call, not accompanied by pg_stop_backup().+ */+ XLogRecPtr minRecoveryPoint;+ TimeLineID minRecoveryPointTLI;+ XLogRecPtr backupStartPoint;+ XLogRecPtr backupEndPoint;+ bool backupEndRequired;++ /*+ * Parameter settings that determine if the WAL can be used for archival+ * or hot standby.+ */+ int wal_level;+ bool wal_log_hints;+ int MaxConnections;+ int max_worker_processes;+ int max_prepared_xacts;+ int max_locks_per_xact;+ bool track_commit_timestamp;++ /*+ * This data is used to check for hardware-architecture compatibility of+ * the database and the backend executable. We need not check endianness+ * explicitly, since the pg_control version will surely look wrong to a+ * machine of different endianness, but we do need to worry about MAXALIGN+ * and floating-point format. (Note: storage layout nominally also+ * depends on SHORTALIGN and INTALIGN, but in practice these are the same+ * on all architectures of interest.)+ *+ * Testing just one double value is not a very bulletproof test for+ * floating-point compatibility, but it will catch most cases.+ */+ uint32 maxAlign; /* alignment requirement for tuples */+ double floatFormat; /* constant 1234567.0 */+#define FLOATFORMAT_VALUE 1234567.0++ /*+ * This data is used to make sure that configuration of this database is+ * compatible with the backend executable.+ */+ uint32 blcksz; /* data block size for this DB */+ uint32 relseg_size; /* blocks per segment of large relation */++ uint32 xlog_blcksz; /* block size within WAL files */+ uint32 xlog_seg_size; /* size of each WAL segment */++ uint32 nameDataLen; /* catalog name field width */+ uint32 indexMaxKeys; /* max number of columns in an index */++ uint32 toast_max_chunk_size; /* chunk size in TOAST tables */+ uint32 loblksize; /* chunk size in pg_largeobject */++ /* flag indicating internal format of timestamp, interval, time */+ bool enableIntTimes; /* int64 storage enabled? */++ /* flags indicating pass-by-value status of various types */+ bool float4ByVal; /* float4 pass-by-value? */+ bool float8ByVal; /* float8, int8, etc pass-by-value? */++ /* Are data pages protected by checksums? Zero if no checksum version */+ uint32 data_checksum_version;++ /* CRC of all above ... MUST BE LAST! */+ pg_crc32c crc;+} ControlFileData;++/*+ * Physical size of the pg_control file. Note that this is considerably+ * bigger than the actually used size (ie, sizeof(ControlFileData)).+ * The idea is to keep the physical size constant independent of format+ * changes, so that ReadControlFile will deliver a suitable wrong-version+ * message instead of a read error if it's looking at an incompatible file.+ */+#define PG_CONTROL_SIZE 8192++#endif /* PG_CONTROL_H */
+ foreign/libpg_query/src/postgres/include/catalog/pg_conversion.h view
@@ -0,0 +1,77 @@+/*-------------------------------------------------------------------------+ *+ * pg_conversion.h+ * definition of the system "conversion" relation (pg_conversion)+ * along with the relation's initial contents.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/catalog/pg_conversion.h+ *+ * NOTES+ * the genbki.pl script reads this file and generates .bki+ * information from the DATA() statements.+ *+ *-------------------------------------------------------------------------+ */+#ifndef PG_CONVERSION_H+#define PG_CONVERSION_H++#include "catalog/genbki.h"++/* ----------------------------------------------------------------+ * pg_conversion definition.+ *+ * cpp turns this into typedef struct FormData_pg_namespace+ *+ * conname name of the conversion+ * connamespace name space which the conversion belongs to+ * conowner owner of the conversion+ * conforencoding FOR encoding id+ * contoencoding TO encoding id+ * conproc OID of the conversion proc+ * condefault TRUE if this is a default conversion+ * ----------------------------------------------------------------+ */+#define ConversionRelationId 2607++CATALOG(pg_conversion,2607)+{+ NameData conname;+ Oid connamespace;+ Oid conowner;+ int32 conforencoding;+ int32 contoencoding;+ regproc conproc;+ bool condefault;+} FormData_pg_conversion;++/* ----------------+ * Form_pg_conversion corresponds to a pointer to a tuple with+ * the format of pg_conversion relation.+ * ----------------+ */+typedef FormData_pg_conversion *Form_pg_conversion;++/* ----------------+ * compiler constants for pg_conversion+ * ----------------+ */++#define Natts_pg_conversion 7+#define Anum_pg_conversion_conname 1+#define Anum_pg_conversion_connamespace 2+#define Anum_pg_conversion_conowner 3+#define Anum_pg_conversion_conforencoding 4+#define Anum_pg_conversion_contoencoding 5+#define Anum_pg_conversion_conproc 6+#define Anum_pg_conversion_condefault 7++/* ----------------+ * initial contents of pg_conversion+ * ---------------+ */++#endif /* PG_CONVERSION_H */
+ foreign/libpg_query/src/postgres/include/catalog/pg_conversion_fn.h view
@@ -0,0 +1,27 @@+/*-------------------------------------------------------------------------+ *+ * pg_conversion_fn.h+ * prototypes for functions in catalog/pg_conversion.c+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/catalog/pg_conversion_fn.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef PG_CONVERSION_FN_H+#define PG_CONVERSION_FN_H+++#include "catalog/objectaddress.h"++extern ObjectAddress ConversionCreate(const char *conname, Oid connamespace,+ Oid conowner,+ int32 conforencoding, int32 contoencoding,+ Oid conproc, bool def);+extern void RemoveConversionById(Oid conversionOid);+extern Oid FindDefaultConversion(Oid connamespace, int32 for_encoding, int32 to_encoding);++#endif /* PG_CONVERSION_FN_H */
+ foreign/libpg_query/src/postgres/include/catalog/pg_depend.h view
@@ -0,0 +1,90 @@+/*-------------------------------------------------------------------------+ *+ * pg_depend.h+ * definition of the system "dependency" relation (pg_depend)+ * along with the relation's initial contents.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/catalog/pg_depend.h+ *+ * NOTES+ * the genbki.pl script reads this file and generates .bki+ * information from the DATA() statements.+ *+ *-------------------------------------------------------------------------+ */+#ifndef PG_DEPEND_H+#define PG_DEPEND_H++#include "catalog/genbki.h"++/* ----------------+ * pg_depend definition. cpp turns this into+ * typedef struct FormData_pg_depend+ * ----------------+ */+#define DependRelationId 2608++CATALOG(pg_depend,2608) BKI_WITHOUT_OIDS+{+ /*+ * Identification of the dependent (referencing) object.+ *+ * These fields are all zeroes for a DEPENDENCY_PIN entry.+ */+ Oid classid; /* OID of table containing object */+ Oid objid; /* OID of object itself */+ int32 objsubid; /* column number, or 0 if not used */++ /*+ * Identification of the independent (referenced) object.+ */+ Oid refclassid; /* OID of table containing object */+ Oid refobjid; /* OID of object itself */+ int32 refobjsubid; /* column number, or 0 if not used */++ /*+ * Precise semantics of the relationship are specified by the deptype+ * field. See DependencyType in catalog/dependency.h.+ */+ char deptype; /* see codes in dependency.h */+} FormData_pg_depend;++/* ----------------+ * Form_pg_depend corresponds to a pointer to a row with+ * the format of pg_depend relation.+ * ----------------+ */+typedef FormData_pg_depend *Form_pg_depend;++/* ----------------+ * compiler constants for pg_depend+ * ----------------+ */+#define Natts_pg_depend 7+#define Anum_pg_depend_classid 1+#define Anum_pg_depend_objid 2+#define Anum_pg_depend_objsubid 3+#define Anum_pg_depend_refclassid 4+#define Anum_pg_depend_refobjid 5+#define Anum_pg_depend_refobjsubid 6+#define Anum_pg_depend_deptype 7+++/*+ * pg_depend has no preloaded contents; system-defined dependencies are+ * loaded into it during a late stage of the initdb process.+ *+ * NOTE: we do not represent all possible dependency pairs in pg_depend;+ * for example, there's not much value in creating an explicit dependency+ * from an attribute to its relation. Usually we make a dependency for+ * cases where the relationship is conditional rather than essential+ * (for example, not all triggers are dependent on constraints, but all+ * attributes are dependent on relations) or where the dependency is not+ * convenient to find from the contents of other catalogs.+ */++#endif /* PG_DEPEND_H */
+ foreign/libpg_query/src/postgres/include/catalog/pg_event_trigger.h view
@@ -0,0 +1,64 @@+/*-------------------------------------------------------------------------+ *+ * pg_event_trigger.h+ * definition of the system "event trigger" relation (pg_event_trigger)+ * along with the relation's initial contents.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/catalog/pg_event_trigger.h+ *+ * NOTES+ * the genbki.pl script reads this file and generates .bki+ * information from the DATA() statements.+ *+ *-------------------------------------------------------------------------+ */+#ifndef PG_EVENT_TRIGGER_H+#define PG_EVENT_TRIGGER_H++#include "catalog/genbki.h"++/* ----------------+ * pg_event_trigger definition. cpp turns this into+ * typedef struct FormData_pg_event_trigger+ * ----------------+ */+#define EventTriggerRelationId 3466++CATALOG(pg_event_trigger,3466)+{+ NameData evtname; /* trigger's name */+ NameData evtevent; /* trigger's event */+ Oid evtowner; /* trigger's owner */+ Oid evtfoid; /* OID of function to be called */+ char evtenabled; /* trigger's firing configuration WRT+ * session_replication_role */++#ifdef CATALOG_VARLEN+ text evttags[1]; /* command TAGs this event trigger targets */+#endif+} FormData_pg_event_trigger;++/* ----------------+ * Form_pg_event_trigger corresponds to a pointer to a tuple with+ * the format of pg_event_trigger relation.+ * ----------------+ */+typedef FormData_pg_event_trigger *Form_pg_event_trigger;++/* ----------------+ * compiler constants for pg_event_trigger+ * ----------------+ */+#define Natts_pg_event_trigger 6+#define Anum_pg_event_trigger_evtname 1+#define Anum_pg_event_trigger_evtevent 2+#define Anum_pg_event_trigger_evtowner 3+#define Anum_pg_event_trigger_evtfoid 4+#define Anum_pg_event_trigger_evtenabled 5+#define Anum_pg_event_trigger_evttags 6++#endif /* PG_EVENT_TRIGGER_H */
+ foreign/libpg_query/src/postgres/include/catalog/pg_index.h view
@@ -0,0 +1,111 @@+/*-------------------------------------------------------------------------+ *+ * pg_index.h+ * definition of the system "index" relation (pg_index)+ * along with the relation's initial contents.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/catalog/pg_index.h+ *+ * NOTES+ * the genbki.pl script reads this file and generates .bki+ * information from the DATA() statements.+ *+ *-------------------------------------------------------------------------+ */+#ifndef PG_INDEX_H+#define PG_INDEX_H++#include "catalog/genbki.h"++/* ----------------+ * pg_index definition. cpp turns this into+ * typedef struct FormData_pg_index.+ * ----------------+ */+#define IndexRelationId 2610++CATALOG(pg_index,2610) BKI_WITHOUT_OIDS BKI_SCHEMA_MACRO+{+ Oid indexrelid; /* OID of the index */+ Oid indrelid; /* OID of the relation it indexes */+ int16 indnatts; /* number of columns in index */+ bool indisunique; /* is this a unique index? */+ bool indisprimary; /* is this index for primary key? */+ bool indisexclusion; /* is this index for exclusion constraint? */+ bool indimmediate; /* is uniqueness enforced immediately? */+ bool indisclustered; /* is this the index last clustered by? */+ bool indisvalid; /* is this index valid for use by queries? */+ bool indcheckxmin; /* must we wait for xmin to be old? */+ bool indisready; /* is this index ready for inserts? */+ bool indislive; /* is this index alive at all? */+ bool indisreplident; /* is this index the identity for replication? */++ /* variable-length fields start here, but we allow direct access to indkey */+ int2vector indkey; /* column numbers of indexed cols, or 0 */++#ifdef CATALOG_VARLEN+ oidvector indcollation; /* collation identifiers */+ oidvector indclass; /* opclass identifiers */+ int2vector indoption; /* per-column flags (AM-specific meanings) */+ pg_node_tree indexprs; /* expression trees for index attributes that+ * are not simple column references; one for+ * each zero entry in indkey[] */+ pg_node_tree indpred; /* expression tree for predicate, if a partial+ * index; else NULL */+#endif+} FormData_pg_index;++/* ----------------+ * Form_pg_index corresponds to a pointer to a tuple with+ * the format of pg_index relation.+ * ----------------+ */+typedef FormData_pg_index *Form_pg_index;++/* ----------------+ * compiler constants for pg_index+ * ----------------+ */+#define Natts_pg_index 19+#define Anum_pg_index_indexrelid 1+#define Anum_pg_index_indrelid 2+#define Anum_pg_index_indnatts 3+#define Anum_pg_index_indisunique 4+#define Anum_pg_index_indisprimary 5+#define Anum_pg_index_indisexclusion 6+#define Anum_pg_index_indimmediate 7+#define Anum_pg_index_indisclustered 8+#define Anum_pg_index_indisvalid 9+#define Anum_pg_index_indcheckxmin 10+#define Anum_pg_index_indisready 11+#define Anum_pg_index_indislive 12+#define Anum_pg_index_indisreplident 13+#define Anum_pg_index_indkey 14+#define Anum_pg_index_indcollation 15+#define Anum_pg_index_indclass 16+#define Anum_pg_index_indoption 17+#define Anum_pg_index_indexprs 18+#define Anum_pg_index_indpred 19++/*+ * Index AMs that support ordered scans must support these two indoption+ * bits. Otherwise, the content of the per-column indoption fields is+ * open for future definition.+ */+#define INDOPTION_DESC 0x0001 /* values are in reverse order */+#define INDOPTION_NULLS_FIRST 0x0002 /* NULLs are first instead of last */++/*+ * Use of these macros is recommended over direct examination of the state+ * flag columns where possible; this allows source code compatibility with+ * the hacky representation used in 9.2.+ */+#define IndexIsValid(indexForm) ((indexForm)->indisvalid)+#define IndexIsReady(indexForm) ((indexForm)->indisready)+#define IndexIsLive(indexForm) ((indexForm)->indislive)++#endif /* PG_INDEX_H */
+ foreign/libpg_query/src/postgres/include/catalog/pg_language.h view
@@ -0,0 +1,82 @@+/*-------------------------------------------------------------------------+ *+ * pg_language.h+ * definition of the system "language" relation (pg_language)+ * along with the relation's initial contents.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/catalog/pg_language.h+ *+ * NOTES+ * the genbki.pl script reads this file and generates .bki+ * information from the DATA() statements.+ *+ *-------------------------------------------------------------------------+ */+#ifndef PG_LANGUAGE_H+#define PG_LANGUAGE_H++#include "catalog/genbki.h"++/* ----------------+ * pg_language definition. cpp turns this into+ * typedef struct FormData_pg_language+ * ----------------+ */+#define LanguageRelationId 2612++CATALOG(pg_language,2612)+{+ NameData lanname; /* Language name */+ Oid lanowner; /* Language's owner */+ bool lanispl; /* Is a procedural language */+ bool lanpltrusted; /* PL is trusted */+ Oid lanplcallfoid; /* Call handler for PL */+ Oid laninline; /* Optional anonymous-block handler function */+ Oid lanvalidator; /* Optional validation function */++#ifdef CATALOG_VARLEN /* variable-length fields start here */+ aclitem lanacl[1]; /* Access privileges */+#endif+} FormData_pg_language;++/* ----------------+ * Form_pg_language corresponds to a pointer to a tuple with+ * the format of pg_language relation.+ * ----------------+ */+typedef FormData_pg_language *Form_pg_language;++/* ----------------+ * compiler constants for pg_language+ * ----------------+ */+#define Natts_pg_language 8+#define Anum_pg_language_lanname 1+#define Anum_pg_language_lanowner 2+#define Anum_pg_language_lanispl 3+#define Anum_pg_language_lanpltrusted 4+#define Anum_pg_language_lanplcallfoid 5+#define Anum_pg_language_laninline 6+#define Anum_pg_language_lanvalidator 7+#define Anum_pg_language_lanacl 8++/* ----------------+ * initial contents of pg_language+ * ----------------+ */++DATA(insert OID = 12 ( "internal" PGUID f f 0 0 2246 _null_ ));+DESCR("built-in functions");+#define INTERNALlanguageId 12+DATA(insert OID = 13 ( "c" PGUID f f 0 0 2247 _null_ ));+DESCR("dynamically-loaded C functions");+#define ClanguageId 13+DATA(insert OID = 14 ( "sql" PGUID f t 0 0 2248 _null_ ));+DESCR("SQL-language functions");+#define SQLlanguageId 14++#endif /* PG_LANGUAGE_H */
+ foreign/libpg_query/src/postgres/include/catalog/pg_namespace.h view
@@ -0,0 +1,85 @@+/*-------------------------------------------------------------------------+ *+ * pg_namespace.h+ * definition of the system "namespace" relation (pg_namespace)+ * along with the relation's initial contents.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/catalog/pg_namespace.h+ *+ * NOTES+ * the genbki.pl script reads this file and generates .bki+ * information from the DATA() statements.+ *+ *-------------------------------------------------------------------------+ */+#ifndef PG_NAMESPACE_H+#define PG_NAMESPACE_H++#include "catalog/genbki.h"++/* ----------------------------------------------------------------+ * pg_namespace definition.+ *+ * cpp turns this into typedef struct FormData_pg_namespace+ *+ * nspname name of the namespace+ * nspowner owner (creator) of the namespace+ * nspacl access privilege list+ * ----------------------------------------------------------------+ */+#define NamespaceRelationId 2615++CATALOG(pg_namespace,2615)+{+ NameData nspname;+ Oid nspowner;++#ifdef CATALOG_VARLEN /* variable-length fields start here */+ aclitem nspacl[1];+#endif+} FormData_pg_namespace;++/* ----------------+ * Form_pg_namespace corresponds to a pointer to a tuple with+ * the format of pg_namespace relation.+ * ----------------+ */+typedef FormData_pg_namespace *Form_pg_namespace;++/* ----------------+ * compiler constants for pg_namespace+ * ----------------+ */++#define Natts_pg_namespace 3+#define Anum_pg_namespace_nspname 1+#define Anum_pg_namespace_nspowner 2+#define Anum_pg_namespace_nspacl 3+++/* ----------------+ * initial contents of pg_namespace+ * ---------------+ */++DATA(insert OID = 11 ( "pg_catalog" PGUID _null_ ));+DESCR("system catalog schema");+#define PG_CATALOG_NAMESPACE 11+DATA(insert OID = 99 ( "pg_toast" PGUID _null_ ));+DESCR("reserved schema for TOAST tables");+#define PG_TOAST_NAMESPACE 99+DATA(insert OID = 2200 ( "public" PGUID _null_ ));+DESCR("standard public schema");+#define PG_PUBLIC_NAMESPACE 2200+++/*+ * prototypes for functions in pg_namespace.c+ */+extern Oid NamespaceCreate(const char *nspName, Oid ownerId, bool isTemp);++#endif /* PG_NAMESPACE_H */
+ foreign/libpg_query/src/postgres/include/catalog/pg_opclass.h view
@@ -0,0 +1,275 @@+/*-------------------------------------------------------------------------+ *+ * pg_opclass.h+ * definition of the system "opclass" relation (pg_opclass)+ * along with the relation's initial contents.+ *+ * The primary key for this table is <opcmethod, opcname, opcnamespace> ---+ * that is, there is a row for each valid combination of opclass name and+ * index access method type. This row specifies the expected input data type+ * for the opclass (the type of the heap column, or the expression output type+ * in the case of an index expression). Note that types binary-coercible to+ * the specified type will be accepted too.+ *+ * For a given <opcmethod, opcintype> pair, there can be at most one row that+ * has opcdefault = true; this row is the default opclass for such data in+ * such an index. (This is not currently enforced by an index, because we+ * don't support partial indexes on system catalogs.)+ *+ * Normally opckeytype = InvalidOid (zero), indicating that the data stored+ * in the index is the same as the data in the indexed column. If opckeytype+ * is nonzero then it indicates that a conversion step is needed to produce+ * the stored index data, which will be of type opckeytype (which might be+ * the same or different from the input datatype). Performing such a+ * conversion is the responsibility of the index access method --- not all+ * AMs support this.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/catalog/pg_opclass.h+ *+ * NOTES+ * the genbki.pl script reads this file and generates .bki+ * information from the DATA() statements.+ *+ *-------------------------------------------------------------------------+ */+#ifndef PG_OPCLASS_H+#define PG_OPCLASS_H++#include "catalog/genbki.h"++/* ----------------+ * pg_opclass definition. cpp turns this into+ * typedef struct FormData_pg_opclass+ * ----------------+ */+#define OperatorClassRelationId 2616++CATALOG(pg_opclass,2616)+{+ Oid opcmethod; /* index access method opclass is for */+ NameData opcname; /* name of this opclass */+ Oid opcnamespace; /* namespace of this opclass */+ Oid opcowner; /* opclass owner */+ Oid opcfamily; /* containing operator family */+ Oid opcintype; /* type of data indexed by opclass */+ bool opcdefault; /* T if opclass is default for opcintype */+ Oid opckeytype; /* type of data in index, or InvalidOid */+} FormData_pg_opclass;++/* ----------------+ * Form_pg_opclass corresponds to a pointer to a tuple with+ * the format of pg_opclass relation.+ * ----------------+ */+typedef FormData_pg_opclass *Form_pg_opclass;++/* ----------------+ * compiler constants for pg_opclass+ * ----------------+ */+#define Natts_pg_opclass 8+#define Anum_pg_opclass_opcmethod 1+#define Anum_pg_opclass_opcname 2+#define Anum_pg_opclass_opcnamespace 3+#define Anum_pg_opclass_opcowner 4+#define Anum_pg_opclass_opcfamily 5+#define Anum_pg_opclass_opcintype 6+#define Anum_pg_opclass_opcdefault 7+#define Anum_pg_opclass_opckeytype 8++/* ----------------+ * initial contents of pg_opclass+ *+ * Note: we hard-wire an OID only for a few entries that have to be explicitly+ * referenced in the C code or in built-in catalog entries. The rest get OIDs+ * assigned on-the-fly during initdb.+ * ----------------+ */++DATA(insert ( 403 abstime_ops PGNSP PGUID 421 702 t 0 ));+DATA(insert ( 403 array_ops PGNSP PGUID 397 2277 t 0 ));+DATA(insert ( 405 array_ops PGNSP PGUID 627 2277 t 0 ));+DATA(insert ( 403 bit_ops PGNSP PGUID 423 1560 t 0 ));+DATA(insert ( 403 bool_ops PGNSP PGUID 424 16 t 0 ));+DATA(insert ( 403 bpchar_ops PGNSP PGUID 426 1042 t 0 ));+DATA(insert ( 405 bpchar_ops PGNSP PGUID 427 1042 t 0 ));+DATA(insert ( 403 bytea_ops PGNSP PGUID 428 17 t 0 ));+DATA(insert ( 403 char_ops PGNSP PGUID 429 18 t 0 ));+DATA(insert ( 405 char_ops PGNSP PGUID 431 18 t 0 ));+DATA(insert ( 403 cidr_ops PGNSP PGUID 1974 869 f 0 ));+DATA(insert ( 405 cidr_ops PGNSP PGUID 1975 869 f 0 ));+DATA(insert OID = 3122 ( 403 date_ops PGNSP PGUID 434 1082 t 0 ));+#define DATE_BTREE_OPS_OID 3122+DATA(insert ( 405 date_ops PGNSP PGUID 435 1082 t 0 ));+DATA(insert ( 403 float4_ops PGNSP PGUID 1970 700 t 0 ));+DATA(insert ( 405 float4_ops PGNSP PGUID 1971 700 t 0 ));+DATA(insert OID = 3123 ( 403 float8_ops PGNSP PGUID 1970 701 t 0 ));+#define FLOAT8_BTREE_OPS_OID 3123+DATA(insert ( 405 float8_ops PGNSP PGUID 1971 701 t 0 ));+DATA(insert ( 403 inet_ops PGNSP PGUID 1974 869 t 0 ));+DATA(insert ( 405 inet_ops PGNSP PGUID 1975 869 t 0 ));+DATA(insert ( 783 inet_ops PGNSP PGUID 3550 869 f 0 ));+DATA(insert OID = 1979 ( 403 int2_ops PGNSP PGUID 1976 21 t 0 ));+#define INT2_BTREE_OPS_OID 1979+DATA(insert ( 405 int2_ops PGNSP PGUID 1977 21 t 0 ));+DATA(insert OID = 1978 ( 403 int4_ops PGNSP PGUID 1976 23 t 0 ));+#define INT4_BTREE_OPS_OID 1978+DATA(insert ( 405 int4_ops PGNSP PGUID 1977 23 t 0 ));+DATA(insert OID = 3124 ( 403 int8_ops PGNSP PGUID 1976 20 t 0 ));+#define INT8_BTREE_OPS_OID 3124+DATA(insert ( 405 int8_ops PGNSP PGUID 1977 20 t 0 ));+DATA(insert ( 403 interval_ops PGNSP PGUID 1982 1186 t 0 ));+DATA(insert ( 405 interval_ops PGNSP PGUID 1983 1186 t 0 ));+DATA(insert ( 403 macaddr_ops PGNSP PGUID 1984 829 t 0 ));+DATA(insert ( 405 macaddr_ops PGNSP PGUID 1985 829 t 0 ));+/*+ * Here's an ugly little hack to save space in the system catalog indexes.+ * btree doesn't ordinarily allow a storage type different from input type;+ * but cstring and name are the same thing except for trailing padding,+ * and we can safely omit that within an index entry. So we declare the+ * btree opclass for name as using cstring storage type.+ */+DATA(insert ( 403 name_ops PGNSP PGUID 1986 19 t 2275 ));+DATA(insert ( 405 name_ops PGNSP PGUID 1987 19 t 0 ));+DATA(insert OID = 3125 ( 403 numeric_ops PGNSP PGUID 1988 1700 t 0 ));+#define NUMERIC_BTREE_OPS_OID 3125+DATA(insert ( 405 numeric_ops PGNSP PGUID 1998 1700 t 0 ));+DATA(insert OID = 1981 ( 403 oid_ops PGNSP PGUID 1989 26 t 0 ));+#define OID_BTREE_OPS_OID 1981+DATA(insert ( 405 oid_ops PGNSP PGUID 1990 26 t 0 ));+DATA(insert ( 403 oidvector_ops PGNSP PGUID 1991 30 t 0 ));+DATA(insert ( 405 oidvector_ops PGNSP PGUID 1992 30 t 0 ));+DATA(insert ( 403 record_ops PGNSP PGUID 2994 2249 t 0 ));+DATA(insert ( 403 record_image_ops PGNSP PGUID 3194 2249 f 0 ));+DATA(insert OID = 3126 ( 403 text_ops PGNSP PGUID 1994 25 t 0 ));+#define TEXT_BTREE_OPS_OID 3126+DATA(insert ( 405 text_ops PGNSP PGUID 1995 25 t 0 ));+DATA(insert ( 403 time_ops PGNSP PGUID 1996 1083 t 0 ));+DATA(insert ( 405 time_ops PGNSP PGUID 1997 1083 t 0 ));+DATA(insert OID = 3127 ( 403 timestamptz_ops PGNSP PGUID 434 1184 t 0 ));+#define TIMESTAMPTZ_BTREE_OPS_OID 3127+DATA(insert ( 405 timestamptz_ops PGNSP PGUID 1999 1184 t 0 ));+DATA(insert ( 403 timetz_ops PGNSP PGUID 2000 1266 t 0 ));+DATA(insert ( 405 timetz_ops PGNSP PGUID 2001 1266 t 0 ));+DATA(insert ( 403 varbit_ops PGNSP PGUID 2002 1562 t 0 ));+DATA(insert ( 403 varchar_ops PGNSP PGUID 1994 25 f 0 ));+DATA(insert ( 405 varchar_ops PGNSP PGUID 1995 25 f 0 ));+DATA(insert OID = 3128 ( 403 timestamp_ops PGNSP PGUID 434 1114 t 0 ));+#define TIMESTAMP_BTREE_OPS_OID 3128+DATA(insert ( 405 timestamp_ops PGNSP PGUID 2040 1114 t 0 ));+DATA(insert ( 403 text_pattern_ops PGNSP PGUID 2095 25 f 0 ));+DATA(insert ( 403 varchar_pattern_ops PGNSP PGUID 2095 25 f 0 ));+DATA(insert ( 403 bpchar_pattern_ops PGNSP PGUID 2097 1042 f 0 ));+DATA(insert ( 403 money_ops PGNSP PGUID 2099 790 t 0 ));+DATA(insert ( 405 bool_ops PGNSP PGUID 2222 16 t 0 ));+DATA(insert ( 405 bytea_ops PGNSP PGUID 2223 17 t 0 ));+DATA(insert ( 405 int2vector_ops PGNSP PGUID 2224 22 t 0 ));+DATA(insert ( 403 tid_ops PGNSP PGUID 2789 27 t 0 ));+DATA(insert ( 405 xid_ops PGNSP PGUID 2225 28 t 0 ));+DATA(insert ( 405 cid_ops PGNSP PGUID 2226 29 t 0 ));+DATA(insert ( 405 abstime_ops PGNSP PGUID 2227 702 t 0 ));+DATA(insert ( 405 reltime_ops PGNSP PGUID 2228 703 t 0 ));+DATA(insert ( 405 text_pattern_ops PGNSP PGUID 2229 25 f 0 ));+DATA(insert ( 405 varchar_pattern_ops PGNSP PGUID 2229 25 f 0 ));+DATA(insert ( 405 bpchar_pattern_ops PGNSP PGUID 2231 1042 f 0 ));+DATA(insert ( 403 reltime_ops PGNSP PGUID 2233 703 t 0 ));+DATA(insert ( 403 tinterval_ops PGNSP PGUID 2234 704 t 0 ));+DATA(insert ( 405 aclitem_ops PGNSP PGUID 2235 1033 t 0 ));+DATA(insert ( 783 box_ops PGNSP PGUID 2593 603 t 0 ));+DATA(insert ( 783 point_ops PGNSP PGUID 1029 600 t 603 ));+DATA(insert ( 783 poly_ops PGNSP PGUID 2594 604 t 603 ));+DATA(insert ( 783 circle_ops PGNSP PGUID 2595 718 t 603 ));+DATA(insert ( 2742 _int4_ops PGNSP PGUID 2745 1007 t 23 ));+DATA(insert ( 2742 _text_ops PGNSP PGUID 2745 1009 t 25 ));+DATA(insert ( 2742 _abstime_ops PGNSP PGUID 2745 1023 t 702 ));+DATA(insert ( 2742 _bit_ops PGNSP PGUID 2745 1561 t 1560 ));+DATA(insert ( 2742 _bool_ops PGNSP PGUID 2745 1000 t 16 ));+DATA(insert ( 2742 _bpchar_ops PGNSP PGUID 2745 1014 t 1042 ));+DATA(insert ( 2742 _bytea_ops PGNSP PGUID 2745 1001 t 17 ));+DATA(insert ( 2742 _char_ops PGNSP PGUID 2745 1002 t 18 ));+DATA(insert ( 2742 _cidr_ops PGNSP PGUID 2745 651 t 650 ));+DATA(insert ( 2742 _date_ops PGNSP PGUID 2745 1182 t 1082 ));+DATA(insert ( 2742 _float4_ops PGNSP PGUID 2745 1021 t 700 ));+DATA(insert ( 2742 _float8_ops PGNSP PGUID 2745 1022 t 701 ));+DATA(insert ( 2742 _inet_ops PGNSP PGUID 2745 1041 t 869 ));+DATA(insert ( 2742 _int2_ops PGNSP PGUID 2745 1005 t 21 ));+DATA(insert ( 2742 _int8_ops PGNSP PGUID 2745 1016 t 20 ));+DATA(insert ( 2742 _interval_ops PGNSP PGUID 2745 1187 t 1186 ));+DATA(insert ( 2742 _macaddr_ops PGNSP PGUID 2745 1040 t 829 ));+DATA(insert ( 2742 _name_ops PGNSP PGUID 2745 1003 t 19 ));+DATA(insert ( 2742 _numeric_ops PGNSP PGUID 2745 1231 t 1700 ));+DATA(insert ( 2742 _oid_ops PGNSP PGUID 2745 1028 t 26 ));+DATA(insert ( 2742 _oidvector_ops PGNSP PGUID 2745 1013 t 30 ));+DATA(insert ( 2742 _time_ops PGNSP PGUID 2745 1183 t 1083 ));+DATA(insert ( 2742 _timestamptz_ops PGNSP PGUID 2745 1185 t 1184 ));+DATA(insert ( 2742 _timetz_ops PGNSP PGUID 2745 1270 t 1266 ));+DATA(insert ( 2742 _varbit_ops PGNSP PGUID 2745 1563 t 1562 ));+DATA(insert ( 2742 _varchar_ops PGNSP PGUID 2745 1015 t 1043 ));+DATA(insert ( 2742 _timestamp_ops PGNSP PGUID 2745 1115 t 1114 ));+DATA(insert ( 2742 _money_ops PGNSP PGUID 2745 791 t 790 ));+DATA(insert ( 2742 _reltime_ops PGNSP PGUID 2745 1024 t 703 ));+DATA(insert ( 2742 _tinterval_ops PGNSP PGUID 2745 1025 t 704 ));+DATA(insert ( 403 uuid_ops PGNSP PGUID 2968 2950 t 0 ));+DATA(insert ( 405 uuid_ops PGNSP PGUID 2969 2950 t 0 ));+DATA(insert ( 403 pg_lsn_ops PGNSP PGUID 3253 3220 t 0 ));+DATA(insert ( 405 pg_lsn_ops PGNSP PGUID 3254 3220 t 0 ));+DATA(insert ( 403 enum_ops PGNSP PGUID 3522 3500 t 0 ));+DATA(insert ( 405 enum_ops PGNSP PGUID 3523 3500 t 0 ));+DATA(insert ( 403 tsvector_ops PGNSP PGUID 3626 3614 t 0 ));+DATA(insert ( 783 tsvector_ops PGNSP PGUID 3655 3614 t 3642 ));+DATA(insert ( 2742 tsvector_ops PGNSP PGUID 3659 3614 t 25 ));+DATA(insert ( 403 tsquery_ops PGNSP PGUID 3683 3615 t 0 ));+DATA(insert ( 783 tsquery_ops PGNSP PGUID 3702 3615 t 20 ));+DATA(insert ( 403 range_ops PGNSP PGUID 3901 3831 t 0 ));+DATA(insert ( 405 range_ops PGNSP PGUID 3903 3831 t 0 ));+DATA(insert ( 783 range_ops PGNSP PGUID 3919 3831 t 0 ));+DATA(insert ( 4000 range_ops PGNSP PGUID 3474 3831 t 0 ));+DATA(insert ( 4000 quad_point_ops PGNSP PGUID 4015 600 t 0 ));+DATA(insert ( 4000 kd_point_ops PGNSP PGUID 4016 600 f 0 ));+DATA(insert ( 4000 text_ops PGNSP PGUID 4017 25 t 0 ));+DATA(insert ( 403 jsonb_ops PGNSP PGUID 4033 3802 t 0 ));+DATA(insert ( 405 jsonb_ops PGNSP PGUID 4034 3802 t 0 ));+DATA(insert ( 2742 jsonb_ops PGNSP PGUID 4036 3802 t 25 ));+DATA(insert ( 2742 jsonb_path_ops PGNSP PGUID 4037 3802 f 23 ));++/* BRIN operator classes */+/* no brin opclass for bool */+DATA(insert ( 3580 bytea_minmax_ops PGNSP PGUID 4064 17 t 17 ));+DATA(insert ( 3580 char_minmax_ops PGNSP PGUID 4062 18 t 18 ));+DATA(insert ( 3580 name_minmax_ops PGNSP PGUID 4065 19 t 19 ));+DATA(insert ( 3580 int8_minmax_ops PGNSP PGUID 4054 20 t 20 ));+DATA(insert ( 3580 int2_minmax_ops PGNSP PGUID 4054 21 t 21 ));+DATA(insert ( 3580 int4_minmax_ops PGNSP PGUID 4054 23 t 23 ));+DATA(insert ( 3580 text_minmax_ops PGNSP PGUID 4056 25 t 25 ));+DATA(insert ( 3580 oid_minmax_ops PGNSP PGUID 4068 26 t 26 ));+DATA(insert ( 3580 tid_minmax_ops PGNSP PGUID 4069 27 t 27 ));+DATA(insert ( 3580 float4_minmax_ops PGNSP PGUID 4070 700 t 700 ));+DATA(insert ( 3580 float8_minmax_ops PGNSP PGUID 4070 701 t 701 ));+DATA(insert ( 3580 abstime_minmax_ops PGNSP PGUID 4072 702 t 702 ));+DATA(insert ( 3580 reltime_minmax_ops PGNSP PGUID 4073 703 t 703 ));+DATA(insert ( 3580 macaddr_minmax_ops PGNSP PGUID 4074 829 t 829 ));+DATA(insert ( 3580 inet_minmax_ops PGNSP PGUID 4075 869 f 869 ));+DATA(insert ( 3580 inet_inclusion_ops PGNSP PGUID 4102 869 t 869 ));+DATA(insert ( 3580 bpchar_minmax_ops PGNSP PGUID 4076 1042 t 1042 ));+DATA(insert ( 3580 time_minmax_ops PGNSP PGUID 4077 1083 t 1083 ));+DATA(insert ( 3580 date_minmax_ops PGNSP PGUID 4059 1082 t 1082 ));+DATA(insert ( 3580 timestamp_minmax_ops PGNSP PGUID 4059 1114 t 1114 ));+DATA(insert ( 3580 timestamptz_minmax_ops PGNSP PGUID 4059 1184 t 1184 ));+DATA(insert ( 3580 interval_minmax_ops PGNSP PGUID 4078 1186 t 1186 ));+DATA(insert ( 3580 timetz_minmax_ops PGNSP PGUID 4058 1266 t 1266 ));+DATA(insert ( 3580 bit_minmax_ops PGNSP PGUID 4079 1560 t 1560 ));+DATA(insert ( 3580 varbit_minmax_ops PGNSP PGUID 4080 1562 t 1562 ));+DATA(insert ( 3580 numeric_minmax_ops PGNSP PGUID 4055 1700 t 1700 ));+/* no brin opclass for record, anyarray */+DATA(insert ( 3580 uuid_minmax_ops PGNSP PGUID 4081 2950 t 2950 ));+DATA(insert ( 3580 range_inclusion_ops PGNSP PGUID 4103 3831 t 3831 ));+DATA(insert ( 3580 pg_lsn_minmax_ops PGNSP PGUID 4082 3220 t 3220 ));+/* no brin opclass for enum, tsvector, tsquery, jsonb */+DATA(insert ( 3580 box_inclusion_ops PGNSP PGUID 4104 603 t 603 ));+/* no brin opclass for the geometric types except box */++#endif /* PG_OPCLASS_H */
+ foreign/libpg_query/src/postgres/include/catalog/pg_operator.h view
@@ -0,0 +1,1823 @@+/*-------------------------------------------------------------------------+ *+ * pg_operator.h+ * definition of the system "operator" relation (pg_operator)+ * along with the relation's initial contents.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/catalog/pg_operator.h+ *+ * NOTES+ * the genbki.pl script reads this file and generates .bki+ * information from the DATA() statements.+ *+ * XXX do NOT break up DATA() statements into multiple lines!+ * the scripts are not as smart as you might think...+ *+ *-------------------------------------------------------------------------+ */+#ifndef PG_OPERATOR_H+#define PG_OPERATOR_H++#include "catalog/genbki.h"++/* ----------------+ * pg_operator definition. cpp turns this into+ * typedef struct FormData_pg_operator+ * ----------------+ */+#define OperatorRelationId 2617++CATALOG(pg_operator,2617)+{+ NameData oprname; /* name of operator */+ Oid oprnamespace; /* OID of namespace containing this oper */+ Oid oprowner; /* operator owner */+ char oprkind; /* 'l', 'r', or 'b' */+ bool oprcanmerge; /* can be used in merge join? */+ bool oprcanhash; /* can be used in hash join? */+ Oid oprleft; /* left arg type, or 0 if 'l' oprkind */+ Oid oprright; /* right arg type, or 0 if 'r' oprkind */+ Oid oprresult; /* result datatype */+ Oid oprcom; /* OID of commutator oper, or 0 if none */+ Oid oprnegate; /* OID of negator oper, or 0 if none */+ regproc oprcode; /* OID of underlying function */+ regproc oprrest; /* OID of restriction estimator, or 0 */+ regproc oprjoin; /* OID of join estimator, or 0 */+} FormData_pg_operator;++/* ----------------+ * Form_pg_operator corresponds to a pointer to a tuple with+ * the format of pg_operator relation.+ * ----------------+ */+typedef FormData_pg_operator *Form_pg_operator;++/* ----------------+ * compiler constants for pg_operator+ * ----------------+ */++#define Natts_pg_operator 14+#define Anum_pg_operator_oprname 1+#define Anum_pg_operator_oprnamespace 2+#define Anum_pg_operator_oprowner 3+#define Anum_pg_operator_oprkind 4+#define Anum_pg_operator_oprcanmerge 5+#define Anum_pg_operator_oprcanhash 6+#define Anum_pg_operator_oprleft 7+#define Anum_pg_operator_oprright 8+#define Anum_pg_operator_oprresult 9+#define Anum_pg_operator_oprcom 10+#define Anum_pg_operator_oprnegate 11+#define Anum_pg_operator_oprcode 12+#define Anum_pg_operator_oprrest 13+#define Anum_pg_operator_oprjoin 14++/* ----------------+ * initial contents of pg_operator+ * ----------------+ */++/*+ * Note: every entry in pg_operator.h is expected to have a DESCR() comment.+ * If the operator is a deprecated equivalent of some other entry, be sure+ * to comment it as such so that initdb doesn't think it's a preferred name+ * for the underlying function.+ */++DATA(insert OID = 15 ( "=" PGNSP PGUID b t t 23 20 16 416 36 int48eq eqsel eqjoinsel ));+DESCR("equal");+DATA(insert OID = 36 ( "<>" PGNSP PGUID b f f 23 20 16 417 15 int48ne neqsel neqjoinsel ));+DESCR("not equal");+DATA(insert OID = 37 ( "<" PGNSP PGUID b f f 23 20 16 419 82 int48lt scalarltsel scalarltjoinsel ));+DESCR("less than");+DATA(insert OID = 76 ( ">" PGNSP PGUID b f f 23 20 16 418 80 int48gt scalargtsel scalargtjoinsel ));+DESCR("greater than");+DATA(insert OID = 80 ( "<=" PGNSP PGUID b f f 23 20 16 430 76 int48le scalarltsel scalarltjoinsel ));+DESCR("less than or equal");+DATA(insert OID = 82 ( ">=" PGNSP PGUID b f f 23 20 16 420 37 int48ge scalargtsel scalargtjoinsel ));+DESCR("greater than or equal");++DATA(insert OID = 58 ( "<" PGNSP PGUID b f f 16 16 16 59 1695 boollt scalarltsel scalarltjoinsel ));+DESCR("less than");+DATA(insert OID = 59 ( ">" PGNSP PGUID b f f 16 16 16 58 1694 boolgt scalargtsel scalargtjoinsel ));+DESCR("greater than");+DATA(insert OID = 85 ( "<>" PGNSP PGUID b f f 16 16 16 85 91 boolne neqsel neqjoinsel ));+DESCR("not equal");+#define BooleanNotEqualOperator 85+DATA(insert OID = 91 ( "=" PGNSP PGUID b t t 16 16 16 91 85 booleq eqsel eqjoinsel ));+DESCR("equal");+#define BooleanEqualOperator 91+DATA(insert OID = 1694 ( "<=" PGNSP PGUID b f f 16 16 16 1695 59 boolle scalarltsel scalarltjoinsel ));+DESCR("less than or equal");+DATA(insert OID = 1695 ( ">=" PGNSP PGUID b f f 16 16 16 1694 58 boolge scalargtsel scalargtjoinsel ));+DESCR("greater than or equal");++DATA(insert OID = 92 ( "=" PGNSP PGUID b t t 18 18 16 92 630 chareq eqsel eqjoinsel ));+DESCR("equal");+DATA(insert OID = 93 ( "=" PGNSP PGUID b t t 19 19 16 93 643 nameeq eqsel eqjoinsel ));+DESCR("equal");+DATA(insert OID = 94 ( "=" PGNSP PGUID b t t 21 21 16 94 519 int2eq eqsel eqjoinsel ));+DESCR("equal");+DATA(insert OID = 95 ( "<" PGNSP PGUID b f f 21 21 16 520 524 int2lt scalarltsel scalarltjoinsel ));+DESCR("less than");+DATA(insert OID = 96 ( "=" PGNSP PGUID b t t 23 23 16 96 518 int4eq eqsel eqjoinsel ));+DESCR("equal");+#define Int4EqualOperator 96+DATA(insert OID = 97 ( "<" PGNSP PGUID b f f 23 23 16 521 525 int4lt scalarltsel scalarltjoinsel ));+DESCR("less than");+#define Int4LessOperator 97+DATA(insert OID = 98 ( "=" PGNSP PGUID b t t 25 25 16 98 531 texteq eqsel eqjoinsel ));+DESCR("equal");+#define TextEqualOperator 98++DATA(insert OID = 349 ( "||" PGNSP PGUID b f f 2277 2283 2277 0 0 array_append - - ));+DESCR("append element onto end of array");+DATA(insert OID = 374 ( "||" PGNSP PGUID b f f 2283 2277 2277 0 0 array_prepend - - ));+DESCR("prepend element onto front of array");+DATA(insert OID = 375 ( "||" PGNSP PGUID b f f 2277 2277 2277 0 0 array_cat - - ));+DESCR("concatenate");++DATA(insert OID = 352 ( "=" PGNSP PGUID b f t 28 28 16 352 0 xideq eqsel eqjoinsel ));+DESCR("equal");+DATA(insert OID = 353 ( "=" PGNSP PGUID b f f 28 23 16 0 0 xideqint4 eqsel eqjoinsel ));+DESCR("equal");+DATA(insert OID = 388 ( "!" PGNSP PGUID r f f 20 0 1700 0 0 numeric_fac - - ));+DESCR("factorial");+DATA(insert OID = 389 ( "!!" PGNSP PGUID l f f 0 20 1700 0 0 numeric_fac - - ));+DESCR("deprecated, use ! instead");+DATA(insert OID = 385 ( "=" PGNSP PGUID b f t 29 29 16 385 0 cideq eqsel eqjoinsel ));+DESCR("equal");+DATA(insert OID = 386 ( "=" PGNSP PGUID b f t 22 22 16 386 0 int2vectoreq eqsel eqjoinsel ));+DESCR("equal");++DATA(insert OID = 387 ( "=" PGNSP PGUID b t f 27 27 16 387 402 tideq eqsel eqjoinsel ));+DESCR("equal");+#define TIDEqualOperator 387+DATA(insert OID = 402 ( "<>" PGNSP PGUID b f f 27 27 16 402 387 tidne neqsel neqjoinsel ));+DESCR("not equal");+DATA(insert OID = 2799 ( "<" PGNSP PGUID b f f 27 27 16 2800 2802 tidlt scalarltsel scalarltjoinsel ));+DESCR("less than");+#define TIDLessOperator 2799+DATA(insert OID = 2800 ( ">" PGNSP PGUID b f f 27 27 16 2799 2801 tidgt scalargtsel scalargtjoinsel ));+DESCR("greater than");+DATA(insert OID = 2801 ( "<=" PGNSP PGUID b f f 27 27 16 2802 2800 tidle scalarltsel scalarltjoinsel ));+DESCR("less than or equal");+DATA(insert OID = 2802 ( ">=" PGNSP PGUID b f f 27 27 16 2801 2799 tidge scalargtsel scalargtjoinsel ));+DESCR("greater than or equal");++DATA(insert OID = 410 ( "=" PGNSP PGUID b t t 20 20 16 410 411 int8eq eqsel eqjoinsel ));+DESCR("equal");+DATA(insert OID = 411 ( "<>" PGNSP PGUID b f f 20 20 16 411 410 int8ne neqsel neqjoinsel ));+DESCR("not equal");+DATA(insert OID = 412 ( "<" PGNSP PGUID b f f 20 20 16 413 415 int8lt scalarltsel scalarltjoinsel ));+DESCR("less than");+#define Int8LessOperator 412+DATA(insert OID = 413 ( ">" PGNSP PGUID b f f 20 20 16 412 414 int8gt scalargtsel scalargtjoinsel ));+DESCR("greater than");+DATA(insert OID = 414 ( "<=" PGNSP PGUID b f f 20 20 16 415 413 int8le scalarltsel scalarltjoinsel ));+DESCR("less than or equal");+DATA(insert OID = 415 ( ">=" PGNSP PGUID b f f 20 20 16 414 412 int8ge scalargtsel scalargtjoinsel ));+DESCR("greater than or equal");++DATA(insert OID = 416 ( "=" PGNSP PGUID b t t 20 23 16 15 417 int84eq eqsel eqjoinsel ));+DESCR("equal");+DATA(insert OID = 417 ( "<>" PGNSP PGUID b f f 20 23 16 36 416 int84ne neqsel neqjoinsel ));+DESCR("not equal");+DATA(insert OID = 418 ( "<" PGNSP PGUID b f f 20 23 16 76 430 int84lt scalarltsel scalarltjoinsel ));+DESCR("less than");+DATA(insert OID = 419 ( ">" PGNSP PGUID b f f 20 23 16 37 420 int84gt scalargtsel scalargtjoinsel ));+DESCR("greater than");+DATA(insert OID = 420 ( "<=" PGNSP PGUID b f f 20 23 16 82 419 int84le scalarltsel scalarltjoinsel ));+DESCR("less than or equal");+DATA(insert OID = 430 ( ">=" PGNSP PGUID b f f 20 23 16 80 418 int84ge scalargtsel scalargtjoinsel ));+DESCR("greater than or equal");+DATA(insert OID = 439 ( "%" PGNSP PGUID b f f 20 20 20 0 0 int8mod - - ));+DESCR("modulus");+DATA(insert OID = 473 ( "@" PGNSP PGUID l f f 0 20 20 0 0 int8abs - - ));+DESCR("absolute value");++DATA(insert OID = 484 ( "-" PGNSP PGUID l f f 0 20 20 0 0 int8um - - ));+DESCR("negate");+DATA(insert OID = 485 ( "<<" PGNSP PGUID b f f 604 604 16 0 0 poly_left positionsel positionjoinsel ));+DESCR("is left of");+DATA(insert OID = 486 ( "&<" PGNSP PGUID b f f 604 604 16 0 0 poly_overleft positionsel positionjoinsel ));+DESCR("overlaps or is left of");+DATA(insert OID = 487 ( "&>" PGNSP PGUID b f f 604 604 16 0 0 poly_overright positionsel positionjoinsel ));+DESCR("overlaps or is right of");+DATA(insert OID = 488 ( ">>" PGNSP PGUID b f f 604 604 16 0 0 poly_right positionsel positionjoinsel ));+DESCR("is right of");+DATA(insert OID = 489 ( "<@" PGNSP PGUID b f f 604 604 16 490 0 poly_contained contsel contjoinsel ));+DESCR("is contained by");+DATA(insert OID = 490 ( "@>" PGNSP PGUID b f f 604 604 16 489 0 poly_contain contsel contjoinsel ));+DESCR("contains");+DATA(insert OID = 491 ( "~=" PGNSP PGUID b f f 604 604 16 491 0 poly_same eqsel eqjoinsel ));+DESCR("same as");+DATA(insert OID = 492 ( "&&" PGNSP PGUID b f f 604 604 16 492 0 poly_overlap areasel areajoinsel ));+DESCR("overlaps");+DATA(insert OID = 493 ( "<<" PGNSP PGUID b f f 603 603 16 0 0 box_left positionsel positionjoinsel ));+DESCR("is left of");+DATA(insert OID = 494 ( "&<" PGNSP PGUID b f f 603 603 16 0 0 box_overleft positionsel positionjoinsel ));+DESCR("overlaps or is left of");+DATA(insert OID = 495 ( "&>" PGNSP PGUID b f f 603 603 16 0 0 box_overright positionsel positionjoinsel ));+DESCR("overlaps or is right of");+DATA(insert OID = 496 ( ">>" PGNSP PGUID b f f 603 603 16 0 0 box_right positionsel positionjoinsel ));+DESCR("is right of");+DATA(insert OID = 497 ( "<@" PGNSP PGUID b f f 603 603 16 498 0 box_contained contsel contjoinsel ));+DESCR("is contained by");+DATA(insert OID = 498 ( "@>" PGNSP PGUID b f f 603 603 16 497 0 box_contain contsel contjoinsel ));+DESCR("contains");+DATA(insert OID = 499 ( "~=" PGNSP PGUID b f f 603 603 16 499 0 box_same eqsel eqjoinsel ));+DESCR("same as");+DATA(insert OID = 500 ( "&&" PGNSP PGUID b f f 603 603 16 500 0 box_overlap areasel areajoinsel ));+DESCR("overlaps");+DATA(insert OID = 501 ( ">=" PGNSP PGUID b f f 603 603 16 505 504 box_ge areasel areajoinsel ));+DESCR("greater than or equal by area");+DATA(insert OID = 502 ( ">" PGNSP PGUID b f f 603 603 16 504 505 box_gt areasel areajoinsel ));+DESCR("greater than by area");+DATA(insert OID = 503 ( "=" PGNSP PGUID b f f 603 603 16 503 0 box_eq eqsel eqjoinsel ));+DESCR("equal by area");+DATA(insert OID = 504 ( "<" PGNSP PGUID b f f 603 603 16 502 501 box_lt areasel areajoinsel ));+DESCR("less than by area");+DATA(insert OID = 505 ( "<=" PGNSP PGUID b f f 603 603 16 501 502 box_le areasel areajoinsel ));+DESCR("less than or equal by area");+DATA(insert OID = 506 ( ">^" PGNSP PGUID b f f 600 600 16 0 0 point_above positionsel positionjoinsel ));+DESCR("is above");+DATA(insert OID = 507 ( "<<" PGNSP PGUID b f f 600 600 16 0 0 point_left positionsel positionjoinsel ));+DESCR("is left of");+DATA(insert OID = 508 ( ">>" PGNSP PGUID b f f 600 600 16 0 0 point_right positionsel positionjoinsel ));+DESCR("is right of");+DATA(insert OID = 509 ( "<^" PGNSP PGUID b f f 600 600 16 0 0 point_below positionsel positionjoinsel ));+DESCR("is below");+DATA(insert OID = 510 ( "~=" PGNSP PGUID b f f 600 600 16 510 713 point_eq eqsel eqjoinsel ));+DESCR("same as");+DATA(insert OID = 511 ( "<@" PGNSP PGUID b f f 600 603 16 433 0 on_pb contsel contjoinsel ));+DESCR("point inside box");+DATA(insert OID = 433 ( "@>" PGNSP PGUID b f f 603 600 16 511 0 box_contain_pt contsel contjoinsel ));+DESCR("contains");+DATA(insert OID = 512 ( "<@" PGNSP PGUID b f f 600 602 16 755 0 on_ppath - - ));+DESCR("point within closed path, or point on open path");+DATA(insert OID = 513 ( "@@" PGNSP PGUID l f f 0 603 600 0 0 box_center - - ));+DESCR("center of");+DATA(insert OID = 514 ( "*" PGNSP PGUID b f f 23 23 23 514 0 int4mul - - ));+DESCR("multiply");+DATA(insert OID = 517 ( "<->" PGNSP PGUID b f f 600 600 701 517 0 point_distance - - ));+DESCR("distance between");+DATA(insert OID = 518 ( "<>" PGNSP PGUID b f f 23 23 16 518 96 int4ne neqsel neqjoinsel ));+DESCR("not equal");+DATA(insert OID = 519 ( "<>" PGNSP PGUID b f f 21 21 16 519 94 int2ne neqsel neqjoinsel ));+DESCR("not equal");+DATA(insert OID = 520 ( ">" PGNSP PGUID b f f 21 21 16 95 522 int2gt scalargtsel scalargtjoinsel ));+DESCR("greater than");+DATA(insert OID = 521 ( ">" PGNSP PGUID b f f 23 23 16 97 523 int4gt scalargtsel scalargtjoinsel ));+DESCR("greater than");+DATA(insert OID = 522 ( "<=" PGNSP PGUID b f f 21 21 16 524 520 int2le scalarltsel scalarltjoinsel ));+DESCR("less than or equal");+DATA(insert OID = 523 ( "<=" PGNSP PGUID b f f 23 23 16 525 521 int4le scalarltsel scalarltjoinsel ));+DESCR("less than or equal");+DATA(insert OID = 524 ( ">=" PGNSP PGUID b f f 21 21 16 522 95 int2ge scalargtsel scalargtjoinsel ));+DESCR("greater than or equal");+DATA(insert OID = 525 ( ">=" PGNSP PGUID b f f 23 23 16 523 97 int4ge scalargtsel scalargtjoinsel ));+DESCR("greater than or equal");+DATA(insert OID = 526 ( "*" PGNSP PGUID b f f 21 21 21 526 0 int2mul - - ));+DESCR("multiply");+DATA(insert OID = 527 ( "/" PGNSP PGUID b f f 21 21 21 0 0 int2div - - ));+DESCR("divide");+DATA(insert OID = 528 ( "/" PGNSP PGUID b f f 23 23 23 0 0 int4div - - ));+DESCR("divide");+DATA(insert OID = 529 ( "%" PGNSP PGUID b f f 21 21 21 0 0 int2mod - - ));+DESCR("modulus");+DATA(insert OID = 530 ( "%" PGNSP PGUID b f f 23 23 23 0 0 int4mod - - ));+DESCR("modulus");+DATA(insert OID = 531 ( "<>" PGNSP PGUID b f f 25 25 16 531 98 textne neqsel neqjoinsel ));+DESCR("not equal");+DATA(insert OID = 532 ( "=" PGNSP PGUID b t t 21 23 16 533 538 int24eq eqsel eqjoinsel ));+DESCR("equal");+DATA(insert OID = 533 ( "=" PGNSP PGUID b t t 23 21 16 532 539 int42eq eqsel eqjoinsel ));+DESCR("equal");+DATA(insert OID = 534 ( "<" PGNSP PGUID b f f 21 23 16 537 542 int24lt scalarltsel scalarltjoinsel ));+DESCR("less than");+DATA(insert OID = 535 ( "<" PGNSP PGUID b f f 23 21 16 536 543 int42lt scalarltsel scalarltjoinsel ));+DESCR("less than");+DATA(insert OID = 536 ( ">" PGNSP PGUID b f f 21 23 16 535 540 int24gt scalargtsel scalargtjoinsel ));+DESCR("greater than");+DATA(insert OID = 537 ( ">" PGNSP PGUID b f f 23 21 16 534 541 int42gt scalargtsel scalargtjoinsel ));+DESCR("greater than");+DATA(insert OID = 538 ( "<>" PGNSP PGUID b f f 21 23 16 539 532 int24ne neqsel neqjoinsel ));+DESCR("not equal");+DATA(insert OID = 539 ( "<>" PGNSP PGUID b f f 23 21 16 538 533 int42ne neqsel neqjoinsel ));+DESCR("not equal");+DATA(insert OID = 540 ( "<=" PGNSP PGUID b f f 21 23 16 543 536 int24le scalarltsel scalarltjoinsel ));+DESCR("less than or equal");+DATA(insert OID = 541 ( "<=" PGNSP PGUID b f f 23 21 16 542 537 int42le scalarltsel scalarltjoinsel ));+DESCR("less than or equal");+DATA(insert OID = 542 ( ">=" PGNSP PGUID b f f 21 23 16 541 534 int24ge scalargtsel scalargtjoinsel ));+DESCR("greater than or equal");+DATA(insert OID = 543 ( ">=" PGNSP PGUID b f f 23 21 16 540 535 int42ge scalargtsel scalargtjoinsel ));+DESCR("greater than or equal");+DATA(insert OID = 544 ( "*" PGNSP PGUID b f f 21 23 23 545 0 int24mul - - ));+DESCR("multiply");+DATA(insert OID = 545 ( "*" PGNSP PGUID b f f 23 21 23 544 0 int42mul - - ));+DESCR("multiply");+DATA(insert OID = 546 ( "/" PGNSP PGUID b f f 21 23 23 0 0 int24div - - ));+DESCR("divide");+DATA(insert OID = 547 ( "/" PGNSP PGUID b f f 23 21 23 0 0 int42div - - ));+DESCR("divide");+DATA(insert OID = 550 ( "+" PGNSP PGUID b f f 21 21 21 550 0 int2pl - - ));+DESCR("add");+DATA(insert OID = 551 ( "+" PGNSP PGUID b f f 23 23 23 551 0 int4pl - - ));+DESCR("add");+DATA(insert OID = 552 ( "+" PGNSP PGUID b f f 21 23 23 553 0 int24pl - - ));+DESCR("add");+DATA(insert OID = 553 ( "+" PGNSP PGUID b f f 23 21 23 552 0 int42pl - - ));+DESCR("add");+DATA(insert OID = 554 ( "-" PGNSP PGUID b f f 21 21 21 0 0 int2mi - - ));+DESCR("subtract");+DATA(insert OID = 555 ( "-" PGNSP PGUID b f f 23 23 23 0 0 int4mi - - ));+DESCR("subtract");+DATA(insert OID = 556 ( "-" PGNSP PGUID b f f 21 23 23 0 0 int24mi - - ));+DESCR("subtract");+DATA(insert OID = 557 ( "-" PGNSP PGUID b f f 23 21 23 0 0 int42mi - - ));+DESCR("subtract");+DATA(insert OID = 558 ( "-" PGNSP PGUID l f f 0 23 23 0 0 int4um - - ));+DESCR("negate");+DATA(insert OID = 559 ( "-" PGNSP PGUID l f f 0 21 21 0 0 int2um - - ));+DESCR("negate");+DATA(insert OID = 560 ( "=" PGNSP PGUID b t t 702 702 16 560 561 abstimeeq eqsel eqjoinsel ));+DESCR("equal");+DATA(insert OID = 561 ( "<>" PGNSP PGUID b f f 702 702 16 561 560 abstimene neqsel neqjoinsel ));+DESCR("not equal");+DATA(insert OID = 562 ( "<" PGNSP PGUID b f f 702 702 16 563 565 abstimelt scalarltsel scalarltjoinsel ));+DESCR("less than");+DATA(insert OID = 563 ( ">" PGNSP PGUID b f f 702 702 16 562 564 abstimegt scalargtsel scalargtjoinsel ));+DESCR("greater than");+DATA(insert OID = 564 ( "<=" PGNSP PGUID b f f 702 702 16 565 563 abstimele scalarltsel scalarltjoinsel ));+DESCR("less than or equal");+DATA(insert OID = 565 ( ">=" PGNSP PGUID b f f 702 702 16 564 562 abstimege scalargtsel scalargtjoinsel ));+DESCR("greater than or equal");+DATA(insert OID = 566 ( "=" PGNSP PGUID b t t 703 703 16 566 567 reltimeeq eqsel eqjoinsel ));+DESCR("equal");+DATA(insert OID = 567 ( "<>" PGNSP PGUID b f f 703 703 16 567 566 reltimene neqsel neqjoinsel ));+DESCR("not equal");+DATA(insert OID = 568 ( "<" PGNSP PGUID b f f 703 703 16 569 571 reltimelt scalarltsel scalarltjoinsel ));+DESCR("less than");+DATA(insert OID = 569 ( ">" PGNSP PGUID b f f 703 703 16 568 570 reltimegt scalargtsel scalargtjoinsel ));+DESCR("greater than");+DATA(insert OID = 570 ( "<=" PGNSP PGUID b f f 703 703 16 571 569 reltimele scalarltsel scalarltjoinsel ));+DESCR("less than or equal");+DATA(insert OID = 571 ( ">=" PGNSP PGUID b f f 703 703 16 570 568 reltimege scalargtsel scalargtjoinsel ));+DESCR("greater than or equal");+DATA(insert OID = 572 ( "~=" PGNSP PGUID b f f 704 704 16 572 0 tintervalsame eqsel eqjoinsel ));+DESCR("same as");+DATA(insert OID = 573 ( "<<" PGNSP PGUID b f f 704 704 16 0 0 tintervalct - - ));+DESCR("contains");+DATA(insert OID = 574 ( "&&" PGNSP PGUID b f f 704 704 16 574 0 tintervalov - - ));+DESCR("overlaps");+DATA(insert OID = 575 ( "#=" PGNSP PGUID b f f 704 703 16 0 576 tintervalleneq - - ));+DESCR("equal by length");+DATA(insert OID = 576 ( "#<>" PGNSP PGUID b f f 704 703 16 0 575 tintervallenne - - ));+DESCR("not equal by length");+DATA(insert OID = 577 ( "#<" PGNSP PGUID b f f 704 703 16 0 580 tintervallenlt - - ));+DESCR("less than by length");+DATA(insert OID = 578 ( "#>" PGNSP PGUID b f f 704 703 16 0 579 tintervallengt - - ));+DESCR("greater than by length");+DATA(insert OID = 579 ( "#<=" PGNSP PGUID b f f 704 703 16 0 578 tintervallenle - - ));+DESCR("less than or equal by length");+DATA(insert OID = 580 ( "#>=" PGNSP PGUID b f f 704 703 16 0 577 tintervallenge - - ));+DESCR("greater than or equal by length");+DATA(insert OID = 581 ( "+" PGNSP PGUID b f f 702 703 702 0 0 timepl - - ));+DESCR("add");+DATA(insert OID = 582 ( "-" PGNSP PGUID b f f 702 703 702 0 0 timemi - - ));+DESCR("subtract");+DATA(insert OID = 583 ( "<?>" PGNSP PGUID b f f 702 704 16 0 0 intinterval - - ));+DESCR("is contained by");+DATA(insert OID = 584 ( "-" PGNSP PGUID l f f 0 700 700 0 0 float4um - - ));+DESCR("negate");+DATA(insert OID = 585 ( "-" PGNSP PGUID l f f 0 701 701 0 0 float8um - - ));+DESCR("negate");+DATA(insert OID = 586 ( "+" PGNSP PGUID b f f 700 700 700 586 0 float4pl - - ));+DESCR("add");+DATA(insert OID = 587 ( "-" PGNSP PGUID b f f 700 700 700 0 0 float4mi - - ));+DESCR("subtract");+DATA(insert OID = 588 ( "/" PGNSP PGUID b f f 700 700 700 0 0 float4div - - ));+DESCR("divide");+DATA(insert OID = 589 ( "*" PGNSP PGUID b f f 700 700 700 589 0 float4mul - - ));+DESCR("multiply");+DATA(insert OID = 590 ( "@" PGNSP PGUID l f f 0 700 700 0 0 float4abs - - ));+DESCR("absolute value");+DATA(insert OID = 591 ( "+" PGNSP PGUID b f f 701 701 701 591 0 float8pl - - ));+DESCR("add");+DATA(insert OID = 592 ( "-" PGNSP PGUID b f f 701 701 701 0 0 float8mi - - ));+DESCR("subtract");+DATA(insert OID = 593 ( "/" PGNSP PGUID b f f 701 701 701 0 0 float8div - - ));+DESCR("divide");+DATA(insert OID = 594 ( "*" PGNSP PGUID b f f 701 701 701 594 0 float8mul - - ));+DESCR("multiply");+DATA(insert OID = 595 ( "@" PGNSP PGUID l f f 0 701 701 0 0 float8abs - - ));+DESCR("absolute value");+DATA(insert OID = 596 ( "|/" PGNSP PGUID l f f 0 701 701 0 0 dsqrt - - ));+DESCR("square root");+DATA(insert OID = 597 ( "||/" PGNSP PGUID l f f 0 701 701 0 0 dcbrt - - ));+DESCR("cube root");+DATA(insert OID = 1284 ( "|" PGNSP PGUID l f f 0 704 702 0 0 tintervalstart - - ));+DESCR("start of interval");+DATA(insert OID = 606 ( "<#>" PGNSP PGUID b f f 702 702 704 0 0 mktinterval - - ));+DESCR("convert to tinterval");++DATA(insert OID = 607 ( "=" PGNSP PGUID b t t 26 26 16 607 608 oideq eqsel eqjoinsel ));+DESCR("equal");+DATA(insert OID = 608 ( "<>" PGNSP PGUID b f f 26 26 16 608 607 oidne neqsel neqjoinsel ));+DESCR("not equal");+DATA(insert OID = 609 ( "<" PGNSP PGUID b f f 26 26 16 610 612 oidlt scalarltsel scalarltjoinsel ));+DESCR("less than");+DATA(insert OID = 610 ( ">" PGNSP PGUID b f f 26 26 16 609 611 oidgt scalargtsel scalargtjoinsel ));+DESCR("greater than");+DATA(insert OID = 611 ( "<=" PGNSP PGUID b f f 26 26 16 612 610 oidle scalarltsel scalarltjoinsel ));+DESCR("less than or equal");+DATA(insert OID = 612 ( ">=" PGNSP PGUID b f f 26 26 16 611 609 oidge scalargtsel scalargtjoinsel ));+DESCR("greater than or equal");++DATA(insert OID = 644 ( "<>" PGNSP PGUID b f f 30 30 16 644 649 oidvectorne neqsel neqjoinsel ));+DESCR("not equal");+DATA(insert OID = 645 ( "<" PGNSP PGUID b f f 30 30 16 646 648 oidvectorlt scalarltsel scalarltjoinsel ));+DESCR("less than");+DATA(insert OID = 646 ( ">" PGNSP PGUID b f f 30 30 16 645 647 oidvectorgt scalargtsel scalargtjoinsel ));+DESCR("greater than");+DATA(insert OID = 647 ( "<=" PGNSP PGUID b f f 30 30 16 648 646 oidvectorle scalarltsel scalarltjoinsel ));+DESCR("less than or equal");+DATA(insert OID = 648 ( ">=" PGNSP PGUID b f f 30 30 16 647 645 oidvectorge scalargtsel scalargtjoinsel ));+DESCR("greater than or equal");+DATA(insert OID = 649 ( "=" PGNSP PGUID b t t 30 30 16 649 644 oidvectoreq eqsel eqjoinsel ));+DESCR("equal");++DATA(insert OID = 613 ( "<->" PGNSP PGUID b f f 600 628 701 0 0 dist_pl - - ));+DESCR("distance between");+DATA(insert OID = 614 ( "<->" PGNSP PGUID b f f 600 601 701 0 0 dist_ps - - ));+DESCR("distance between");+DATA(insert OID = 615 ( "<->" PGNSP PGUID b f f 600 603 701 0 0 dist_pb - - ));+DESCR("distance between");+DATA(insert OID = 616 ( "<->" PGNSP PGUID b f f 601 628 701 0 0 dist_sl - - ));+DESCR("distance between");+DATA(insert OID = 617 ( "<->" PGNSP PGUID b f f 601 603 701 0 0 dist_sb - - ));+DESCR("distance between");+DATA(insert OID = 618 ( "<->" PGNSP PGUID b f f 600 602 701 0 0 dist_ppath - - ));+DESCR("distance between");++DATA(insert OID = 620 ( "=" PGNSP PGUID b t t 700 700 16 620 621 float4eq eqsel eqjoinsel ));+DESCR("equal");+DATA(insert OID = 621 ( "<>" PGNSP PGUID b f f 700 700 16 621 620 float4ne neqsel neqjoinsel ));+DESCR("not equal");+DATA(insert OID = 622 ( "<" PGNSP PGUID b f f 700 700 16 623 625 float4lt scalarltsel scalarltjoinsel ));+DESCR("less than");+DATA(insert OID = 623 ( ">" PGNSP PGUID b f f 700 700 16 622 624 float4gt scalargtsel scalargtjoinsel ));+DESCR("greater than");+DATA(insert OID = 624 ( "<=" PGNSP PGUID b f f 700 700 16 625 623 float4le scalarltsel scalarltjoinsel ));+DESCR("less than or equal");+DATA(insert OID = 625 ( ">=" PGNSP PGUID b f f 700 700 16 624 622 float4ge scalargtsel scalargtjoinsel ));+DESCR("greater than or equal");+DATA(insert OID = 630 ( "<>" PGNSP PGUID b f f 18 18 16 630 92 charne neqsel neqjoinsel ));+DESCR("not equal");++DATA(insert OID = 631 ( "<" PGNSP PGUID b f f 18 18 16 633 634 charlt scalarltsel scalarltjoinsel ));+DESCR("less than");+DATA(insert OID = 632 ( "<=" PGNSP PGUID b f f 18 18 16 634 633 charle scalarltsel scalarltjoinsel ));+DESCR("less than or equal");+DATA(insert OID = 633 ( ">" PGNSP PGUID b f f 18 18 16 631 632 chargt scalargtsel scalargtjoinsel ));+DESCR("greater than");+DATA(insert OID = 634 ( ">=" PGNSP PGUID b f f 18 18 16 632 631 charge scalargtsel scalargtjoinsel ));+DESCR("greater than or equal");++DATA(insert OID = 639 ( "~" PGNSP PGUID b f f 19 25 16 0 640 nameregexeq regexeqsel regexeqjoinsel ));+DESCR("matches regular expression, case-sensitive");+#define OID_NAME_REGEXEQ_OP 639+DATA(insert OID = 640 ( "!~" PGNSP PGUID b f f 19 25 16 0 639 nameregexne regexnesel regexnejoinsel ));+DESCR("does not match regular expression, case-sensitive");+DATA(insert OID = 641 ( "~" PGNSP PGUID b f f 25 25 16 0 642 textregexeq regexeqsel regexeqjoinsel ));+DESCR("matches regular expression, case-sensitive");+#define OID_TEXT_REGEXEQ_OP 641+DATA(insert OID = 642 ( "!~" PGNSP PGUID b f f 25 25 16 0 641 textregexne regexnesel regexnejoinsel ));+DESCR("does not match regular expression, case-sensitive");+DATA(insert OID = 643 ( "<>" PGNSP PGUID b f f 19 19 16 643 93 namene neqsel neqjoinsel ));+DESCR("not equal");+DATA(insert OID = 654 ( "||" PGNSP PGUID b f f 25 25 25 0 0 textcat - - ));+DESCR("concatenate");++DATA(insert OID = 660 ( "<" PGNSP PGUID b f f 19 19 16 662 663 namelt scalarltsel scalarltjoinsel ));+DESCR("less than");+DATA(insert OID = 661 ( "<=" PGNSP PGUID b f f 19 19 16 663 662 namele scalarltsel scalarltjoinsel ));+DESCR("less than or equal");+DATA(insert OID = 662 ( ">" PGNSP PGUID b f f 19 19 16 660 661 namegt scalargtsel scalargtjoinsel ));+DESCR("greater than");+DATA(insert OID = 663 ( ">=" PGNSP PGUID b f f 19 19 16 661 660 namege scalargtsel scalargtjoinsel ));+DESCR("greater than or equal");+DATA(insert OID = 664 ( "<" PGNSP PGUID b f f 25 25 16 666 667 text_lt scalarltsel scalarltjoinsel ));+DESCR("less than");+DATA(insert OID = 665 ( "<=" PGNSP PGUID b f f 25 25 16 667 666 text_le scalarltsel scalarltjoinsel ));+DESCR("less than or equal");+DATA(insert OID = 666 ( ">" PGNSP PGUID b f f 25 25 16 664 665 text_gt scalargtsel scalargtjoinsel ));+DESCR("greater than");+DATA(insert OID = 667 ( ">=" PGNSP PGUID b f f 25 25 16 665 664 text_ge scalargtsel scalargtjoinsel ));+DESCR("greater than or equal");++DATA(insert OID = 670 ( "=" PGNSP PGUID b t t 701 701 16 670 671 float8eq eqsel eqjoinsel ));+DESCR("equal");+DATA(insert OID = 671 ( "<>" PGNSP PGUID b f f 701 701 16 671 670 float8ne neqsel neqjoinsel ));+DESCR("not equal");+DATA(insert OID = 672 ( "<" PGNSP PGUID b f f 701 701 16 674 675 float8lt scalarltsel scalarltjoinsel ));+DESCR("less than");+#define Float8LessOperator 672+DATA(insert OID = 673 ( "<=" PGNSP PGUID b f f 701 701 16 675 674 float8le scalarltsel scalarltjoinsel ));+DESCR("less than or equal");+DATA(insert OID = 674 ( ">" PGNSP PGUID b f f 701 701 16 672 673 float8gt scalargtsel scalargtjoinsel ));+DESCR("greater than");+DATA(insert OID = 675 ( ">=" PGNSP PGUID b f f 701 701 16 673 672 float8ge scalargtsel scalargtjoinsel ));+DESCR("greater than or equal");++DATA(insert OID = 682 ( "@" PGNSP PGUID l f f 0 21 21 0 0 int2abs - - ));+DESCR("absolute value");+DATA(insert OID = 684 ( "+" PGNSP PGUID b f f 20 20 20 684 0 int8pl - - ));+DESCR("add");+DATA(insert OID = 685 ( "-" PGNSP PGUID b f f 20 20 20 0 0 int8mi - - ));+DESCR("subtract");+DATA(insert OID = 686 ( "*" PGNSP PGUID b f f 20 20 20 686 0 int8mul - - ));+DESCR("multiply");+DATA(insert OID = 687 ( "/" PGNSP PGUID b f f 20 20 20 0 0 int8div - - ));+DESCR("divide");++DATA(insert OID = 688 ( "+" PGNSP PGUID b f f 20 23 20 692 0 int84pl - - ));+DESCR("add");+DATA(insert OID = 689 ( "-" PGNSP PGUID b f f 20 23 20 0 0 int84mi - - ));+DESCR("subtract");+DATA(insert OID = 690 ( "*" PGNSP PGUID b f f 20 23 20 694 0 int84mul - - ));+DESCR("multiply");+DATA(insert OID = 691 ( "/" PGNSP PGUID b f f 20 23 20 0 0 int84div - - ));+DESCR("divide");+DATA(insert OID = 692 ( "+" PGNSP PGUID b f f 23 20 20 688 0 int48pl - - ));+DESCR("add");+DATA(insert OID = 693 ( "-" PGNSP PGUID b f f 23 20 20 0 0 int48mi - - ));+DESCR("subtract");+DATA(insert OID = 694 ( "*" PGNSP PGUID b f f 23 20 20 690 0 int48mul - - ));+DESCR("multiply");+DATA(insert OID = 695 ( "/" PGNSP PGUID b f f 23 20 20 0 0 int48div - - ));+DESCR("divide");++DATA(insert OID = 818 ( "+" PGNSP PGUID b f f 20 21 20 822 0 int82pl - - ));+DESCR("add");+DATA(insert OID = 819 ( "-" PGNSP PGUID b f f 20 21 20 0 0 int82mi - - ));+DESCR("subtract");+DATA(insert OID = 820 ( "*" PGNSP PGUID b f f 20 21 20 824 0 int82mul - - ));+DESCR("multiply");+DATA(insert OID = 821 ( "/" PGNSP PGUID b f f 20 21 20 0 0 int82div - - ));+DESCR("divide");+DATA(insert OID = 822 ( "+" PGNSP PGUID b f f 21 20 20 818 0 int28pl - - ));+DESCR("add");+DATA(insert OID = 823 ( "-" PGNSP PGUID b f f 21 20 20 0 0 int28mi - - ));+DESCR("subtract");+DATA(insert OID = 824 ( "*" PGNSP PGUID b f f 21 20 20 820 0 int28mul - - ));+DESCR("multiply");+DATA(insert OID = 825 ( "/" PGNSP PGUID b f f 21 20 20 0 0 int28div - - ));+DESCR("divide");++DATA(insert OID = 706 ( "<->" PGNSP PGUID b f f 603 603 701 706 0 box_distance - - ));+DESCR("distance between");+DATA(insert OID = 707 ( "<->" PGNSP PGUID b f f 602 602 701 707 0 path_distance - - ));+DESCR("distance between");+DATA(insert OID = 708 ( "<->" PGNSP PGUID b f f 628 628 701 708 0 line_distance - - ));+DESCR("distance between");+DATA(insert OID = 709 ( "<->" PGNSP PGUID b f f 601 601 701 709 0 lseg_distance - - ));+DESCR("distance between");+DATA(insert OID = 712 ( "<->" PGNSP PGUID b f f 604 604 701 712 0 poly_distance - - ));+DESCR("distance between");++DATA(insert OID = 713 ( "<>" PGNSP PGUID b f f 600 600 16 713 510 point_ne neqsel neqjoinsel ));+DESCR("not equal");++/* add translation/rotation/scaling operators for geometric types. - thomas 97/05/10 */+DATA(insert OID = 731 ( "+" PGNSP PGUID b f f 600 600 600 731 0 point_add - - ));+DESCR("add points (translate)");+DATA(insert OID = 732 ( "-" PGNSP PGUID b f f 600 600 600 0 0 point_sub - - ));+DESCR("subtract points (translate)");+DATA(insert OID = 733 ( "*" PGNSP PGUID b f f 600 600 600 733 0 point_mul - - ));+DESCR("multiply points (scale/rotate)");+DATA(insert OID = 734 ( "/" PGNSP PGUID b f f 600 600 600 0 0 point_div - - ));+DESCR("divide points (scale/rotate)");+DATA(insert OID = 735 ( "+" PGNSP PGUID b f f 602 602 602 735 0 path_add - - ));+DESCR("concatenate");+DATA(insert OID = 736 ( "+" PGNSP PGUID b f f 602 600 602 0 0 path_add_pt - - ));+DESCR("add (translate path)");+DATA(insert OID = 737 ( "-" PGNSP PGUID b f f 602 600 602 0 0 path_sub_pt - - ));+DESCR("subtract (translate path)");+DATA(insert OID = 738 ( "*" PGNSP PGUID b f f 602 600 602 0 0 path_mul_pt - - ));+DESCR("multiply (rotate/scale path)");+DATA(insert OID = 739 ( "/" PGNSP PGUID b f f 602 600 602 0 0 path_div_pt - - ));+DESCR("divide (rotate/scale path)");+DATA(insert OID = 755 ( "@>" PGNSP PGUID b f f 602 600 16 512 0 path_contain_pt - - ));+DESCR("contains");+DATA(insert OID = 756 ( "<@" PGNSP PGUID b f f 600 604 16 757 0 pt_contained_poly contsel contjoinsel ));+DESCR("is contained by");+DATA(insert OID = 757 ( "@>" PGNSP PGUID b f f 604 600 16 756 0 poly_contain_pt contsel contjoinsel ));+DESCR("contains");+DATA(insert OID = 758 ( "<@" PGNSP PGUID b f f 600 718 16 759 0 pt_contained_circle contsel contjoinsel ));+DESCR("is contained by");+DATA(insert OID = 759 ( "@>" PGNSP PGUID b f f 718 600 16 758 0 circle_contain_pt contsel contjoinsel ));+DESCR("contains");++DATA(insert OID = 773 ( "@" PGNSP PGUID l f f 0 23 23 0 0 int4abs - - ));+DESCR("absolute value");++/* additional operators for geometric types - thomas 1997-07-09 */+DATA(insert OID = 792 ( "=" PGNSP PGUID b f f 602 602 16 792 0 path_n_eq eqsel eqjoinsel ));+DESCR("equal");+DATA(insert OID = 793 ( "<" PGNSP PGUID b f f 602 602 16 794 0 path_n_lt - - ));+DESCR("less than");+DATA(insert OID = 794 ( ">" PGNSP PGUID b f f 602 602 16 793 0 path_n_gt - - ));+DESCR("greater than");+DATA(insert OID = 795 ( "<=" PGNSP PGUID b f f 602 602 16 796 0 path_n_le - - ));+DESCR("less than or equal");+DATA(insert OID = 796 ( ">=" PGNSP PGUID b f f 602 602 16 795 0 path_n_ge - - ));+DESCR("greater than or equal");+DATA(insert OID = 797 ( "#" PGNSP PGUID l f f 0 602 23 0 0 path_npoints - - ));+DESCR("number of points");+DATA(insert OID = 798 ( "?#" PGNSP PGUID b f f 602 602 16 0 0 path_inter - - ));+DESCR("intersect");+DATA(insert OID = 799 ( "@-@" PGNSP PGUID l f f 0 602 701 0 0 path_length - - ));+DESCR("sum of path segment lengths");+DATA(insert OID = 800 ( ">^" PGNSP PGUID b f f 603 603 16 0 0 box_above_eq positionsel positionjoinsel ));+DESCR("is above (allows touching)");+DATA(insert OID = 801 ( "<^" PGNSP PGUID b f f 603 603 16 0 0 box_below_eq positionsel positionjoinsel ));+DESCR("is below (allows touching)");+DATA(insert OID = 802 ( "?#" PGNSP PGUID b f f 603 603 16 0 0 box_overlap areasel areajoinsel ));+DESCR("deprecated, use && instead");+DATA(insert OID = 803 ( "#" PGNSP PGUID b f f 603 603 603 0 0 box_intersect - - ));+DESCR("box intersection");+DATA(insert OID = 804 ( "+" PGNSP PGUID b f f 603 600 603 0 0 box_add - - ));+DESCR("add point to box (translate)");+DATA(insert OID = 805 ( "-" PGNSP PGUID b f f 603 600 603 0 0 box_sub - - ));+DESCR("subtract point from box (translate)");+DATA(insert OID = 806 ( "*" PGNSP PGUID b f f 603 600 603 0 0 box_mul - - ));+DESCR("multiply box by point (scale)");+DATA(insert OID = 807 ( "/" PGNSP PGUID b f f 603 600 603 0 0 box_div - - ));+DESCR("divide box by point (scale)");+DATA(insert OID = 808 ( "?-" PGNSP PGUID b f f 600 600 16 808 0 point_horiz - - ));+DESCR("horizontally aligned");+DATA(insert OID = 809 ( "?|" PGNSP PGUID b f f 600 600 16 809 0 point_vert - - ));+DESCR("vertically aligned");++DATA(insert OID = 811 ( "=" PGNSP PGUID b t f 704 704 16 811 812 tintervaleq eqsel eqjoinsel ));+DESCR("equal");+DATA(insert OID = 812 ( "<>" PGNSP PGUID b f f 704 704 16 812 811 tintervalne neqsel neqjoinsel ));+DESCR("not equal");+DATA(insert OID = 813 ( "<" PGNSP PGUID b f f 704 704 16 814 816 tintervallt scalarltsel scalarltjoinsel ));+DESCR("less than");+DATA(insert OID = 814 ( ">" PGNSP PGUID b f f 704 704 16 813 815 tintervalgt scalargtsel scalargtjoinsel ));+DESCR("greater than");+DATA(insert OID = 815 ( "<=" PGNSP PGUID b f f 704 704 16 816 814 tintervalle scalarltsel scalarltjoinsel ));+DESCR("less than or equal");+DATA(insert OID = 816 ( ">=" PGNSP PGUID b f f 704 704 16 815 813 tintervalge scalargtsel scalargtjoinsel ));+DESCR("greater than or equal");++DATA(insert OID = 843 ( "*" PGNSP PGUID b f f 790 700 790 845 0 cash_mul_flt4 - - ));+DESCR("multiply");+DATA(insert OID = 844 ( "/" PGNSP PGUID b f f 790 700 790 0 0 cash_div_flt4 - - ));+DESCR("divide");+DATA(insert OID = 845 ( "*" PGNSP PGUID b f f 700 790 790 843 0 flt4_mul_cash - - ));+DESCR("multiply");++DATA(insert OID = 900 ( "=" PGNSP PGUID b t f 790 790 16 900 901 cash_eq eqsel eqjoinsel ));+DESCR("equal");+DATA(insert OID = 901 ( "<>" PGNSP PGUID b f f 790 790 16 901 900 cash_ne neqsel neqjoinsel ));+DESCR("not equal");+DATA(insert OID = 902 ( "<" PGNSP PGUID b f f 790 790 16 903 905 cash_lt scalarltsel scalarltjoinsel ));+DESCR("less than");+DATA(insert OID = 903 ( ">" PGNSP PGUID b f f 790 790 16 902 904 cash_gt scalargtsel scalargtjoinsel ));+DESCR("greater than");+DATA(insert OID = 904 ( "<=" PGNSP PGUID b f f 790 790 16 905 903 cash_le scalarltsel scalarltjoinsel ));+DESCR("less than or equal");+DATA(insert OID = 905 ( ">=" PGNSP PGUID b f f 790 790 16 904 902 cash_ge scalargtsel scalargtjoinsel ));+DESCR("greater than or equal");+DATA(insert OID = 906 ( "+" PGNSP PGUID b f f 790 790 790 906 0 cash_pl - - ));+DESCR("add");+DATA(insert OID = 907 ( "-" PGNSP PGUID b f f 790 790 790 0 0 cash_mi - - ));+DESCR("subtract");+DATA(insert OID = 908 ( "*" PGNSP PGUID b f f 790 701 790 916 0 cash_mul_flt8 - - ));+DESCR("multiply");+DATA(insert OID = 909 ( "/" PGNSP PGUID b f f 790 701 790 0 0 cash_div_flt8 - - ));+DESCR("divide");+DATA(insert OID = 912 ( "*" PGNSP PGUID b f f 790 23 790 917 0 cash_mul_int4 - - ));+DESCR("multiply");+DATA(insert OID = 913 ( "/" PGNSP PGUID b f f 790 23 790 0 0 cash_div_int4 - - ));+DESCR("divide");+DATA(insert OID = 914 ( "*" PGNSP PGUID b f f 790 21 790 918 0 cash_mul_int2 - - ));+DESCR("multiply");+DATA(insert OID = 915 ( "/" PGNSP PGUID b f f 790 21 790 0 0 cash_div_int2 - - ));+DESCR("divide");+DATA(insert OID = 916 ( "*" PGNSP PGUID b f f 701 790 790 908 0 flt8_mul_cash - - ));+DESCR("multiply");+DATA(insert OID = 917 ( "*" PGNSP PGUID b f f 23 790 790 912 0 int4_mul_cash - - ));+DESCR("multiply");+DATA(insert OID = 918 ( "*" PGNSP PGUID b f f 21 790 790 914 0 int2_mul_cash - - ));+DESCR("multiply");+DATA(insert OID = 3825 ( "/" PGNSP PGUID b f f 790 790 701 0 0 cash_div_cash - - ));+DESCR("divide");++DATA(insert OID = 965 ( "^" PGNSP PGUID b f f 701 701 701 0 0 dpow - - ));+DESCR("exponentiation");+DATA(insert OID = 966 ( "+" PGNSP PGUID b f f 1034 1033 1034 0 0 aclinsert - - ));+DESCR("add/update ACL item");+DATA(insert OID = 967 ( "-" PGNSP PGUID b f f 1034 1033 1034 0 0 aclremove - - ));+DESCR("remove ACL item");+DATA(insert OID = 968 ( "@>" PGNSP PGUID b f f 1034 1033 16 0 0 aclcontains - - ));+DESCR("contains");+DATA(insert OID = 974 ( "=" PGNSP PGUID b f t 1033 1033 16 974 0 aclitemeq eqsel eqjoinsel ));+DESCR("equal");++/* additional geometric operators - thomas 1997-07-09 */+DATA(insert OID = 969 ( "@@" PGNSP PGUID l f f 0 601 600 0 0 lseg_center - - ));+DESCR("center of");+DATA(insert OID = 970 ( "@@" PGNSP PGUID l f f 0 602 600 0 0 path_center - - ));+DESCR("center of");+DATA(insert OID = 971 ( "@@" PGNSP PGUID l f f 0 604 600 0 0 poly_center - - ));+DESCR("center of");++DATA(insert OID = 1054 ( "=" PGNSP PGUID b t t 1042 1042 16 1054 1057 bpchareq eqsel eqjoinsel ));+DESCR("equal");++DATA(insert OID = 1055 ( "~" PGNSP PGUID b f f 1042 25 16 0 1056 bpcharregexeq regexeqsel regexeqjoinsel ));+DESCR("matches regular expression, case-sensitive");+#define OID_BPCHAR_REGEXEQ_OP 1055+DATA(insert OID = 1056 ( "!~" PGNSP PGUID b f f 1042 25 16 0 1055 bpcharregexne regexnesel regexnejoinsel ));+DESCR("does not match regular expression, case-sensitive");+DATA(insert OID = 1057 ( "<>" PGNSP PGUID b f f 1042 1042 16 1057 1054 bpcharne neqsel neqjoinsel ));+DESCR("not equal");+DATA(insert OID = 1058 ( "<" PGNSP PGUID b f f 1042 1042 16 1060 1061 bpcharlt scalarltsel scalarltjoinsel ));+DESCR("less than");+DATA(insert OID = 1059 ( "<=" PGNSP PGUID b f f 1042 1042 16 1061 1060 bpcharle scalarltsel scalarltjoinsel ));+DESCR("less than or equal");+DATA(insert OID = 1060 ( ">" PGNSP PGUID b f f 1042 1042 16 1058 1059 bpchargt scalargtsel scalargtjoinsel ));+DESCR("greater than");+DATA(insert OID = 1061 ( ">=" PGNSP PGUID b f f 1042 1042 16 1059 1058 bpcharge scalargtsel scalargtjoinsel ));+DESCR("greater than or equal");++/* generic array comparison operators */+DATA(insert OID = 1070 ( "=" PGNSP PGUID b t t 2277 2277 16 1070 1071 array_eq eqsel eqjoinsel ));+DESCR("equal");+#define ARRAY_EQ_OP 1070+DATA(insert OID = 1071 ( "<>" PGNSP PGUID b f f 2277 2277 16 1071 1070 array_ne neqsel neqjoinsel ));+DESCR("not equal");+DATA(insert OID = 1072 ( "<" PGNSP PGUID b f f 2277 2277 16 1073 1075 array_lt scalarltsel scalarltjoinsel ));+DESCR("less than");+#define ARRAY_LT_OP 1072+DATA(insert OID = 1073 ( ">" PGNSP PGUID b f f 2277 2277 16 1072 1074 array_gt scalargtsel scalargtjoinsel ));+DESCR("greater than");+#define ARRAY_GT_OP 1073+DATA(insert OID = 1074 ( "<=" PGNSP PGUID b f f 2277 2277 16 1075 1073 array_le scalarltsel scalarltjoinsel ));+DESCR("less than or equal");+DATA(insert OID = 1075 ( ">=" PGNSP PGUID b f f 2277 2277 16 1074 1072 array_ge scalargtsel scalargtjoinsel ));+DESCR("greater than or equal");++/* date operators */+DATA(insert OID = 1076 ( "+" PGNSP PGUID b f f 1082 1186 1114 2551 0 date_pl_interval - - ));+DESCR("add");+DATA(insert OID = 1077 ( "-" PGNSP PGUID b f f 1082 1186 1114 0 0 date_mi_interval - - ));+DESCR("subtract");+DATA(insert OID = 1093 ( "=" PGNSP PGUID b t t 1082 1082 16 1093 1094 date_eq eqsel eqjoinsel ));+DESCR("equal");+DATA(insert OID = 1094 ( "<>" PGNSP PGUID b f f 1082 1082 16 1094 1093 date_ne neqsel neqjoinsel ));+DESCR("not equal");+DATA(insert OID = 1095 ( "<" PGNSP PGUID b f f 1082 1082 16 1097 1098 date_lt scalarltsel scalarltjoinsel ));+DESCR("less than");+DATA(insert OID = 1096 ( "<=" PGNSP PGUID b f f 1082 1082 16 1098 1097 date_le scalarltsel scalarltjoinsel ));+DESCR("less than or equal");+DATA(insert OID = 1097 ( ">" PGNSP PGUID b f f 1082 1082 16 1095 1096 date_gt scalargtsel scalargtjoinsel ));+DESCR("greater than");+DATA(insert OID = 1098 ( ">=" PGNSP PGUID b f f 1082 1082 16 1096 1095 date_ge scalargtsel scalargtjoinsel ));+DESCR("greater than or equal");+DATA(insert OID = 1099 ( "-" PGNSP PGUID b f f 1082 1082 23 0 0 date_mi - - ));+DESCR("subtract");+DATA(insert OID = 1100 ( "+" PGNSP PGUID b f f 1082 23 1082 2555 0 date_pli - - ));+DESCR("add");+DATA(insert OID = 1101 ( "-" PGNSP PGUID b f f 1082 23 1082 0 0 date_mii - - ));+DESCR("subtract");++/* time operators */+DATA(insert OID = 1108 ( "=" PGNSP PGUID b t t 1083 1083 16 1108 1109 time_eq eqsel eqjoinsel ));+DESCR("equal");+DATA(insert OID = 1109 ( "<>" PGNSP PGUID b f f 1083 1083 16 1109 1108 time_ne neqsel neqjoinsel ));+DESCR("not equal");+DATA(insert OID = 1110 ( "<" PGNSP PGUID b f f 1083 1083 16 1112 1113 time_lt scalarltsel scalarltjoinsel ));+DESCR("less than");+DATA(insert OID = 1111 ( "<=" PGNSP PGUID b f f 1083 1083 16 1113 1112 time_le scalarltsel scalarltjoinsel ));+DESCR("less than or equal");+DATA(insert OID = 1112 ( ">" PGNSP PGUID b f f 1083 1083 16 1110 1111 time_gt scalargtsel scalargtjoinsel ));+DESCR("greater than");+DATA(insert OID = 1113 ( ">=" PGNSP PGUID b f f 1083 1083 16 1111 1110 time_ge scalargtsel scalargtjoinsel ));+DESCR("greater than or equal");++/* timetz operators */+DATA(insert OID = 1550 ( "=" PGNSP PGUID b t t 1266 1266 16 1550 1551 timetz_eq eqsel eqjoinsel ));+DESCR("equal");+DATA(insert OID = 1551 ( "<>" PGNSP PGUID b f f 1266 1266 16 1551 1550 timetz_ne neqsel neqjoinsel ));+DESCR("not equal");+DATA(insert OID = 1552 ( "<" PGNSP PGUID b f f 1266 1266 16 1554 1555 timetz_lt scalarltsel scalarltjoinsel ));+DESCR("less than");+DATA(insert OID = 1553 ( "<=" PGNSP PGUID b f f 1266 1266 16 1555 1554 timetz_le scalarltsel scalarltjoinsel ));+DESCR("less than or equal");+DATA(insert OID = 1554 ( ">" PGNSP PGUID b f f 1266 1266 16 1552 1553 timetz_gt scalargtsel scalargtjoinsel ));+DESCR("greater than");+DATA(insert OID = 1555 ( ">=" PGNSP PGUID b f f 1266 1266 16 1553 1552 timetz_ge scalargtsel scalargtjoinsel ));+DESCR("greater than or equal");++/* float48 operators */+DATA(insert OID = 1116 ( "+" PGNSP PGUID b f f 700 701 701 1126 0 float48pl - - ));+DESCR("add");+DATA(insert OID = 1117 ( "-" PGNSP PGUID b f f 700 701 701 0 0 float48mi - - ));+DESCR("subtract");+DATA(insert OID = 1118 ( "/" PGNSP PGUID b f f 700 701 701 0 0 float48div - - ));+DESCR("divide");+DATA(insert OID = 1119 ( "*" PGNSP PGUID b f f 700 701 701 1129 0 float48mul - - ));+DESCR("multiply");+DATA(insert OID = 1120 ( "=" PGNSP PGUID b t t 700 701 16 1130 1121 float48eq eqsel eqjoinsel ));+DESCR("equal");+DATA(insert OID = 1121 ( "<>" PGNSP PGUID b f f 700 701 16 1131 1120 float48ne neqsel neqjoinsel ));+DESCR("not equal");+DATA(insert OID = 1122 ( "<" PGNSP PGUID b f f 700 701 16 1133 1125 float48lt scalarltsel scalarltjoinsel ));+DESCR("less than");+DATA(insert OID = 1123 ( ">" PGNSP PGUID b f f 700 701 16 1132 1124 float48gt scalargtsel scalargtjoinsel ));+DESCR("greater than");+DATA(insert OID = 1124 ( "<=" PGNSP PGUID b f f 700 701 16 1135 1123 float48le scalarltsel scalarltjoinsel ));+DESCR("less than or equal");+DATA(insert OID = 1125 ( ">=" PGNSP PGUID b f f 700 701 16 1134 1122 float48ge scalargtsel scalargtjoinsel ));+DESCR("greater than or equal");++/* float84 operators */+DATA(insert OID = 1126 ( "+" PGNSP PGUID b f f 701 700 701 1116 0 float84pl - - ));+DESCR("add");+DATA(insert OID = 1127 ( "-" PGNSP PGUID b f f 701 700 701 0 0 float84mi - - ));+DESCR("subtract");+DATA(insert OID = 1128 ( "/" PGNSP PGUID b f f 701 700 701 0 0 float84div - - ));+DESCR("divide");+DATA(insert OID = 1129 ( "*" PGNSP PGUID b f f 701 700 701 1119 0 float84mul - - ));+DESCR("multiply");+DATA(insert OID = 1130 ( "=" PGNSP PGUID b t t 701 700 16 1120 1131 float84eq eqsel eqjoinsel ));+DESCR("equal");+DATA(insert OID = 1131 ( "<>" PGNSP PGUID b f f 701 700 16 1121 1130 float84ne neqsel neqjoinsel ));+DESCR("not equal");+DATA(insert OID = 1132 ( "<" PGNSP PGUID b f f 701 700 16 1123 1135 float84lt scalarltsel scalarltjoinsel ));+DESCR("less than");+DATA(insert OID = 1133 ( ">" PGNSP PGUID b f f 701 700 16 1122 1134 float84gt scalargtsel scalargtjoinsel ));+DESCR("greater than");+DATA(insert OID = 1134 ( "<=" PGNSP PGUID b f f 701 700 16 1125 1133 float84le scalarltsel scalarltjoinsel ));+DESCR("less than or equal");+DATA(insert OID = 1135 ( ">=" PGNSP PGUID b f f 701 700 16 1124 1132 float84ge scalargtsel scalargtjoinsel ));+DESCR("greater than or equal");+++/* LIKE hacks by Keith Parks. */+DATA(insert OID = 1207 ( "~~" PGNSP PGUID b f f 19 25 16 0 1208 namelike likesel likejoinsel ));+DESCR("matches LIKE expression");+#define OID_NAME_LIKE_OP 1207+DATA(insert OID = 1208 ( "!~~" PGNSP PGUID b f f 19 25 16 0 1207 namenlike nlikesel nlikejoinsel ));+DESCR("does not match LIKE expression");+DATA(insert OID = 1209 ( "~~" PGNSP PGUID b f f 25 25 16 0 1210 textlike likesel likejoinsel ));+DESCR("matches LIKE expression");+#define OID_TEXT_LIKE_OP 1209+DATA(insert OID = 1210 ( "!~~" PGNSP PGUID b f f 25 25 16 0 1209 textnlike nlikesel nlikejoinsel ));+DESCR("does not match LIKE expression");+DATA(insert OID = 1211 ( "~~" PGNSP PGUID b f f 1042 25 16 0 1212 bpcharlike likesel likejoinsel ));+DESCR("matches LIKE expression");+#define OID_BPCHAR_LIKE_OP 1211+DATA(insert OID = 1212 ( "!~~" PGNSP PGUID b f f 1042 25 16 0 1211 bpcharnlike nlikesel nlikejoinsel ));+DESCR("does not match LIKE expression");++/* case-insensitive regex hacks */+DATA(insert OID = 1226 ( "~*" PGNSP PGUID b f f 19 25 16 0 1227 nameicregexeq icregexeqsel icregexeqjoinsel ));+DESCR("matches regular expression, case-insensitive");+#define OID_NAME_ICREGEXEQ_OP 1226+DATA(insert OID = 1227 ( "!~*" PGNSP PGUID b f f 19 25 16 0 1226 nameicregexne icregexnesel icregexnejoinsel ));+DESCR("does not match regular expression, case-insensitive");+DATA(insert OID = 1228 ( "~*" PGNSP PGUID b f f 25 25 16 0 1229 texticregexeq icregexeqsel icregexeqjoinsel ));+DESCR("matches regular expression, case-insensitive");+#define OID_TEXT_ICREGEXEQ_OP 1228+DATA(insert OID = 1229 ( "!~*" PGNSP PGUID b f f 25 25 16 0 1228 texticregexne icregexnesel icregexnejoinsel ));+DESCR("does not match regular expression, case-insensitive");+DATA(insert OID = 1234 ( "~*" PGNSP PGUID b f f 1042 25 16 0 1235 bpcharicregexeq icregexeqsel icregexeqjoinsel ));+DESCR("matches regular expression, case-insensitive");+#define OID_BPCHAR_ICREGEXEQ_OP 1234+DATA(insert OID = 1235 ( "!~*" PGNSP PGUID b f f 1042 25 16 0 1234 bpcharicregexne icregexnesel icregexnejoinsel ));+DESCR("does not match regular expression, case-insensitive");++/* timestamptz operators */+DATA(insert OID = 1320 ( "=" PGNSP PGUID b t t 1184 1184 16 1320 1321 timestamptz_eq eqsel eqjoinsel ));+DESCR("equal");+DATA(insert OID = 1321 ( "<>" PGNSP PGUID b f f 1184 1184 16 1321 1320 timestamptz_ne neqsel neqjoinsel ));+DESCR("not equal");+DATA(insert OID = 1322 ( "<" PGNSP PGUID b f f 1184 1184 16 1324 1325 timestamptz_lt scalarltsel scalarltjoinsel ));+DESCR("less than");+DATA(insert OID = 1323 ( "<=" PGNSP PGUID b f f 1184 1184 16 1325 1324 timestamptz_le scalarltsel scalarltjoinsel ));+DESCR("less than or equal");+DATA(insert OID = 1324 ( ">" PGNSP PGUID b f f 1184 1184 16 1322 1323 timestamptz_gt scalargtsel scalargtjoinsel ));+DESCR("greater than");+DATA(insert OID = 1325 ( ">=" PGNSP PGUID b f f 1184 1184 16 1323 1322 timestamptz_ge scalargtsel scalargtjoinsel ));+DESCR("greater than or equal");+DATA(insert OID = 1327 ( "+" PGNSP PGUID b f f 1184 1186 1184 2554 0 timestamptz_pl_interval - - ));+DESCR("add");+DATA(insert OID = 1328 ( "-" PGNSP PGUID b f f 1184 1184 1186 0 0 timestamptz_mi - - ));+DESCR("subtract");+DATA(insert OID = 1329 ( "-" PGNSP PGUID b f f 1184 1186 1184 0 0 timestamptz_mi_interval - - ));+DESCR("subtract");++/* interval operators */+DATA(insert OID = 1330 ( "=" PGNSP PGUID b t t 1186 1186 16 1330 1331 interval_eq eqsel eqjoinsel ));+DESCR("equal");+DATA(insert OID = 1331 ( "<>" PGNSP PGUID b f f 1186 1186 16 1331 1330 interval_ne neqsel neqjoinsel ));+DESCR("not equal");+DATA(insert OID = 1332 ( "<" PGNSP PGUID b f f 1186 1186 16 1334 1335 interval_lt scalarltsel scalarltjoinsel ));+DESCR("less than");+DATA(insert OID = 1333 ( "<=" PGNSP PGUID b f f 1186 1186 16 1335 1334 interval_le scalarltsel scalarltjoinsel ));+DESCR("less than or equal");+DATA(insert OID = 1334 ( ">" PGNSP PGUID b f f 1186 1186 16 1332 1333 interval_gt scalargtsel scalargtjoinsel ));+DESCR("greater than");+DATA(insert OID = 1335 ( ">=" PGNSP PGUID b f f 1186 1186 16 1333 1332 interval_ge scalargtsel scalargtjoinsel ));+DESCR("greater than or equal");++DATA(insert OID = 1336 ( "-" PGNSP PGUID l f f 0 1186 1186 0 0 interval_um - - ));+DESCR("negate");+DATA(insert OID = 1337 ( "+" PGNSP PGUID b f f 1186 1186 1186 1337 0 interval_pl - - ));+DESCR("add");+DATA(insert OID = 1338 ( "-" PGNSP PGUID b f f 1186 1186 1186 0 0 interval_mi - - ));+DESCR("subtract");++DATA(insert OID = 1360 ( "+" PGNSP PGUID b f f 1082 1083 1114 1363 0 datetime_pl - - ));+DESCR("convert date and time to timestamp");+DATA(insert OID = 1361 ( "+" PGNSP PGUID b f f 1082 1266 1184 1366 0 datetimetz_pl - - ));+DESCR("convert date and time with time zone to timestamp with time zone");+DATA(insert OID = 1363 ( "+" PGNSP PGUID b f f 1083 1082 1114 1360 0 timedate_pl - - ));+DESCR("convert time and date to timestamp");+DATA(insert OID = 1366 ( "+" PGNSP PGUID b f f 1266 1082 1184 1361 0 timetzdate_pl - - ));+DESCR("convert time with time zone and date to timestamp with time zone");++DATA(insert OID = 1399 ( "-" PGNSP PGUID b f f 1083 1083 1186 0 0 time_mi_time - - ));+DESCR("subtract");++/* additional geometric operators - thomas 97/04/18 */+DATA(insert OID = 1420 ( "@@" PGNSP PGUID l f f 0 718 600 0 0 circle_center - - ));+DESCR("center of");+DATA(insert OID = 1500 ( "=" PGNSP PGUID b f f 718 718 16 1500 1501 circle_eq eqsel eqjoinsel ));+DESCR("equal by area");+DATA(insert OID = 1501 ( "<>" PGNSP PGUID b f f 718 718 16 1501 1500 circle_ne neqsel neqjoinsel ));+DESCR("not equal by area");+DATA(insert OID = 1502 ( "<" PGNSP PGUID b f f 718 718 16 1503 1505 circle_lt areasel areajoinsel ));+DESCR("less than by area");+DATA(insert OID = 1503 ( ">" PGNSP PGUID b f f 718 718 16 1502 1504 circle_gt areasel areajoinsel ));+DESCR("greater than by area");+DATA(insert OID = 1504 ( "<=" PGNSP PGUID b f f 718 718 16 1505 1503 circle_le areasel areajoinsel ));+DESCR("less than or equal by area");+DATA(insert OID = 1505 ( ">=" PGNSP PGUID b f f 718 718 16 1504 1502 circle_ge areasel areajoinsel ));+DESCR("greater than or equal by area");++DATA(insert OID = 1506 ( "<<" PGNSP PGUID b f f 718 718 16 0 0 circle_left positionsel positionjoinsel ));+DESCR("is left of");+DATA(insert OID = 1507 ( "&<" PGNSP PGUID b f f 718 718 16 0 0 circle_overleft positionsel positionjoinsel ));+DESCR("overlaps or is left of");+DATA(insert OID = 1508 ( "&>" PGNSP PGUID b f f 718 718 16 0 0 circle_overright positionsel positionjoinsel ));+DESCR("overlaps or is right of");+DATA(insert OID = 1509 ( ">>" PGNSP PGUID b f f 718 718 16 0 0 circle_right positionsel positionjoinsel ));+DESCR("is right of");+DATA(insert OID = 1510 ( "<@" PGNSP PGUID b f f 718 718 16 1511 0 circle_contained contsel contjoinsel ));+DESCR("is contained by");+DATA(insert OID = 1511 ( "@>" PGNSP PGUID b f f 718 718 16 1510 0 circle_contain contsel contjoinsel ));+DESCR("contains");+DATA(insert OID = 1512 ( "~=" PGNSP PGUID b f f 718 718 16 1512 0 circle_same eqsel eqjoinsel ));+DESCR("same as");+DATA(insert OID = 1513 ( "&&" PGNSP PGUID b f f 718 718 16 1513 0 circle_overlap areasel areajoinsel ));+DESCR("overlaps");+DATA(insert OID = 1514 ( "|>>" PGNSP PGUID b f f 718 718 16 0 0 circle_above positionsel positionjoinsel ));+DESCR("is above");+DATA(insert OID = 1515 ( "<<|" PGNSP PGUID b f f 718 718 16 0 0 circle_below positionsel positionjoinsel ));+DESCR("is below");++DATA(insert OID = 1516 ( "+" PGNSP PGUID b f f 718 600 718 0 0 circle_add_pt - - ));+DESCR("add");+DATA(insert OID = 1517 ( "-" PGNSP PGUID b f f 718 600 718 0 0 circle_sub_pt - - ));+DESCR("subtract");+DATA(insert OID = 1518 ( "*" PGNSP PGUID b f f 718 600 718 0 0 circle_mul_pt - - ));+DESCR("multiply");+DATA(insert OID = 1519 ( "/" PGNSP PGUID b f f 718 600 718 0 0 circle_div_pt - - ));+DESCR("divide");++DATA(insert OID = 1520 ( "<->" PGNSP PGUID b f f 718 718 701 1520 0 circle_distance - - ));+DESCR("distance between");+DATA(insert OID = 1521 ( "#" PGNSP PGUID l f f 0 604 23 0 0 poly_npoints - - ));+DESCR("number of points");+DATA(insert OID = 1522 ( "<->" PGNSP PGUID b f f 600 718 701 3291 0 dist_pc - - ));+DESCR("distance between");+DATA(insert OID = 3291 ( "<->" PGNSP PGUID b f f 718 600 701 1522 0 dist_cpoint - - ));+DESCR("distance between");+DATA(insert OID = 3276 ( "<->" PGNSP PGUID b f f 600 604 701 3289 0 dist_ppoly - - ));+DESCR("distance between");+DATA(insert OID = 3289 ( "<->" PGNSP PGUID b f f 604 600 701 3276 0 dist_polyp - - ));+DESCR("distance between");+DATA(insert OID = 1523 ( "<->" PGNSP PGUID b f f 718 604 701 0 0 dist_cpoly - - ));+DESCR("distance between");++/* additional geometric operators - thomas 1997-07-09 */+DATA(insert OID = 1524 ( "<->" PGNSP PGUID b f f 628 603 701 0 0 dist_lb - - ));+DESCR("distance between");++DATA(insert OID = 1525 ( "?#" PGNSP PGUID b f f 601 601 16 1525 0 lseg_intersect - - ));+DESCR("intersect");+DATA(insert OID = 1526 ( "?||" PGNSP PGUID b f f 601 601 16 1526 0 lseg_parallel - - ));+DESCR("parallel");+DATA(insert OID = 1527 ( "?-|" PGNSP PGUID b f f 601 601 16 1527 0 lseg_perp - - ));+DESCR("perpendicular");+DATA(insert OID = 1528 ( "?-" PGNSP PGUID l f f 0 601 16 0 0 lseg_horizontal - - ));+DESCR("horizontal");+DATA(insert OID = 1529 ( "?|" PGNSP PGUID l f f 0 601 16 0 0 lseg_vertical - - ));+DESCR("vertical");+DATA(insert OID = 1535 ( "=" PGNSP PGUID b f f 601 601 16 1535 1586 lseg_eq eqsel eqjoinsel ));+DESCR("equal");+DATA(insert OID = 1536 ( "#" PGNSP PGUID b f f 601 601 600 1536 0 lseg_interpt - - ));+DESCR("intersection point");+DATA(insert OID = 1537 ( "?#" PGNSP PGUID b f f 601 628 16 0 0 inter_sl - - ));+DESCR("intersect");+DATA(insert OID = 1538 ( "?#" PGNSP PGUID b f f 601 603 16 0 0 inter_sb - - ));+DESCR("intersect");+DATA(insert OID = 1539 ( "?#" PGNSP PGUID b f f 628 603 16 0 0 inter_lb - - ));+DESCR("intersect");++DATA(insert OID = 1546 ( "<@" PGNSP PGUID b f f 600 628 16 0 0 on_pl - - ));+DESCR("point on line");+DATA(insert OID = 1547 ( "<@" PGNSP PGUID b f f 600 601 16 0 0 on_ps - - ));+DESCR("is contained by");+DATA(insert OID = 1548 ( "<@" PGNSP PGUID b f f 601 628 16 0 0 on_sl - - ));+DESCR("lseg on line");+DATA(insert OID = 1549 ( "<@" PGNSP PGUID b f f 601 603 16 0 0 on_sb - - ));+DESCR("is contained by");++DATA(insert OID = 1557 ( "##" PGNSP PGUID b f f 600 628 600 0 0 close_pl - - ));+DESCR("closest point to A on B");+DATA(insert OID = 1558 ( "##" PGNSP PGUID b f f 600 601 600 0 0 close_ps - - ));+DESCR("closest point to A on B");+DATA(insert OID = 1559 ( "##" PGNSP PGUID b f f 600 603 600 0 0 close_pb - - ));+DESCR("closest point to A on B");++DATA(insert OID = 1566 ( "##" PGNSP PGUID b f f 601 628 600 0 0 close_sl - - ));+DESCR("closest point to A on B");+DATA(insert OID = 1567 ( "##" PGNSP PGUID b f f 601 603 600 0 0 close_sb - - ));+DESCR("closest point to A on B");+DATA(insert OID = 1568 ( "##" PGNSP PGUID b f f 628 603 600 0 0 close_lb - - ));+DESCR("closest point to A on B");+DATA(insert OID = 1577 ( "##" PGNSP PGUID b f f 628 601 600 0 0 close_ls - - ));+DESCR("closest point to A on B");+DATA(insert OID = 1578 ( "##" PGNSP PGUID b f f 601 601 600 0 0 close_lseg - - ));+DESCR("closest point to A on B");+DATA(insert OID = 1583 ( "*" PGNSP PGUID b f f 1186 701 1186 1584 0 interval_mul - - ));+DESCR("multiply");+DATA(insert OID = 1584 ( "*" PGNSP PGUID b f f 701 1186 1186 1583 0 mul_d_interval - - ));+DESCR("multiply");+DATA(insert OID = 1585 ( "/" PGNSP PGUID b f f 1186 701 1186 0 0 interval_div - - ));+DESCR("divide");++DATA(insert OID = 1586 ( "<>" PGNSP PGUID b f f 601 601 16 1586 1535 lseg_ne neqsel neqjoinsel ));+DESCR("not equal");+DATA(insert OID = 1587 ( "<" PGNSP PGUID b f f 601 601 16 1589 1590 lseg_lt - - ));+DESCR("less than by length");+DATA(insert OID = 1588 ( "<=" PGNSP PGUID b f f 601 601 16 1590 1589 lseg_le - - ));+DESCR("less than or equal by length");+DATA(insert OID = 1589 ( ">" PGNSP PGUID b f f 601 601 16 1587 1588 lseg_gt - - ));+DESCR("greater than by length");+DATA(insert OID = 1590 ( ">=" PGNSP PGUID b f f 601 601 16 1588 1587 lseg_ge - - ));+DESCR("greater than or equal by length");++DATA(insert OID = 1591 ( "@-@" PGNSP PGUID l f f 0 601 701 0 0 lseg_length - - ));+DESCR("distance between endpoints");++DATA(insert OID = 1611 ( "?#" PGNSP PGUID b f f 628 628 16 1611 0 line_intersect - - ));+DESCR("intersect");+DATA(insert OID = 1612 ( "?||" PGNSP PGUID b f f 628 628 16 1612 0 line_parallel - - ));+DESCR("parallel");+DATA(insert OID = 1613 ( "?-|" PGNSP PGUID b f f 628 628 16 1613 0 line_perp - - ));+DESCR("perpendicular");+DATA(insert OID = 1614 ( "?-" PGNSP PGUID l f f 0 628 16 0 0 line_horizontal - - ));+DESCR("horizontal");+DATA(insert OID = 1615 ( "?|" PGNSP PGUID l f f 0 628 16 0 0 line_vertical - - ));+DESCR("vertical");+DATA(insert OID = 1616 ( "=" PGNSP PGUID b f f 628 628 16 1616 0 line_eq eqsel eqjoinsel ));+DESCR("equal");+DATA(insert OID = 1617 ( "#" PGNSP PGUID b f f 628 628 600 1617 0 line_interpt - - ));+DESCR("intersection point");++/* MAC type */+DATA(insert OID = 1220 ( "=" PGNSP PGUID b t t 829 829 16 1220 1221 macaddr_eq eqsel eqjoinsel ));+DESCR("equal");+DATA(insert OID = 1221 ( "<>" PGNSP PGUID b f f 829 829 16 1221 1220 macaddr_ne neqsel neqjoinsel ));+DESCR("not equal");+DATA(insert OID = 1222 ( "<" PGNSP PGUID b f f 829 829 16 1224 1225 macaddr_lt scalarltsel scalarltjoinsel ));+DESCR("less than");+DATA(insert OID = 1223 ( "<=" PGNSP PGUID b f f 829 829 16 1225 1224 macaddr_le scalarltsel scalarltjoinsel ));+DESCR("less than or equal");+DATA(insert OID = 1224 ( ">" PGNSP PGUID b f f 829 829 16 1222 1223 macaddr_gt scalargtsel scalargtjoinsel ));+DESCR("greater than");+DATA(insert OID = 1225 ( ">=" PGNSP PGUID b f f 829 829 16 1223 1222 macaddr_ge scalargtsel scalargtjoinsel ));+DESCR("greater than or equal");++DATA(insert OID = 3147 ( "~" PGNSP PGUID l f f 0 829 829 0 0 macaddr_not - - ));+DESCR("bitwise not");+DATA(insert OID = 3148 ( "&" PGNSP PGUID b f f 829 829 829 0 0 macaddr_and - - ));+DESCR("bitwise and");+DATA(insert OID = 3149 ( "|" PGNSP PGUID b f f 829 829 829 0 0 macaddr_or - - ));+DESCR("bitwise or");++/* INET type (these also support CIDR via implicit cast) */+DATA(insert OID = 1201 ( "=" PGNSP PGUID b t t 869 869 16 1201 1202 network_eq eqsel eqjoinsel ));+DESCR("equal");+DATA(insert OID = 1202 ( "<>" PGNSP PGUID b f f 869 869 16 1202 1201 network_ne neqsel neqjoinsel ));+DESCR("not equal");+DATA(insert OID = 1203 ( "<" PGNSP PGUID b f f 869 869 16 1205 1206 network_lt scalarltsel scalarltjoinsel ));+DESCR("less than");+DATA(insert OID = 1204 ( "<=" PGNSP PGUID b f f 869 869 16 1206 1205 network_le scalarltsel scalarltjoinsel ));+DESCR("less than or equal");+DATA(insert OID = 1205 ( ">" PGNSP PGUID b f f 869 869 16 1203 1204 network_gt scalargtsel scalargtjoinsel ));+DESCR("greater than");+DATA(insert OID = 1206 ( ">=" PGNSP PGUID b f f 869 869 16 1204 1203 network_ge scalargtsel scalargtjoinsel ));+DESCR("greater than or equal");+DATA(insert OID = 931 ( "<<" PGNSP PGUID b f f 869 869 16 933 0 network_sub networksel networkjoinsel ));+DESCR("is subnet");+#define OID_INET_SUB_OP 931+DATA(insert OID = 932 ( "<<=" PGNSP PGUID b f f 869 869 16 934 0 network_subeq networksel networkjoinsel ));+DESCR("is subnet or equal");+#define OID_INET_SUBEQ_OP 932+DATA(insert OID = 933 ( ">>" PGNSP PGUID b f f 869 869 16 931 0 network_sup networksel networkjoinsel ));+DESCR("is supernet");+#define OID_INET_SUP_OP 933+DATA(insert OID = 934 ( ">>=" PGNSP PGUID b f f 869 869 16 932 0 network_supeq networksel networkjoinsel ));+DESCR("is supernet or equal");+#define OID_INET_SUPEQ_OP 934+DATA(insert OID = 3552 ( "&&" PGNSP PGUID b f f 869 869 16 3552 0 network_overlap networksel networkjoinsel ));+DESCR("overlaps (is subnet or supernet)");+#define OID_INET_OVERLAP_OP 3552++DATA(insert OID = 2634 ( "~" PGNSP PGUID l f f 0 869 869 0 0 inetnot - - ));+DESCR("bitwise not");+DATA(insert OID = 2635 ( "&" PGNSP PGUID b f f 869 869 869 0 0 inetand - - ));+DESCR("bitwise and");+DATA(insert OID = 2636 ( "|" PGNSP PGUID b f f 869 869 869 0 0 inetor - - ));+DESCR("bitwise or");+DATA(insert OID = 2637 ( "+" PGNSP PGUID b f f 869 20 869 2638 0 inetpl - - ));+DESCR("add");+DATA(insert OID = 2638 ( "+" PGNSP PGUID b f f 20 869 869 2637 0 int8pl_inet - - ));+DESCR("add");+DATA(insert OID = 2639 ( "-" PGNSP PGUID b f f 869 20 869 0 0 inetmi_int8 - - ));+DESCR("subtract");+DATA(insert OID = 2640 ( "-" PGNSP PGUID b f f 869 869 20 0 0 inetmi - - ));+DESCR("subtract");++/* case-insensitive LIKE hacks */+DATA(insert OID = 1625 ( "~~*" PGNSP PGUID b f f 19 25 16 0 1626 nameiclike iclikesel iclikejoinsel ));+DESCR("matches LIKE expression, case-insensitive");+#define OID_NAME_ICLIKE_OP 1625+DATA(insert OID = 1626 ( "!~~*" PGNSP PGUID b f f 19 25 16 0 1625 nameicnlike icnlikesel icnlikejoinsel ));+DESCR("does not match LIKE expression, case-insensitive");+DATA(insert OID = 1627 ( "~~*" PGNSP PGUID b f f 25 25 16 0 1628 texticlike iclikesel iclikejoinsel ));+DESCR("matches LIKE expression, case-insensitive");+#define OID_TEXT_ICLIKE_OP 1627+DATA(insert OID = 1628 ( "!~~*" PGNSP PGUID b f f 25 25 16 0 1627 texticnlike icnlikesel icnlikejoinsel ));+DESCR("does not match LIKE expression, case-insensitive");+DATA(insert OID = 1629 ( "~~*" PGNSP PGUID b f f 1042 25 16 0 1630 bpchariclike iclikesel iclikejoinsel ));+DESCR("matches LIKE expression, case-insensitive");+#define OID_BPCHAR_ICLIKE_OP 1629+DATA(insert OID = 1630 ( "!~~*" PGNSP PGUID b f f 1042 25 16 0 1629 bpcharicnlike icnlikesel icnlikejoinsel ));+DESCR("does not match LIKE expression, case-insensitive");++/* NUMERIC type - OID's 1700-1799 */+DATA(insert OID = 1751 ( "-" PGNSP PGUID l f f 0 1700 1700 0 0 numeric_uminus - - ));+DESCR("negate");+DATA(insert OID = 1752 ( "=" PGNSP PGUID b t t 1700 1700 16 1752 1753 numeric_eq eqsel eqjoinsel ));+DESCR("equal");+DATA(insert OID = 1753 ( "<>" PGNSP PGUID b f f 1700 1700 16 1753 1752 numeric_ne neqsel neqjoinsel ));+DESCR("not equal");+DATA(insert OID = 1754 ( "<" PGNSP PGUID b f f 1700 1700 16 1756 1757 numeric_lt scalarltsel scalarltjoinsel ));+DESCR("less than");+DATA(insert OID = 1755 ( "<=" PGNSP PGUID b f f 1700 1700 16 1757 1756 numeric_le scalarltsel scalarltjoinsel ));+DESCR("less than or equal");+DATA(insert OID = 1756 ( ">" PGNSP PGUID b f f 1700 1700 16 1754 1755 numeric_gt scalargtsel scalargtjoinsel ));+DESCR("greater than");+DATA(insert OID = 1757 ( ">=" PGNSP PGUID b f f 1700 1700 16 1755 1754 numeric_ge scalargtsel scalargtjoinsel ));+DESCR("greater than or equal");+DATA(insert OID = 1758 ( "+" PGNSP PGUID b f f 1700 1700 1700 1758 0 numeric_add - - ));+DESCR("add");+DATA(insert OID = 1759 ( "-" PGNSP PGUID b f f 1700 1700 1700 0 0 numeric_sub - - ));+DESCR("subtract");+DATA(insert OID = 1760 ( "*" PGNSP PGUID b f f 1700 1700 1700 1760 0 numeric_mul - - ));+DESCR("multiply");+DATA(insert OID = 1761 ( "/" PGNSP PGUID b f f 1700 1700 1700 0 0 numeric_div - - ));+DESCR("divide");+DATA(insert OID = 1762 ( "%" PGNSP PGUID b f f 1700 1700 1700 0 0 numeric_mod - - ));+DESCR("modulus");+DATA(insert OID = 1038 ( "^" PGNSP PGUID b f f 1700 1700 1700 0 0 numeric_power - - ));+DESCR("exponentiation");+DATA(insert OID = 1763 ( "@" PGNSP PGUID l f f 0 1700 1700 0 0 numeric_abs - - ));+DESCR("absolute value");++DATA(insert OID = 1784 ( "=" PGNSP PGUID b t f 1560 1560 16 1784 1785 biteq eqsel eqjoinsel ));+DESCR("equal");+DATA(insert OID = 1785 ( "<>" PGNSP PGUID b f f 1560 1560 16 1785 1784 bitne neqsel neqjoinsel ));+DESCR("not equal");+DATA(insert OID = 1786 ( "<" PGNSP PGUID b f f 1560 1560 16 1787 1789 bitlt scalarltsel scalarltjoinsel ));+DESCR("less than");+DATA(insert OID = 1787 ( ">" PGNSP PGUID b f f 1560 1560 16 1786 1788 bitgt scalargtsel scalargtjoinsel ));+DESCR("greater than");+DATA(insert OID = 1788 ( "<=" PGNSP PGUID b f f 1560 1560 16 1789 1787 bitle scalarltsel scalarltjoinsel ));+DESCR("less than or equal");+DATA(insert OID = 1789 ( ">=" PGNSP PGUID b f f 1560 1560 16 1788 1786 bitge scalargtsel scalargtjoinsel ));+DESCR("greater than or equal");+DATA(insert OID = 1791 ( "&" PGNSP PGUID b f f 1560 1560 1560 1791 0 bitand - - ));+DESCR("bitwise and");+DATA(insert OID = 1792 ( "|" PGNSP PGUID b f f 1560 1560 1560 1792 0 bitor - - ));+DESCR("bitwise or");+DATA(insert OID = 1793 ( "#" PGNSP PGUID b f f 1560 1560 1560 1793 0 bitxor - - ));+DESCR("bitwise exclusive or");+DATA(insert OID = 1794 ( "~" PGNSP PGUID l f f 0 1560 1560 0 0 bitnot - - ));+DESCR("bitwise not");+DATA(insert OID = 1795 ( "<<" PGNSP PGUID b f f 1560 23 1560 0 0 bitshiftleft - - ));+DESCR("bitwise shift left");+DATA(insert OID = 1796 ( ">>" PGNSP PGUID b f f 1560 23 1560 0 0 bitshiftright - - ));+DESCR("bitwise shift right");+DATA(insert OID = 1797 ( "||" PGNSP PGUID b f f 1562 1562 1562 0 0 bitcat - - ));+DESCR("concatenate");++DATA(insert OID = 1800 ( "+" PGNSP PGUID b f f 1083 1186 1083 1849 0 time_pl_interval - - ));+DESCR("add");+DATA(insert OID = 1801 ( "-" PGNSP PGUID b f f 1083 1186 1083 0 0 time_mi_interval - - ));+DESCR("subtract");+DATA(insert OID = 1802 ( "+" PGNSP PGUID b f f 1266 1186 1266 2552 0 timetz_pl_interval - - ));+DESCR("add");+DATA(insert OID = 1803 ( "-" PGNSP PGUID b f f 1266 1186 1266 0 0 timetz_mi_interval - - ));+DESCR("subtract");++DATA(insert OID = 1804 ( "=" PGNSP PGUID b t f 1562 1562 16 1804 1805 varbiteq eqsel eqjoinsel ));+DESCR("equal");+DATA(insert OID = 1805 ( "<>" PGNSP PGUID b f f 1562 1562 16 1805 1804 varbitne neqsel neqjoinsel ));+DESCR("not equal");+DATA(insert OID = 1806 ( "<" PGNSP PGUID b f f 1562 1562 16 1807 1809 varbitlt scalarltsel scalarltjoinsel ));+DESCR("less than");+DATA(insert OID = 1807 ( ">" PGNSP PGUID b f f 1562 1562 16 1806 1808 varbitgt scalargtsel scalargtjoinsel ));+DESCR("greater than");+DATA(insert OID = 1808 ( "<=" PGNSP PGUID b f f 1562 1562 16 1809 1807 varbitle scalarltsel scalarltjoinsel ));+DESCR("less than or equal");+DATA(insert OID = 1809 ( ">=" PGNSP PGUID b f f 1562 1562 16 1808 1806 varbitge scalargtsel scalargtjoinsel ));+DESCR("greater than or equal");++DATA(insert OID = 1849 ( "+" PGNSP PGUID b f f 1186 1083 1083 1800 0 interval_pl_time - - ));+DESCR("add");++DATA(insert OID = 1862 ( "=" PGNSP PGUID b t t 21 20 16 1868 1863 int28eq eqsel eqjoinsel ));+DESCR("equal");+DATA(insert OID = 1863 ( "<>" PGNSP PGUID b f f 21 20 16 1869 1862 int28ne neqsel neqjoinsel ));+DESCR("not equal");+DATA(insert OID = 1864 ( "<" PGNSP PGUID b f f 21 20 16 1871 1867 int28lt scalarltsel scalarltjoinsel ));+DESCR("less than");+DATA(insert OID = 1865 ( ">" PGNSP PGUID b f f 21 20 16 1870 1866 int28gt scalargtsel scalargtjoinsel ));+DESCR("greater than");+DATA(insert OID = 1866 ( "<=" PGNSP PGUID b f f 21 20 16 1873 1865 int28le scalarltsel scalarltjoinsel ));+DESCR("less than or equal");+DATA(insert OID = 1867 ( ">=" PGNSP PGUID b f f 21 20 16 1872 1864 int28ge scalargtsel scalargtjoinsel ));+DESCR("greater than or equal");++DATA(insert OID = 1868 ( "=" PGNSP PGUID b t t 20 21 16 1862 1869 int82eq eqsel eqjoinsel ));+DESCR("equal");+DATA(insert OID = 1869 ( "<>" PGNSP PGUID b f f 20 21 16 1863 1868 int82ne neqsel neqjoinsel ));+DESCR("not equal");+DATA(insert OID = 1870 ( "<" PGNSP PGUID b f f 20 21 16 1865 1873 int82lt scalarltsel scalarltjoinsel ));+DESCR("less than");+DATA(insert OID = 1871 ( ">" PGNSP PGUID b f f 20 21 16 1864 1872 int82gt scalargtsel scalargtjoinsel ));+DESCR("greater than");+DATA(insert OID = 1872 ( "<=" PGNSP PGUID b f f 20 21 16 1867 1871 int82le scalarltsel scalarltjoinsel ));+DESCR("less than or equal");+DATA(insert OID = 1873 ( ">=" PGNSP PGUID b f f 20 21 16 1866 1870 int82ge scalargtsel scalargtjoinsel ));+DESCR("greater than or equal");++DATA(insert OID = 1874 ( "&" PGNSP PGUID b f f 21 21 21 1874 0 int2and - - ));+DESCR("bitwise and");+DATA(insert OID = 1875 ( "|" PGNSP PGUID b f f 21 21 21 1875 0 int2or - - ));+DESCR("bitwise or");+DATA(insert OID = 1876 ( "#" PGNSP PGUID b f f 21 21 21 1876 0 int2xor - - ));+DESCR("bitwise exclusive or");+DATA(insert OID = 1877 ( "~" PGNSP PGUID l f f 0 21 21 0 0 int2not - - ));+DESCR("bitwise not");+DATA(insert OID = 1878 ( "<<" PGNSP PGUID b f f 21 23 21 0 0 int2shl - - ));+DESCR("bitwise shift left");+DATA(insert OID = 1879 ( ">>" PGNSP PGUID b f f 21 23 21 0 0 int2shr - - ));+DESCR("bitwise shift right");++DATA(insert OID = 1880 ( "&" PGNSP PGUID b f f 23 23 23 1880 0 int4and - - ));+DESCR("bitwise and");+DATA(insert OID = 1881 ( "|" PGNSP PGUID b f f 23 23 23 1881 0 int4or - - ));+DESCR("bitwise or");+DATA(insert OID = 1882 ( "#" PGNSP PGUID b f f 23 23 23 1882 0 int4xor - - ));+DESCR("bitwise exclusive or");+DATA(insert OID = 1883 ( "~" PGNSP PGUID l f f 0 23 23 0 0 int4not - - ));+DESCR("bitwise not");+DATA(insert OID = 1884 ( "<<" PGNSP PGUID b f f 23 23 23 0 0 int4shl - - ));+DESCR("bitwise shift left");+DATA(insert OID = 1885 ( ">>" PGNSP PGUID b f f 23 23 23 0 0 int4shr - - ));+DESCR("bitwise shift right");++DATA(insert OID = 1886 ( "&" PGNSP PGUID b f f 20 20 20 1886 0 int8and - - ));+DESCR("bitwise and");+DATA(insert OID = 1887 ( "|" PGNSP PGUID b f f 20 20 20 1887 0 int8or - - ));+DESCR("bitwise or");+DATA(insert OID = 1888 ( "#" PGNSP PGUID b f f 20 20 20 1888 0 int8xor - - ));+DESCR("bitwise exclusive or");+DATA(insert OID = 1889 ( "~" PGNSP PGUID l f f 0 20 20 0 0 int8not - - ));+DESCR("bitwise not");+DATA(insert OID = 1890 ( "<<" PGNSP PGUID b f f 20 23 20 0 0 int8shl - - ));+DESCR("bitwise shift left");+DATA(insert OID = 1891 ( ">>" PGNSP PGUID b f f 20 23 20 0 0 int8shr - - ));+DESCR("bitwise shift right");++DATA(insert OID = 1916 ( "+" PGNSP PGUID l f f 0 20 20 0 0 int8up - - ));+DESCR("unary plus");+DATA(insert OID = 1917 ( "+" PGNSP PGUID l f f 0 21 21 0 0 int2up - - ));+DESCR("unary plus");+DATA(insert OID = 1918 ( "+" PGNSP PGUID l f f 0 23 23 0 0 int4up - - ));+DESCR("unary plus");+DATA(insert OID = 1919 ( "+" PGNSP PGUID l f f 0 700 700 0 0 float4up - - ));+DESCR("unary plus");+DATA(insert OID = 1920 ( "+" PGNSP PGUID l f f 0 701 701 0 0 float8up - - ));+DESCR("unary plus");+DATA(insert OID = 1921 ( "+" PGNSP PGUID l f f 0 1700 1700 0 0 numeric_uplus - - ));+DESCR("unary plus");++/* bytea operators */+DATA(insert OID = 1955 ( "=" PGNSP PGUID b t t 17 17 16 1955 1956 byteaeq eqsel eqjoinsel ));+DESCR("equal");+DATA(insert OID = 1956 ( "<>" PGNSP PGUID b f f 17 17 16 1956 1955 byteane neqsel neqjoinsel ));+DESCR("not equal");+DATA(insert OID = 1957 ( "<" PGNSP PGUID b f f 17 17 16 1959 1960 bytealt scalarltsel scalarltjoinsel ));+DESCR("less than");+DATA(insert OID = 1958 ( "<=" PGNSP PGUID b f f 17 17 16 1960 1959 byteale scalarltsel scalarltjoinsel ));+DESCR("less than or equal");+DATA(insert OID = 1959 ( ">" PGNSP PGUID b f f 17 17 16 1957 1958 byteagt scalargtsel scalargtjoinsel ));+DESCR("greater than");+DATA(insert OID = 1960 ( ">=" PGNSP PGUID b f f 17 17 16 1958 1957 byteage scalargtsel scalargtjoinsel ));+DESCR("greater than or equal");++DATA(insert OID = 2016 ( "~~" PGNSP PGUID b f f 17 17 16 0 2017 bytealike likesel likejoinsel ));+DESCR("matches LIKE expression");+#define OID_BYTEA_LIKE_OP 2016+DATA(insert OID = 2017 ( "!~~" PGNSP PGUID b f f 17 17 16 0 2016 byteanlike nlikesel nlikejoinsel ));+DESCR("does not match LIKE expression");+DATA(insert OID = 2018 ( "||" PGNSP PGUID b f f 17 17 17 0 0 byteacat - - ));+DESCR("concatenate");++/* timestamp operators */+DATA(insert OID = 2060 ( "=" PGNSP PGUID b t t 1114 1114 16 2060 2061 timestamp_eq eqsel eqjoinsel ));+DESCR("equal");+DATA(insert OID = 2061 ( "<>" PGNSP PGUID b f f 1114 1114 16 2061 2060 timestamp_ne neqsel neqjoinsel ));+DESCR("not equal");+DATA(insert OID = 2062 ( "<" PGNSP PGUID b f f 1114 1114 16 2064 2065 timestamp_lt scalarltsel scalarltjoinsel ));+DESCR("less than");+DATA(insert OID = 2063 ( "<=" PGNSP PGUID b f f 1114 1114 16 2065 2064 timestamp_le scalarltsel scalarltjoinsel ));+DESCR("less than or equal");+DATA(insert OID = 2064 ( ">" PGNSP PGUID b f f 1114 1114 16 2062 2063 timestamp_gt scalargtsel scalargtjoinsel ));+DESCR("greater than");+DATA(insert OID = 2065 ( ">=" PGNSP PGUID b f f 1114 1114 16 2063 2062 timestamp_ge scalargtsel scalargtjoinsel ));+DESCR("greater than or equal");+DATA(insert OID = 2066 ( "+" PGNSP PGUID b f f 1114 1186 1114 2553 0 timestamp_pl_interval - - ));+DESCR("add");+DATA(insert OID = 2067 ( "-" PGNSP PGUID b f f 1114 1114 1186 0 0 timestamp_mi - - ));+DESCR("subtract");+DATA(insert OID = 2068 ( "-" PGNSP PGUID b f f 1114 1186 1114 0 0 timestamp_mi_interval - - ));+DESCR("subtract");++/* character-by-character (not collation order) comparison operators for character types */++DATA(insert OID = 2314 ( "~<~" PGNSP PGUID b f f 25 25 16 2318 2317 text_pattern_lt scalarltsel scalarltjoinsel ));+DESCR("less than");+DATA(insert OID = 2315 ( "~<=~" PGNSP PGUID b f f 25 25 16 2317 2318 text_pattern_le scalarltsel scalarltjoinsel ));+DESCR("less than or equal");+DATA(insert OID = 2317 ( "~>=~" PGNSP PGUID b f f 25 25 16 2315 2314 text_pattern_ge scalargtsel scalargtjoinsel ));+DESCR("greater than or equal");+DATA(insert OID = 2318 ( "~>~" PGNSP PGUID b f f 25 25 16 2314 2315 text_pattern_gt scalargtsel scalargtjoinsel ));+DESCR("greater than");++DATA(insert OID = 2326 ( "~<~" PGNSP PGUID b f f 1042 1042 16 2330 2329 bpchar_pattern_lt scalarltsel scalarltjoinsel ));+DESCR("less than");+DATA(insert OID = 2327 ( "~<=~" PGNSP PGUID b f f 1042 1042 16 2329 2330 bpchar_pattern_le scalarltsel scalarltjoinsel ));+DESCR("less than or equal");+DATA(insert OID = 2329 ( "~>=~" PGNSP PGUID b f f 1042 1042 16 2327 2326 bpchar_pattern_ge scalargtsel scalargtjoinsel ));+DESCR("greater than or equal");+DATA(insert OID = 2330 ( "~>~" PGNSP PGUID b f f 1042 1042 16 2326 2327 bpchar_pattern_gt scalargtsel scalargtjoinsel ));+DESCR("greater than");++/* crosstype operations for date vs. timestamp and timestamptz */++DATA(insert OID = 2345 ( "<" PGNSP PGUID b f f 1082 1114 16 2375 2348 date_lt_timestamp scalarltsel scalarltjoinsel ));+DESCR("less than");+DATA(insert OID = 2346 ( "<=" PGNSP PGUID b f f 1082 1114 16 2374 2349 date_le_timestamp scalarltsel scalarltjoinsel ));+DESCR("less than or equal");+DATA(insert OID = 2347 ( "=" PGNSP PGUID b t f 1082 1114 16 2373 2350 date_eq_timestamp eqsel eqjoinsel ));+DESCR("equal");+DATA(insert OID = 2348 ( ">=" PGNSP PGUID b f f 1082 1114 16 2372 2345 date_ge_timestamp scalargtsel scalargtjoinsel ));+DESCR("greater than or equal");+DATA(insert OID = 2349 ( ">" PGNSP PGUID b f f 1082 1114 16 2371 2346 date_gt_timestamp scalargtsel scalargtjoinsel ));+DESCR("greater than");+DATA(insert OID = 2350 ( "<>" PGNSP PGUID b f f 1082 1114 16 2376 2347 date_ne_timestamp neqsel neqjoinsel ));+DESCR("not equal");++DATA(insert OID = 2358 ( "<" PGNSP PGUID b f f 1082 1184 16 2388 2361 date_lt_timestamptz scalarltsel scalarltjoinsel ));+DESCR("less than");+DATA(insert OID = 2359 ( "<=" PGNSP PGUID b f f 1082 1184 16 2387 2362 date_le_timestamptz scalarltsel scalarltjoinsel ));+DESCR("less than or equal");+DATA(insert OID = 2360 ( "=" PGNSP PGUID b t f 1082 1184 16 2386 2363 date_eq_timestamptz eqsel eqjoinsel ));+DESCR("equal");+DATA(insert OID = 2361 ( ">=" PGNSP PGUID b f f 1082 1184 16 2385 2358 date_ge_timestamptz scalargtsel scalargtjoinsel ));+DESCR("greater than or equal");+DATA(insert OID = 2362 ( ">" PGNSP PGUID b f f 1082 1184 16 2384 2359 date_gt_timestamptz scalargtsel scalargtjoinsel ));+DESCR("greater than");+DATA(insert OID = 2363 ( "<>" PGNSP PGUID b f f 1082 1184 16 2389 2360 date_ne_timestamptz neqsel neqjoinsel ));+DESCR("not equal");++DATA(insert OID = 2371 ( "<" PGNSP PGUID b f f 1114 1082 16 2349 2374 timestamp_lt_date scalarltsel scalarltjoinsel ));+DESCR("less than");+DATA(insert OID = 2372 ( "<=" PGNSP PGUID b f f 1114 1082 16 2348 2375 timestamp_le_date scalarltsel scalarltjoinsel ));+DESCR("less than or equal");+DATA(insert OID = 2373 ( "=" PGNSP PGUID b t f 1114 1082 16 2347 2376 timestamp_eq_date eqsel eqjoinsel ));+DESCR("equal");+DATA(insert OID = 2374 ( ">=" PGNSP PGUID b f f 1114 1082 16 2346 2371 timestamp_ge_date scalargtsel scalargtjoinsel ));+DESCR("greater than or equal");+DATA(insert OID = 2375 ( ">" PGNSP PGUID b f f 1114 1082 16 2345 2372 timestamp_gt_date scalargtsel scalargtjoinsel ));+DESCR("greater than");+DATA(insert OID = 2376 ( "<>" PGNSP PGUID b f f 1114 1082 16 2350 2373 timestamp_ne_date neqsel neqjoinsel ));+DESCR("not equal");++DATA(insert OID = 2384 ( "<" PGNSP PGUID b f f 1184 1082 16 2362 2387 timestamptz_lt_date scalarltsel scalarltjoinsel ));+DESCR("less than");+DATA(insert OID = 2385 ( "<=" PGNSP PGUID b f f 1184 1082 16 2361 2388 timestamptz_le_date scalarltsel scalarltjoinsel ));+DESCR("less than or equal");+DATA(insert OID = 2386 ( "=" PGNSP PGUID b t f 1184 1082 16 2360 2389 timestamptz_eq_date eqsel eqjoinsel ));+DESCR("equal");+DATA(insert OID = 2387 ( ">=" PGNSP PGUID b f f 1184 1082 16 2359 2384 timestamptz_ge_date scalargtsel scalargtjoinsel ));+DESCR("greater than or equal");+DATA(insert OID = 2388 ( ">" PGNSP PGUID b f f 1184 1082 16 2358 2385 timestamptz_gt_date scalargtsel scalargtjoinsel ));+DESCR("greater than");+DATA(insert OID = 2389 ( "<>" PGNSP PGUID b f f 1184 1082 16 2363 2386 timestamptz_ne_date neqsel neqjoinsel ));+DESCR("not equal");++/* crosstype operations for timestamp vs. timestamptz */++DATA(insert OID = 2534 ( "<" PGNSP PGUID b f f 1114 1184 16 2544 2537 timestamp_lt_timestamptz scalarltsel scalarltjoinsel ));+DESCR("less than");+DATA(insert OID = 2535 ( "<=" PGNSP PGUID b f f 1114 1184 16 2543 2538 timestamp_le_timestamptz scalarltsel scalarltjoinsel ));+DESCR("less than or equal");+DATA(insert OID = 2536 ( "=" PGNSP PGUID b t f 1114 1184 16 2542 2539 timestamp_eq_timestamptz eqsel eqjoinsel ));+DESCR("equal");+DATA(insert OID = 2537 ( ">=" PGNSP PGUID b f f 1114 1184 16 2541 2534 timestamp_ge_timestamptz scalargtsel scalargtjoinsel ));+DESCR("greater than or equal");+DATA(insert OID = 2538 ( ">" PGNSP PGUID b f f 1114 1184 16 2540 2535 timestamp_gt_timestamptz scalargtsel scalargtjoinsel ));+DESCR("greater than");+DATA(insert OID = 2539 ( "<>" PGNSP PGUID b f f 1114 1184 16 2545 2536 timestamp_ne_timestamptz neqsel neqjoinsel ));+DESCR("not equal");++DATA(insert OID = 2540 ( "<" PGNSP PGUID b f f 1184 1114 16 2538 2543 timestamptz_lt_timestamp scalarltsel scalarltjoinsel ));+DESCR("less than");+DATA(insert OID = 2541 ( "<=" PGNSP PGUID b f f 1184 1114 16 2537 2544 timestamptz_le_timestamp scalarltsel scalarltjoinsel ));+DESCR("less than or equal");+DATA(insert OID = 2542 ( "=" PGNSP PGUID b t f 1184 1114 16 2536 2545 timestamptz_eq_timestamp eqsel eqjoinsel ));+DESCR("equal");+DATA(insert OID = 2543 ( ">=" PGNSP PGUID b f f 1184 1114 16 2535 2540 timestamptz_ge_timestamp scalargtsel scalargtjoinsel ));+DESCR("greater than or equal");+DATA(insert OID = 2544 ( ">" PGNSP PGUID b f f 1184 1114 16 2534 2541 timestamptz_gt_timestamp scalargtsel scalargtjoinsel ));+DESCR("greater than");+DATA(insert OID = 2545 ( "<>" PGNSP PGUID b f f 1184 1114 16 2539 2542 timestamptz_ne_timestamp neqsel neqjoinsel ));+DESCR("not equal");++/* formerly-missing interval + datetime operators */+DATA(insert OID = 2551 ( "+" PGNSP PGUID b f f 1186 1082 1114 1076 0 interval_pl_date - - ));+DESCR("add");+DATA(insert OID = 2552 ( "+" PGNSP PGUID b f f 1186 1266 1266 1802 0 interval_pl_timetz - - ));+DESCR("add");+DATA(insert OID = 2553 ( "+" PGNSP PGUID b f f 1186 1114 1114 2066 0 interval_pl_timestamp - - ));+DESCR("add");+DATA(insert OID = 2554 ( "+" PGNSP PGUID b f f 1186 1184 1184 1327 0 interval_pl_timestamptz - - ));+DESCR("add");+DATA(insert OID = 2555 ( "+" PGNSP PGUID b f f 23 1082 1082 1100 0 integer_pl_date - - ));+DESCR("add");++/* new operators for Y-direction rtree opfamilies */+DATA(insert OID = 2570 ( "<<|" PGNSP PGUID b f f 603 603 16 0 0 box_below positionsel positionjoinsel ));+DESCR("is below");+DATA(insert OID = 2571 ( "&<|" PGNSP PGUID b f f 603 603 16 0 0 box_overbelow positionsel positionjoinsel ));+DESCR("overlaps or is below");+DATA(insert OID = 2572 ( "|&>" PGNSP PGUID b f f 603 603 16 0 0 box_overabove positionsel positionjoinsel ));+DESCR("overlaps or is above");+DATA(insert OID = 2573 ( "|>>" PGNSP PGUID b f f 603 603 16 0 0 box_above positionsel positionjoinsel ));+DESCR("is above");+DATA(insert OID = 2574 ( "<<|" PGNSP PGUID b f f 604 604 16 0 0 poly_below positionsel positionjoinsel ));+DESCR("is below");+DATA(insert OID = 2575 ( "&<|" PGNSP PGUID b f f 604 604 16 0 0 poly_overbelow positionsel positionjoinsel ));+DESCR("overlaps or is below");+DATA(insert OID = 2576 ( "|&>" PGNSP PGUID b f f 604 604 16 0 0 poly_overabove positionsel positionjoinsel ));+DESCR("overlaps or is above");+DATA(insert OID = 2577 ( "|>>" PGNSP PGUID b f f 604 604 16 0 0 poly_above positionsel positionjoinsel ));+DESCR("is above");+DATA(insert OID = 2589 ( "&<|" PGNSP PGUID b f f 718 718 16 0 0 circle_overbelow positionsel positionjoinsel ));+DESCR("overlaps or is below");+DATA(insert OID = 2590 ( "|&>" PGNSP PGUID b f f 718 718 16 0 0 circle_overabove positionsel positionjoinsel ));+DESCR("overlaps or is above");++/* overlap/contains/contained for arrays */+DATA(insert OID = 2750 ( "&&" PGNSP PGUID b f f 2277 2277 16 2750 0 arrayoverlap arraycontsel arraycontjoinsel ));+DESCR("overlaps");+#define OID_ARRAY_OVERLAP_OP 2750+DATA(insert OID = 2751 ( "@>" PGNSP PGUID b f f 2277 2277 16 2752 0 arraycontains arraycontsel arraycontjoinsel ));+DESCR("contains");+#define OID_ARRAY_CONTAINS_OP 2751+DATA(insert OID = 2752 ( "<@" PGNSP PGUID b f f 2277 2277 16 2751 0 arraycontained arraycontsel arraycontjoinsel ));+DESCR("is contained by");+#define OID_ARRAY_CONTAINED_OP 2752++/* capturing operators to preserve pre-8.3 behavior of text concatenation */+DATA(insert OID = 2779 ( "||" PGNSP PGUID b f f 25 2776 25 0 0 textanycat - - ));+DESCR("concatenate");+DATA(insert OID = 2780 ( "||" PGNSP PGUID b f f 2776 25 25 0 0 anytextcat - - ));+DESCR("concatenate");++/* obsolete names for contains/contained-by operators; remove these someday */+DATA(insert OID = 2860 ( "@" PGNSP PGUID b f f 604 604 16 2861 0 poly_contained contsel contjoinsel ));+DESCR("deprecated, use <@ instead");+DATA(insert OID = 2861 ( "~" PGNSP PGUID b f f 604 604 16 2860 0 poly_contain contsel contjoinsel ));+DESCR("deprecated, use @> instead");+DATA(insert OID = 2862 ( "@" PGNSP PGUID b f f 603 603 16 2863 0 box_contained contsel contjoinsel ));+DESCR("deprecated, use <@ instead");+DATA(insert OID = 2863 ( "~" PGNSP PGUID b f f 603 603 16 2862 0 box_contain contsel contjoinsel ));+DESCR("deprecated, use @> instead");+DATA(insert OID = 2864 ( "@" PGNSP PGUID b f f 718 718 16 2865 0 circle_contained contsel contjoinsel ));+DESCR("deprecated, use <@ instead");+DATA(insert OID = 2865 ( "~" PGNSP PGUID b f f 718 718 16 2864 0 circle_contain contsel contjoinsel ));+DESCR("deprecated, use @> instead");+DATA(insert OID = 2866 ( "@" PGNSP PGUID b f f 600 603 16 0 0 on_pb - - ));+DESCR("deprecated, use <@ instead");+DATA(insert OID = 2867 ( "@" PGNSP PGUID b f f 600 602 16 2868 0 on_ppath - - ));+DESCR("deprecated, use <@ instead");+DATA(insert OID = 2868 ( "~" PGNSP PGUID b f f 602 600 16 2867 0 path_contain_pt - - ));+DESCR("deprecated, use @> instead");+DATA(insert OID = 2869 ( "@" PGNSP PGUID b f f 600 604 16 2870 0 pt_contained_poly - - ));+DESCR("deprecated, use <@ instead");+DATA(insert OID = 2870 ( "~" PGNSP PGUID b f f 604 600 16 2869 0 poly_contain_pt - - ));+DESCR("deprecated, use @> instead");+DATA(insert OID = 2871 ( "@" PGNSP PGUID b f f 600 718 16 2872 0 pt_contained_circle - - ));+DESCR("deprecated, use <@ instead");+DATA(insert OID = 2872 ( "~" PGNSP PGUID b f f 718 600 16 2871 0 circle_contain_pt - - ));+DESCR("deprecated, use @> instead");+DATA(insert OID = 2873 ( "@" PGNSP PGUID b f f 600 628 16 0 0 on_pl - - ));+DESCR("deprecated, use <@ instead");+DATA(insert OID = 2874 ( "@" PGNSP PGUID b f f 600 601 16 0 0 on_ps - - ));+DESCR("deprecated, use <@ instead");+DATA(insert OID = 2875 ( "@" PGNSP PGUID b f f 601 628 16 0 0 on_sl - - ));+DESCR("deprecated, use <@ instead");+DATA(insert OID = 2876 ( "@" PGNSP PGUID b f f 601 603 16 0 0 on_sb - - ));+DESCR("deprecated, use <@ instead");+DATA(insert OID = 2877 ( "~" PGNSP PGUID b f f 1034 1033 16 0 0 aclcontains - - ));+DESCR("deprecated, use @> instead");++/* uuid operators */+DATA(insert OID = 2972 ( "=" PGNSP PGUID b t t 2950 2950 16 2972 2973 uuid_eq eqsel eqjoinsel ));+DESCR("equal");+DATA(insert OID = 2973 ( "<>" PGNSP PGUID b f f 2950 2950 16 2973 2972 uuid_ne neqsel neqjoinsel ));+DESCR("not equal");+DATA(insert OID = 2974 ( "<" PGNSP PGUID b f f 2950 2950 16 2975 2977 uuid_lt scalarltsel scalarltjoinsel ));+DESCR("less than");+DATA(insert OID = 2975 ( ">" PGNSP PGUID b f f 2950 2950 16 2974 2976 uuid_gt scalargtsel scalargtjoinsel ));+DESCR("greater than");+DATA(insert OID = 2976 ( "<=" PGNSP PGUID b f f 2950 2950 16 2977 2975 uuid_le scalarltsel scalarltjoinsel ));+DESCR("less than or equal");+DATA(insert OID = 2977 ( ">=" PGNSP PGUID b f f 2950 2950 16 2976 2974 uuid_ge scalargtsel scalargtjoinsel ));+DESCR("greater than or equal");++/* pg_lsn operators */+DATA(insert OID = 3222 ( "=" PGNSP PGUID b t t 3220 3220 16 3222 3223 pg_lsn_eq eqsel eqjoinsel ));+DESCR("equal");+DATA(insert OID = 3223 ( "<>" PGNSP PGUID b f f 3220 3220 16 3223 3222 pg_lsn_ne neqsel neqjoinsel ));+DESCR("not equal");+DATA(insert OID = 3224 ( "<" PGNSP PGUID b f f 3220 3220 16 3225 3227 pg_lsn_lt scalarltsel scalarltjoinsel ));+DESCR("less than");+DATA(insert OID = 3225 ( ">" PGNSP PGUID b f f 3220 3220 16 3224 3226 pg_lsn_gt scalargtsel scalargtjoinsel ));+DESCR("greater than");+DATA(insert OID = 3226 ( "<=" PGNSP PGUID b f f 3220 3220 16 3227 3225 pg_lsn_le scalarltsel scalarltjoinsel ));+DESCR("less than or equal");+DATA(insert OID = 3227 ( ">=" PGNSP PGUID b f f 3220 3220 16 3226 3224 pg_lsn_ge scalargtsel scalargtjoinsel ));+DESCR("greater than or equal");+DATA(insert OID = 3228 ( "-" PGNSP PGUID b f f 3220 3220 1700 0 0 pg_lsn_mi - - ));+DESCR("minus");++/* enum operators */+DATA(insert OID = 3516 ( "=" PGNSP PGUID b t t 3500 3500 16 3516 3517 enum_eq eqsel eqjoinsel ));+DESCR("equal");+DATA(insert OID = 3517 ( "<>" PGNSP PGUID b f f 3500 3500 16 3517 3516 enum_ne neqsel neqjoinsel ));+DESCR("not equal");+DATA(insert OID = 3518 ( "<" PGNSP PGUID b f f 3500 3500 16 3519 3521 enum_lt scalarltsel scalarltjoinsel ));+DESCR("less than");+DATA(insert OID = 3519 ( ">" PGNSP PGUID b f f 3500 3500 16 3518 3520 enum_gt scalargtsel scalargtjoinsel ));+DESCR("greater than");+DATA(insert OID = 3520 ( "<=" PGNSP PGUID b f f 3500 3500 16 3521 3519 enum_le scalarltsel scalarltjoinsel ));+DESCR("less than or equal");+DATA(insert OID = 3521 ( ">=" PGNSP PGUID b f f 3500 3500 16 3520 3518 enum_ge scalargtsel scalargtjoinsel ));+DESCR("greater than or equal");++/*+ * tsearch operations+ */+DATA(insert OID = 3627 ( "<" PGNSP PGUID b f f 3614 3614 16 3632 3631 tsvector_lt scalarltsel scalarltjoinsel ));+DESCR("less than");+DATA(insert OID = 3628 ( "<=" PGNSP PGUID b f f 3614 3614 16 3631 3632 tsvector_le scalarltsel scalarltjoinsel ));+DESCR("less than or equal");+DATA(insert OID = 3629 ( "=" PGNSP PGUID b t f 3614 3614 16 3629 3630 tsvector_eq eqsel eqjoinsel ));+DESCR("equal");+DATA(insert OID = 3630 ( "<>" PGNSP PGUID b f f 3614 3614 16 3630 3629 tsvector_ne neqsel neqjoinsel ));+DESCR("not equal");+DATA(insert OID = 3631 ( ">=" PGNSP PGUID b f f 3614 3614 16 3628 3627 tsvector_ge scalargtsel scalargtjoinsel ));+DESCR("greater than or equal");+DATA(insert OID = 3632 ( ">" PGNSP PGUID b f f 3614 3614 16 3627 3628 tsvector_gt scalargtsel scalargtjoinsel ));+DESCR("greater than");+DATA(insert OID = 3633 ( "||" PGNSP PGUID b f f 3614 3614 3614 0 0 tsvector_concat - - ));+DESCR("concatenate");+DATA(insert OID = 3636 ( "@@" PGNSP PGUID b f f 3614 3615 16 3637 0 ts_match_vq tsmatchsel tsmatchjoinsel ));+DESCR("text search match");+DATA(insert OID = 3637 ( "@@" PGNSP PGUID b f f 3615 3614 16 3636 0 ts_match_qv tsmatchsel tsmatchjoinsel ));+DESCR("text search match");+DATA(insert OID = 3660 ( "@@@" PGNSP PGUID b f f 3614 3615 16 3661 0 ts_match_vq tsmatchsel tsmatchjoinsel ));+DESCR("deprecated, use @@ instead");+DATA(insert OID = 3661 ( "@@@" PGNSP PGUID b f f 3615 3614 16 3660 0 ts_match_qv tsmatchsel tsmatchjoinsel ));+DESCR("deprecated, use @@ instead");+DATA(insert OID = 3674 ( "<" PGNSP PGUID b f f 3615 3615 16 3679 3678 tsquery_lt scalarltsel scalarltjoinsel ));+DESCR("less than");+DATA(insert OID = 3675 ( "<=" PGNSP PGUID b f f 3615 3615 16 3678 3679 tsquery_le scalarltsel scalarltjoinsel ));+DESCR("less than or equal");+DATA(insert OID = 3676 ( "=" PGNSP PGUID b t f 3615 3615 16 3676 3677 tsquery_eq eqsel eqjoinsel ));+DESCR("equal");+DATA(insert OID = 3677 ( "<>" PGNSP PGUID b f f 3615 3615 16 3677 3676 tsquery_ne neqsel neqjoinsel ));+DESCR("not equal");+DATA(insert OID = 3678 ( ">=" PGNSP PGUID b f f 3615 3615 16 3675 3674 tsquery_ge scalargtsel scalargtjoinsel ));+DESCR("greater than or equal");+DATA(insert OID = 3679 ( ">" PGNSP PGUID b f f 3615 3615 16 3674 3675 tsquery_gt scalargtsel scalargtjoinsel ));+DESCR("greater than");+DATA(insert OID = 3680 ( "&&" PGNSP PGUID b f f 3615 3615 3615 0 0 tsquery_and - - ));+DESCR("AND-concatenate");+DATA(insert OID = 3681 ( "||" PGNSP PGUID b f f 3615 3615 3615 0 0 tsquery_or - - ));+DESCR("OR-concatenate");+DATA(insert OID = 3682 ( "!!" PGNSP PGUID l f f 0 3615 3615 0 0 tsquery_not - - ));+DESCR("NOT tsquery");+DATA(insert OID = 3693 ( "@>" PGNSP PGUID b f f 3615 3615 16 3694 0 tsq_mcontains contsel contjoinsel ));+DESCR("contains");+DATA(insert OID = 3694 ( "<@" PGNSP PGUID b f f 3615 3615 16 3693 0 tsq_mcontained contsel contjoinsel ));+DESCR("is contained by");+DATA(insert OID = 3762 ( "@@" PGNSP PGUID b f f 25 25 16 0 0 ts_match_tt contsel contjoinsel ));+DESCR("text search match");+DATA(insert OID = 3763 ( "@@" PGNSP PGUID b f f 25 3615 16 0 0 ts_match_tq contsel contjoinsel ));+DESCR("text search match");++/* generic record comparison operators */+DATA(insert OID = 2988 ( "=" PGNSP PGUID b t f 2249 2249 16 2988 2989 record_eq eqsel eqjoinsel ));+DESCR("equal");+#define RECORD_EQ_OP 2988+DATA(insert OID = 2989 ( "<>" PGNSP PGUID b f f 2249 2249 16 2989 2988 record_ne neqsel neqjoinsel ));+DESCR("not equal");+DATA(insert OID = 2990 ( "<" PGNSP PGUID b f f 2249 2249 16 2991 2993 record_lt scalarltsel scalarltjoinsel ));+DESCR("less than");+#define RECORD_LT_OP 2990+DATA(insert OID = 2991 ( ">" PGNSP PGUID b f f 2249 2249 16 2990 2992 record_gt scalargtsel scalargtjoinsel ));+DESCR("greater than");+#define RECORD_GT_OP 2991+DATA(insert OID = 2992 ( "<=" PGNSP PGUID b f f 2249 2249 16 2993 2991 record_le scalarltsel scalarltjoinsel ));+DESCR("less than or equal");+DATA(insert OID = 2993 ( ">=" PGNSP PGUID b f f 2249 2249 16 2992 2990 record_ge scalargtsel scalargtjoinsel ));+DESCR("greater than or equal");++/* byte-oriented tests for identical rows and fast sorting */+DATA(insert OID = 3188 ( "*=" PGNSP PGUID b t f 2249 2249 16 3188 3189 record_image_eq eqsel eqjoinsel ));+DESCR("identical");+DATA(insert OID = 3189 ( "*<>" PGNSP PGUID b f f 2249 2249 16 3189 3188 record_image_ne neqsel neqjoinsel ));+DESCR("not identical");+DATA(insert OID = 3190 ( "*<" PGNSP PGUID b f f 2249 2249 16 3191 3193 record_image_lt scalarltsel scalarltjoinsel ));+DESCR("less than");+DATA(insert OID = 3191 ( "*>" PGNSP PGUID b f f 2249 2249 16 3190 3192 record_image_gt scalargtsel scalargtjoinsel ));+DESCR("greater than");+DATA(insert OID = 3192 ( "*<=" PGNSP PGUID b f f 2249 2249 16 3193 3191 record_image_le scalarltsel scalarltjoinsel ));+DESCR("less than or equal");+DATA(insert OID = 3193 ( "*>=" PGNSP PGUID b f f 2249 2249 16 3192 3190 record_image_ge scalargtsel scalargtjoinsel ));+DESCR("greater than or equal");++/* generic range type operators */+DATA(insert OID = 3882 ( "=" PGNSP PGUID b t t 3831 3831 16 3882 3883 range_eq eqsel eqjoinsel ));+DESCR("equal");+DATA(insert OID = 3883 ( "<>" PGNSP PGUID b f f 3831 3831 16 3883 3882 range_ne neqsel neqjoinsel ));+DESCR("not equal");+DATA(insert OID = 3884 ( "<" PGNSP PGUID b f f 3831 3831 16 3887 3886 range_lt rangesel scalarltjoinsel ));+DESCR("less than");+#define OID_RANGE_LESS_OP 3884+DATA(insert OID = 3885 ( "<=" PGNSP PGUID b f f 3831 3831 16 3886 3887 range_le rangesel scalarltjoinsel ));+DESCR("less than or equal");+#define OID_RANGE_LESS_EQUAL_OP 3885+DATA(insert OID = 3886 ( ">=" PGNSP PGUID b f f 3831 3831 16 3885 3884 range_ge rangesel scalargtjoinsel ));+DESCR("greater than or equal");+#define OID_RANGE_GREATER_EQUAL_OP 3886+DATA(insert OID = 3887 ( ">" PGNSP PGUID b f f 3831 3831 16 3884 3885 range_gt rangesel scalargtjoinsel ));+DESCR("greater than");+#define OID_RANGE_GREATER_OP 3887+DATA(insert OID = 3888 ( "&&" PGNSP PGUID b f f 3831 3831 16 3888 0 range_overlaps rangesel areajoinsel ));+DESCR("overlaps");+#define OID_RANGE_OVERLAP_OP 3888+DATA(insert OID = 3889 ( "@>" PGNSP PGUID b f f 3831 2283 16 3891 0 range_contains_elem rangesel contjoinsel ));+DESCR("contains");+#define OID_RANGE_CONTAINS_ELEM_OP 3889+DATA(insert OID = 3890 ( "@>" PGNSP PGUID b f f 3831 3831 16 3892 0 range_contains rangesel contjoinsel ));+DESCR("contains");+#define OID_RANGE_CONTAINS_OP 3890+DATA(insert OID = 3891 ( "<@" PGNSP PGUID b f f 2283 3831 16 3889 0 elem_contained_by_range rangesel contjoinsel ));+DESCR("is contained by");+#define OID_RANGE_ELEM_CONTAINED_OP 3891+DATA(insert OID = 3892 ( "<@" PGNSP PGUID b f f 3831 3831 16 3890 0 range_contained_by rangesel contjoinsel ));+DESCR("is contained by");+#define OID_RANGE_CONTAINED_OP 3892+DATA(insert OID = 3893 ( "<<" PGNSP PGUID b f f 3831 3831 16 3894 0 range_before rangesel scalarltjoinsel ));+DESCR("is left of");+#define OID_RANGE_LEFT_OP 3893+DATA(insert OID = 3894 ( ">>" PGNSP PGUID b f f 3831 3831 16 3893 0 range_after rangesel scalargtjoinsel ));+DESCR("is right of");+#define OID_RANGE_RIGHT_OP 3894+DATA(insert OID = 3895 ( "&<" PGNSP PGUID b f f 3831 3831 16 0 0 range_overleft rangesel scalarltjoinsel ));+DESCR("overlaps or is left of");+#define OID_RANGE_OVERLAPS_LEFT_OP 3895+DATA(insert OID = 3896 ( "&>" PGNSP PGUID b f f 3831 3831 16 0 0 range_overright rangesel scalargtjoinsel ));+DESCR("overlaps or is right of");+#define OID_RANGE_OVERLAPS_RIGHT_OP 3896+DATA(insert OID = 3897 ( "-|-" PGNSP PGUID b f f 3831 3831 16 3897 0 range_adjacent contsel contjoinsel ));+DESCR("is adjacent to");+DATA(insert OID = 3898 ( "+" PGNSP PGUID b f f 3831 3831 3831 3898 0 range_union - - ));+DESCR("range union");+DATA(insert OID = 3899 ( "-" PGNSP PGUID b f f 3831 3831 3831 0 0 range_minus - - ));+DESCR("range difference");+DATA(insert OID = 3900 ( "*" PGNSP PGUID b f f 3831 3831 3831 3900 0 range_intersect - - ));+DESCR("range intersection");+DATA(insert OID = 3962 ( "->" PGNSP PGUID b f f 114 25 114 0 0 json_object_field - - ));+DESCR("get json object field");+DATA(insert OID = 3963 ( "->>" PGNSP PGUID b f f 114 25 25 0 0 json_object_field_text - - ));+DESCR("get json object field as text");+DATA(insert OID = 3964 ( "->" PGNSP PGUID b f f 114 23 114 0 0 json_array_element - - ));+DESCR("get json array element");+DATA(insert OID = 3965 ( "->>" PGNSP PGUID b f f 114 23 25 0 0 json_array_element_text - - ));+DESCR("get json array element as text");+DATA(insert OID = 3966 ( "#>" PGNSP PGUID b f f 114 1009 114 0 0 json_extract_path - - ));+DESCR("get value from json with path elements");+DATA(insert OID = 3967 ( "#>>" PGNSP PGUID b f f 114 1009 25 0 0 json_extract_path_text - - ));+DESCR("get value from json as text with path elements");+DATA(insert OID = 3211 ( "->" PGNSP PGUID b f f 3802 25 3802 0 0 jsonb_object_field - - ));+DESCR("get jsonb object field");+DATA(insert OID = 3477 ( "->>" PGNSP PGUID b f f 3802 25 25 0 0 jsonb_object_field_text - - ));+DESCR("get jsonb object field as text");+DATA(insert OID = 3212 ( "->" PGNSP PGUID b f f 3802 23 3802 0 0 jsonb_array_element - - ));+DESCR("get jsonb array element");+DATA(insert OID = 3481 ( "->>" PGNSP PGUID b f f 3802 23 25 0 0 jsonb_array_element_text - - ));+DESCR("get jsonb array element as text");+DATA(insert OID = 3213 ( "#>" PGNSP PGUID b f f 3802 1009 3802 0 0 jsonb_extract_path - - ));+DESCR("get value from jsonb with path elements");+DATA(insert OID = 3206 ( "#>>" PGNSP PGUID b f f 3802 1009 25 0 0 jsonb_extract_path_text - - ));+DESCR("get value from jsonb as text with path elements");+DATA(insert OID = 3240 ( "=" PGNSP PGUID b t t 3802 3802 16 3240 3241 jsonb_eq eqsel eqjoinsel ));+DESCR("equal");+DATA(insert OID = 3241 ( "<>" PGNSP PGUID b f f 3802 3802 16 3241 3240 jsonb_ne neqsel neqjoinsel ));+DESCR("not equal");+DATA(insert OID = 3242 ( "<" PGNSP PGUID b f f 3802 3802 16 3243 3245 jsonb_lt scalarltsel scalarltjoinsel ));+DESCR("less than");+DATA(insert OID = 3243 ( ">" PGNSP PGUID b f f 3802 3802 16 3242 3244 jsonb_gt scalargtsel scalargtjoinsel ));+DESCR("greater than");+DATA(insert OID = 3244 ( "<=" PGNSP PGUID b f f 3802 3802 16 3245 3243 jsonb_le scalarltsel scalarltjoinsel ));+DESCR("less than or equal");+DATA(insert OID = 3245 ( ">=" PGNSP PGUID b f f 3802 3802 16 3244 3242 jsonb_ge scalargtsel scalargtjoinsel ));+DESCR("greater than or equal");+DATA(insert OID = 3246 ( "@>" PGNSP PGUID b f f 3802 3802 16 3250 0 jsonb_contains contsel contjoinsel ));+DESCR("contains");+DATA(insert OID = 3247 ( "?" PGNSP PGUID b f f 3802 25 16 0 0 jsonb_exists contsel contjoinsel ));+DESCR("key exists");+DATA(insert OID = 3248 ( "?|" PGNSP PGUID b f f 3802 1009 16 0 0 jsonb_exists_any contsel contjoinsel ));+DESCR("any key exists");+DATA(insert OID = 3249 ( "?&" PGNSP PGUID b f f 3802 1009 16 0 0 jsonb_exists_all contsel contjoinsel ));+DESCR("all keys exist");+DATA(insert OID = 3250 ( "<@" PGNSP PGUID b f f 3802 3802 16 3246 0 jsonb_contained contsel contjoinsel ));+DESCR("is contained by");+DATA(insert OID = 3284 ( "||" PGNSP PGUID b f f 3802 3802 3802 0 0 jsonb_concat - - ));+DESCR("concatenate");+DATA(insert OID = 3285 ( "-" PGNSP PGUID b f f 3802 25 3802 0 0 3302 - - ));+DESCR("delete object field");+DATA(insert OID = 3286 ( "-" PGNSP PGUID b f f 3802 23 3802 0 0 3303 - - ));+DESCR("delete array element");+DATA(insert OID = 3287 ( "#-" PGNSP PGUID b f f 3802 1009 3802 0 0 jsonb_delete_path - - ));+DESCR("delete path");++#endif /* PG_OPERATOR_H */
+ foreign/libpg_query/src/postgres/include/catalog/pg_opfamily.h view
@@ -0,0 +1,186 @@+/*-------------------------------------------------------------------------+ *+ * pg_opfamily.h+ * definition of the system "opfamily" relation (pg_opfamily)+ * along with the relation's initial contents.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/catalog/pg_opfamily.h+ *+ * NOTES+ * the genbki.pl script reads this file and generates .bki+ * information from the DATA() statements.+ *+ *-------------------------------------------------------------------------+ */+#ifndef PG_OPFAMILY_H+#define PG_OPFAMILY_H++#include "catalog/genbki.h"++/* ----------------+ * pg_opfamily definition. cpp turns this into+ * typedef struct FormData_pg_opfamily+ * ----------------+ */+#define OperatorFamilyRelationId 2753++CATALOG(pg_opfamily,2753)+{+ Oid opfmethod; /* index access method opfamily is for */+ NameData opfname; /* name of this opfamily */+ Oid opfnamespace; /* namespace of this opfamily */+ Oid opfowner; /* opfamily owner */+} FormData_pg_opfamily;++/* ----------------+ * Form_pg_opfamily corresponds to a pointer to a tuple with+ * the format of pg_opfamily relation.+ * ----------------+ */+typedef FormData_pg_opfamily *Form_pg_opfamily;++/* ----------------+ * compiler constants for pg_opfamily+ * ----------------+ */+#define Natts_pg_opfamily 4+#define Anum_pg_opfamily_opfmethod 1+#define Anum_pg_opfamily_opfname 2+#define Anum_pg_opfamily_opfnamespace 3+#define Anum_pg_opfamily_opfowner 4++/* ----------------+ * initial contents of pg_opfamily+ * ----------------+ */++DATA(insert OID = 421 ( 403 abstime_ops PGNSP PGUID ));+DATA(insert OID = 397 ( 403 array_ops PGNSP PGUID ));+DATA(insert OID = 627 ( 405 array_ops PGNSP PGUID ));+DATA(insert OID = 423 ( 403 bit_ops PGNSP PGUID ));+DATA(insert OID = 424 ( 403 bool_ops PGNSP PGUID ));+#define BOOL_BTREE_FAM_OID 424+DATA(insert OID = 426 ( 403 bpchar_ops PGNSP PGUID ));+#define BPCHAR_BTREE_FAM_OID 426+DATA(insert OID = 427 ( 405 bpchar_ops PGNSP PGUID ));+DATA(insert OID = 428 ( 403 bytea_ops PGNSP PGUID ));+#define BYTEA_BTREE_FAM_OID 428+DATA(insert OID = 429 ( 403 char_ops PGNSP PGUID ));+DATA(insert OID = 431 ( 405 char_ops PGNSP PGUID ));+DATA(insert OID = 434 ( 403 datetime_ops PGNSP PGUID ));+DATA(insert OID = 435 ( 405 date_ops PGNSP PGUID ));+DATA(insert OID = 1970 ( 403 float_ops PGNSP PGUID ));+DATA(insert OID = 1971 ( 405 float_ops PGNSP PGUID ));+DATA(insert OID = 1974 ( 403 network_ops PGNSP PGUID ));+#define NETWORK_BTREE_FAM_OID 1974+DATA(insert OID = 1975 ( 405 network_ops PGNSP PGUID ));+DATA(insert OID = 3550 ( 783 network_ops PGNSP PGUID ));+DATA(insert OID = 1976 ( 403 integer_ops PGNSP PGUID ));+#define INTEGER_BTREE_FAM_OID 1976+DATA(insert OID = 1977 ( 405 integer_ops PGNSP PGUID ));+DATA(insert OID = 1982 ( 403 interval_ops PGNSP PGUID ));+DATA(insert OID = 1983 ( 405 interval_ops PGNSP PGUID ));+DATA(insert OID = 1984 ( 403 macaddr_ops PGNSP PGUID ));+DATA(insert OID = 1985 ( 405 macaddr_ops PGNSP PGUID ));+DATA(insert OID = 1986 ( 403 name_ops PGNSP PGUID ));+#define NAME_BTREE_FAM_OID 1986+DATA(insert OID = 1987 ( 405 name_ops PGNSP PGUID ));+DATA(insert OID = 1988 ( 403 numeric_ops PGNSP PGUID ));+DATA(insert OID = 1998 ( 405 numeric_ops PGNSP PGUID ));+DATA(insert OID = 1989 ( 403 oid_ops PGNSP PGUID ));+#define OID_BTREE_FAM_OID 1989+DATA(insert OID = 1990 ( 405 oid_ops PGNSP PGUID ));+DATA(insert OID = 1991 ( 403 oidvector_ops PGNSP PGUID ));+DATA(insert OID = 1992 ( 405 oidvector_ops PGNSP PGUID ));+DATA(insert OID = 2994 ( 403 record_ops PGNSP PGUID ));+DATA(insert OID = 3194 ( 403 record_image_ops PGNSP PGUID ));+DATA(insert OID = 1994 ( 403 text_ops PGNSP PGUID ));+#define TEXT_BTREE_FAM_OID 1994+DATA(insert OID = 1995 ( 405 text_ops PGNSP PGUID ));+DATA(insert OID = 1996 ( 403 time_ops PGNSP PGUID ));+DATA(insert OID = 1997 ( 405 time_ops PGNSP PGUID ));+DATA(insert OID = 1999 ( 405 timestamptz_ops PGNSP PGUID ));+DATA(insert OID = 2000 ( 403 timetz_ops PGNSP PGUID ));+DATA(insert OID = 2001 ( 405 timetz_ops PGNSP PGUID ));+DATA(insert OID = 2002 ( 403 varbit_ops PGNSP PGUID ));+DATA(insert OID = 2040 ( 405 timestamp_ops PGNSP PGUID ));+DATA(insert OID = 2095 ( 403 text_pattern_ops PGNSP PGUID ));+#define TEXT_PATTERN_BTREE_FAM_OID 2095+DATA(insert OID = 2097 ( 403 bpchar_pattern_ops PGNSP PGUID ));+#define BPCHAR_PATTERN_BTREE_FAM_OID 2097+DATA(insert OID = 2099 ( 403 money_ops PGNSP PGUID ));+DATA(insert OID = 2222 ( 405 bool_ops PGNSP PGUID ));+#define BOOL_HASH_FAM_OID 2222+DATA(insert OID = 2223 ( 405 bytea_ops PGNSP PGUID ));+DATA(insert OID = 2224 ( 405 int2vector_ops PGNSP PGUID ));+DATA(insert OID = 2789 ( 403 tid_ops PGNSP PGUID ));+DATA(insert OID = 2225 ( 405 xid_ops PGNSP PGUID ));+DATA(insert OID = 2226 ( 405 cid_ops PGNSP PGUID ));+DATA(insert OID = 2227 ( 405 abstime_ops PGNSP PGUID ));+DATA(insert OID = 2228 ( 405 reltime_ops PGNSP PGUID ));+DATA(insert OID = 2229 ( 405 text_pattern_ops PGNSP PGUID ));+DATA(insert OID = 2231 ( 405 bpchar_pattern_ops PGNSP PGUID ));+DATA(insert OID = 2233 ( 403 reltime_ops PGNSP PGUID ));+DATA(insert OID = 2234 ( 403 tinterval_ops PGNSP PGUID ));+DATA(insert OID = 2235 ( 405 aclitem_ops PGNSP PGUID ));+DATA(insert OID = 2593 ( 783 box_ops PGNSP PGUID ));+DATA(insert OID = 2594 ( 783 poly_ops PGNSP PGUID ));+DATA(insert OID = 2595 ( 783 circle_ops PGNSP PGUID ));+DATA(insert OID = 1029 ( 783 point_ops PGNSP PGUID ));+DATA(insert OID = 2745 ( 2742 array_ops PGNSP PGUID ));+DATA(insert OID = 2968 ( 403 uuid_ops PGNSP PGUID ));+DATA(insert OID = 2969 ( 405 uuid_ops PGNSP PGUID ));+DATA(insert OID = 3253 ( 403 pg_lsn_ops PGNSP PGUID ));+DATA(insert OID = 3254 ( 405 pg_lsn_ops PGNSP PGUID ));+DATA(insert OID = 3522 ( 403 enum_ops PGNSP PGUID ));+DATA(insert OID = 3523 ( 405 enum_ops PGNSP PGUID ));+DATA(insert OID = 3626 ( 403 tsvector_ops PGNSP PGUID ));+DATA(insert OID = 3655 ( 783 tsvector_ops PGNSP PGUID ));+DATA(insert OID = 3659 ( 2742 tsvector_ops PGNSP PGUID ));+DATA(insert OID = 3683 ( 403 tsquery_ops PGNSP PGUID ));+DATA(insert OID = 3702 ( 783 tsquery_ops PGNSP PGUID ));+DATA(insert OID = 3901 ( 403 range_ops PGNSP PGUID ));+DATA(insert OID = 3903 ( 405 range_ops PGNSP PGUID ));+DATA(insert OID = 3919 ( 783 range_ops PGNSP PGUID ));+DATA(insert OID = 3474 ( 4000 range_ops PGNSP PGUID ));+DATA(insert OID = 4015 ( 4000 quad_point_ops PGNSP PGUID ));+DATA(insert OID = 4016 ( 4000 kd_point_ops PGNSP PGUID ));+DATA(insert OID = 4017 ( 4000 text_ops PGNSP PGUID ));+#define TEXT_SPGIST_FAM_OID 4017+DATA(insert OID = 4033 ( 403 jsonb_ops PGNSP PGUID ));+DATA(insert OID = 4034 ( 405 jsonb_ops PGNSP PGUID ));+DATA(insert OID = 4035 ( 783 jsonb_ops PGNSP PGUID ));+DATA(insert OID = 4036 ( 2742 jsonb_ops PGNSP PGUID ));+DATA(insert OID = 4037 ( 2742 jsonb_path_ops PGNSP PGUID ));++DATA(insert OID = 4054 ( 3580 integer_minmax_ops PGNSP PGUID ));+DATA(insert OID = 4055 ( 3580 numeric_minmax_ops PGNSP PGUID ));+DATA(insert OID = 4056 ( 3580 text_minmax_ops PGNSP PGUID ));+DATA(insert OID = 4058 ( 3580 timetz_minmax_ops PGNSP PGUID ));+DATA(insert OID = 4059 ( 3580 datetime_minmax_ops PGNSP PGUID ));+DATA(insert OID = 4062 ( 3580 char_minmax_ops PGNSP PGUID ));+DATA(insert OID = 4064 ( 3580 bytea_minmax_ops PGNSP PGUID ));+DATA(insert OID = 4065 ( 3580 name_minmax_ops PGNSP PGUID ));+DATA(insert OID = 4068 ( 3580 oid_minmax_ops PGNSP PGUID ));+DATA(insert OID = 4069 ( 3580 tid_minmax_ops PGNSP PGUID ));+DATA(insert OID = 4070 ( 3580 float_minmax_ops PGNSP PGUID ));+DATA(insert OID = 4072 ( 3580 abstime_minmax_ops PGNSP PGUID ));+DATA(insert OID = 4073 ( 3580 reltime_minmax_ops PGNSP PGUID ));+DATA(insert OID = 4074 ( 3580 macaddr_minmax_ops PGNSP PGUID ));+DATA(insert OID = 4075 ( 3580 network_minmax_ops PGNSP PGUID ));+DATA(insert OID = 4102 ( 3580 network_inclusion_ops PGNSP PGUID ));+DATA(insert OID = 4076 ( 3580 bpchar_minmax_ops PGNSP PGUID ));+DATA(insert OID = 4077 ( 3580 time_minmax_ops PGNSP PGUID ));+DATA(insert OID = 4078 ( 3580 interval_minmax_ops PGNSP PGUID ));+DATA(insert OID = 4079 ( 3580 bit_minmax_ops PGNSP PGUID ));+DATA(insert OID = 4080 ( 3580 varbit_minmax_ops PGNSP PGUID ));+DATA(insert OID = 4081 ( 3580 uuid_minmax_ops PGNSP PGUID ));+DATA(insert OID = 4103 ( 3580 range_inclusion_ops PGNSP PGUID ));+DATA(insert OID = 4082 ( 3580 pg_lsn_minmax_ops PGNSP PGUID ));+DATA(insert OID = 4104 ( 3580 box_inclusion_ops PGNSP PGUID ));++#endif /* PG_OPFAMILY_H */
+ foreign/libpg_query/src/postgres/include/catalog/pg_proc.h view
@@ -0,0 +1,5357 @@+/*-------------------------------------------------------------------------+ *+ * pg_proc.h+ * definition of the system "procedure" relation (pg_proc)+ * along with the relation's initial contents.+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/catalog/pg_proc.h+ *+ * NOTES+ * The script catalog/genbki.pl reads this file and generates .bki+ * information from the DATA() statements. utils/Gen_fmgrtab.pl+ * generates fmgroids.h and fmgrtab.c the same way.+ *+ * XXX do NOT break up DATA() statements into multiple lines!+ * the scripts are not as smart as you might think...+ * XXX (eg. #if 0 #endif won't do what you think)+ *+ *-------------------------------------------------------------------------+ */+#ifndef PG_PROC_H+#define PG_PROC_H++#include "catalog/genbki.h"++/* ----------------+ * pg_proc definition. cpp turns this into+ * typedef struct FormData_pg_proc+ * ----------------+ */+#define ProcedureRelationId 1255+#define ProcedureRelation_Rowtype_Id 81++CATALOG(pg_proc,1255) BKI_BOOTSTRAP BKI_ROWTYPE_OID(81) BKI_SCHEMA_MACRO+{+ NameData proname; /* procedure name */+ Oid pronamespace; /* OID of namespace containing this proc */+ Oid proowner; /* procedure owner */+ Oid prolang; /* OID of pg_language entry */+ float4 procost; /* estimated execution cost */+ float4 prorows; /* estimated # of rows out (if proretset) */+ Oid provariadic; /* element type of variadic array, or 0 */+ regproc protransform; /* transforms calls to it during planning */+ bool proisagg; /* is it an aggregate? */+ bool proiswindow; /* is it a window function? */+ bool prosecdef; /* security definer */+ bool proleakproof; /* is it a leak-proof function? */+ bool proisstrict; /* strict with respect to NULLs? */+ bool proretset; /* returns a set? */+ char provolatile; /* see PROVOLATILE_ categories below */+ int16 pronargs; /* number of arguments */+ int16 pronargdefaults; /* number of arguments with defaults */+ Oid prorettype; /* OID of result type */++ /*+ * variable-length fields start here, but we allow direct access to+ * proargtypes+ */+ oidvector proargtypes; /* parameter types (excludes OUT params) */++#ifdef CATALOG_VARLEN+ Oid proallargtypes[1]; /* all param types (NULL if IN only) */+ char proargmodes[1]; /* parameter modes (NULL if IN only) */+ text proargnames[1]; /* parameter names (NULL if no names) */+ pg_node_tree proargdefaults;/* list of expression trees for argument+ * defaults (NULL if none) */+ Oid protrftypes[1]; /* types for which to apply transforms */+ text prosrc BKI_FORCE_NOT_NULL; /* procedure source text */+ text probin; /* secondary procedure info (can be NULL) */+ text proconfig[1]; /* procedure-local GUC settings */+ aclitem proacl[1]; /* access permissions */+#endif+} FormData_pg_proc;++/* ----------------+ * Form_pg_proc corresponds to a pointer to a tuple with+ * the format of pg_proc relation.+ * ----------------+ */+typedef FormData_pg_proc *Form_pg_proc;++/* ----------------+ * compiler constants for pg_proc+ * ----------------+ */+#define Natts_pg_proc 28+#define Anum_pg_proc_proname 1+#define Anum_pg_proc_pronamespace 2+#define Anum_pg_proc_proowner 3+#define Anum_pg_proc_prolang 4+#define Anum_pg_proc_procost 5+#define Anum_pg_proc_prorows 6+#define Anum_pg_proc_provariadic 7+#define Anum_pg_proc_protransform 8+#define Anum_pg_proc_proisagg 9+#define Anum_pg_proc_proiswindow 10+#define Anum_pg_proc_prosecdef 11+#define Anum_pg_proc_proleakproof 12+#define Anum_pg_proc_proisstrict 13+#define Anum_pg_proc_proretset 14+#define Anum_pg_proc_provolatile 15+#define Anum_pg_proc_pronargs 16+#define Anum_pg_proc_pronargdefaults 17+#define Anum_pg_proc_prorettype 18+#define Anum_pg_proc_proargtypes 19+#define Anum_pg_proc_proallargtypes 20+#define Anum_pg_proc_proargmodes 21+#define Anum_pg_proc_proargnames 22+#define Anum_pg_proc_proargdefaults 23+#define Anum_pg_proc_protrftypes 24+#define Anum_pg_proc_prosrc 25+#define Anum_pg_proc_probin 26+#define Anum_pg_proc_proconfig 27+#define Anum_pg_proc_proacl 28++/* ----------------+ * initial contents of pg_proc+ * ----------------+ */++/*+ * Note: every entry in pg_proc.h is expected to have a DESCR() comment,+ * except for functions that implement pg_operator.h operators and don't+ * have a good reason to be called directly rather than via the operator.+ * (If you do expect such a function to be used directly, you should+ * duplicate the operator's comment.) initdb will supply suitable default+ * comments for functions referenced by pg_operator.+ *+ * Try to follow the style of existing functions' comments.+ * Some recommended conventions:+ * "I/O" for typinput, typoutput, typreceive, typsend functions+ * "I/O typmod" for typmodin, typmodout functions+ * "aggregate transition function" for aggtransfn functions, unless+ * they are reasonably useful in their own right+ * "aggregate final function" for aggfinalfn functions (likewise)+ * "convert srctypename to desttypename" for cast functions+ * "less-equal-greater" for B-tree comparison functions+ */++/* keep the following ordered by OID so that later changes can be made easier */++/* OIDS 1 - 99 */++DATA(insert OID = 1242 ( boolin PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 16 "2275" _null_ _null_ _null_ _null_ _null_ boolin _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 1243 ( boolout PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2275 "16" _null_ _null_ _null_ _null_ _null_ boolout _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 1244 ( byteain PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 17 "2275" _null_ _null_ _null_ _null_ _null_ byteain _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 31 ( byteaout PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2275 "17" _null_ _null_ _null_ _null_ _null_ byteaout _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 1245 ( charin PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 18 "2275" _null_ _null_ _null_ _null_ _null_ charin _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 33 ( charout PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2275 "18" _null_ _null_ _null_ _null_ _null_ charout _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 34 ( namein PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 19 "2275" _null_ _null_ _null_ _null_ _null_ namein _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 35 ( nameout PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2275 "19" _null_ _null_ _null_ _null_ _null_ nameout _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 38 ( int2in PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 21 "2275" _null_ _null_ _null_ _null_ _null_ int2in _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 39 ( int2out PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2275 "21" _null_ _null_ _null_ _null_ _null_ int2out _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 40 ( int2vectorin PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 22 "2275" _null_ _null_ _null_ _null_ _null_ int2vectorin _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 41 ( int2vectorout PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2275 "22" _null_ _null_ _null_ _null_ _null_ int2vectorout _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 42 ( int4in PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 23 "2275" _null_ _null_ _null_ _null_ _null_ int4in _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 43 ( int4out PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2275 "23" _null_ _null_ _null_ _null_ _null_ int4out _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 44 ( regprocin PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 24 "2275" _null_ _null_ _null_ _null_ _null_ regprocin _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 45 ( regprocout PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 2275 "24" _null_ _null_ _null_ _null_ _null_ regprocout _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 3494 ( to_regproc PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 24 "2275" _null_ _null_ _null_ _null_ _null_ to_regproc _null_ _null_ _null_ ));+DESCR("convert proname to regproc");+DATA(insert OID = 3479 ( to_regprocedure PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 2202 "2275" _null_ _null_ _null_ _null_ _null_ to_regprocedure _null_ _null_ _null_ ));+DESCR("convert proname to regprocedure");+DATA(insert OID = 46 ( textin PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 25 "2275" _null_ _null_ _null_ _null_ _null_ textin _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 47 ( textout PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2275 "25" _null_ _null_ _null_ _null_ _null_ textout _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 48 ( tidin PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 27 "2275" _null_ _null_ _null_ _null_ _null_ tidin _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 49 ( tidout PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2275 "27" _null_ _null_ _null_ _null_ _null_ tidout _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 50 ( xidin PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 28 "2275" _null_ _null_ _null_ _null_ _null_ xidin _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 51 ( xidout PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2275 "28" _null_ _null_ _null_ _null_ _null_ xidout _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 52 ( cidin PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 29 "2275" _null_ _null_ _null_ _null_ _null_ cidin _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 53 ( cidout PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2275 "29" _null_ _null_ _null_ _null_ _null_ cidout _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 54 ( oidvectorin PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 30 "2275" _null_ _null_ _null_ _null_ _null_ oidvectorin _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 55 ( oidvectorout PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2275 "30" _null_ _null_ _null_ _null_ _null_ oidvectorout _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 56 ( boollt PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "16 16" _null_ _null_ _null_ _null_ _null_ boollt _null_ _null_ _null_ ));+DATA(insert OID = 57 ( boolgt PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "16 16" _null_ _null_ _null_ _null_ _null_ boolgt _null_ _null_ _null_ ));+DATA(insert OID = 60 ( booleq PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "16 16" _null_ _null_ _null_ _null_ _null_ booleq _null_ _null_ _null_ ));+DATA(insert OID = 61 ( chareq PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "18 18" _null_ _null_ _null_ _null_ _null_ chareq _null_ _null_ _null_ ));+DATA(insert OID = 62 ( nameeq PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "19 19" _null_ _null_ _null_ _null_ _null_ nameeq _null_ _null_ _null_ ));+DATA(insert OID = 63 ( int2eq PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "21 21" _null_ _null_ _null_ _null_ _null_ int2eq _null_ _null_ _null_ ));+DATA(insert OID = 64 ( int2lt PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "21 21" _null_ _null_ _null_ _null_ _null_ int2lt _null_ _null_ _null_ ));+DATA(insert OID = 65 ( int4eq PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "23 23" _null_ _null_ _null_ _null_ _null_ int4eq _null_ _null_ _null_ ));+DATA(insert OID = 66 ( int4lt PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "23 23" _null_ _null_ _null_ _null_ _null_ int4lt _null_ _null_ _null_ ));+DATA(insert OID = 67 ( texteq PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "25 25" _null_ _null_ _null_ _null_ _null_ texteq _null_ _null_ _null_ ));+DATA(insert OID = 68 ( xideq PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "28 28" _null_ _null_ _null_ _null_ _null_ xideq _null_ _null_ _null_ ));+DATA(insert OID = 69 ( cideq PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "29 29" _null_ _null_ _null_ _null_ _null_ cideq _null_ _null_ _null_ ));+DATA(insert OID = 70 ( charne PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "18 18" _null_ _null_ _null_ _null_ _null_ charne _null_ _null_ _null_ ));+DATA(insert OID = 1246 ( charlt PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "18 18" _null_ _null_ _null_ _null_ _null_ charlt _null_ _null_ _null_ ));+DATA(insert OID = 72 ( charle PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "18 18" _null_ _null_ _null_ _null_ _null_ charle _null_ _null_ _null_ ));+DATA(insert OID = 73 ( chargt PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "18 18" _null_ _null_ _null_ _null_ _null_ chargt _null_ _null_ _null_ ));+DATA(insert OID = 74 ( charge PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "18 18" _null_ _null_ _null_ _null_ _null_ charge _null_ _null_ _null_ ));+DATA(insert OID = 77 ( int4 PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 23 "18" _null_ _null_ _null_ _null_ _null_ chartoi4 _null_ _null_ _null_ ));+DESCR("convert char to int4");+DATA(insert OID = 78 ( char PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 18 "23" _null_ _null_ _null_ _null_ _null_ i4tochar _null_ _null_ _null_ ));+DESCR("convert int4 to char");++DATA(insert OID = 79 ( nameregexeq PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "19 25" _null_ _null_ _null_ _null_ _null_ nameregexeq _null_ _null_ _null_ ));+DATA(insert OID = 1252 ( nameregexne PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "19 25" _null_ _null_ _null_ _null_ _null_ nameregexne _null_ _null_ _null_ ));+DATA(insert OID = 1254 ( textregexeq PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "25 25" _null_ _null_ _null_ _null_ _null_ textregexeq _null_ _null_ _null_ ));+DATA(insert OID = 1256 ( textregexne PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "25 25" _null_ _null_ _null_ _null_ _null_ textregexne _null_ _null_ _null_ ));+DATA(insert OID = 1257 ( textlen PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 23 "25" _null_ _null_ _null_ _null_ _null_ textlen _null_ _null_ _null_ ));+DESCR("length");+DATA(insert OID = 1258 ( textcat PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 25 "25 25" _null_ _null_ _null_ _null_ _null_ textcat _null_ _null_ _null_ ));++DATA(insert OID = 84 ( boolne PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "16 16" _null_ _null_ _null_ _null_ _null_ boolne _null_ _null_ _null_ ));+DATA(insert OID = 89 ( version PGNSP PGUID 12 1 0 0 0 f f f f t f s 0 0 25 "" _null_ _null_ _null_ _null_ _null_ pgsql_version _null_ _null_ _null_ ));+DESCR("PostgreSQL version string");++DATA(insert OID = 86 ( pg_ddl_command_in PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 32 "2275" _null_ _null_ _null_ _null_ _null_ pg_ddl_command_in _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 87 ( pg_ddl_command_out PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2275 "32" _null_ _null_ _null_ _null_ _null_ pg_ddl_command_out _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 88 ( pg_ddl_command_recv PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 32 "2281" _null_ _null_ _null_ _null_ _null_ pg_ddl_command_recv _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 90 ( pg_ddl_command_send PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 17 "32" _null_ _null_ _null_ _null_ _null_ pg_ddl_command_send _null_ _null_ _null_ ));+DESCR("I/O");++/* OIDS 100 - 199 */++DATA(insert OID = 101 ( eqsel PGNSP PGUID 12 1 0 0 0 f f f f t f s 4 0 701 "2281 26 2281 23" _null_ _null_ _null_ _null_ _null_ eqsel _null_ _null_ _null_ ));+DESCR("restriction selectivity of = and related operators");+DATA(insert OID = 102 ( neqsel PGNSP PGUID 12 1 0 0 0 f f f f t f s 4 0 701 "2281 26 2281 23" _null_ _null_ _null_ _null_ _null_ neqsel _null_ _null_ _null_ ));+DESCR("restriction selectivity of <> and related operators");+DATA(insert OID = 103 ( scalarltsel PGNSP PGUID 12 1 0 0 0 f f f f t f s 4 0 701 "2281 26 2281 23" _null_ _null_ _null_ _null_ _null_ scalarltsel _null_ _null_ _null_ ));+DESCR("restriction selectivity of < and related operators on scalar datatypes");+DATA(insert OID = 104 ( scalargtsel PGNSP PGUID 12 1 0 0 0 f f f f t f s 4 0 701 "2281 26 2281 23" _null_ _null_ _null_ _null_ _null_ scalargtsel _null_ _null_ _null_ ));+DESCR("restriction selectivity of > and related operators on scalar datatypes");+DATA(insert OID = 105 ( eqjoinsel PGNSP PGUID 12 1 0 0 0 f f f f t f s 5 0 701 "2281 26 2281 21 2281" _null_ _null_ _null_ _null_ _null_ eqjoinsel _null_ _null_ _null_ ));+DESCR("join selectivity of = and related operators");+DATA(insert OID = 106 ( neqjoinsel PGNSP PGUID 12 1 0 0 0 f f f f t f s 5 0 701 "2281 26 2281 21 2281" _null_ _null_ _null_ _null_ _null_ neqjoinsel _null_ _null_ _null_ ));+DESCR("join selectivity of <> and related operators");+DATA(insert OID = 107 ( scalarltjoinsel PGNSP PGUID 12 1 0 0 0 f f f f t f s 5 0 701 "2281 26 2281 21 2281" _null_ _null_ _null_ _null_ _null_ scalarltjoinsel _null_ _null_ _null_ ));+DESCR("join selectivity of < and related operators on scalar datatypes");+DATA(insert OID = 108 ( scalargtjoinsel PGNSP PGUID 12 1 0 0 0 f f f f t f s 5 0 701 "2281 26 2281 21 2281" _null_ _null_ _null_ _null_ _null_ scalargtjoinsel _null_ _null_ _null_ ));+DESCR("join selectivity of > and related operators on scalar datatypes");++DATA(insert OID = 109 ( unknownin PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 705 "2275" _null_ _null_ _null_ _null_ _null_ unknownin _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 110 ( unknownout PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2275 "705" _null_ _null_ _null_ _null_ _null_ unknownout _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 111 ( numeric_fac PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 1700 "20" _null_ _null_ _null_ _null_ _null_ numeric_fac _null_ _null_ _null_ ));++DATA(insert OID = 115 ( box_above_eq PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "603 603" _null_ _null_ _null_ _null_ _null_ box_above_eq _null_ _null_ _null_ ));+DATA(insert OID = 116 ( box_below_eq PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "603 603" _null_ _null_ _null_ _null_ _null_ box_below_eq _null_ _null_ _null_ ));++DATA(insert OID = 117 ( point_in PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 600 "2275" _null_ _null_ _null_ _null_ _null_ point_in _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 118 ( point_out PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2275 "600" _null_ _null_ _null_ _null_ _null_ point_out _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 119 ( lseg_in PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 601 "2275" _null_ _null_ _null_ _null_ _null_ lseg_in _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 120 ( lseg_out PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2275 "601" _null_ _null_ _null_ _null_ _null_ lseg_out _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 121 ( path_in PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 602 "2275" _null_ _null_ _null_ _null_ _null_ path_in _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 122 ( path_out PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2275 "602" _null_ _null_ _null_ _null_ _null_ path_out _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 123 ( box_in PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 603 "2275" _null_ _null_ _null_ _null_ _null_ box_in _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 124 ( box_out PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2275 "603" _null_ _null_ _null_ _null_ _null_ box_out _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 125 ( box_overlap PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "603 603" _null_ _null_ _null_ _null_ _null_ box_overlap _null_ _null_ _null_ ));+DATA(insert OID = 126 ( box_ge PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "603 603" _null_ _null_ _null_ _null_ _null_ box_ge _null_ _null_ _null_ ));+DATA(insert OID = 127 ( box_gt PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "603 603" _null_ _null_ _null_ _null_ _null_ box_gt _null_ _null_ _null_ ));+DATA(insert OID = 128 ( box_eq PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "603 603" _null_ _null_ _null_ _null_ _null_ box_eq _null_ _null_ _null_ ));+DATA(insert OID = 129 ( box_lt PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "603 603" _null_ _null_ _null_ _null_ _null_ box_lt _null_ _null_ _null_ ));+DATA(insert OID = 130 ( box_le PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "603 603" _null_ _null_ _null_ _null_ _null_ box_le _null_ _null_ _null_ ));+DATA(insert OID = 131 ( point_above PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "600 600" _null_ _null_ _null_ _null_ _null_ point_above _null_ _null_ _null_ ));+DATA(insert OID = 132 ( point_left PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "600 600" _null_ _null_ _null_ _null_ _null_ point_left _null_ _null_ _null_ ));+DATA(insert OID = 133 ( point_right PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "600 600" _null_ _null_ _null_ _null_ _null_ point_right _null_ _null_ _null_ ));+DATA(insert OID = 134 ( point_below PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "600 600" _null_ _null_ _null_ _null_ _null_ point_below _null_ _null_ _null_ ));+DATA(insert OID = 135 ( point_eq PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "600 600" _null_ _null_ _null_ _null_ _null_ point_eq _null_ _null_ _null_ ));+DATA(insert OID = 136 ( on_pb PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "600 603" _null_ _null_ _null_ _null_ _null_ on_pb _null_ _null_ _null_ ));+DATA(insert OID = 137 ( on_ppath PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "600 602" _null_ _null_ _null_ _null_ _null_ on_ppath _null_ _null_ _null_ ));+DATA(insert OID = 138 ( box_center PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 600 "603" _null_ _null_ _null_ _null_ _null_ box_center _null_ _null_ _null_ ));+DATA(insert OID = 139 ( areasel PGNSP PGUID 12 1 0 0 0 f f f f t f s 4 0 701 "2281 26 2281 23" _null_ _null_ _null_ _null_ _null_ areasel _null_ _null_ _null_ ));+DESCR("restriction selectivity for area-comparison operators");+DATA(insert OID = 140 ( areajoinsel PGNSP PGUID 12 1 0 0 0 f f f f t f s 5 0 701 "2281 26 2281 21 2281" _null_ _null_ _null_ _null_ _null_ areajoinsel _null_ _null_ _null_ ));+DESCR("join selectivity for area-comparison operators");+DATA(insert OID = 141 ( int4mul PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "23 23" _null_ _null_ _null_ _null_ _null_ int4mul _null_ _null_ _null_ ));+DATA(insert OID = 144 ( int4ne PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "23 23" _null_ _null_ _null_ _null_ _null_ int4ne _null_ _null_ _null_ ));+DATA(insert OID = 145 ( int2ne PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "21 21" _null_ _null_ _null_ _null_ _null_ int2ne _null_ _null_ _null_ ));+DATA(insert OID = 146 ( int2gt PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "21 21" _null_ _null_ _null_ _null_ _null_ int2gt _null_ _null_ _null_ ));+DATA(insert OID = 147 ( int4gt PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "23 23" _null_ _null_ _null_ _null_ _null_ int4gt _null_ _null_ _null_ ));+DATA(insert OID = 148 ( int2le PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "21 21" _null_ _null_ _null_ _null_ _null_ int2le _null_ _null_ _null_ ));+DATA(insert OID = 149 ( int4le PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "23 23" _null_ _null_ _null_ _null_ _null_ int4le _null_ _null_ _null_ ));+DATA(insert OID = 150 ( int4ge PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "23 23" _null_ _null_ _null_ _null_ _null_ int4ge _null_ _null_ _null_ ));+DATA(insert OID = 151 ( int2ge PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "21 21" _null_ _null_ _null_ _null_ _null_ int2ge _null_ _null_ _null_ ));+DATA(insert OID = 152 ( int2mul PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 21 "21 21" _null_ _null_ _null_ _null_ _null_ int2mul _null_ _null_ _null_ ));+DATA(insert OID = 153 ( int2div PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 21 "21 21" _null_ _null_ _null_ _null_ _null_ int2div _null_ _null_ _null_ ));+DATA(insert OID = 154 ( int4div PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "23 23" _null_ _null_ _null_ _null_ _null_ int4div _null_ _null_ _null_ ));+DATA(insert OID = 155 ( int2mod PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 21 "21 21" _null_ _null_ _null_ _null_ _null_ int2mod _null_ _null_ _null_ ));+DATA(insert OID = 156 ( int4mod PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "23 23" _null_ _null_ _null_ _null_ _null_ int4mod _null_ _null_ _null_ ));+DATA(insert OID = 157 ( textne PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "25 25" _null_ _null_ _null_ _null_ _null_ textne _null_ _null_ _null_ ));+DATA(insert OID = 158 ( int24eq PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "21 23" _null_ _null_ _null_ _null_ _null_ int24eq _null_ _null_ _null_ ));+DATA(insert OID = 159 ( int42eq PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "23 21" _null_ _null_ _null_ _null_ _null_ int42eq _null_ _null_ _null_ ));+DATA(insert OID = 160 ( int24lt PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "21 23" _null_ _null_ _null_ _null_ _null_ int24lt _null_ _null_ _null_ ));+DATA(insert OID = 161 ( int42lt PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "23 21" _null_ _null_ _null_ _null_ _null_ int42lt _null_ _null_ _null_ ));+DATA(insert OID = 162 ( int24gt PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "21 23" _null_ _null_ _null_ _null_ _null_ int24gt _null_ _null_ _null_ ));+DATA(insert OID = 163 ( int42gt PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "23 21" _null_ _null_ _null_ _null_ _null_ int42gt _null_ _null_ _null_ ));+DATA(insert OID = 164 ( int24ne PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "21 23" _null_ _null_ _null_ _null_ _null_ int24ne _null_ _null_ _null_ ));+DATA(insert OID = 165 ( int42ne PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "23 21" _null_ _null_ _null_ _null_ _null_ int42ne _null_ _null_ _null_ ));+DATA(insert OID = 166 ( int24le PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "21 23" _null_ _null_ _null_ _null_ _null_ int24le _null_ _null_ _null_ ));+DATA(insert OID = 167 ( int42le PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "23 21" _null_ _null_ _null_ _null_ _null_ int42le _null_ _null_ _null_ ));+DATA(insert OID = 168 ( int24ge PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "21 23" _null_ _null_ _null_ _null_ _null_ int24ge _null_ _null_ _null_ ));+DATA(insert OID = 169 ( int42ge PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "23 21" _null_ _null_ _null_ _null_ _null_ int42ge _null_ _null_ _null_ ));+DATA(insert OID = 170 ( int24mul PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "21 23" _null_ _null_ _null_ _null_ _null_ int24mul _null_ _null_ _null_ ));+DATA(insert OID = 171 ( int42mul PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "23 21" _null_ _null_ _null_ _null_ _null_ int42mul _null_ _null_ _null_ ));+DATA(insert OID = 172 ( int24div PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "21 23" _null_ _null_ _null_ _null_ _null_ int24div _null_ _null_ _null_ ));+DATA(insert OID = 173 ( int42div PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "23 21" _null_ _null_ _null_ _null_ _null_ int42div _null_ _null_ _null_ ));+DATA(insert OID = 176 ( int2pl PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 21 "21 21" _null_ _null_ _null_ _null_ _null_ int2pl _null_ _null_ _null_ ));+DATA(insert OID = 177 ( int4pl PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "23 23" _null_ _null_ _null_ _null_ _null_ int4pl _null_ _null_ _null_ ));+DATA(insert OID = 178 ( int24pl PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "21 23" _null_ _null_ _null_ _null_ _null_ int24pl _null_ _null_ _null_ ));+DATA(insert OID = 179 ( int42pl PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "23 21" _null_ _null_ _null_ _null_ _null_ int42pl _null_ _null_ _null_ ));+DATA(insert OID = 180 ( int2mi PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 21 "21 21" _null_ _null_ _null_ _null_ _null_ int2mi _null_ _null_ _null_ ));+DATA(insert OID = 181 ( int4mi PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "23 23" _null_ _null_ _null_ _null_ _null_ int4mi _null_ _null_ _null_ ));+DATA(insert OID = 182 ( int24mi PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "21 23" _null_ _null_ _null_ _null_ _null_ int24mi _null_ _null_ _null_ ));+DATA(insert OID = 183 ( int42mi PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "23 21" _null_ _null_ _null_ _null_ _null_ int42mi _null_ _null_ _null_ ));+DATA(insert OID = 184 ( oideq PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "26 26" _null_ _null_ _null_ _null_ _null_ oideq _null_ _null_ _null_ ));+DATA(insert OID = 185 ( oidne PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "26 26" _null_ _null_ _null_ _null_ _null_ oidne _null_ _null_ _null_ ));+DATA(insert OID = 186 ( box_same PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "603 603" _null_ _null_ _null_ _null_ _null_ box_same _null_ _null_ _null_ ));+DATA(insert OID = 187 ( box_contain PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "603 603" _null_ _null_ _null_ _null_ _null_ box_contain _null_ _null_ _null_ ));+DATA(insert OID = 188 ( box_left PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "603 603" _null_ _null_ _null_ _null_ _null_ box_left _null_ _null_ _null_ ));+DATA(insert OID = 189 ( box_overleft PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "603 603" _null_ _null_ _null_ _null_ _null_ box_overleft _null_ _null_ _null_ ));+DATA(insert OID = 190 ( box_overright PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "603 603" _null_ _null_ _null_ _null_ _null_ box_overright _null_ _null_ _null_ ));+DATA(insert OID = 191 ( box_right PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "603 603" _null_ _null_ _null_ _null_ _null_ box_right _null_ _null_ _null_ ));+DATA(insert OID = 192 ( box_contained PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "603 603" _null_ _null_ _null_ _null_ _null_ box_contained _null_ _null_ _null_ ));+DATA(insert OID = 193 ( box_contain_pt PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "603 600" _null_ _null_ _null_ _null_ _null_ box_contain_pt _null_ _null_ _null_ ));++DATA(insert OID = 195 ( pg_node_tree_in PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 194 "2275" _null_ _null_ _null_ _null_ _null_ pg_node_tree_in _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 196 ( pg_node_tree_out PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2275 "194" _null_ _null_ _null_ _null_ _null_ pg_node_tree_out _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 197 ( pg_node_tree_recv PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 194 "2281" _null_ _null_ _null_ _null_ _null_ pg_node_tree_recv _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 198 ( pg_node_tree_send PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 17 "194" _null_ _null_ _null_ _null_ _null_ pg_node_tree_send _null_ _null_ _null_ ));+DESCR("I/O");++/* OIDS 200 - 299 */++DATA(insert OID = 200 ( float4in PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 700 "2275" _null_ _null_ _null_ _null_ _null_ float4in _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 201 ( float4out PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2275 "700" _null_ _null_ _null_ _null_ _null_ float4out _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 202 ( float4mul PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 700 "700 700" _null_ _null_ _null_ _null_ _null_ float4mul _null_ _null_ _null_ ));+DATA(insert OID = 203 ( float4div PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 700 "700 700" _null_ _null_ _null_ _null_ _null_ float4div _null_ _null_ _null_ ));+DATA(insert OID = 204 ( float4pl PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 700 "700 700" _null_ _null_ _null_ _null_ _null_ float4pl _null_ _null_ _null_ ));+DATA(insert OID = 205 ( float4mi PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 700 "700 700" _null_ _null_ _null_ _null_ _null_ float4mi _null_ _null_ _null_ ));+DATA(insert OID = 206 ( float4um PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 700 "700" _null_ _null_ _null_ _null_ _null_ float4um _null_ _null_ _null_ ));+DATA(insert OID = 207 ( float4abs PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 700 "700" _null_ _null_ _null_ _null_ _null_ float4abs _null_ _null_ _null_ ));+DATA(insert OID = 208 ( float4_accum PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1022 "1022 700" _null_ _null_ _null_ _null_ _null_ float4_accum _null_ _null_ _null_ ));+DESCR("aggregate transition function");+DATA(insert OID = 209 ( float4larger PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 700 "700 700" _null_ _null_ _null_ _null_ _null_ float4larger _null_ _null_ _null_ ));+DESCR("larger of two");+DATA(insert OID = 211 ( float4smaller PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 700 "700 700" _null_ _null_ _null_ _null_ _null_ float4smaller _null_ _null_ _null_ ));+DESCR("smaller of two");++DATA(insert OID = 212 ( int4um PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 23 "23" _null_ _null_ _null_ _null_ _null_ int4um _null_ _null_ _null_ ));+DATA(insert OID = 213 ( int2um PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 21 "21" _null_ _null_ _null_ _null_ _null_ int2um _null_ _null_ _null_ ));++DATA(insert OID = 214 ( float8in PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 701 "2275" _null_ _null_ _null_ _null_ _null_ float8in _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 215 ( float8out PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2275 "701" _null_ _null_ _null_ _null_ _null_ float8out _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 216 ( float8mul PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 701 "701 701" _null_ _null_ _null_ _null_ _null_ float8mul _null_ _null_ _null_ ));+DATA(insert OID = 217 ( float8div PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 701 "701 701" _null_ _null_ _null_ _null_ _null_ float8div _null_ _null_ _null_ ));+DATA(insert OID = 218 ( float8pl PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 701 "701 701" _null_ _null_ _null_ _null_ _null_ float8pl _null_ _null_ _null_ ));+DATA(insert OID = 219 ( float8mi PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 701 "701 701" _null_ _null_ _null_ _null_ _null_ float8mi _null_ _null_ _null_ ));+DATA(insert OID = 220 ( float8um PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 701 "701" _null_ _null_ _null_ _null_ _null_ float8um _null_ _null_ _null_ ));+DATA(insert OID = 221 ( float8abs PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 701 "701" _null_ _null_ _null_ _null_ _null_ float8abs _null_ _null_ _null_ ));+DATA(insert OID = 222 ( float8_accum PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1022 "1022 701" _null_ _null_ _null_ _null_ _null_ float8_accum _null_ _null_ _null_ ));+DESCR("aggregate transition function");+DATA(insert OID = 223 ( float8larger PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 701 "701 701" _null_ _null_ _null_ _null_ _null_ float8larger _null_ _null_ _null_ ));+DESCR("larger of two");+DATA(insert OID = 224 ( float8smaller PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 701 "701 701" _null_ _null_ _null_ _null_ _null_ float8smaller _null_ _null_ _null_ ));+DESCR("smaller of two");++DATA(insert OID = 225 ( lseg_center PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 600 "601" _null_ _null_ _null_ _null_ _null_ lseg_center _null_ _null_ _null_ ));+DATA(insert OID = 226 ( path_center PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 600 "602" _null_ _null_ _null_ _null_ _null_ path_center _null_ _null_ _null_ ));+DATA(insert OID = 227 ( poly_center PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 600 "604" _null_ _null_ _null_ _null_ _null_ poly_center _null_ _null_ _null_ ));++DATA(insert OID = 228 ( dround PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 701 "701" _null_ _null_ _null_ _null_ _null_ dround _null_ _null_ _null_ ));+DESCR("round to nearest integer");+DATA(insert OID = 229 ( dtrunc PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 701 "701" _null_ _null_ _null_ _null_ _null_ dtrunc _null_ _null_ _null_ ));+DESCR("truncate to integer");+DATA(insert OID = 2308 ( ceil PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 701 "701" _null_ _null_ _null_ _null_ _null_ dceil _null_ _null_ _null_ ));+DESCR("smallest integer >= value");+DATA(insert OID = 2320 ( ceiling PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 701 "701" _null_ _null_ _null_ _null_ _null_ dceil _null_ _null_ _null_ ));+DESCR("smallest integer >= value");+DATA(insert OID = 2309 ( floor PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 701 "701" _null_ _null_ _null_ _null_ _null_ dfloor _null_ _null_ _null_ ));+DESCR("largest integer <= value");+DATA(insert OID = 2310 ( sign PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 701 "701" _null_ _null_ _null_ _null_ _null_ dsign _null_ _null_ _null_ ));+DESCR("sign of value");+DATA(insert OID = 230 ( dsqrt PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 701 "701" _null_ _null_ _null_ _null_ _null_ dsqrt _null_ _null_ _null_ ));+DATA(insert OID = 231 ( dcbrt PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 701 "701" _null_ _null_ _null_ _null_ _null_ dcbrt _null_ _null_ _null_ ));+DATA(insert OID = 232 ( dpow PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 701 "701 701" _null_ _null_ _null_ _null_ _null_ dpow _null_ _null_ _null_ ));+DATA(insert OID = 233 ( dexp PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 701 "701" _null_ _null_ _null_ _null_ _null_ dexp _null_ _null_ _null_ ));+DESCR("natural exponential (e^x)");+DATA(insert OID = 234 ( dlog1 PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 701 "701" _null_ _null_ _null_ _null_ _null_ dlog1 _null_ _null_ _null_ ));+DESCR("natural logarithm");+DATA(insert OID = 235 ( float8 PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 701 "21" _null_ _null_ _null_ _null_ _null_ i2tod _null_ _null_ _null_ ));+DESCR("convert int2 to float8");+DATA(insert OID = 236 ( float4 PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 700 "21" _null_ _null_ _null_ _null_ _null_ i2tof _null_ _null_ _null_ ));+DESCR("convert int2 to float4");+DATA(insert OID = 237 ( int2 PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 21 "701" _null_ _null_ _null_ _null_ _null_ dtoi2 _null_ _null_ _null_ ));+DESCR("convert float8 to int2");+DATA(insert OID = 238 ( int2 PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 21 "700" _null_ _null_ _null_ _null_ _null_ ftoi2 _null_ _null_ _null_ ));+DESCR("convert float4 to int2");+DATA(insert OID = 239 ( line_distance PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 701 "628 628" _null_ _null_ _null_ _null_ _null_ line_distance _null_ _null_ _null_ ));++DATA(insert OID = 240 ( abstimein PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 702 "2275" _null_ _null_ _null_ _null_ _null_ abstimein _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 241 ( abstimeout PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 2275 "702" _null_ _null_ _null_ _null_ _null_ abstimeout _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 242 ( reltimein PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 703 "2275" _null_ _null_ _null_ _null_ _null_ reltimein _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 243 ( reltimeout PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 2275 "703" _null_ _null_ _null_ _null_ _null_ reltimeout _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 244 ( timepl PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 702 "702 703" _null_ _null_ _null_ _null_ _null_ timepl _null_ _null_ _null_ ));+DATA(insert OID = 245 ( timemi PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 702 "702 703" _null_ _null_ _null_ _null_ _null_ timemi _null_ _null_ _null_ ));+DATA(insert OID = 246 ( tintervalin PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 704 "2275" _null_ _null_ _null_ _null_ _null_ tintervalin _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 247 ( tintervalout PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 2275 "704" _null_ _null_ _null_ _null_ _null_ tintervalout _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 248 ( intinterval PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "702 704" _null_ _null_ _null_ _null_ _null_ intinterval _null_ _null_ _null_ ));+DATA(insert OID = 249 ( tintervalrel PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 703 "704" _null_ _null_ _null_ _null_ _null_ tintervalrel _null_ _null_ _null_ ));+DESCR("tinterval to reltime");+DATA(insert OID = 250 ( timenow PGNSP PGUID 12 1 0 0 0 f f f f t f s 0 0 702 "" _null_ _null_ _null_ _null_ _null_ timenow _null_ _null_ _null_ ));+DESCR("current date and time (abstime)");+DATA(insert OID = 251 ( abstimeeq PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "702 702" _null_ _null_ _null_ _null_ _null_ abstimeeq _null_ _null_ _null_ ));+DATA(insert OID = 252 ( abstimene PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "702 702" _null_ _null_ _null_ _null_ _null_ abstimene _null_ _null_ _null_ ));+DATA(insert OID = 253 ( abstimelt PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "702 702" _null_ _null_ _null_ _null_ _null_ abstimelt _null_ _null_ _null_ ));+DATA(insert OID = 254 ( abstimegt PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "702 702" _null_ _null_ _null_ _null_ _null_ abstimegt _null_ _null_ _null_ ));+DATA(insert OID = 255 ( abstimele PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "702 702" _null_ _null_ _null_ _null_ _null_ abstimele _null_ _null_ _null_ ));+DATA(insert OID = 256 ( abstimege PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "702 702" _null_ _null_ _null_ _null_ _null_ abstimege _null_ _null_ _null_ ));+DATA(insert OID = 257 ( reltimeeq PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "703 703" _null_ _null_ _null_ _null_ _null_ reltimeeq _null_ _null_ _null_ ));+DATA(insert OID = 258 ( reltimene PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "703 703" _null_ _null_ _null_ _null_ _null_ reltimene _null_ _null_ _null_ ));+DATA(insert OID = 259 ( reltimelt PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "703 703" _null_ _null_ _null_ _null_ _null_ reltimelt _null_ _null_ _null_ ));+DATA(insert OID = 260 ( reltimegt PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "703 703" _null_ _null_ _null_ _null_ _null_ reltimegt _null_ _null_ _null_ ));+DATA(insert OID = 261 ( reltimele PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "703 703" _null_ _null_ _null_ _null_ _null_ reltimele _null_ _null_ _null_ ));+DATA(insert OID = 262 ( reltimege PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "703 703" _null_ _null_ _null_ _null_ _null_ reltimege _null_ _null_ _null_ ));+DATA(insert OID = 263 ( tintervalsame PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "704 704" _null_ _null_ _null_ _null_ _null_ tintervalsame _null_ _null_ _null_ ));+DATA(insert OID = 264 ( tintervalct PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "704 704" _null_ _null_ _null_ _null_ _null_ tintervalct _null_ _null_ _null_ ));+DATA(insert OID = 265 ( tintervalov PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "704 704" _null_ _null_ _null_ _null_ _null_ tintervalov _null_ _null_ _null_ ));+DATA(insert OID = 266 ( tintervalleneq PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "704 703" _null_ _null_ _null_ _null_ _null_ tintervalleneq _null_ _null_ _null_ ));+DATA(insert OID = 267 ( tintervallenne PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "704 703" _null_ _null_ _null_ _null_ _null_ tintervallenne _null_ _null_ _null_ ));+DATA(insert OID = 268 ( tintervallenlt PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "704 703" _null_ _null_ _null_ _null_ _null_ tintervallenlt _null_ _null_ _null_ ));+DATA(insert OID = 269 ( tintervallengt PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "704 703" _null_ _null_ _null_ _null_ _null_ tintervallengt _null_ _null_ _null_ ));+DATA(insert OID = 270 ( tintervallenle PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "704 703" _null_ _null_ _null_ _null_ _null_ tintervallenle _null_ _null_ _null_ ));+DATA(insert OID = 271 ( tintervallenge PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "704 703" _null_ _null_ _null_ _null_ _null_ tintervallenge _null_ _null_ _null_ ));+DATA(insert OID = 272 ( tintervalstart PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 702 "704" _null_ _null_ _null_ _null_ _null_ tintervalstart _null_ _null_ _null_ ));+DATA(insert OID = 273 ( tintervalend PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 702 "704" _null_ _null_ _null_ _null_ _null_ tintervalend _null_ _null_ _null_ ));+DESCR("end of interval");+DATA(insert OID = 274 ( timeofday PGNSP PGUID 12 1 0 0 0 f f f f t f v 0 0 25 "" _null_ _null_ _null_ _null_ _null_ timeofday _null_ _null_ _null_ ));+DESCR("current date and time - increments during transactions");+DATA(insert OID = 275 ( isfinite PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 16 "702" _null_ _null_ _null_ _null_ _null_ abstime_finite _null_ _null_ _null_ ));+DESCR("finite abstime?");++DATA(insert OID = 277 ( inter_sl PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "601 628" _null_ _null_ _null_ _null_ _null_ inter_sl _null_ _null_ _null_ ));+DATA(insert OID = 278 ( inter_lb PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "628 603" _null_ _null_ _null_ _null_ _null_ inter_lb _null_ _null_ _null_ ));++DATA(insert OID = 279 ( float48mul PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 701 "700 701" _null_ _null_ _null_ _null_ _null_ float48mul _null_ _null_ _null_ ));+DATA(insert OID = 280 ( float48div PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 701 "700 701" _null_ _null_ _null_ _null_ _null_ float48div _null_ _null_ _null_ ));+DATA(insert OID = 281 ( float48pl PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 701 "700 701" _null_ _null_ _null_ _null_ _null_ float48pl _null_ _null_ _null_ ));+DATA(insert OID = 282 ( float48mi PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 701 "700 701" _null_ _null_ _null_ _null_ _null_ float48mi _null_ _null_ _null_ ));+DATA(insert OID = 283 ( float84mul PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 701 "701 700" _null_ _null_ _null_ _null_ _null_ float84mul _null_ _null_ _null_ ));+DATA(insert OID = 284 ( float84div PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 701 "701 700" _null_ _null_ _null_ _null_ _null_ float84div _null_ _null_ _null_ ));+DATA(insert OID = 285 ( float84pl PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 701 "701 700" _null_ _null_ _null_ _null_ _null_ float84pl _null_ _null_ _null_ ));+DATA(insert OID = 286 ( float84mi PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 701 "701 700" _null_ _null_ _null_ _null_ _null_ float84mi _null_ _null_ _null_ ));++DATA(insert OID = 287 ( float4eq PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "700 700" _null_ _null_ _null_ _null_ _null_ float4eq _null_ _null_ _null_ ));+DATA(insert OID = 288 ( float4ne PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "700 700" _null_ _null_ _null_ _null_ _null_ float4ne _null_ _null_ _null_ ));+DATA(insert OID = 289 ( float4lt PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "700 700" _null_ _null_ _null_ _null_ _null_ float4lt _null_ _null_ _null_ ));+DATA(insert OID = 290 ( float4le PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "700 700" _null_ _null_ _null_ _null_ _null_ float4le _null_ _null_ _null_ ));+DATA(insert OID = 291 ( float4gt PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "700 700" _null_ _null_ _null_ _null_ _null_ float4gt _null_ _null_ _null_ ));+DATA(insert OID = 292 ( float4ge PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "700 700" _null_ _null_ _null_ _null_ _null_ float4ge _null_ _null_ _null_ ));++DATA(insert OID = 293 ( float8eq PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "701 701" _null_ _null_ _null_ _null_ _null_ float8eq _null_ _null_ _null_ ));+DATA(insert OID = 294 ( float8ne PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "701 701" _null_ _null_ _null_ _null_ _null_ float8ne _null_ _null_ _null_ ));+DATA(insert OID = 295 ( float8lt PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "701 701" _null_ _null_ _null_ _null_ _null_ float8lt _null_ _null_ _null_ ));+DATA(insert OID = 296 ( float8le PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "701 701" _null_ _null_ _null_ _null_ _null_ float8le _null_ _null_ _null_ ));+DATA(insert OID = 297 ( float8gt PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "701 701" _null_ _null_ _null_ _null_ _null_ float8gt _null_ _null_ _null_ ));+DATA(insert OID = 298 ( float8ge PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "701 701" _null_ _null_ _null_ _null_ _null_ float8ge _null_ _null_ _null_ ));++DATA(insert OID = 299 ( float48eq PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "700 701" _null_ _null_ _null_ _null_ _null_ float48eq _null_ _null_ _null_ ));++/* OIDS 300 - 399 */++DATA(insert OID = 300 ( float48ne PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "700 701" _null_ _null_ _null_ _null_ _null_ float48ne _null_ _null_ _null_ ));+DATA(insert OID = 301 ( float48lt PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "700 701" _null_ _null_ _null_ _null_ _null_ float48lt _null_ _null_ _null_ ));+DATA(insert OID = 302 ( float48le PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "700 701" _null_ _null_ _null_ _null_ _null_ float48le _null_ _null_ _null_ ));+DATA(insert OID = 303 ( float48gt PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "700 701" _null_ _null_ _null_ _null_ _null_ float48gt _null_ _null_ _null_ ));+DATA(insert OID = 304 ( float48ge PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "700 701" _null_ _null_ _null_ _null_ _null_ float48ge _null_ _null_ _null_ ));+DATA(insert OID = 305 ( float84eq PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "701 700" _null_ _null_ _null_ _null_ _null_ float84eq _null_ _null_ _null_ ));+DATA(insert OID = 306 ( float84ne PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "701 700" _null_ _null_ _null_ _null_ _null_ float84ne _null_ _null_ _null_ ));+DATA(insert OID = 307 ( float84lt PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "701 700" _null_ _null_ _null_ _null_ _null_ float84lt _null_ _null_ _null_ ));+DATA(insert OID = 308 ( float84le PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "701 700" _null_ _null_ _null_ _null_ _null_ float84le _null_ _null_ _null_ ));+DATA(insert OID = 309 ( float84gt PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "701 700" _null_ _null_ _null_ _null_ _null_ float84gt _null_ _null_ _null_ ));+DATA(insert OID = 310 ( float84ge PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "701 700" _null_ _null_ _null_ _null_ _null_ float84ge _null_ _null_ _null_ ));+DATA(insert OID = 320 ( width_bucket PGNSP PGUID 12 1 0 0 0 f f f f t f i 4 0 23 "701 701 701 23" _null_ _null_ _null_ _null_ _null_ width_bucket_float8 _null_ _null_ _null_ ));+DESCR("bucket number of operand in equal-width histogram");++DATA(insert OID = 311 ( float8 PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 701 "700" _null_ _null_ _null_ _null_ _null_ ftod _null_ _null_ _null_ ));+DESCR("convert float4 to float8");+DATA(insert OID = 312 ( float4 PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 700 "701" _null_ _null_ _null_ _null_ _null_ dtof _null_ _null_ _null_ ));+DESCR("convert float8 to float4");+DATA(insert OID = 313 ( int4 PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 23 "21" _null_ _null_ _null_ _null_ _null_ i2toi4 _null_ _null_ _null_ ));+DESCR("convert int2 to int4");+DATA(insert OID = 314 ( int2 PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 21 "23" _null_ _null_ _null_ _null_ _null_ i4toi2 _null_ _null_ _null_ ));+DESCR("convert int4 to int2");+DATA(insert OID = 315 ( int2vectoreq PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "22 22" _null_ _null_ _null_ _null_ _null_ int2vectoreq _null_ _null_ _null_ ));+DATA(insert OID = 316 ( float8 PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 701 "23" _null_ _null_ _null_ _null_ _null_ i4tod _null_ _null_ _null_ ));+DESCR("convert int4 to float8");+DATA(insert OID = 317 ( int4 PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 23 "701" _null_ _null_ _null_ _null_ _null_ dtoi4 _null_ _null_ _null_ ));+DESCR("convert float8 to int4");+DATA(insert OID = 318 ( float4 PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 700 "23" _null_ _null_ _null_ _null_ _null_ i4tof _null_ _null_ _null_ ));+DESCR("convert int4 to float4");+DATA(insert OID = 319 ( int4 PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 23 "700" _null_ _null_ _null_ _null_ _null_ ftoi4 _null_ _null_ _null_ ));+DESCR("convert float4 to int4");++DATA(insert OID = 330 ( btgettuple PGNSP PGUID 12 1 0 0 0 f f f f t f v 2 0 16 "2281 2281" _null_ _null_ _null_ _null_ _null_ btgettuple _null_ _null_ _null_ ));+DESCR("btree(internal)");+DATA(insert OID = 636 ( btgetbitmap PGNSP PGUID 12 1 0 0 0 f f f f t f v 2 0 20 "2281 2281" _null_ _null_ _null_ _null_ _null_ btgetbitmap _null_ _null_ _null_ ));+DESCR("btree(internal)");+DATA(insert OID = 331 ( btinsert PGNSP PGUID 12 1 0 0 0 f f f f t f v 6 0 16 "2281 2281 2281 2281 2281 2281" _null_ _null_ _null_ _null_ _null_ btinsert _null_ _null_ _null_ ));+DESCR("btree(internal)");+DATA(insert OID = 333 ( btbeginscan PGNSP PGUID 12 1 0 0 0 f f f f t f v 3 0 2281 "2281 2281 2281" _null_ _null_ _null_ _null_ _null_ btbeginscan _null_ _null_ _null_ ));+DESCR("btree(internal)");+DATA(insert OID = 334 ( btrescan PGNSP PGUID 12 1 0 0 0 f f f f t f v 5 0 2278 "2281 2281 2281 2281 2281" _null_ _null_ _null_ _null_ _null_ btrescan _null_ _null_ _null_ ));+DESCR("btree(internal)");+DATA(insert OID = 335 ( btendscan PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 2278 "2281" _null_ _null_ _null_ _null_ _null_ btendscan _null_ _null_ _null_ ));+DESCR("btree(internal)");+DATA(insert OID = 336 ( btmarkpos PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 2278 "2281" _null_ _null_ _null_ _null_ _null_ btmarkpos _null_ _null_ _null_ ));+DESCR("btree(internal)");+DATA(insert OID = 337 ( btrestrpos PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 2278 "2281" _null_ _null_ _null_ _null_ _null_ btrestrpos _null_ _null_ _null_ ));+DESCR("btree(internal)");+DATA(insert OID = 338 ( btbuild PGNSP PGUID 12 1 0 0 0 f f f f t f v 3 0 2281 "2281 2281 2281" _null_ _null_ _null_ _null_ _null_ btbuild _null_ _null_ _null_ ));+DESCR("btree(internal)");+DATA(insert OID = 328 ( btbuildempty PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 2278 "2281" _null_ _null_ _null_ _null_ _null_ btbuildempty _null_ _null_ _null_ ));+DESCR("btree(internal)");+DATA(insert OID = 332 ( btbulkdelete PGNSP PGUID 12 1 0 0 0 f f f f t f v 4 0 2281 "2281 2281 2281 2281" _null_ _null_ _null_ _null_ _null_ btbulkdelete _null_ _null_ _null_ ));+DESCR("btree(internal)");+DATA(insert OID = 972 ( btvacuumcleanup PGNSP PGUID 12 1 0 0 0 f f f f t f v 2 0 2281 "2281 2281" _null_ _null_ _null_ _null_ _null_ btvacuumcleanup _null_ _null_ _null_ ));+DESCR("btree(internal)");+DATA(insert OID = 276 ( btcanreturn PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 16 "2281 23" _null_ _null_ _null_ _null_ _null_ btcanreturn _null_ _null_ _null_ ));+DESCR("btree(internal)");+DATA(insert OID = 1268 ( btcostestimate PGNSP PGUID 12 1 0 0 0 f f f f t f v 7 0 2278 "2281 2281 2281 2281 2281 2281 2281" _null_ _null_ _null_ _null_ _null_ btcostestimate _null_ _null_ _null_ ));+DESCR("btree(internal)");+DATA(insert OID = 2785 ( btoptions PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 17 "1009 16" _null_ _null_ _null_ _null_ _null_ btoptions _null_ _null_ _null_ ));+DESCR("btree(internal)");++DATA(insert OID = 3789 ( bringetbitmap PGNSP PGUID 12 1 0 0 0 f f f f t f v 2 0 20 "2281 2281" _null_ _null_ _null_ _null_ _null_ bringetbitmap _null_ _null_ _null_ ));+DESCR("brin(internal)");+DATA(insert OID = 3790 ( brininsert PGNSP PGUID 12 1 0 0 0 f f f f t f v 6 0 16 "2281 2281 2281 2281 2281 2281" _null_ _null_ _null_ _null_ _null_ brininsert _null_ _null_ _null_ ));+DESCR("brin(internal)");+DATA(insert OID = 3791 ( brinbeginscan PGNSP PGUID 12 1 0 0 0 f f f f t f v 3 0 2281 "2281 2281 2281" _null_ _null_ _null_ _null_ _null_ brinbeginscan _null_ _null_ _null_ ));+DESCR("brin(internal)");+DATA(insert OID = 3792 ( brinrescan PGNSP PGUID 12 1 0 0 0 f f f f t f v 5 0 2278 "2281 2281 2281 2281 2281" _null_ _null_ _null_ _null_ _null_ brinrescan _null_ _null_ _null_ ));+DESCR("brin(internal)");+DATA(insert OID = 3793 ( brinendscan PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 2278 "2281" _null_ _null_ _null_ _null_ _null_ brinendscan _null_ _null_ _null_ ));+DESCR("brin(internal)");+DATA(insert OID = 3794 ( brinmarkpos PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 2278 "2281" _null_ _null_ _null_ _null_ _null_ brinmarkpos _null_ _null_ _null_ ));+DESCR("brin(internal)");+DATA(insert OID = 3795 ( brinrestrpos PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 2278 "2281" _null_ _null_ _null_ _null_ _null_ brinrestrpos _null_ _null_ _null_ ));+DESCR("brin(internal)");+DATA(insert OID = 3796 ( brinbuild PGNSP PGUID 12 1 0 0 0 f f f f t f v 3 0 2281 "2281 2281 2281" _null_ _null_ _null_ _null_ _null_ brinbuild _null_ _null_ _null_ ));+DESCR("brin(internal)");+DATA(insert OID = 3797 ( brinbuildempty PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 2278 "2281" _null_ _null_ _null_ _null_ _null_ brinbuildempty _null_ _null_ _null_ ));+DESCR("brin(internal)");+DATA(insert OID = 3798 ( brinbulkdelete PGNSP PGUID 12 1 0 0 0 f f f f t f v 4 0 2281 "2281 2281 2281 2281" _null_ _null_ _null_ _null_ _null_ brinbulkdelete _null_ _null_ _null_ ));+DESCR("brin(internal)");+DATA(insert OID = 3799 ( brinvacuumcleanup PGNSP PGUID 12 1 0 0 0 f f f f t f v 2 0 2281 "2281 2281" _null_ _null_ _null_ _null_ _null_ brinvacuumcleanup _null_ _null_ _null_ ));+DESCR("brin(internal)");+DATA(insert OID = 3800 ( brincostestimate PGNSP PGUID 12 1 0 0 0 f f f f t f v 7 0 2278 "2281 2281 2281 2281 2281 2281 2281" _null_ _null_ _null_ _null_ _null_ brincostestimate _null_ _null_ _null_ ));+DESCR("brin(internal)");+DATA(insert OID = 3801 ( brinoptions PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 17 "1009 16" _null_ _null_ _null_ _null_ _null_ brinoptions _null_ _null_ _null_ ));+DESCR("brin(internal)");+DATA(insert OID = 3952 ( brin_summarize_new_values PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 23 "2205" _null_ _null_ _null_ _null_ _null_ brin_summarize_new_values _null_ _null_ _null_ ));+DESCR("brin: standalone scan new table pages");++DATA(insert OID = 339 ( poly_same PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "604 604" _null_ _null_ _null_ _null_ _null_ poly_same _null_ _null_ _null_ ));+DATA(insert OID = 340 ( poly_contain PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "604 604" _null_ _null_ _null_ _null_ _null_ poly_contain _null_ _null_ _null_ ));+DATA(insert OID = 341 ( poly_left PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "604 604" _null_ _null_ _null_ _null_ _null_ poly_left _null_ _null_ _null_ ));+DATA(insert OID = 342 ( poly_overleft PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "604 604" _null_ _null_ _null_ _null_ _null_ poly_overleft _null_ _null_ _null_ ));+DATA(insert OID = 343 ( poly_overright PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "604 604" _null_ _null_ _null_ _null_ _null_ poly_overright _null_ _null_ _null_ ));+DATA(insert OID = 344 ( poly_right PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "604 604" _null_ _null_ _null_ _null_ _null_ poly_right _null_ _null_ _null_ ));+DATA(insert OID = 345 ( poly_contained PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "604 604" _null_ _null_ _null_ _null_ _null_ poly_contained _null_ _null_ _null_ ));+DATA(insert OID = 346 ( poly_overlap PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "604 604" _null_ _null_ _null_ _null_ _null_ poly_overlap _null_ _null_ _null_ ));+DATA(insert OID = 347 ( poly_in PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 604 "2275" _null_ _null_ _null_ _null_ _null_ poly_in _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 348 ( poly_out PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2275 "604" _null_ _null_ _null_ _null_ _null_ poly_out _null_ _null_ _null_ ));+DESCR("I/O");++DATA(insert OID = 350 ( btint2cmp PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "21 21" _null_ _null_ _null_ _null_ _null_ btint2cmp _null_ _null_ _null_ ));+DESCR("less-equal-greater");+DATA(insert OID = 3129 ( btint2sortsupport PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2278 "2281" _null_ _null_ _null_ _null_ _null_ btint2sortsupport _null_ _null_ _null_ ));+DESCR("sort support");+DATA(insert OID = 351 ( btint4cmp PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "23 23" _null_ _null_ _null_ _null_ _null_ btint4cmp _null_ _null_ _null_ ));+DESCR("less-equal-greater");+DATA(insert OID = 3130 ( btint4sortsupport PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2278 "2281" _null_ _null_ _null_ _null_ _null_ btint4sortsupport _null_ _null_ _null_ ));+DESCR("sort support");+DATA(insert OID = 842 ( btint8cmp PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "20 20" _null_ _null_ _null_ _null_ _null_ btint8cmp _null_ _null_ _null_ ));+DESCR("less-equal-greater");+DATA(insert OID = 3131 ( btint8sortsupport PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2278 "2281" _null_ _null_ _null_ _null_ _null_ btint8sortsupport _null_ _null_ _null_ ));+DESCR("sort support");+DATA(insert OID = 354 ( btfloat4cmp PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "700 700" _null_ _null_ _null_ _null_ _null_ btfloat4cmp _null_ _null_ _null_ ));+DESCR("less-equal-greater");+DATA(insert OID = 3132 ( btfloat4sortsupport PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2278 "2281" _null_ _null_ _null_ _null_ _null_ btfloat4sortsupport _null_ _null_ _null_ ));+DESCR("sort support");+DATA(insert OID = 355 ( btfloat8cmp PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "701 701" _null_ _null_ _null_ _null_ _null_ btfloat8cmp _null_ _null_ _null_ ));+DESCR("less-equal-greater");+DATA(insert OID = 3133 ( btfloat8sortsupport PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2278 "2281" _null_ _null_ _null_ _null_ _null_ btfloat8sortsupport _null_ _null_ _null_ ));+DESCR("sort support");+DATA(insert OID = 356 ( btoidcmp PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "26 26" _null_ _null_ _null_ _null_ _null_ btoidcmp _null_ _null_ _null_ ));+DESCR("less-equal-greater");+DATA(insert OID = 3134 ( btoidsortsupport PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2278 "2281" _null_ _null_ _null_ _null_ _null_ btoidsortsupport _null_ _null_ _null_ ));+DESCR("sort support");+DATA(insert OID = 404 ( btoidvectorcmp PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "30 30" _null_ _null_ _null_ _null_ _null_ btoidvectorcmp _null_ _null_ _null_ ));+DESCR("less-equal-greater");+DATA(insert OID = 357 ( btabstimecmp PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "702 702" _null_ _null_ _null_ _null_ _null_ btabstimecmp _null_ _null_ _null_ ));+DESCR("less-equal-greater");+DATA(insert OID = 358 ( btcharcmp PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "18 18" _null_ _null_ _null_ _null_ _null_ btcharcmp _null_ _null_ _null_ ));+DESCR("less-equal-greater");+DATA(insert OID = 359 ( btnamecmp PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "19 19" _null_ _null_ _null_ _null_ _null_ btnamecmp _null_ _null_ _null_ ));+DESCR("less-equal-greater");+DATA(insert OID = 3135 ( btnamesortsupport PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2278 "2281" _null_ _null_ _null_ _null_ _null_ btnamesortsupport _null_ _null_ _null_ ));+DESCR("sort support");+DATA(insert OID = 360 ( bttextcmp PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "25 25" _null_ _null_ _null_ _null_ _null_ bttextcmp _null_ _null_ _null_ ));+DESCR("less-equal-greater");+DATA(insert OID = 3255 ( bttextsortsupport PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2278 "2281" _null_ _null_ _null_ _null_ _null_ bttextsortsupport _null_ _null_ _null_ ));+DESCR("sort support");+DATA(insert OID = 377 ( cash_cmp PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "790 790" _null_ _null_ _null_ _null_ _null_ cash_cmp _null_ _null_ _null_ ));+DESCR("less-equal-greater");+DATA(insert OID = 380 ( btreltimecmp PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "703 703" _null_ _null_ _null_ _null_ _null_ btreltimecmp _null_ _null_ _null_ ));+DESCR("less-equal-greater");+DATA(insert OID = 381 ( bttintervalcmp PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "704 704" _null_ _null_ _null_ _null_ _null_ bttintervalcmp _null_ _null_ _null_ ));+DESCR("less-equal-greater");+DATA(insert OID = 382 ( btarraycmp PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "2277 2277" _null_ _null_ _null_ _null_ _null_ btarraycmp _null_ _null_ _null_ ));+DESCR("less-equal-greater");++DATA(insert OID = 361 ( lseg_distance PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 701 "601 601" _null_ _null_ _null_ _null_ _null_ lseg_distance _null_ _null_ _null_ ));+DATA(insert OID = 362 ( lseg_interpt PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 600 "601 601" _null_ _null_ _null_ _null_ _null_ lseg_interpt _null_ _null_ _null_ ));+DATA(insert OID = 363 ( dist_ps PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 701 "600 601" _null_ _null_ _null_ _null_ _null_ dist_ps _null_ _null_ _null_ ));+DATA(insert OID = 364 ( dist_pb PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 701 "600 603" _null_ _null_ _null_ _null_ _null_ dist_pb _null_ _null_ _null_ ));+DATA(insert OID = 365 ( dist_sb PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 701 "601 603" _null_ _null_ _null_ _null_ _null_ dist_sb _null_ _null_ _null_ ));+DATA(insert OID = 366 ( close_ps PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 600 "600 601" _null_ _null_ _null_ _null_ _null_ close_ps _null_ _null_ _null_ ));+DATA(insert OID = 367 ( close_pb PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 600 "600 603" _null_ _null_ _null_ _null_ _null_ close_pb _null_ _null_ _null_ ));+DATA(insert OID = 368 ( close_sb PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 600 "601 603" _null_ _null_ _null_ _null_ _null_ close_sb _null_ _null_ _null_ ));+DATA(insert OID = 369 ( on_ps PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "600 601" _null_ _null_ _null_ _null_ _null_ on_ps _null_ _null_ _null_ ));+DATA(insert OID = 370 ( path_distance PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 701 "602 602" _null_ _null_ _null_ _null_ _null_ path_distance _null_ _null_ _null_ ));+DATA(insert OID = 371 ( dist_ppath PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 701 "600 602" _null_ _null_ _null_ _null_ _null_ dist_ppath _null_ _null_ _null_ ));+DATA(insert OID = 372 ( on_sb PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "601 603" _null_ _null_ _null_ _null_ _null_ on_sb _null_ _null_ _null_ ));+DATA(insert OID = 373 ( inter_sb PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "601 603" _null_ _null_ _null_ _null_ _null_ inter_sb _null_ _null_ _null_ ));++/* OIDS 400 - 499 */++DATA(insert OID = 401 ( text PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 25 "1042" _null_ _null_ _null_ _null_ _null_ rtrim1 _null_ _null_ _null_ ));+DESCR("convert char(n) to text");+DATA(insert OID = 406 ( text PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 25 "19" _null_ _null_ _null_ _null_ _null_ name_text _null_ _null_ _null_ ));+DESCR("convert name to text");+DATA(insert OID = 407 ( name PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 19 "25" _null_ _null_ _null_ _null_ _null_ text_name _null_ _null_ _null_ ));+DESCR("convert text to name");+DATA(insert OID = 408 ( bpchar PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 1042 "19" _null_ _null_ _null_ _null_ _null_ name_bpchar _null_ _null_ _null_ ));+DESCR("convert name to char(n)");+DATA(insert OID = 409 ( name PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 19 "1042" _null_ _null_ _null_ _null_ _null_ bpchar_name _null_ _null_ _null_ ));+DESCR("convert char(n) to name");++DATA(insert OID = 440 ( hashgettuple PGNSP PGUID 12 1 0 0 0 f f f f t f v 2 0 16 "2281 2281" _null_ _null_ _null_ _null_ _null_ hashgettuple _null_ _null_ _null_ ));+DESCR("hash(internal)");+DATA(insert OID = 637 ( hashgetbitmap PGNSP PGUID 12 1 0 0 0 f f f f t f v 2 0 20 "2281 2281" _null_ _null_ _null_ _null_ _null_ hashgetbitmap _null_ _null_ _null_ ));+DESCR("hash(internal)");+DATA(insert OID = 441 ( hashinsert PGNSP PGUID 12 1 0 0 0 f f f f t f v 6 0 16 "2281 2281 2281 2281 2281 2281" _null_ _null_ _null_ _null_ _null_ hashinsert _null_ _null_ _null_ ));+DESCR("hash(internal)");+DATA(insert OID = 443 ( hashbeginscan PGNSP PGUID 12 1 0 0 0 f f f f t f v 3 0 2281 "2281 2281 2281" _null_ _null_ _null_ _null_ _null_ hashbeginscan _null_ _null_ _null_ ));+DESCR("hash(internal)");+DATA(insert OID = 444 ( hashrescan PGNSP PGUID 12 1 0 0 0 f f f f t f v 5 0 2278 "2281 2281 2281 2281 2281" _null_ _null_ _null_ _null_ _null_ hashrescan _null_ _null_ _null_ ));+DESCR("hash(internal)");+DATA(insert OID = 445 ( hashendscan PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 2278 "2281" _null_ _null_ _null_ _null_ _null_ hashendscan _null_ _null_ _null_ ));+DESCR("hash(internal)");+DATA(insert OID = 446 ( hashmarkpos PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 2278 "2281" _null_ _null_ _null_ _null_ _null_ hashmarkpos _null_ _null_ _null_ ));+DESCR("hash(internal)");+DATA(insert OID = 447 ( hashrestrpos PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 2278 "2281" _null_ _null_ _null_ _null_ _null_ hashrestrpos _null_ _null_ _null_ ));+DESCR("hash(internal)");+DATA(insert OID = 448 ( hashbuild PGNSP PGUID 12 1 0 0 0 f f f f t f v 3 0 2281 "2281 2281 2281" _null_ _null_ _null_ _null_ _null_ hashbuild _null_ _null_ _null_ ));+DESCR("hash(internal)");+DATA(insert OID = 327 ( hashbuildempty PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 2278 "2281" _null_ _null_ _null_ _null_ _null_ hashbuildempty _null_ _null_ _null_ ));+DESCR("hash(internal)");+DATA(insert OID = 442 ( hashbulkdelete PGNSP PGUID 12 1 0 0 0 f f f f t f v 4 0 2281 "2281 2281 2281 2281" _null_ _null_ _null_ _null_ _null_ hashbulkdelete _null_ _null_ _null_ ));+DESCR("hash(internal)");+DATA(insert OID = 425 ( hashvacuumcleanup PGNSP PGUID 12 1 0 0 0 f f f f t f v 2 0 2281 "2281 2281" _null_ _null_ _null_ _null_ _null_ hashvacuumcleanup _null_ _null_ _null_ ));+DESCR("hash(internal)");+DATA(insert OID = 438 ( hashcostestimate PGNSP PGUID 12 1 0 0 0 f f f f t f v 7 0 2278 "2281 2281 2281 2281 2281 2281 2281" _null_ _null_ _null_ _null_ _null_ hashcostestimate _null_ _null_ _null_ ));+DESCR("hash(internal)");+DATA(insert OID = 2786 ( hashoptions PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 17 "1009 16" _null_ _null_ _null_ _null_ _null_ hashoptions _null_ _null_ _null_ ));+DESCR("hash(internal)");++DATA(insert OID = 449 ( hashint2 PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 23 "21" _null_ _null_ _null_ _null_ _null_ hashint2 _null_ _null_ _null_ ));+DESCR("hash");+DATA(insert OID = 450 ( hashint4 PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 23 "23" _null_ _null_ _null_ _null_ _null_ hashint4 _null_ _null_ _null_ ));+DESCR("hash");+DATA(insert OID = 949 ( hashint8 PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 23 "20" _null_ _null_ _null_ _null_ _null_ hashint8 _null_ _null_ _null_ ));+DESCR("hash");+DATA(insert OID = 451 ( hashfloat4 PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 23 "700" _null_ _null_ _null_ _null_ _null_ hashfloat4 _null_ _null_ _null_ ));+DESCR("hash");+DATA(insert OID = 452 ( hashfloat8 PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 23 "701" _null_ _null_ _null_ _null_ _null_ hashfloat8 _null_ _null_ _null_ ));+DESCR("hash");+DATA(insert OID = 453 ( hashoid PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 23 "26" _null_ _null_ _null_ _null_ _null_ hashoid _null_ _null_ _null_ ));+DESCR("hash");+DATA(insert OID = 454 ( hashchar PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 23 "18" _null_ _null_ _null_ _null_ _null_ hashchar _null_ _null_ _null_ ));+DESCR("hash");+DATA(insert OID = 455 ( hashname PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 23 "19" _null_ _null_ _null_ _null_ _null_ hashname _null_ _null_ _null_ ));+DESCR("hash");+DATA(insert OID = 400 ( hashtext PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 23 "25" _null_ _null_ _null_ _null_ _null_ hashtext _null_ _null_ _null_ ));+DESCR("hash");+DATA(insert OID = 456 ( hashvarlena PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 23 "2281" _null_ _null_ _null_ _null_ _null_ hashvarlena _null_ _null_ _null_ ));+DESCR("hash");+DATA(insert OID = 457 ( hashoidvector PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 23 "30" _null_ _null_ _null_ _null_ _null_ hashoidvector _null_ _null_ _null_ ));+DESCR("hash");+DATA(insert OID = 329 ( hash_aclitem PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 23 "1033" _null_ _null_ _null_ _null_ _null_ hash_aclitem _null_ _null_ _null_ ));+DESCR("hash");+DATA(insert OID = 398 ( hashint2vector PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 23 "22" _null_ _null_ _null_ _null_ _null_ hashint2vector _null_ _null_ _null_ ));+DESCR("hash");+DATA(insert OID = 399 ( hashmacaddr PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 23 "829" _null_ _null_ _null_ _null_ _null_ hashmacaddr _null_ _null_ _null_ ));+DESCR("hash");+DATA(insert OID = 422 ( hashinet PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 23 "869" _null_ _null_ _null_ _null_ _null_ hashinet _null_ _null_ _null_ ));+DESCR("hash");+DATA(insert OID = 432 ( hash_numeric PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 23 "1700" _null_ _null_ _null_ _null_ _null_ hash_numeric _null_ _null_ _null_ ));+DESCR("hash");+DATA(insert OID = 458 ( text_larger PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 25 "25 25" _null_ _null_ _null_ _null_ _null_ text_larger _null_ _null_ _null_ ));+DESCR("larger of two");+DATA(insert OID = 459 ( text_smaller PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 25 "25 25" _null_ _null_ _null_ _null_ _null_ text_smaller _null_ _null_ _null_ ));+DESCR("smaller of two");++DATA(insert OID = 460 ( int8in PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 20 "2275" _null_ _null_ _null_ _null_ _null_ int8in _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 461 ( int8out PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2275 "20" _null_ _null_ _null_ _null_ _null_ int8out _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 462 ( int8um PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 20 "20" _null_ _null_ _null_ _null_ _null_ int8um _null_ _null_ _null_ ));+DATA(insert OID = 463 ( int8pl PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 20 "20 20" _null_ _null_ _null_ _null_ _null_ int8pl _null_ _null_ _null_ ));+DATA(insert OID = 464 ( int8mi PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 20 "20 20" _null_ _null_ _null_ _null_ _null_ int8mi _null_ _null_ _null_ ));+DATA(insert OID = 465 ( int8mul PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 20 "20 20" _null_ _null_ _null_ _null_ _null_ int8mul _null_ _null_ _null_ ));+DATA(insert OID = 466 ( int8div PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 20 "20 20" _null_ _null_ _null_ _null_ _null_ int8div _null_ _null_ _null_ ));+DATA(insert OID = 467 ( int8eq PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "20 20" _null_ _null_ _null_ _null_ _null_ int8eq _null_ _null_ _null_ ));+DATA(insert OID = 468 ( int8ne PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "20 20" _null_ _null_ _null_ _null_ _null_ int8ne _null_ _null_ _null_ ));+DATA(insert OID = 469 ( int8lt PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "20 20" _null_ _null_ _null_ _null_ _null_ int8lt _null_ _null_ _null_ ));+DATA(insert OID = 470 ( int8gt PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "20 20" _null_ _null_ _null_ _null_ _null_ int8gt _null_ _null_ _null_ ));+DATA(insert OID = 471 ( int8le PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "20 20" _null_ _null_ _null_ _null_ _null_ int8le _null_ _null_ _null_ ));+DATA(insert OID = 472 ( int8ge PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "20 20" _null_ _null_ _null_ _null_ _null_ int8ge _null_ _null_ _null_ ));++DATA(insert OID = 474 ( int84eq PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "20 23" _null_ _null_ _null_ _null_ _null_ int84eq _null_ _null_ _null_ ));+DATA(insert OID = 475 ( int84ne PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "20 23" _null_ _null_ _null_ _null_ _null_ int84ne _null_ _null_ _null_ ));+DATA(insert OID = 476 ( int84lt PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "20 23" _null_ _null_ _null_ _null_ _null_ int84lt _null_ _null_ _null_ ));+DATA(insert OID = 477 ( int84gt PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "20 23" _null_ _null_ _null_ _null_ _null_ int84gt _null_ _null_ _null_ ));+DATA(insert OID = 478 ( int84le PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "20 23" _null_ _null_ _null_ _null_ _null_ int84le _null_ _null_ _null_ ));+DATA(insert OID = 479 ( int84ge PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "20 23" _null_ _null_ _null_ _null_ _null_ int84ge _null_ _null_ _null_ ));++DATA(insert OID = 480 ( int4 PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 23 "20" _null_ _null_ _null_ _null_ _null_ int84 _null_ _null_ _null_ ));+DESCR("convert int8 to int4");+DATA(insert OID = 481 ( int8 PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 20 "23" _null_ _null_ _null_ _null_ _null_ int48 _null_ _null_ _null_ ));+DESCR("convert int4 to int8");+DATA(insert OID = 482 ( float8 PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 701 "20" _null_ _null_ _null_ _null_ _null_ i8tod _null_ _null_ _null_ ));+DESCR("convert int8 to float8");+DATA(insert OID = 483 ( int8 PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 20 "701" _null_ _null_ _null_ _null_ _null_ dtoi8 _null_ _null_ _null_ ));+DESCR("convert float8 to int8");++/* OIDS 500 - 599 */++/* OIDS 600 - 699 */++DATA(insert OID = 626 ( hash_array PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 23 "2277" _null_ _null_ _null_ _null_ _null_ hash_array _null_ _null_ _null_ ));+DESCR("hash");++DATA(insert OID = 652 ( float4 PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 700 "20" _null_ _null_ _null_ _null_ _null_ i8tof _null_ _null_ _null_ ));+DESCR("convert int8 to float4");+DATA(insert OID = 653 ( int8 PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 20 "700" _null_ _null_ _null_ _null_ _null_ ftoi8 _null_ _null_ _null_ ));+DESCR("convert float4 to int8");++DATA(insert OID = 714 ( int2 PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 21 "20" _null_ _null_ _null_ _null_ _null_ int82 _null_ _null_ _null_ ));+DESCR("convert int8 to int2");+DATA(insert OID = 754 ( int8 PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 20 "21" _null_ _null_ _null_ _null_ _null_ int28 _null_ _null_ _null_ ));+DESCR("convert int2 to int8");++DATA(insert OID = 655 ( namelt PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "19 19" _null_ _null_ _null_ _null_ _null_ namelt _null_ _null_ _null_ ));+DATA(insert OID = 656 ( namele PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "19 19" _null_ _null_ _null_ _null_ _null_ namele _null_ _null_ _null_ ));+DATA(insert OID = 657 ( namegt PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "19 19" _null_ _null_ _null_ _null_ _null_ namegt _null_ _null_ _null_ ));+DATA(insert OID = 658 ( namege PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "19 19" _null_ _null_ _null_ _null_ _null_ namege _null_ _null_ _null_ ));+DATA(insert OID = 659 ( namene PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "19 19" _null_ _null_ _null_ _null_ _null_ namene _null_ _null_ _null_ ));++DATA(insert OID = 668 ( bpchar PGNSP PGUID 12 1 0 0 0 f f f f t f i 3 0 1042 "1042 23 16" _null_ _null_ _null_ _null_ _null_ bpchar _null_ _null_ _null_ ));+DESCR("adjust char() to typmod length");+DATA(insert OID = 3097 ( varchar_transform PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2281 "2281" _null_ _null_ _null_ _null_ _null_ varchar_transform _null_ _null_ _null_ ));+DESCR("transform a varchar length coercion");+DATA(insert OID = 669 ( varchar PGNSP PGUID 12 1 0 0 varchar_transform f f f f t f i 3 0 1043 "1043 23 16" _null_ _null_ _null_ _null_ _null_ varchar _null_ _null_ _null_ ));+DESCR("adjust varchar() to typmod length");++DATA(insert OID = 676 ( mktinterval PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 704 "702 702" _null_ _null_ _null_ _null_ _null_ mktinterval _null_ _null_ _null_ ));++DATA(insert OID = 619 ( oidvectorne PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "30 30" _null_ _null_ _null_ _null_ _null_ oidvectorne _null_ _null_ _null_ ));+DATA(insert OID = 677 ( oidvectorlt PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "30 30" _null_ _null_ _null_ _null_ _null_ oidvectorlt _null_ _null_ _null_ ));+DATA(insert OID = 678 ( oidvectorle PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "30 30" _null_ _null_ _null_ _null_ _null_ oidvectorle _null_ _null_ _null_ ));+DATA(insert OID = 679 ( oidvectoreq PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "30 30" _null_ _null_ _null_ _null_ _null_ oidvectoreq _null_ _null_ _null_ ));+DATA(insert OID = 680 ( oidvectorge PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "30 30" _null_ _null_ _null_ _null_ _null_ oidvectorge _null_ _null_ _null_ ));+DATA(insert OID = 681 ( oidvectorgt PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "30 30" _null_ _null_ _null_ _null_ _null_ oidvectorgt _null_ _null_ _null_ ));++/* OIDS 700 - 799 */+DATA(insert OID = 710 ( getpgusername PGNSP PGUID 12 1 0 0 0 f f f f t f s 0 0 19 "" _null_ _null_ _null_ _null_ _null_ current_user _null_ _null_ _null_ ));+DESCR("deprecated, use current_user instead");+DATA(insert OID = 716 ( oidlt PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "26 26" _null_ _null_ _null_ _null_ _null_ oidlt _null_ _null_ _null_ ));+DATA(insert OID = 717 ( oidle PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "26 26" _null_ _null_ _null_ _null_ _null_ oidle _null_ _null_ _null_ ));++DATA(insert OID = 720 ( octet_length PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 23 "17" _null_ _null_ _null_ _null_ _null_ byteaoctetlen _null_ _null_ _null_ ));+DESCR("octet length");+DATA(insert OID = 721 ( get_byte PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "17 23" _null_ _null_ _null_ _null_ _null_ byteaGetByte _null_ _null_ _null_ ));+DESCR("get byte");+DATA(insert OID = 722 ( set_byte PGNSP PGUID 12 1 0 0 0 f f f f t f i 3 0 17 "17 23 23" _null_ _null_ _null_ _null_ _null_ byteaSetByte _null_ _null_ _null_ ));+DESCR("set byte");+DATA(insert OID = 723 ( get_bit PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "17 23" _null_ _null_ _null_ _null_ _null_ byteaGetBit _null_ _null_ _null_ ));+DESCR("get bit");+DATA(insert OID = 724 ( set_bit PGNSP PGUID 12 1 0 0 0 f f f f t f i 3 0 17 "17 23 23" _null_ _null_ _null_ _null_ _null_ byteaSetBit _null_ _null_ _null_ ));+DESCR("set bit");+DATA(insert OID = 749 ( overlay PGNSP PGUID 12 1 0 0 0 f f f f t f i 4 0 17 "17 17 23 23" _null_ _null_ _null_ _null_ _null_ byteaoverlay _null_ _null_ _null_ ));+DESCR("substitute portion of string");+DATA(insert OID = 752 ( overlay PGNSP PGUID 12 1 0 0 0 f f f f t f i 3 0 17 "17 17 23" _null_ _null_ _null_ _null_ _null_ byteaoverlay_no_len _null_ _null_ _null_ ));+DESCR("substitute portion of string");++DATA(insert OID = 725 ( dist_pl PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 701 "600 628" _null_ _null_ _null_ _null_ _null_ dist_pl _null_ _null_ _null_ ));+DATA(insert OID = 726 ( dist_lb PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 701 "628 603" _null_ _null_ _null_ _null_ _null_ dist_lb _null_ _null_ _null_ ));+DATA(insert OID = 727 ( dist_sl PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 701 "601 628" _null_ _null_ _null_ _null_ _null_ dist_sl _null_ _null_ _null_ ));+DATA(insert OID = 728 ( dist_cpoly PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 701 "718 604" _null_ _null_ _null_ _null_ _null_ dist_cpoly _null_ _null_ _null_ ));+DATA(insert OID = 729 ( poly_distance PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 701 "604 604" _null_ _null_ _null_ _null_ _null_ poly_distance _null_ _null_ _null_ ));+DATA(insert OID = 3275 ( dist_ppoly PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 701 "600 604" _null_ _null_ _null_ _null_ _null_ dist_ppoly _null_ _null_ _null_ ));+DATA(insert OID = 3292 ( dist_polyp PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 701 "604 600" _null_ _null_ _null_ _null_ _null_ dist_polyp _null_ _null_ _null_ ));+DATA(insert OID = 3290 ( dist_cpoint PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 701 "718 600" _null_ _null_ _null_ _null_ _null_ dist_cpoint _null_ _null_ _null_ ));++DATA(insert OID = 740 ( text_lt PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "25 25" _null_ _null_ _null_ _null_ _null_ text_lt _null_ _null_ _null_ ));+DATA(insert OID = 741 ( text_le PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "25 25" _null_ _null_ _null_ _null_ _null_ text_le _null_ _null_ _null_ ));+DATA(insert OID = 742 ( text_gt PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "25 25" _null_ _null_ _null_ _null_ _null_ text_gt _null_ _null_ _null_ ));+DATA(insert OID = 743 ( text_ge PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "25 25" _null_ _null_ _null_ _null_ _null_ text_ge _null_ _null_ _null_ ));++DATA(insert OID = 745 ( current_user PGNSP PGUID 12 1 0 0 0 f f f f t f s 0 0 19 "" _null_ _null_ _null_ _null_ _null_ current_user _null_ _null_ _null_ ));+DESCR("current user name");+DATA(insert OID = 746 ( session_user PGNSP PGUID 12 1 0 0 0 f f f f t f s 0 0 19 "" _null_ _null_ _null_ _null_ _null_ session_user _null_ _null_ _null_ ));+DESCR("session user name");++DATA(insert OID = 744 ( array_eq PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "2277 2277" _null_ _null_ _null_ _null_ _null_ array_eq _null_ _null_ _null_ ));+DATA(insert OID = 390 ( array_ne PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "2277 2277" _null_ _null_ _null_ _null_ _null_ array_ne _null_ _null_ _null_ ));+DATA(insert OID = 391 ( array_lt PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "2277 2277" _null_ _null_ _null_ _null_ _null_ array_lt _null_ _null_ _null_ ));+DATA(insert OID = 392 ( array_gt PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "2277 2277" _null_ _null_ _null_ _null_ _null_ array_gt _null_ _null_ _null_ ));+DATA(insert OID = 393 ( array_le PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "2277 2277" _null_ _null_ _null_ _null_ _null_ array_le _null_ _null_ _null_ ));+DATA(insert OID = 396 ( array_ge PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "2277 2277" _null_ _null_ _null_ _null_ _null_ array_ge _null_ _null_ _null_ ));+DATA(insert OID = 747 ( array_dims PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 25 "2277" _null_ _null_ _null_ _null_ _null_ array_dims _null_ _null_ _null_ ));+DESCR("array dimensions");+DATA(insert OID = 748 ( array_ndims PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 23 "2277" _null_ _null_ _null_ _null_ _null_ array_ndims _null_ _null_ _null_ ));+DESCR("number of array dimensions");+DATA(insert OID = 750 ( array_in PGNSP PGUID 12 1 0 0 0 f f f f t f s 3 0 2277 "2275 26 23" _null_ _null_ _null_ _null_ _null_ array_in _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 751 ( array_out PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 2275 "2277" _null_ _null_ _null_ _null_ _null_ array_out _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2091 ( array_lower PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "2277 23" _null_ _null_ _null_ _null_ _null_ array_lower _null_ _null_ _null_ ));+DESCR("array lower dimension");+DATA(insert OID = 2092 ( array_upper PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "2277 23" _null_ _null_ _null_ _null_ _null_ array_upper _null_ _null_ _null_ ));+DESCR("array upper dimension");+DATA(insert OID = 2176 ( array_length PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "2277 23" _null_ _null_ _null_ _null_ _null_ array_length _null_ _null_ _null_ ));+DESCR("array length");+DATA(insert OID = 3179 ( cardinality PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 23 "2277" _null_ _null_ _null_ _null_ _null_ array_cardinality _null_ _null_ _null_ ));+DESCR("array cardinality");+DATA(insert OID = 378 ( array_append PGNSP PGUID 12 1 0 0 0 f f f f f f i 2 0 2277 "2277 2283" _null_ _null_ _null_ _null_ _null_ array_append _null_ _null_ _null_ ));+DESCR("append element onto end of array");+DATA(insert OID = 379 ( array_prepend PGNSP PGUID 12 1 0 0 0 f f f f f f i 2 0 2277 "2283 2277" _null_ _null_ _null_ _null_ _null_ array_prepend _null_ _null_ _null_ ));+DESCR("prepend element onto front of array");+DATA(insert OID = 383 ( array_cat PGNSP PGUID 12 1 0 0 0 f f f f f f i 2 0 2277 "2277 2277" _null_ _null_ _null_ _null_ _null_ array_cat _null_ _null_ _null_ ));+DATA(insert OID = 394 ( string_to_array PGNSP PGUID 12 1 0 0 0 f f f f f f i 2 0 1009 "25 25" _null_ _null_ _null_ _null_ _null_ text_to_array _null_ _null_ _null_ ));+DESCR("split delimited text into text[]");+DATA(insert OID = 395 ( array_to_string PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 25 "2277 25" _null_ _null_ _null_ _null_ _null_ array_to_text _null_ _null_ _null_ ));+DESCR("concatenate array elements, using delimiter, into text");+DATA(insert OID = 376 ( string_to_array PGNSP PGUID 12 1 0 0 0 f f f f f f i 3 0 1009 "25 25 25" _null_ _null_ _null_ _null_ _null_ text_to_array_null _null_ _null_ _null_ ));+DESCR("split delimited text into text[], with null string");+DATA(insert OID = 384 ( array_to_string PGNSP PGUID 12 1 0 0 0 f f f f f f s 3 0 25 "2277 25 25" _null_ _null_ _null_ _null_ _null_ array_to_text_null _null_ _null_ _null_ ));+DESCR("concatenate array elements, using delimiter and null string, into text");+DATA(insert OID = 515 ( array_larger PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 2277 "2277 2277" _null_ _null_ _null_ _null_ _null_ array_larger _null_ _null_ _null_ ));+DESCR("larger of two");+DATA(insert OID = 516 ( array_smaller PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 2277 "2277 2277" _null_ _null_ _null_ _null_ _null_ array_smaller _null_ _null_ _null_ ));+DESCR("smaller of two");+DATA(insert OID = 3277 ( array_position PGNSP PGUID 12 1 0 0 0 f f f f f f i 2 0 23 "2277 2283" _null_ _null_ _null_ _null_ _null_ array_position _null_ _null_ _null_ ));+DESCR("returns an offset of value in array");+DATA(insert OID = 3278 ( array_position PGNSP PGUID 12 1 0 0 0 f f f f f f i 3 0 23 "2277 2283 23" _null_ _null_ _null_ _null_ _null_ array_position_start _null_ _null_ _null_ ));+DESCR("returns an offset of value in array with start index");+DATA(insert OID = 3279 ( array_positions PGNSP PGUID 12 1 0 0 0 f f f f f f i 2 0 1007 "2277 2283" _null_ _null_ _null_ _null_ _null_ array_positions _null_ _null_ _null_ ));+DESCR("returns an array of offsets of some value in array");+DATA(insert OID = 1191 ( generate_subscripts PGNSP PGUID 12 1 1000 0 0 f f f f t t i 3 0 23 "2277 23 16" _null_ _null_ _null_ _null_ _null_ generate_subscripts _null_ _null_ _null_ ));+DESCR("array subscripts generator");+DATA(insert OID = 1192 ( generate_subscripts PGNSP PGUID 12 1 1000 0 0 f f f f t t i 2 0 23 "2277 23" _null_ _null_ _null_ _null_ _null_ generate_subscripts_nodir _null_ _null_ _null_ ));+DESCR("array subscripts generator");+DATA(insert OID = 1193 ( array_fill PGNSP PGUID 12 1 0 0 0 f f f f f f i 2 0 2277 "2283 1007" _null_ _null_ _null_ _null_ _null_ array_fill _null_ _null_ _null_ ));+DESCR("array constructor with value");+DATA(insert OID = 1286 ( array_fill PGNSP PGUID 12 1 0 0 0 f f f f f f i 3 0 2277 "2283 1007 1007" _null_ _null_ _null_ _null_ _null_ array_fill_with_lower_bounds _null_ _null_ _null_ ));+DESCR("array constructor with value");+DATA(insert OID = 2331 ( unnest PGNSP PGUID 12 1 100 0 0 f f f f t t i 1 0 2283 "2277" _null_ _null_ _null_ _null_ _null_ array_unnest _null_ _null_ _null_ ));+DESCR("expand array to set of rows");+DATA(insert OID = 3167 ( array_remove PGNSP PGUID 12 1 0 0 0 f f f f f f i 2 0 2277 "2277 2283" _null_ _null_ _null_ _null_ _null_ array_remove _null_ _null_ _null_ ));+DESCR("remove any occurrences of an element from an array");+DATA(insert OID = 3168 ( array_replace PGNSP PGUID 12 1 0 0 0 f f f f f f i 3 0 2277 "2277 2283 2283" _null_ _null_ _null_ _null_ _null_ array_replace _null_ _null_ _null_ ));+DESCR("replace any occurrences of an element in an array");+DATA(insert OID = 2333 ( array_agg_transfn PGNSP PGUID 12 1 0 0 0 f f f f f f i 2 0 2281 "2281 2776" _null_ _null_ _null_ _null_ _null_ array_agg_transfn _null_ _null_ _null_ ));+DESCR("aggregate transition function");+DATA(insert OID = 2334 ( array_agg_finalfn PGNSP PGUID 12 1 0 0 0 f f f f f f i 2 0 2277 "2281 2776" _null_ _null_ _null_ _null_ _null_ array_agg_finalfn _null_ _null_ _null_ ));+DESCR("aggregate final function");+DATA(insert OID = 2335 ( array_agg PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 2277 "2776" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("concatenate aggregate input into an array");+DATA(insert OID = 4051 ( array_agg_array_transfn PGNSP PGUID 12 1 0 0 0 f f f f f f i 2 0 2281 "2281 2277" _null_ _null_ _null_ _null_ _null_ array_agg_array_transfn _null_ _null_ _null_ ));+DESCR("aggregate transition function");+DATA(insert OID = 4052 ( array_agg_array_finalfn PGNSP PGUID 12 1 0 0 0 f f f f f f i 2 0 2277 "2281 2277" _null_ _null_ _null_ _null_ _null_ array_agg_array_finalfn _null_ _null_ _null_ ));+DESCR("aggregate final function");+DATA(insert OID = 4053 ( array_agg PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 2277 "2277" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("concatenate aggregate input into an array");+DATA(insert OID = 3218 ( width_bucket PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "2283 2277" _null_ _null_ _null_ _null_ _null_ width_bucket_array _null_ _null_ _null_ ));+DESCR("bucket number of operand given a sorted array of bucket lower bounds");+DATA(insert OID = 3816 ( array_typanalyze PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 16 "2281" _null_ _null_ _null_ _null_ _null_ array_typanalyze _null_ _null_ _null_ ));+DESCR("array typanalyze");+DATA(insert OID = 3817 ( arraycontsel PGNSP PGUID 12 1 0 0 0 f f f f t f s 4 0 701 "2281 26 2281 23" _null_ _null_ _null_ _null_ _null_ arraycontsel _null_ _null_ _null_ ));+DESCR("restriction selectivity for array-containment operators");+DATA(insert OID = 3818 ( arraycontjoinsel PGNSP PGUID 12 1 0 0 0 f f f f t f s 5 0 701 "2281 26 2281 21 2281" _null_ _null_ _null_ _null_ _null_ arraycontjoinsel _null_ _null_ _null_ ));+DESCR("join selectivity for array-containment operators");++DATA(insert OID = 760 ( smgrin PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 210 "2275" _null_ _null_ _null_ _null_ _null_ smgrin _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 761 ( smgrout PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 2275 "210" _null_ _null_ _null_ _null_ _null_ smgrout _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 762 ( smgreq PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "210 210" _null_ _null_ _null_ _null_ _null_ smgreq _null_ _null_ _null_ ));+DESCR("storage manager");+DATA(insert OID = 763 ( smgrne PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "210 210" _null_ _null_ _null_ _null_ _null_ smgrne _null_ _null_ _null_ ));+DESCR("storage manager");++DATA(insert OID = 764 ( lo_import PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 26 "25" _null_ _null_ _null_ _null_ _null_ lo_import _null_ _null_ _null_ ));+DESCR("large object import");+DATA(insert OID = 767 ( lo_import PGNSP PGUID 12 1 0 0 0 f f f f t f v 2 0 26 "25 26" _null_ _null_ _null_ _null_ _null_ lo_import_with_oid _null_ _null_ _null_ ));+DESCR("large object import");+DATA(insert OID = 765 ( lo_export PGNSP PGUID 12 1 0 0 0 f f f f t f v 2 0 23 "26 25" _null_ _null_ _null_ _null_ _null_ lo_export _null_ _null_ _null_ ));+DESCR("large object export");++DATA(insert OID = 766 ( int4inc PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 23 "23" _null_ _null_ _null_ _null_ _null_ int4inc _null_ _null_ _null_ ));+DESCR("increment");+DATA(insert OID = 768 ( int4larger PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "23 23" _null_ _null_ _null_ _null_ _null_ int4larger _null_ _null_ _null_ ));+DESCR("larger of two");+DATA(insert OID = 769 ( int4smaller PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "23 23" _null_ _null_ _null_ _null_ _null_ int4smaller _null_ _null_ _null_ ));+DESCR("smaller of two");+DATA(insert OID = 770 ( int2larger PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 21 "21 21" _null_ _null_ _null_ _null_ _null_ int2larger _null_ _null_ _null_ ));+DESCR("larger of two");+DATA(insert OID = 771 ( int2smaller PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 21 "21 21" _null_ _null_ _null_ _null_ _null_ int2smaller _null_ _null_ _null_ ));+DESCR("smaller of two");++DATA(insert OID = 774 ( gistgettuple PGNSP PGUID 12 1 0 0 0 f f f f t f v 2 0 16 "2281 2281" _null_ _null_ _null_ _null_ _null_ gistgettuple _null_ _null_ _null_ ));+DESCR("gist(internal)");+DATA(insert OID = 638 ( gistgetbitmap PGNSP PGUID 12 1 0 0 0 f f f f t f v 2 0 20 "2281 2281" _null_ _null_ _null_ _null_ _null_ gistgetbitmap _null_ _null_ _null_ ));+DESCR("gist(internal)");+DATA(insert OID = 775 ( gistinsert PGNSP PGUID 12 1 0 0 0 f f f f t f v 6 0 16 "2281 2281 2281 2281 2281 2281" _null_ _null_ _null_ _null_ _null_ gistinsert _null_ _null_ _null_ ));+DESCR("gist(internal)");+DATA(insert OID = 777 ( gistbeginscan PGNSP PGUID 12 1 0 0 0 f f f f t f v 3 0 2281 "2281 2281 2281" _null_ _null_ _null_ _null_ _null_ gistbeginscan _null_ _null_ _null_ ));+DESCR("gist(internal)");+DATA(insert OID = 778 ( gistrescan PGNSP PGUID 12 1 0 0 0 f f f f t f v 5 0 2278 "2281 2281 2281 2281 2281" _null_ _null_ _null_ _null_ _null_ gistrescan _null_ _null_ _null_ ));+DESCR("gist(internal)");+DATA(insert OID = 779 ( gistendscan PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 2278 "2281" _null_ _null_ _null_ _null_ _null_ gistendscan _null_ _null_ _null_ ));+DESCR("gist(internal)");+DATA(insert OID = 780 ( gistmarkpos PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 2278 "2281" _null_ _null_ _null_ _null_ _null_ gistmarkpos _null_ _null_ _null_ ));+DESCR("gist(internal)");+DATA(insert OID = 781 ( gistrestrpos PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 2278 "2281" _null_ _null_ _null_ _null_ _null_ gistrestrpos _null_ _null_ _null_ ));+DESCR("gist(internal)");+DATA(insert OID = 782 ( gistbuild PGNSP PGUID 12 1 0 0 0 f f f f t f v 3 0 2281 "2281 2281 2281" _null_ _null_ _null_ _null_ _null_ gistbuild _null_ _null_ _null_ ));+DESCR("gist(internal)");+DATA(insert OID = 326 ( gistbuildempty PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 2278 "2281" _null_ _null_ _null_ _null_ _null_ gistbuildempty _null_ _null_ _null_ ));+DESCR("gist(internal)");+DATA(insert OID = 776 ( gistbulkdelete PGNSP PGUID 12 1 0 0 0 f f f f t f v 4 0 2281 "2281 2281 2281 2281" _null_ _null_ _null_ _null_ _null_ gistbulkdelete _null_ _null_ _null_ ));+DESCR("gist(internal)");+DATA(insert OID = 2561 ( gistvacuumcleanup PGNSP PGUID 12 1 0 0 0 f f f f t f v 2 0 2281 "2281 2281" _null_ _null_ _null_ _null_ _null_ gistvacuumcleanup _null_ _null_ _null_ ));+DESCR("gist(internal)");+DATA(insert OID = 3280 ( gistcanreturn PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 16 "2281 23" _null_ _null_ _null_ _null_ _null_ gistcanreturn _null_ _null_ _null_ ));+DESCR("gist(internal)");+DATA(insert OID = 772 ( gistcostestimate PGNSP PGUID 12 1 0 0 0 f f f f t f v 7 0 2278 "2281 2281 2281 2281 2281 2281 2281" _null_ _null_ _null_ _null_ _null_ gistcostestimate _null_ _null_ _null_ ));+DESCR("gist(internal)");+DATA(insert OID = 2787 ( gistoptions PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 17 "1009 16" _null_ _null_ _null_ _null_ _null_ gistoptions _null_ _null_ _null_ ));+DESCR("gist(internal)");++DATA(insert OID = 784 ( tintervaleq PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "704 704" _null_ _null_ _null_ _null_ _null_ tintervaleq _null_ _null_ _null_ ));+DATA(insert OID = 785 ( tintervalne PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "704 704" _null_ _null_ _null_ _null_ _null_ tintervalne _null_ _null_ _null_ ));+DATA(insert OID = 786 ( tintervallt PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "704 704" _null_ _null_ _null_ _null_ _null_ tintervallt _null_ _null_ _null_ ));+DATA(insert OID = 787 ( tintervalgt PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "704 704" _null_ _null_ _null_ _null_ _null_ tintervalgt _null_ _null_ _null_ ));+DATA(insert OID = 788 ( tintervalle PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "704 704" _null_ _null_ _null_ _null_ _null_ tintervalle _null_ _null_ _null_ ));+DATA(insert OID = 789 ( tintervalge PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "704 704" _null_ _null_ _null_ _null_ _null_ tintervalge _null_ _null_ _null_ ));++/* OIDS 800 - 899 */++DATA(insert OID = 846 ( cash_mul_flt4 PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 790 "790 700" _null_ _null_ _null_ _null_ _null_ cash_mul_flt4 _null_ _null_ _null_ ));+DATA(insert OID = 847 ( cash_div_flt4 PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 790 "790 700" _null_ _null_ _null_ _null_ _null_ cash_div_flt4 _null_ _null_ _null_ ));+DATA(insert OID = 848 ( flt4_mul_cash PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 790 "700 790" _null_ _null_ _null_ _null_ _null_ flt4_mul_cash _null_ _null_ _null_ ));++DATA(insert OID = 849 ( position PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "25 25" _null_ _null_ _null_ _null_ _null_ textpos _null_ _null_ _null_ ));+DESCR("position of substring");+DATA(insert OID = 850 ( textlike PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "25 25" _null_ _null_ _null_ _null_ _null_ textlike _null_ _null_ _null_ ));+DATA(insert OID = 851 ( textnlike PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "25 25" _null_ _null_ _null_ _null_ _null_ textnlike _null_ _null_ _null_ ));++DATA(insert OID = 852 ( int48eq PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "23 20" _null_ _null_ _null_ _null_ _null_ int48eq _null_ _null_ _null_ ));+DATA(insert OID = 853 ( int48ne PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "23 20" _null_ _null_ _null_ _null_ _null_ int48ne _null_ _null_ _null_ ));+DATA(insert OID = 854 ( int48lt PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "23 20" _null_ _null_ _null_ _null_ _null_ int48lt _null_ _null_ _null_ ));+DATA(insert OID = 855 ( int48gt PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "23 20" _null_ _null_ _null_ _null_ _null_ int48gt _null_ _null_ _null_ ));+DATA(insert OID = 856 ( int48le PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "23 20" _null_ _null_ _null_ _null_ _null_ int48le _null_ _null_ _null_ ));+DATA(insert OID = 857 ( int48ge PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "23 20" _null_ _null_ _null_ _null_ _null_ int48ge _null_ _null_ _null_ ));++DATA(insert OID = 858 ( namelike PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "19 25" _null_ _null_ _null_ _null_ _null_ namelike _null_ _null_ _null_ ));+DATA(insert OID = 859 ( namenlike PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "19 25" _null_ _null_ _null_ _null_ _null_ namenlike _null_ _null_ _null_ ));++DATA(insert OID = 860 ( bpchar PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 1042 "18" _null_ _null_ _null_ _null_ _null_ char_bpchar _null_ _null_ _null_ ));+DESCR("convert char to char(n)");++DATA(insert OID = 861 ( current_database PGNSP PGUID 12 1 0 0 0 f f f f t f s 0 0 19 "" _null_ _null_ _null_ _null_ _null_ current_database _null_ _null_ _null_ ));+DESCR("name of the current database");+DATA(insert OID = 817 ( current_query PGNSP PGUID 12 1 0 0 0 f f f f f f v 0 0 25 "" _null_ _null_ _null_ _null_ _null_ current_query _null_ _null_ _null_ ));+DESCR("get the currently executing query");++DATA(insert OID = 862 ( int4_mul_cash PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 790 "23 790" _null_ _null_ _null_ _null_ _null_ int4_mul_cash _null_ _null_ _null_ ));+DATA(insert OID = 863 ( int2_mul_cash PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 790 "21 790" _null_ _null_ _null_ _null_ _null_ int2_mul_cash _null_ _null_ _null_ ));+DATA(insert OID = 864 ( cash_mul_int4 PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 790 "790 23" _null_ _null_ _null_ _null_ _null_ cash_mul_int4 _null_ _null_ _null_ ));+DATA(insert OID = 865 ( cash_div_int4 PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 790 "790 23" _null_ _null_ _null_ _null_ _null_ cash_div_int4 _null_ _null_ _null_ ));+DATA(insert OID = 866 ( cash_mul_int2 PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 790 "790 21" _null_ _null_ _null_ _null_ _null_ cash_mul_int2 _null_ _null_ _null_ ));+DATA(insert OID = 867 ( cash_div_int2 PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 790 "790 21" _null_ _null_ _null_ _null_ _null_ cash_div_int2 _null_ _null_ _null_ ));++DATA(insert OID = 886 ( cash_in PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 790 "2275" _null_ _null_ _null_ _null_ _null_ cash_in _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 887 ( cash_out PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 2275 "790" _null_ _null_ _null_ _null_ _null_ cash_out _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 888 ( cash_eq PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "790 790" _null_ _null_ _null_ _null_ _null_ cash_eq _null_ _null_ _null_ ));+DATA(insert OID = 889 ( cash_ne PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "790 790" _null_ _null_ _null_ _null_ _null_ cash_ne _null_ _null_ _null_ ));+DATA(insert OID = 890 ( cash_lt PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "790 790" _null_ _null_ _null_ _null_ _null_ cash_lt _null_ _null_ _null_ ));+DATA(insert OID = 891 ( cash_le PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "790 790" _null_ _null_ _null_ _null_ _null_ cash_le _null_ _null_ _null_ ));+DATA(insert OID = 892 ( cash_gt PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "790 790" _null_ _null_ _null_ _null_ _null_ cash_gt _null_ _null_ _null_ ));+DATA(insert OID = 893 ( cash_ge PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "790 790" _null_ _null_ _null_ _null_ _null_ cash_ge _null_ _null_ _null_ ));+DATA(insert OID = 894 ( cash_pl PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 790 "790 790" _null_ _null_ _null_ _null_ _null_ cash_pl _null_ _null_ _null_ ));+DATA(insert OID = 895 ( cash_mi PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 790 "790 790" _null_ _null_ _null_ _null_ _null_ cash_mi _null_ _null_ _null_ ));+DATA(insert OID = 896 ( cash_mul_flt8 PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 790 "790 701" _null_ _null_ _null_ _null_ _null_ cash_mul_flt8 _null_ _null_ _null_ ));+DATA(insert OID = 897 ( cash_div_flt8 PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 790 "790 701" _null_ _null_ _null_ _null_ _null_ cash_div_flt8 _null_ _null_ _null_ ));+DATA(insert OID = 898 ( cashlarger PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 790 "790 790" _null_ _null_ _null_ _null_ _null_ cashlarger _null_ _null_ _null_ ));+DESCR("larger of two");+DATA(insert OID = 899 ( cashsmaller PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 790 "790 790" _null_ _null_ _null_ _null_ _null_ cashsmaller _null_ _null_ _null_ ));+DESCR("smaller of two");+DATA(insert OID = 919 ( flt8_mul_cash PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 790 "701 790" _null_ _null_ _null_ _null_ _null_ flt8_mul_cash _null_ _null_ _null_ ));+DATA(insert OID = 935 ( cash_words PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 25 "790" _null_ _null_ _null_ _null_ _null_ cash_words _null_ _null_ _null_ ));+DESCR("output money amount as words");+DATA(insert OID = 3822 ( cash_div_cash PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 701 "790 790" _null_ _null_ _null_ _null_ _null_ cash_div_cash _null_ _null_ _null_ ));+DATA(insert OID = 3823 ( numeric PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 1700 "790" _null_ _null_ _null_ _null_ _null_ cash_numeric _null_ _null_ _null_ ));+DESCR("convert money to numeric");+DATA(insert OID = 3824 ( money PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 790 "1700" _null_ _null_ _null_ _null_ _null_ numeric_cash _null_ _null_ _null_ ));+DESCR("convert numeric to money");+DATA(insert OID = 3811 ( money PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 790 "23" _null_ _null_ _null_ _null_ _null_ int4_cash _null_ _null_ _null_ ));+DESCR("convert int4 to money");+DATA(insert OID = 3812 ( money PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 790 "20" _null_ _null_ _null_ _null_ _null_ int8_cash _null_ _null_ _null_ ));+DESCR("convert int8 to money");++/* OIDS 900 - 999 */++DATA(insert OID = 940 ( mod PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 21 "21 21" _null_ _null_ _null_ _null_ _null_ int2mod _null_ _null_ _null_ ));+DESCR("modulus");+DATA(insert OID = 941 ( mod PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "23 23" _null_ _null_ _null_ _null_ _null_ int4mod _null_ _null_ _null_ ));+DESCR("modulus");++DATA(insert OID = 945 ( int8mod PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 20 "20 20" _null_ _null_ _null_ _null_ _null_ int8mod _null_ _null_ _null_ ));+DATA(insert OID = 947 ( mod PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 20 "20 20" _null_ _null_ _null_ _null_ _null_ int8mod _null_ _null_ _null_ ));+DESCR("modulus");++DATA(insert OID = 944 ( char PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 18 "25" _null_ _null_ _null_ _null_ _null_ text_char _null_ _null_ _null_ ));+DESCR("convert text to char");+DATA(insert OID = 946 ( text PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 25 "18" _null_ _null_ _null_ _null_ _null_ char_text _null_ _null_ _null_ ));+DESCR("convert char to text");++DATA(insert OID = 952 ( lo_open PGNSP PGUID 12 1 0 0 0 f f f f t f v 2 0 23 "26 23" _null_ _null_ _null_ _null_ _null_ lo_open _null_ _null_ _null_ ));+DESCR("large object open");+DATA(insert OID = 953 ( lo_close PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 23 "23" _null_ _null_ _null_ _null_ _null_ lo_close _null_ _null_ _null_ ));+DESCR("large object close");+DATA(insert OID = 954 ( loread PGNSP PGUID 12 1 0 0 0 f f f f t f v 2 0 17 "23 23" _null_ _null_ _null_ _null_ _null_ loread _null_ _null_ _null_ ));+DESCR("large object read");+DATA(insert OID = 955 ( lowrite PGNSP PGUID 12 1 0 0 0 f f f f t f v 2 0 23 "23 17" _null_ _null_ _null_ _null_ _null_ lowrite _null_ _null_ _null_ ));+DESCR("large object write");+DATA(insert OID = 956 ( lo_lseek PGNSP PGUID 12 1 0 0 0 f f f f t f v 3 0 23 "23 23 23" _null_ _null_ _null_ _null_ _null_ lo_lseek _null_ _null_ _null_ ));+DESCR("large object seek");+DATA(insert OID = 3170 ( lo_lseek64 PGNSP PGUID 12 1 0 0 0 f f f f t f v 3 0 20 "23 20 23" _null_ _null_ _null_ _null_ _null_ lo_lseek64 _null_ _null_ _null_ ));+DESCR("large object seek (64 bit)");+DATA(insert OID = 957 ( lo_creat PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 26 "23" _null_ _null_ _null_ _null_ _null_ lo_creat _null_ _null_ _null_ ));+DESCR("large object create");+DATA(insert OID = 715 ( lo_create PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 26 "26" _null_ _null_ _null_ _null_ _null_ lo_create _null_ _null_ _null_ ));+DESCR("large object create");+DATA(insert OID = 958 ( lo_tell PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 23 "23" _null_ _null_ _null_ _null_ _null_ lo_tell _null_ _null_ _null_ ));+DESCR("large object position");+DATA(insert OID = 3171 ( lo_tell64 PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 20 "23" _null_ _null_ _null_ _null_ _null_ lo_tell64 _null_ _null_ _null_ ));+DESCR("large object position (64 bit)");+DATA(insert OID = 1004 ( lo_truncate PGNSP PGUID 12 1 0 0 0 f f f f t f v 2 0 23 "23 23" _null_ _null_ _null_ _null_ _null_ lo_truncate _null_ _null_ _null_ ));+DESCR("truncate large object");+DATA(insert OID = 3172 ( lo_truncate64 PGNSP PGUID 12 1 0 0 0 f f f f t f v 2 0 23 "23 20" _null_ _null_ _null_ _null_ _null_ lo_truncate64 _null_ _null_ _null_ ));+DESCR("truncate large object (64 bit)");++DATA(insert OID = 3457 ( lo_from_bytea PGNSP PGUID 12 1 0 0 0 f f f f t f v 2 0 26 "26 17" _null_ _null_ _null_ _null_ _null_ lo_from_bytea _null_ _null_ _null_ ));+DESCR("create new large object with given content");+DATA(insert OID = 3458 ( lo_get PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 17 "26" _null_ _null_ _null_ _null_ _null_ lo_get _null_ _null_ _null_ ));+DESCR("read entire large object");+DATA(insert OID = 3459 ( lo_get PGNSP PGUID 12 1 0 0 0 f f f f t f v 3 0 17 "26 20 23" _null_ _null_ _null_ _null_ _null_ lo_get_fragment _null_ _null_ _null_ ));+DESCR("read large object from offset for length");+DATA(insert OID = 3460 ( lo_put PGNSP PGUID 12 1 0 0 0 f f f f t f v 3 0 2278 "26 20 17" _null_ _null_ _null_ _null_ _null_ lo_put _null_ _null_ _null_ ));+DESCR("write data at offset");++DATA(insert OID = 959 ( on_pl PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "600 628" _null_ _null_ _null_ _null_ _null_ on_pl _null_ _null_ _null_ ));+DATA(insert OID = 960 ( on_sl PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "601 628" _null_ _null_ _null_ _null_ _null_ on_sl _null_ _null_ _null_ ));+DATA(insert OID = 961 ( close_pl PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 600 "600 628" _null_ _null_ _null_ _null_ _null_ close_pl _null_ _null_ _null_ ));+DATA(insert OID = 962 ( close_sl PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 600 "601 628" _null_ _null_ _null_ _null_ _null_ close_sl _null_ _null_ _null_ ));+DATA(insert OID = 963 ( close_lb PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 600 "628 603" _null_ _null_ _null_ _null_ _null_ close_lb _null_ _null_ _null_ ));++DATA(insert OID = 964 ( lo_unlink PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 23 "26" _null_ _null_ _null_ _null_ _null_ lo_unlink _null_ _null_ _null_ ));+DESCR("large object unlink (delete)");++DATA(insert OID = 973 ( path_inter PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "602 602" _null_ _null_ _null_ _null_ _null_ path_inter _null_ _null_ _null_ ));+DATA(insert OID = 975 ( area PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 701 "603" _null_ _null_ _null_ _null_ _null_ box_area _null_ _null_ _null_ ));+DESCR("box area");+DATA(insert OID = 976 ( width PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 701 "603" _null_ _null_ _null_ _null_ _null_ box_width _null_ _null_ _null_ ));+DESCR("box width");+DATA(insert OID = 977 ( height PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 701 "603" _null_ _null_ _null_ _null_ _null_ box_height _null_ _null_ _null_ ));+DESCR("box height");+DATA(insert OID = 978 ( box_distance PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 701 "603 603" _null_ _null_ _null_ _null_ _null_ box_distance _null_ _null_ _null_ ));+DATA(insert OID = 979 ( area PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 701 "602" _null_ _null_ _null_ _null_ _null_ path_area _null_ _null_ _null_ ));+DESCR("area of a closed path");+DATA(insert OID = 980 ( box_intersect PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 603 "603 603" _null_ _null_ _null_ _null_ _null_ box_intersect _null_ _null_ _null_ ));+DATA(insert OID = 4067 ( bound_box PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 603 "603 603" _null_ _null_ _null_ _null_ _null_ boxes_bound_box _null_ _null_ _null_ ));+DESCR("bounding box of two boxes");+DATA(insert OID = 981 ( diagonal PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 601 "603" _null_ _null_ _null_ _null_ _null_ box_diagonal _null_ _null_ _null_ ));+DESCR("box diagonal");+DATA(insert OID = 982 ( path_n_lt PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "602 602" _null_ _null_ _null_ _null_ _null_ path_n_lt _null_ _null_ _null_ ));+DATA(insert OID = 983 ( path_n_gt PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "602 602" _null_ _null_ _null_ _null_ _null_ path_n_gt _null_ _null_ _null_ ));+DATA(insert OID = 984 ( path_n_eq PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "602 602" _null_ _null_ _null_ _null_ _null_ path_n_eq _null_ _null_ _null_ ));+DATA(insert OID = 985 ( path_n_le PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "602 602" _null_ _null_ _null_ _null_ _null_ path_n_le _null_ _null_ _null_ ));+DATA(insert OID = 986 ( path_n_ge PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "602 602" _null_ _null_ _null_ _null_ _null_ path_n_ge _null_ _null_ _null_ ));+DATA(insert OID = 987 ( path_length PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 701 "602" _null_ _null_ _null_ _null_ _null_ path_length _null_ _null_ _null_ ));+DATA(insert OID = 988 ( point_ne PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "600 600" _null_ _null_ _null_ _null_ _null_ point_ne _null_ _null_ _null_ ));+DATA(insert OID = 989 ( point_vert PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "600 600" _null_ _null_ _null_ _null_ _null_ point_vert _null_ _null_ _null_ ));+DATA(insert OID = 990 ( point_horiz PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "600 600" _null_ _null_ _null_ _null_ _null_ point_horiz _null_ _null_ _null_ ));+DATA(insert OID = 991 ( point_distance PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 701 "600 600" _null_ _null_ _null_ _null_ _null_ point_distance _null_ _null_ _null_ ));+DATA(insert OID = 992 ( slope PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 701 "600 600" _null_ _null_ _null_ _null_ _null_ point_slope _null_ _null_ _null_ ));+DESCR("slope between points");+DATA(insert OID = 993 ( lseg PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 601 "600 600" _null_ _null_ _null_ _null_ _null_ lseg_construct _null_ _null_ _null_ ));+DESCR("convert points to line segment");+DATA(insert OID = 994 ( lseg_intersect PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "601 601" _null_ _null_ _null_ _null_ _null_ lseg_intersect _null_ _null_ _null_ ));+DATA(insert OID = 995 ( lseg_parallel PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "601 601" _null_ _null_ _null_ _null_ _null_ lseg_parallel _null_ _null_ _null_ ));+DATA(insert OID = 996 ( lseg_perp PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "601 601" _null_ _null_ _null_ _null_ _null_ lseg_perp _null_ _null_ _null_ ));+DATA(insert OID = 997 ( lseg_vertical PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 16 "601" _null_ _null_ _null_ _null_ _null_ lseg_vertical _null_ _null_ _null_ ));+DATA(insert OID = 998 ( lseg_horizontal PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 16 "601" _null_ _null_ _null_ _null_ _null_ lseg_horizontal _null_ _null_ _null_ ));+DATA(insert OID = 999 ( lseg_eq PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "601 601" _null_ _null_ _null_ _null_ _null_ lseg_eq _null_ _null_ _null_ ));++/* OIDS 1000 - 1999 */++DATA(insert OID = 3994 ( timestamp_izone_transform PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2281 "2281" _null_ _null_ _null_ _null_ _null_ timestamp_izone_transform _null_ _null_ _null_ ));+DESCR("transform a time zone adjustment");+DATA(insert OID = 1026 ( timezone PGNSP PGUID 12 1 0 0 timestamp_izone_transform f f f f t f i 2 0 1114 "1186 1184" _null_ _null_ _null_ _null_ _null_ timestamptz_izone _null_ _null_ _null_ ));+DESCR("adjust timestamp to new time zone");++DATA(insert OID = 1031 ( aclitemin PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 1033 "2275" _null_ _null_ _null_ _null_ _null_ aclitemin _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 1032 ( aclitemout PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 2275 "1033" _null_ _null_ _null_ _null_ _null_ aclitemout _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 1035 ( aclinsert PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1034 "1034 1033" _null_ _null_ _null_ _null_ _null_ aclinsert _null_ _null_ _null_ ));+DESCR("add/update ACL item");+DATA(insert OID = 1036 ( aclremove PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1034 "1034 1033" _null_ _null_ _null_ _null_ _null_ aclremove _null_ _null_ _null_ ));+DESCR("remove ACL item");+DATA(insert OID = 1037 ( aclcontains PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "1034 1033" _null_ _null_ _null_ _null_ _null_ aclcontains _null_ _null_ _null_ ));+DESCR("contains");+DATA(insert OID = 1062 ( aclitemeq PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "1033 1033" _null_ _null_ _null_ _null_ _null_ aclitem_eq _null_ _null_ _null_ ));+DATA(insert OID = 1365 ( makeaclitem PGNSP PGUID 12 1 0 0 0 f f f f t f i 4 0 1033 "26 26 25 16" _null_ _null_ _null_ _null_ _null_ makeaclitem _null_ _null_ _null_ ));+DESCR("make ACL item");+DATA(insert OID = 3943 ( acldefault PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1034 "18 26" _null_ _null_ _null_ _null_ _null_ acldefault_sql _null_ _null_ _null_ ));+DESCR("TODO");+DATA(insert OID = 1689 ( aclexplode PGNSP PGUID 12 1 10 0 0 f f f f t t s 1 0 2249 "1034" "{1034,26,26,25,16}" "{i,o,o,o,o}" "{acl,grantor,grantee,privilege_type,is_grantable}" _null_ _null_ aclexplode _null_ _null_ _null_ ));+DESCR("convert ACL item array to table, for use by information schema");+DATA(insert OID = 1044 ( bpcharin PGNSP PGUID 12 1 0 0 0 f f f f t f i 3 0 1042 "2275 26 23" _null_ _null_ _null_ _null_ _null_ bpcharin _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 1045 ( bpcharout PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2275 "1042" _null_ _null_ _null_ _null_ _null_ bpcharout _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2913 ( bpchartypmodin PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 23 "1263" _null_ _null_ _null_ _null_ _null_ bpchartypmodin _null_ _null_ _null_ ));+DESCR("I/O typmod");+DATA(insert OID = 2914 ( bpchartypmodout PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2275 "23" _null_ _null_ _null_ _null_ _null_ bpchartypmodout _null_ _null_ _null_ ));+DESCR("I/O typmod");+DATA(insert OID = 1046 ( varcharin PGNSP PGUID 12 1 0 0 0 f f f f t f i 3 0 1043 "2275 26 23" _null_ _null_ _null_ _null_ _null_ varcharin _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 1047 ( varcharout PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2275 "1043" _null_ _null_ _null_ _null_ _null_ varcharout _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2915 ( varchartypmodin PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 23 "1263" _null_ _null_ _null_ _null_ _null_ varchartypmodin _null_ _null_ _null_ ));+DESCR("I/O typmod");+DATA(insert OID = 2916 ( varchartypmodout PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2275 "23" _null_ _null_ _null_ _null_ _null_ varchartypmodout _null_ _null_ _null_ ));+DESCR("I/O typmod");+DATA(insert OID = 1048 ( bpchareq PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "1042 1042" _null_ _null_ _null_ _null_ _null_ bpchareq _null_ _null_ _null_ ));+DATA(insert OID = 1049 ( bpcharlt PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "1042 1042" _null_ _null_ _null_ _null_ _null_ bpcharlt _null_ _null_ _null_ ));+DATA(insert OID = 1050 ( bpcharle PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "1042 1042" _null_ _null_ _null_ _null_ _null_ bpcharle _null_ _null_ _null_ ));+DATA(insert OID = 1051 ( bpchargt PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "1042 1042" _null_ _null_ _null_ _null_ _null_ bpchargt _null_ _null_ _null_ ));+DATA(insert OID = 1052 ( bpcharge PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "1042 1042" _null_ _null_ _null_ _null_ _null_ bpcharge _null_ _null_ _null_ ));+DATA(insert OID = 1053 ( bpcharne PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "1042 1042" _null_ _null_ _null_ _null_ _null_ bpcharne _null_ _null_ _null_ ));+DATA(insert OID = 1063 ( bpchar_larger PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1042 "1042 1042" _null_ _null_ _null_ _null_ _null_ bpchar_larger _null_ _null_ _null_ ));+DESCR("larger of two");+DATA(insert OID = 1064 ( bpchar_smaller PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1042 "1042 1042" _null_ _null_ _null_ _null_ _null_ bpchar_smaller _null_ _null_ _null_ ));+DESCR("smaller of two");+DATA(insert OID = 1078 ( bpcharcmp PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "1042 1042" _null_ _null_ _null_ _null_ _null_ bpcharcmp _null_ _null_ _null_ ));+DESCR("less-equal-greater");+DATA(insert OID = 1080 ( hashbpchar PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 23 "1042" _null_ _null_ _null_ _null_ _null_ hashbpchar _null_ _null_ _null_ ));+DESCR("hash");+DATA(insert OID = 1081 ( format_type PGNSP PGUID 12 1 0 0 0 f f f f f f s 2 0 25 "26 23" _null_ _null_ _null_ _null_ _null_ format_type _null_ _null_ _null_ ));+DESCR("format a type oid and atttypmod to canonical SQL");+DATA(insert OID = 1084 ( date_in PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 1082 "2275" _null_ _null_ _null_ _null_ _null_ date_in _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 1085 ( date_out PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 2275 "1082" _null_ _null_ _null_ _null_ _null_ date_out _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 1086 ( date_eq PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "1082 1082" _null_ _null_ _null_ _null_ _null_ date_eq _null_ _null_ _null_ ));+DATA(insert OID = 1087 ( date_lt PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "1082 1082" _null_ _null_ _null_ _null_ _null_ date_lt _null_ _null_ _null_ ));+DATA(insert OID = 1088 ( date_le PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "1082 1082" _null_ _null_ _null_ _null_ _null_ date_le _null_ _null_ _null_ ));+DATA(insert OID = 1089 ( date_gt PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "1082 1082" _null_ _null_ _null_ _null_ _null_ date_gt _null_ _null_ _null_ ));+DATA(insert OID = 1090 ( date_ge PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "1082 1082" _null_ _null_ _null_ _null_ _null_ date_ge _null_ _null_ _null_ ));+DATA(insert OID = 1091 ( date_ne PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "1082 1082" _null_ _null_ _null_ _null_ _null_ date_ne _null_ _null_ _null_ ));+DATA(insert OID = 1092 ( date_cmp PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "1082 1082" _null_ _null_ _null_ _null_ _null_ date_cmp _null_ _null_ _null_ ));+DESCR("less-equal-greater");+DATA(insert OID = 3136 ( date_sortsupport PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2278 "2281" _null_ _null_ _null_ _null_ _null_ date_sortsupport _null_ _null_ _null_ ));+DESCR("sort support");++/* OIDS 1100 - 1199 */++DATA(insert OID = 1102 ( time_lt PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "1083 1083" _null_ _null_ _null_ _null_ _null_ time_lt _null_ _null_ _null_ ));+DATA(insert OID = 1103 ( time_le PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "1083 1083" _null_ _null_ _null_ _null_ _null_ time_le _null_ _null_ _null_ ));+DATA(insert OID = 1104 ( time_gt PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "1083 1083" _null_ _null_ _null_ _null_ _null_ time_gt _null_ _null_ _null_ ));+DATA(insert OID = 1105 ( time_ge PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "1083 1083" _null_ _null_ _null_ _null_ _null_ time_ge _null_ _null_ _null_ ));+DATA(insert OID = 1106 ( time_ne PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "1083 1083" _null_ _null_ _null_ _null_ _null_ time_ne _null_ _null_ _null_ ));+DATA(insert OID = 1107 ( time_cmp PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "1083 1083" _null_ _null_ _null_ _null_ _null_ time_cmp _null_ _null_ _null_ ));+DESCR("less-equal-greater");+DATA(insert OID = 1138 ( date_larger PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1082 "1082 1082" _null_ _null_ _null_ _null_ _null_ date_larger _null_ _null_ _null_ ));+DESCR("larger of two");+DATA(insert OID = 1139 ( date_smaller PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1082 "1082 1082" _null_ _null_ _null_ _null_ _null_ date_smaller _null_ _null_ _null_ ));+DESCR("smaller of two");+DATA(insert OID = 1140 ( date_mi PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "1082 1082" _null_ _null_ _null_ _null_ _null_ date_mi _null_ _null_ _null_ ));+DATA(insert OID = 1141 ( date_pli PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1082 "1082 23" _null_ _null_ _null_ _null_ _null_ date_pli _null_ _null_ _null_ ));+DATA(insert OID = 1142 ( date_mii PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1082 "1082 23" _null_ _null_ _null_ _null_ _null_ date_mii _null_ _null_ _null_ ));+DATA(insert OID = 1143 ( time_in PGNSP PGUID 12 1 0 0 0 f f f f t f s 3 0 1083 "2275 26 23" _null_ _null_ _null_ _null_ _null_ time_in _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 1144 ( time_out PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2275 "1083" _null_ _null_ _null_ _null_ _null_ time_out _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2909 ( timetypmodin PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 23 "1263" _null_ _null_ _null_ _null_ _null_ timetypmodin _null_ _null_ _null_ ));+DESCR("I/O typmod");+DATA(insert OID = 2910 ( timetypmodout PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2275 "23" _null_ _null_ _null_ _null_ _null_ timetypmodout _null_ _null_ _null_ ));+DESCR("I/O typmod");+DATA(insert OID = 1145 ( time_eq PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "1083 1083" _null_ _null_ _null_ _null_ _null_ time_eq _null_ _null_ _null_ ));++DATA(insert OID = 1146 ( circle_add_pt PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 718 "718 600" _null_ _null_ _null_ _null_ _null_ circle_add_pt _null_ _null_ _null_ ));+DATA(insert OID = 1147 ( circle_sub_pt PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 718 "718 600" _null_ _null_ _null_ _null_ _null_ circle_sub_pt _null_ _null_ _null_ ));+DATA(insert OID = 1148 ( circle_mul_pt PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 718 "718 600" _null_ _null_ _null_ _null_ _null_ circle_mul_pt _null_ _null_ _null_ ));+DATA(insert OID = 1149 ( circle_div_pt PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 718 "718 600" _null_ _null_ _null_ _null_ _null_ circle_div_pt _null_ _null_ _null_ ));++DATA(insert OID = 1150 ( timestamptz_in PGNSP PGUID 12 1 0 0 0 f f f f t f s 3 0 1184 "2275 26 23" _null_ _null_ _null_ _null_ _null_ timestamptz_in _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 1151 ( timestamptz_out PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 2275 "1184" _null_ _null_ _null_ _null_ _null_ timestamptz_out _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2907 ( timestamptztypmodin PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 23 "1263" _null_ _null_ _null_ _null_ _null_ timestamptztypmodin _null_ _null_ _null_ ));+DESCR("I/O typmod");+DATA(insert OID = 2908 ( timestamptztypmodout PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2275 "23" _null_ _null_ _null_ _null_ _null_ timestamptztypmodout _null_ _null_ _null_ ));+DESCR("I/O typmod");+DATA(insert OID = 1152 ( timestamptz_eq PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "1184 1184" _null_ _null_ _null_ _null_ _null_ timestamp_eq _null_ _null_ _null_ ));+DATA(insert OID = 1153 ( timestamptz_ne PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "1184 1184" _null_ _null_ _null_ _null_ _null_ timestamp_ne _null_ _null_ _null_ ));+DATA(insert OID = 1154 ( timestamptz_lt PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "1184 1184" _null_ _null_ _null_ _null_ _null_ timestamp_lt _null_ _null_ _null_ ));+DATA(insert OID = 1155 ( timestamptz_le PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "1184 1184" _null_ _null_ _null_ _null_ _null_ timestamp_le _null_ _null_ _null_ ));+DATA(insert OID = 1156 ( timestamptz_ge PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "1184 1184" _null_ _null_ _null_ _null_ _null_ timestamp_ge _null_ _null_ _null_ ));+DATA(insert OID = 1157 ( timestamptz_gt PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "1184 1184" _null_ _null_ _null_ _null_ _null_ timestamp_gt _null_ _null_ _null_ ));+DATA(insert OID = 1158 ( to_timestamp PGNSP PGUID 14 1 0 0 0 f f f f t f i 1 0 1184 "701" _null_ _null_ _null_ _null_ _null_ "select (''epoch''::pg_catalog.timestamptz + $1 * ''1 second''::pg_catalog.interval)" _null_ _null_ _null_ ));+DESCR("convert UNIX epoch to timestamptz");+DATA(insert OID = 3995 ( timestamp_zone_transform PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2281 "2281" _null_ _null_ _null_ _null_ _null_ timestamp_zone_transform _null_ _null_ _null_ ));+DESCR("transform a time zone adjustment");+DATA(insert OID = 1159 ( timezone PGNSP PGUID 12 1 0 0 timestamp_zone_transform f f f f t f i 2 0 1114 "25 1184" _null_ _null_ _null_ _null_ _null_ timestamptz_zone _null_ _null_ _null_ ));+DESCR("adjust timestamp to new time zone");++DATA(insert OID = 1160 ( interval_in PGNSP PGUID 12 1 0 0 0 f f f f t f s 3 0 1186 "2275 26 23" _null_ _null_ _null_ _null_ _null_ interval_in _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 1161 ( interval_out PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2275 "1186" _null_ _null_ _null_ _null_ _null_ interval_out _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2903 ( intervaltypmodin PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 23 "1263" _null_ _null_ _null_ _null_ _null_ intervaltypmodin _null_ _null_ _null_ ));+DESCR("I/O typmod");+DATA(insert OID = 2904 ( intervaltypmodout PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2275 "23" _null_ _null_ _null_ _null_ _null_ intervaltypmodout _null_ _null_ _null_ ));+DESCR("I/O typmod");+DATA(insert OID = 1162 ( interval_eq PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "1186 1186" _null_ _null_ _null_ _null_ _null_ interval_eq _null_ _null_ _null_ ));+DATA(insert OID = 1163 ( interval_ne PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "1186 1186" _null_ _null_ _null_ _null_ _null_ interval_ne _null_ _null_ _null_ ));+DATA(insert OID = 1164 ( interval_lt PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "1186 1186" _null_ _null_ _null_ _null_ _null_ interval_lt _null_ _null_ _null_ ));+DATA(insert OID = 1165 ( interval_le PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "1186 1186" _null_ _null_ _null_ _null_ _null_ interval_le _null_ _null_ _null_ ));+DATA(insert OID = 1166 ( interval_ge PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "1186 1186" _null_ _null_ _null_ _null_ _null_ interval_ge _null_ _null_ _null_ ));+DATA(insert OID = 1167 ( interval_gt PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "1186 1186" _null_ _null_ _null_ _null_ _null_ interval_gt _null_ _null_ _null_ ));+DATA(insert OID = 1168 ( interval_um PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 1186 "1186" _null_ _null_ _null_ _null_ _null_ interval_um _null_ _null_ _null_ ));+DATA(insert OID = 1169 ( interval_pl PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1186 "1186 1186" _null_ _null_ _null_ _null_ _null_ interval_pl _null_ _null_ _null_ ));+DATA(insert OID = 1170 ( interval_mi PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1186 "1186 1186" _null_ _null_ _null_ _null_ _null_ interval_mi _null_ _null_ _null_ ));+DATA(insert OID = 1171 ( date_part PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 701 "25 1184" _null_ _null_ _null_ _null_ _null_ timestamptz_part _null_ _null_ _null_ ));+DESCR("extract field from timestamp with time zone");+DATA(insert OID = 1172 ( date_part PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 701 "25 1186" _null_ _null_ _null_ _null_ _null_ interval_part _null_ _null_ _null_ ));+DESCR("extract field from interval");+DATA(insert OID = 1173 ( timestamptz PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 1184 "702" _null_ _null_ _null_ _null_ _null_ abstime_timestamptz _null_ _null_ _null_ ));+DESCR("convert abstime to timestamp with time zone");+DATA(insert OID = 1174 ( timestamptz PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 1184 "1082" _null_ _null_ _null_ _null_ _null_ date_timestamptz _null_ _null_ _null_ ));+DESCR("convert date to timestamp with time zone");+DATA(insert OID = 2711 ( justify_interval PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 1186 "1186" _null_ _null_ _null_ _null_ _null_ interval_justify_interval _null_ _null_ _null_ ));+DESCR("promote groups of 24 hours to numbers of days and promote groups of 30 days to numbers of months");+DATA(insert OID = 1175 ( justify_hours PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 1186 "1186" _null_ _null_ _null_ _null_ _null_ interval_justify_hours _null_ _null_ _null_ ));+DESCR("promote groups of 24 hours to numbers of days");+DATA(insert OID = 1295 ( justify_days PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 1186 "1186" _null_ _null_ _null_ _null_ _null_ interval_justify_days _null_ _null_ _null_ ));+DESCR("promote groups of 30 days to numbers of months");+DATA(insert OID = 1176 ( timestamptz PGNSP PGUID 14 1 0 0 0 f f f f t f s 2 0 1184 "1082 1083" _null_ _null_ _null_ _null_ _null_ "select cast(($1 + $2) as timestamp with time zone)" _null_ _null_ _null_ ));+DESCR("convert date and time to timestamp with time zone");+DATA(insert OID = 1177 ( interval PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 1186 "703" _null_ _null_ _null_ _null_ _null_ reltime_interval _null_ _null_ _null_ ));+DESCR("convert reltime to interval");+DATA(insert OID = 1178 ( date PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 1082 "1184" _null_ _null_ _null_ _null_ _null_ timestamptz_date _null_ _null_ _null_ ));+DESCR("convert timestamp with time zone to date");+DATA(insert OID = 1179 ( date PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 1082 "702" _null_ _null_ _null_ _null_ _null_ abstime_date _null_ _null_ _null_ ));+DESCR("convert abstime to date");+DATA(insert OID = 1180 ( abstime PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 702 "1184" _null_ _null_ _null_ _null_ _null_ timestamptz_abstime _null_ _null_ _null_ ));+DESCR("convert timestamp with time zone to abstime");+DATA(insert OID = 1181 ( age PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 23 "28" _null_ _null_ _null_ _null_ _null_ xid_age _null_ _null_ _null_ ));+DESCR("age of a transaction ID, in transactions before current transaction");+DATA(insert OID = 3939 ( mxid_age PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 23 "28" _null_ _null_ _null_ _null_ _null_ mxid_age _null_ _null_ _null_ ));+DESCR("age of a multi-transaction ID, in multi-transactions before current multi-transaction");++DATA(insert OID = 1188 ( timestamptz_mi PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1186 "1184 1184" _null_ _null_ _null_ _null_ _null_ timestamp_mi _null_ _null_ _null_ ));+DATA(insert OID = 1189 ( timestamptz_pl_interval PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 1184 "1184 1186" _null_ _null_ _null_ _null_ _null_ timestamptz_pl_interval _null_ _null_ _null_ ));+DATA(insert OID = 1190 ( timestamptz_mi_interval PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 1184 "1184 1186" _null_ _null_ _null_ _null_ _null_ timestamptz_mi_interval _null_ _null_ _null_ ));+DATA(insert OID = 1194 ( reltime PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 703 "1186" _null_ _null_ _null_ _null_ _null_ interval_reltime _null_ _null_ _null_ ));+DESCR("convert interval to reltime");+DATA(insert OID = 1195 ( timestamptz_smaller PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1184 "1184 1184" _null_ _null_ _null_ _null_ _null_ timestamp_smaller _null_ _null_ _null_ ));+DESCR("smaller of two");+DATA(insert OID = 1196 ( timestamptz_larger PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1184 "1184 1184" _null_ _null_ _null_ _null_ _null_ timestamp_larger _null_ _null_ _null_ ));+DESCR("larger of two");+DATA(insert OID = 1197 ( interval_smaller PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1186 "1186 1186" _null_ _null_ _null_ _null_ _null_ interval_smaller _null_ _null_ _null_ ));+DESCR("smaller of two");+DATA(insert OID = 1198 ( interval_larger PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1186 "1186 1186" _null_ _null_ _null_ _null_ _null_ interval_larger _null_ _null_ _null_ ));+DESCR("larger of two");+DATA(insert OID = 1199 ( age PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1186 "1184 1184" _null_ _null_ _null_ _null_ _null_ timestamptz_age _null_ _null_ _null_ ));+DESCR("date difference preserving months and years");++/* OIDS 1200 - 1299 */++DATA(insert OID = 3918 ( interval_transform PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2281 "2281" _null_ _null_ _null_ _null_ _null_ interval_transform _null_ _null_ _null_ ));+DESCR("transform an interval length coercion");+DATA(insert OID = 1200 ( interval PGNSP PGUID 12 1 0 0 interval_transform f f f f t f i 2 0 1186 "1186 23" _null_ _null_ _null_ _null_ _null_ interval_scale _null_ _null_ _null_ ));+DESCR("adjust interval precision");++DATA(insert OID = 1215 ( obj_description PGNSP PGUID 14 100 0 0 0 f f f f t f s 2 0 25 "26 19" _null_ _null_ _null_ _null_ _null_ "select description from pg_catalog.pg_description where objoid = $1 and classoid = (select oid from pg_catalog.pg_class where relname = $2 and relnamespace = PGNSP) and objsubid = 0" _null_ _null_ _null_ ));+DESCR("get description for object id and catalog name");+DATA(insert OID = 1216 ( col_description PGNSP PGUID 14 100 0 0 0 f f f f t f s 2 0 25 "26 23" _null_ _null_ _null_ _null_ _null_ "select description from pg_catalog.pg_description where objoid = $1 and classoid = ''pg_catalog.pg_class''::pg_catalog.regclass and objsubid = $2" _null_ _null_ _null_ ));+DESCR("get description for table column");+DATA(insert OID = 1993 ( shobj_description PGNSP PGUID 14 100 0 0 0 f f f f t f s 2 0 25 "26 19" _null_ _null_ _null_ _null_ _null_ "select description from pg_catalog.pg_shdescription where objoid = $1 and classoid = (select oid from pg_catalog.pg_class where relname = $2 and relnamespace = PGNSP)" _null_ _null_ _null_ ));+DESCR("get description for object id and shared catalog name");++DATA(insert OID = 1217 ( date_trunc PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 1184 "25 1184" _null_ _null_ _null_ _null_ _null_ timestamptz_trunc _null_ _null_ _null_ ));+DESCR("truncate timestamp with time zone to specified units");+DATA(insert OID = 1218 ( date_trunc PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1186 "25 1186" _null_ _null_ _null_ _null_ _null_ interval_trunc _null_ _null_ _null_ ));+DESCR("truncate interval to specified units");++DATA(insert OID = 1219 ( int8inc PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 20 "20" _null_ _null_ _null_ _null_ _null_ int8inc _null_ _null_ _null_ ));+DESCR("increment");+DATA(insert OID = 3546 ( int8dec PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 20 "20" _null_ _null_ _null_ _null_ _null_ int8dec _null_ _null_ _null_ ));+DESCR("decrement");+DATA(insert OID = 2804 ( int8inc_any PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 20 "20 2276" _null_ _null_ _null_ _null_ _null_ int8inc_any _null_ _null_ _null_ ));+DESCR("increment, ignores second argument");+DATA(insert OID = 3547 ( int8dec_any PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 20 "20 2276" _null_ _null_ _null_ _null_ _null_ int8dec_any _null_ _null_ _null_ ));+DESCR("decrement, ignores second argument");+DATA(insert OID = 1230 ( int8abs PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 20 "20" _null_ _null_ _null_ _null_ _null_ int8abs _null_ _null_ _null_ ));++DATA(insert OID = 1236 ( int8larger PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 20 "20 20" _null_ _null_ _null_ _null_ _null_ int8larger _null_ _null_ _null_ ));+DESCR("larger of two");+DATA(insert OID = 1237 ( int8smaller PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 20 "20 20" _null_ _null_ _null_ _null_ _null_ int8smaller _null_ _null_ _null_ ));+DESCR("smaller of two");++DATA(insert OID = 1238 ( texticregexeq PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "25 25" _null_ _null_ _null_ _null_ _null_ texticregexeq _null_ _null_ _null_ ));+DATA(insert OID = 1239 ( texticregexne PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "25 25" _null_ _null_ _null_ _null_ _null_ texticregexne _null_ _null_ _null_ ));+DATA(insert OID = 1240 ( nameicregexeq PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "19 25" _null_ _null_ _null_ _null_ _null_ nameicregexeq _null_ _null_ _null_ ));+DATA(insert OID = 1241 ( nameicregexne PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "19 25" _null_ _null_ _null_ _null_ _null_ nameicregexne _null_ _null_ _null_ ));++DATA(insert OID = 1251 ( int4abs PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 23 "23" _null_ _null_ _null_ _null_ _null_ int4abs _null_ _null_ _null_ ));+DATA(insert OID = 1253 ( int2abs PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 21 "21" _null_ _null_ _null_ _null_ _null_ int2abs _null_ _null_ _null_ ));++DATA(insert OID = 1271 ( overlaps PGNSP PGUID 12 1 0 0 0 f f f f f f i 4 0 16 "1266 1266 1266 1266" _null_ _null_ _null_ _null_ _null_ overlaps_timetz _null_ _null_ _null_ ));+DESCR("intervals overlap?");+DATA(insert OID = 1272 ( datetime_pl PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1114 "1082 1083" _null_ _null_ _null_ _null_ _null_ datetime_timestamp _null_ _null_ _null_ ));+DATA(insert OID = 1273 ( date_part PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 701 "25 1266" _null_ _null_ _null_ _null_ _null_ timetz_part _null_ _null_ _null_ ));+DESCR("extract field from time with time zone");+DATA(insert OID = 1274 ( int84pl PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 20 "20 23" _null_ _null_ _null_ _null_ _null_ int84pl _null_ _null_ _null_ ));+DATA(insert OID = 1275 ( int84mi PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 20 "20 23" _null_ _null_ _null_ _null_ _null_ int84mi _null_ _null_ _null_ ));+DATA(insert OID = 1276 ( int84mul PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 20 "20 23" _null_ _null_ _null_ _null_ _null_ int84mul _null_ _null_ _null_ ));+DATA(insert OID = 1277 ( int84div PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 20 "20 23" _null_ _null_ _null_ _null_ _null_ int84div _null_ _null_ _null_ ));+DATA(insert OID = 1278 ( int48pl PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 20 "23 20" _null_ _null_ _null_ _null_ _null_ int48pl _null_ _null_ _null_ ));+DATA(insert OID = 1279 ( int48mi PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 20 "23 20" _null_ _null_ _null_ _null_ _null_ int48mi _null_ _null_ _null_ ));+DATA(insert OID = 1280 ( int48mul PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 20 "23 20" _null_ _null_ _null_ _null_ _null_ int48mul _null_ _null_ _null_ ));+DATA(insert OID = 1281 ( int48div PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 20 "23 20" _null_ _null_ _null_ _null_ _null_ int48div _null_ _null_ _null_ ));++DATA(insert OID = 837 ( int82pl PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 20 "20 21" _null_ _null_ _null_ _null_ _null_ int82pl _null_ _null_ _null_ ));+DATA(insert OID = 838 ( int82mi PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 20 "20 21" _null_ _null_ _null_ _null_ _null_ int82mi _null_ _null_ _null_ ));+DATA(insert OID = 839 ( int82mul PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 20 "20 21" _null_ _null_ _null_ _null_ _null_ int82mul _null_ _null_ _null_ ));+DATA(insert OID = 840 ( int82div PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 20 "20 21" _null_ _null_ _null_ _null_ _null_ int82div _null_ _null_ _null_ ));+DATA(insert OID = 841 ( int28pl PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 20 "21 20" _null_ _null_ _null_ _null_ _null_ int28pl _null_ _null_ _null_ ));+DATA(insert OID = 942 ( int28mi PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 20 "21 20" _null_ _null_ _null_ _null_ _null_ int28mi _null_ _null_ _null_ ));+DATA(insert OID = 943 ( int28mul PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 20 "21 20" _null_ _null_ _null_ _null_ _null_ int28mul _null_ _null_ _null_ ));+DATA(insert OID = 948 ( int28div PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 20 "21 20" _null_ _null_ _null_ _null_ _null_ int28div _null_ _null_ _null_ ));++DATA(insert OID = 1287 ( oid PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 26 "20" _null_ _null_ _null_ _null_ _null_ i8tooid _null_ _null_ _null_ ));+DESCR("convert int8 to oid");+DATA(insert OID = 1288 ( int8 PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 20 "26" _null_ _null_ _null_ _null_ _null_ oidtoi8 _null_ _null_ _null_ ));+DESCR("convert oid to int8");++DATA(insert OID = 1291 ( suppress_redundant_updates_trigger PGNSP PGUID 12 1 0 0 0 f f f f t f v 0 0 2279 "" _null_ _null_ _null_ _null_ _null_ suppress_redundant_updates_trigger _null_ _null_ _null_ ));+DESCR("trigger to suppress updates when new and old records match");++DATA(insert OID = 1292 ( tideq PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "27 27" _null_ _null_ _null_ _null_ _null_ tideq _null_ _null_ _null_ ));+DATA(insert OID = 1293 ( currtid PGNSP PGUID 12 1 0 0 0 f f f f t f v 2 0 27 "26 27" _null_ _null_ _null_ _null_ _null_ currtid_byreloid _null_ _null_ _null_ ));+DESCR("latest tid of a tuple");+DATA(insert OID = 1294 ( currtid2 PGNSP PGUID 12 1 0 0 0 f f f f t f v 2 0 27 "25 27" _null_ _null_ _null_ _null_ _null_ currtid_byrelname _null_ _null_ _null_ ));+DESCR("latest tid of a tuple");+DATA(insert OID = 1265 ( tidne PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "27 27" _null_ _null_ _null_ _null_ _null_ tidne _null_ _null_ _null_ ));+DATA(insert OID = 2790 ( tidgt PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "27 27" _null_ _null_ _null_ _null_ _null_ tidgt _null_ _null_ _null_ ));+DATA(insert OID = 2791 ( tidlt PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "27 27" _null_ _null_ _null_ _null_ _null_ tidlt _null_ _null_ _null_ ));+DATA(insert OID = 2792 ( tidge PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "27 27" _null_ _null_ _null_ _null_ _null_ tidge _null_ _null_ _null_ ));+DATA(insert OID = 2793 ( tidle PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "27 27" _null_ _null_ _null_ _null_ _null_ tidle _null_ _null_ _null_ ));+DATA(insert OID = 2794 ( bttidcmp PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "27 27" _null_ _null_ _null_ _null_ _null_ bttidcmp _null_ _null_ _null_ ));+DESCR("less-equal-greater");+DATA(insert OID = 2795 ( tidlarger PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 27 "27 27" _null_ _null_ _null_ _null_ _null_ tidlarger _null_ _null_ _null_ ));+DESCR("larger of two");+DATA(insert OID = 2796 ( tidsmaller PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 27 "27 27" _null_ _null_ _null_ _null_ _null_ tidsmaller _null_ _null_ _null_ ));+DESCR("smaller of two");++DATA(insert OID = 1296 ( timedate_pl PGNSP PGUID 14 1 0 0 0 f f f f t f i 2 0 1114 "1083 1082" _null_ _null_ _null_ _null_ _null_ "select ($2 + $1)" _null_ _null_ _null_ ));+DATA(insert OID = 1297 ( datetimetz_pl PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1184 "1082 1266" _null_ _null_ _null_ _null_ _null_ datetimetz_timestamptz _null_ _null_ _null_ ));+DATA(insert OID = 1298 ( timetzdate_pl PGNSP PGUID 14 1 0 0 0 f f f f t f i 2 0 1184 "1266 1082" _null_ _null_ _null_ _null_ _null_ "select ($2 + $1)" _null_ _null_ _null_ ));+DATA(insert OID = 1299 ( now PGNSP PGUID 12 1 0 0 0 f f f f t f s 0 0 1184 "" _null_ _null_ _null_ _null_ _null_ now _null_ _null_ _null_ ));+DESCR("current transaction time");+DATA(insert OID = 2647 ( transaction_timestamp PGNSP PGUID 12 1 0 0 0 f f f f t f s 0 0 1184 "" _null_ _null_ _null_ _null_ _null_ now _null_ _null_ _null_ ));+DESCR("current transaction time");+DATA(insert OID = 2648 ( statement_timestamp PGNSP PGUID 12 1 0 0 0 f f f f t f s 0 0 1184 "" _null_ _null_ _null_ _null_ _null_ statement_timestamp _null_ _null_ _null_ ));+DESCR("current statement time");+DATA(insert OID = 2649 ( clock_timestamp PGNSP PGUID 12 1 0 0 0 f f f f t f v 0 0 1184 "" _null_ _null_ _null_ _null_ _null_ clock_timestamp _null_ _null_ _null_ ));+DESCR("current clock time");++/* OIDS 1300 - 1399 */++DATA(insert OID = 1300 ( positionsel PGNSP PGUID 12 1 0 0 0 f f f f t f s 4 0 701 "2281 26 2281 23" _null_ _null_ _null_ _null_ _null_ positionsel _null_ _null_ _null_ ));+DESCR("restriction selectivity for position-comparison operators");+DATA(insert OID = 1301 ( positionjoinsel PGNSP PGUID 12 1 0 0 0 f f f f t f s 5 0 701 "2281 26 2281 21 2281" _null_ _null_ _null_ _null_ _null_ positionjoinsel _null_ _null_ _null_ ));+DESCR("join selectivity for position-comparison operators");+DATA(insert OID = 1302 ( contsel PGNSP PGUID 12 1 0 0 0 f f f f t f s 4 0 701 "2281 26 2281 23" _null_ _null_ _null_ _null_ _null_ contsel _null_ _null_ _null_ ));+DESCR("restriction selectivity for containment comparison operators");+DATA(insert OID = 1303 ( contjoinsel PGNSP PGUID 12 1 0 0 0 f f f f t f s 5 0 701 "2281 26 2281 21 2281" _null_ _null_ _null_ _null_ _null_ contjoinsel _null_ _null_ _null_ ));+DESCR("join selectivity for containment comparison operators");++DATA(insert OID = 1304 ( overlaps PGNSP PGUID 12 1 0 0 0 f f f f f f i 4 0 16 "1184 1184 1184 1184" _null_ _null_ _null_ _null_ _null_ overlaps_timestamp _null_ _null_ _null_ ));+DESCR("intervals overlap?");+DATA(insert OID = 1305 ( overlaps PGNSP PGUID 14 1 0 0 0 f f f f f f s 4 0 16 "1184 1186 1184 1186" _null_ _null_ _null_ _null_ _null_ "select ($1, ($1 + $2)) overlaps ($3, ($3 + $4))" _null_ _null_ _null_ ));+DESCR("intervals overlap?");+DATA(insert OID = 1306 ( overlaps PGNSP PGUID 14 1 0 0 0 f f f f f f s 4 0 16 "1184 1184 1184 1186" _null_ _null_ _null_ _null_ _null_ "select ($1, $2) overlaps ($3, ($3 + $4))" _null_ _null_ _null_ ));+DESCR("intervals overlap?");+DATA(insert OID = 1307 ( overlaps PGNSP PGUID 14 1 0 0 0 f f f f f f s 4 0 16 "1184 1186 1184 1184" _null_ _null_ _null_ _null_ _null_ "select ($1, ($1 + $2)) overlaps ($3, $4)" _null_ _null_ _null_ ));+DESCR("intervals overlap?");++DATA(insert OID = 1308 ( overlaps PGNSP PGUID 12 1 0 0 0 f f f f f f i 4 0 16 "1083 1083 1083 1083" _null_ _null_ _null_ _null_ _null_ overlaps_time _null_ _null_ _null_ ));+DESCR("intervals overlap?");+DATA(insert OID = 1309 ( overlaps PGNSP PGUID 14 1 0 0 0 f f f f f f i 4 0 16 "1083 1186 1083 1186" _null_ _null_ _null_ _null_ _null_ "select ($1, ($1 + $2)) overlaps ($3, ($3 + $4))" _null_ _null_ _null_ ));+DESCR("intervals overlap?");+DATA(insert OID = 1310 ( overlaps PGNSP PGUID 14 1 0 0 0 f f f f f f i 4 0 16 "1083 1083 1083 1186" _null_ _null_ _null_ _null_ _null_ "select ($1, $2) overlaps ($3, ($3 + $4))" _null_ _null_ _null_ ));+DESCR("intervals overlap?");+DATA(insert OID = 1311 ( overlaps PGNSP PGUID 14 1 0 0 0 f f f f f f i 4 0 16 "1083 1186 1083 1083" _null_ _null_ _null_ _null_ _null_ "select ($1, ($1 + $2)) overlaps ($3, $4)" _null_ _null_ _null_ ));+DESCR("intervals overlap?");++DATA(insert OID = 1312 ( timestamp_in PGNSP PGUID 12 1 0 0 0 f f f f t f s 3 0 1114 "2275 26 23" _null_ _null_ _null_ _null_ _null_ timestamp_in _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 1313 ( timestamp_out PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 2275 "1114" _null_ _null_ _null_ _null_ _null_ timestamp_out _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2905 ( timestamptypmodin PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 23 "1263" _null_ _null_ _null_ _null_ _null_ timestamptypmodin _null_ _null_ _null_ ));+DESCR("I/O typmod");+DATA(insert OID = 2906 ( timestamptypmodout PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2275 "23" _null_ _null_ _null_ _null_ _null_ timestamptypmodout _null_ _null_ _null_ ));+DESCR("I/O typmod");+DATA(insert OID = 1314 ( timestamptz_cmp PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "1184 1184" _null_ _null_ _null_ _null_ _null_ timestamp_cmp _null_ _null_ _null_ ));+DESCR("less-equal-greater");+DATA(insert OID = 1315 ( interval_cmp PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "1186 1186" _null_ _null_ _null_ _null_ _null_ interval_cmp _null_ _null_ _null_ ));+DESCR("less-equal-greater");+DATA(insert OID = 1316 ( time PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 1083 "1114" _null_ _null_ _null_ _null_ _null_ timestamp_time _null_ _null_ _null_ ));+DESCR("convert timestamp to time");++DATA(insert OID = 1317 ( length PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 23 "25" _null_ _null_ _null_ _null_ _null_ textlen _null_ _null_ _null_ ));+DESCR("length");+DATA(insert OID = 1318 ( length PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 23 "1042" _null_ _null_ _null_ _null_ _null_ bpcharlen _null_ _null_ _null_ ));+DESCR("character length");++DATA(insert OID = 1319 ( xideqint4 PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "28 23" _null_ _null_ _null_ _null_ _null_ xideq _null_ _null_ _null_ ));++DATA(insert OID = 1326 ( interval_div PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1186 "1186 701" _null_ _null_ _null_ _null_ _null_ interval_div _null_ _null_ _null_ ));++DATA(insert OID = 1339 ( dlog10 PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 701 "701" _null_ _null_ _null_ _null_ _null_ dlog10 _null_ _null_ _null_ ));+DESCR("base 10 logarithm");+DATA(insert OID = 1340 ( log PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 701 "701" _null_ _null_ _null_ _null_ _null_ dlog10 _null_ _null_ _null_ ));+DESCR("base 10 logarithm");+DATA(insert OID = 1341 ( ln PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 701 "701" _null_ _null_ _null_ _null_ _null_ dlog1 _null_ _null_ _null_ ));+DESCR("natural logarithm");+DATA(insert OID = 1342 ( round PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 701 "701" _null_ _null_ _null_ _null_ _null_ dround _null_ _null_ _null_ ));+DESCR("round to nearest integer");+DATA(insert OID = 1343 ( trunc PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 701 "701" _null_ _null_ _null_ _null_ _null_ dtrunc _null_ _null_ _null_ ));+DESCR("truncate to integer");+DATA(insert OID = 1344 ( sqrt PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 701 "701" _null_ _null_ _null_ _null_ _null_ dsqrt _null_ _null_ _null_ ));+DESCR("square root");+DATA(insert OID = 1345 ( cbrt PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 701 "701" _null_ _null_ _null_ _null_ _null_ dcbrt _null_ _null_ _null_ ));+DESCR("cube root");+DATA(insert OID = 1346 ( pow PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 701 "701 701" _null_ _null_ _null_ _null_ _null_ dpow _null_ _null_ _null_ ));+DESCR("exponentiation");+DATA(insert OID = 1368 ( power PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 701 "701 701" _null_ _null_ _null_ _null_ _null_ dpow _null_ _null_ _null_ ));+DESCR("exponentiation");+DATA(insert OID = 1347 ( exp PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 701 "701" _null_ _null_ _null_ _null_ _null_ dexp _null_ _null_ _null_ ));+DESCR("natural exponential (e^x)");++/*+ * This form of obj_description is now deprecated, since it will fail if+ * OIDs are not unique across system catalogs. Use the other form instead.+ */+DATA(insert OID = 1348 ( obj_description PGNSP PGUID 14 100 0 0 0 f f f f t f s 1 0 25 "26" _null_ _null_ _null_ _null_ _null_ "select description from pg_catalog.pg_description where objoid = $1 and objsubid = 0" _null_ _null_ _null_ ));+DESCR("deprecated, use two-argument form instead");+DATA(insert OID = 1349 ( oidvectortypes PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 25 "30" _null_ _null_ _null_ _null_ _null_ oidvectortypes _null_ _null_ _null_ ));+DESCR("print type names of oidvector field");+++DATA(insert OID = 1350 ( timetz_in PGNSP PGUID 12 1 0 0 0 f f f f t f s 3 0 1266 "2275 26 23" _null_ _null_ _null_ _null_ _null_ timetz_in _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 1351 ( timetz_out PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2275 "1266" _null_ _null_ _null_ _null_ _null_ timetz_out _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2911 ( timetztypmodin PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 23 "1263" _null_ _null_ _null_ _null_ _null_ timetztypmodin _null_ _null_ _null_ ));+DESCR("I/O typmod");+DATA(insert OID = 2912 ( timetztypmodout PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2275 "23" _null_ _null_ _null_ _null_ _null_ timetztypmodout _null_ _null_ _null_ ));+DESCR("I/O typmod");+DATA(insert OID = 1352 ( timetz_eq PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "1266 1266" _null_ _null_ _null_ _null_ _null_ timetz_eq _null_ _null_ _null_ ));+DATA(insert OID = 1353 ( timetz_ne PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "1266 1266" _null_ _null_ _null_ _null_ _null_ timetz_ne _null_ _null_ _null_ ));+DATA(insert OID = 1354 ( timetz_lt PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "1266 1266" _null_ _null_ _null_ _null_ _null_ timetz_lt _null_ _null_ _null_ ));+DATA(insert OID = 1355 ( timetz_le PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "1266 1266" _null_ _null_ _null_ _null_ _null_ timetz_le _null_ _null_ _null_ ));+DATA(insert OID = 1356 ( timetz_ge PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "1266 1266" _null_ _null_ _null_ _null_ _null_ timetz_ge _null_ _null_ _null_ ));+DATA(insert OID = 1357 ( timetz_gt PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "1266 1266" _null_ _null_ _null_ _null_ _null_ timetz_gt _null_ _null_ _null_ ));+DATA(insert OID = 1358 ( timetz_cmp PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "1266 1266" _null_ _null_ _null_ _null_ _null_ timetz_cmp _null_ _null_ _null_ ));+DESCR("less-equal-greater");+DATA(insert OID = 1359 ( timestamptz PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1184 "1082 1266" _null_ _null_ _null_ _null_ _null_ datetimetz_timestamptz _null_ _null_ _null_ ));+DESCR("convert date and time with time zone to timestamp with time zone");++DATA(insert OID = 1364 ( time PGNSP PGUID 14 1 0 0 0 f f f f t f s 1 0 1083 "702" _null_ _null_ _null_ _null_ _null_ "select cast(cast($1 as timestamp without time zone) as pg_catalog.time)" _null_ _null_ _null_ ));+DESCR("convert abstime to time");++DATA(insert OID = 1367 ( character_length PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 23 "1042" _null_ _null_ _null_ _null_ _null_ bpcharlen _null_ _null_ _null_ ));+DESCR("character length");+DATA(insert OID = 1369 ( character_length PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 23 "25" _null_ _null_ _null_ _null_ _null_ textlen _null_ _null_ _null_ ));+DESCR("character length");++DATA(insert OID = 1370 ( interval PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 1186 "1083" _null_ _null_ _null_ _null_ _null_ time_interval _null_ _null_ _null_ ));+DESCR("convert time to interval");+DATA(insert OID = 1372 ( char_length PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 23 "1042" _null_ _null_ _null_ _null_ _null_ bpcharlen _null_ _null_ _null_ ));+DESCR("character length");+DATA(insert OID = 1374 ( octet_length PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 23 "25" _null_ _null_ _null_ _null_ _null_ textoctetlen _null_ _null_ _null_ ));+DESCR("octet length");+DATA(insert OID = 1375 ( octet_length PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 23 "1042" _null_ _null_ _null_ _null_ _null_ bpcharoctetlen _null_ _null_ _null_ ));+DESCR("octet length");++DATA(insert OID = 1377 ( time_larger PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1083 "1083 1083" _null_ _null_ _null_ _null_ _null_ time_larger _null_ _null_ _null_ ));+DESCR("larger of two");+DATA(insert OID = 1378 ( time_smaller PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1083 "1083 1083" _null_ _null_ _null_ _null_ _null_ time_smaller _null_ _null_ _null_ ));+DESCR("smaller of two");+DATA(insert OID = 1379 ( timetz_larger PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1266 "1266 1266" _null_ _null_ _null_ _null_ _null_ timetz_larger _null_ _null_ _null_ ));+DESCR("larger of two");+DATA(insert OID = 1380 ( timetz_smaller PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1266 "1266 1266" _null_ _null_ _null_ _null_ _null_ timetz_smaller _null_ _null_ _null_ ));+DESCR("smaller of two");++DATA(insert OID = 1381 ( char_length PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 23 "25" _null_ _null_ _null_ _null_ _null_ textlen _null_ _null_ _null_ ));+DESCR("character length");++DATA(insert OID = 1382 ( date_part PGNSP PGUID 14 1 0 0 0 f f f f t f s 2 0 701 "25 702" _null_ _null_ _null_ _null_ _null_ "select pg_catalog.date_part($1, cast($2 as timestamp with time zone))" _null_ _null_ _null_ ));+DESCR("extract field from abstime");+DATA(insert OID = 1383 ( date_part PGNSP PGUID 14 1 0 0 0 f f f f t f s 2 0 701 "25 703" _null_ _null_ _null_ _null_ _null_ "select pg_catalog.date_part($1, cast($2 as pg_catalog.interval))" _null_ _null_ _null_ ));+DESCR("extract field from reltime");+DATA(insert OID = 1384 ( date_part PGNSP PGUID 14 1 0 0 0 f f f f t f i 2 0 701 "25 1082" _null_ _null_ _null_ _null_ _null_ "select pg_catalog.date_part($1, cast($2 as timestamp without time zone))" _null_ _null_ _null_ ));+DESCR("extract field from date");+DATA(insert OID = 1385 ( date_part PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 701 "25 1083" _null_ _null_ _null_ _null_ _null_ time_part _null_ _null_ _null_ ));+DESCR("extract field from time");+DATA(insert OID = 1386 ( age PGNSP PGUID 14 1 0 0 0 f f f f t f s 1 0 1186 "1184" _null_ _null_ _null_ _null_ _null_ "select pg_catalog.age(cast(current_date as timestamp with time zone), $1)" _null_ _null_ _null_ ));+DESCR("date difference from today preserving months and years");++DATA(insert OID = 1388 ( timetz PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 1266 "1184" _null_ _null_ _null_ _null_ _null_ timestamptz_timetz _null_ _null_ _null_ ));+DESCR("convert timestamp with time zone to time with time zone");++DATA(insert OID = 1373 ( isfinite PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 16 "1082" _null_ _null_ _null_ _null_ _null_ date_finite _null_ _null_ _null_ ));+DESCR("finite date?");+DATA(insert OID = 1389 ( isfinite PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 16 "1184" _null_ _null_ _null_ _null_ _null_ timestamp_finite _null_ _null_ _null_ ));+DESCR("finite timestamp?");+DATA(insert OID = 1390 ( isfinite PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 16 "1186" _null_ _null_ _null_ _null_ _null_ interval_finite _null_ _null_ _null_ ));+DESCR("finite interval?");+++DATA(insert OID = 1376 ( factorial PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 1700 "20" _null_ _null_ _null_ _null_ _null_ numeric_fac _null_ _null_ _null_ ));+DESCR("factorial");+DATA(insert OID = 1394 ( abs PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 700 "700" _null_ _null_ _null_ _null_ _null_ float4abs _null_ _null_ _null_ ));+DESCR("absolute value");+DATA(insert OID = 1395 ( abs PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 701 "701" _null_ _null_ _null_ _null_ _null_ float8abs _null_ _null_ _null_ ));+DESCR("absolute value");+DATA(insert OID = 1396 ( abs PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 20 "20" _null_ _null_ _null_ _null_ _null_ int8abs _null_ _null_ _null_ ));+DESCR("absolute value");+DATA(insert OID = 1397 ( abs PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 23 "23" _null_ _null_ _null_ _null_ _null_ int4abs _null_ _null_ _null_ ));+DESCR("absolute value");+DATA(insert OID = 1398 ( abs PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 21 "21" _null_ _null_ _null_ _null_ _null_ int2abs _null_ _null_ _null_ ));+DESCR("absolute value");++/* OIDS 1400 - 1499 */++DATA(insert OID = 1400 ( name PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 19 "1043" _null_ _null_ _null_ _null_ _null_ text_name _null_ _null_ _null_ ));+DESCR("convert varchar to name");+DATA(insert OID = 1401 ( varchar PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 1043 "19" _null_ _null_ _null_ _null_ _null_ name_text _null_ _null_ _null_ ));+DESCR("convert name to varchar");++DATA(insert OID = 1402 ( current_schema PGNSP PGUID 12 1 0 0 0 f f f f t f s 0 0 19 "" _null_ _null_ _null_ _null_ _null_ current_schema _null_ _null_ _null_ ));+DESCR("current schema name");+DATA(insert OID = 1403 ( current_schemas PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 1003 "16" _null_ _null_ _null_ _null_ _null_ current_schemas _null_ _null_ _null_ ));+DESCR("current schema search list");++DATA(insert OID = 1404 ( overlay PGNSP PGUID 12 1 0 0 0 f f f f t f i 4 0 25 "25 25 23 23" _null_ _null_ _null_ _null_ _null_ textoverlay _null_ _null_ _null_ ));+DESCR("substitute portion of string");+DATA(insert OID = 1405 ( overlay PGNSP PGUID 12 1 0 0 0 f f f f t f i 3 0 25 "25 25 23" _null_ _null_ _null_ _null_ _null_ textoverlay_no_len _null_ _null_ _null_ ));+DESCR("substitute portion of string");++DATA(insert OID = 1406 ( isvertical PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "600 600" _null_ _null_ _null_ _null_ _null_ point_vert _null_ _null_ _null_ ));+DESCR("vertically aligned");+DATA(insert OID = 1407 ( ishorizontal PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "600 600" _null_ _null_ _null_ _null_ _null_ point_horiz _null_ _null_ _null_ ));+DESCR("horizontally aligned");+DATA(insert OID = 1408 ( isparallel PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "601 601" _null_ _null_ _null_ _null_ _null_ lseg_parallel _null_ _null_ _null_ ));+DESCR("parallel");+DATA(insert OID = 1409 ( isperp PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "601 601" _null_ _null_ _null_ _null_ _null_ lseg_perp _null_ _null_ _null_ ));+DESCR("perpendicular");+DATA(insert OID = 1410 ( isvertical PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 16 "601" _null_ _null_ _null_ _null_ _null_ lseg_vertical _null_ _null_ _null_ ));+DESCR("vertical");+DATA(insert OID = 1411 ( ishorizontal PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 16 "601" _null_ _null_ _null_ _null_ _null_ lseg_horizontal _null_ _null_ _null_ ));+DESCR("horizontal");+DATA(insert OID = 1412 ( isparallel PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "628 628" _null_ _null_ _null_ _null_ _null_ line_parallel _null_ _null_ _null_ ));+DESCR("parallel");+DATA(insert OID = 1413 ( isperp PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "628 628" _null_ _null_ _null_ _null_ _null_ line_perp _null_ _null_ _null_ ));+DESCR("perpendicular");+DATA(insert OID = 1414 ( isvertical PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 16 "628" _null_ _null_ _null_ _null_ _null_ line_vertical _null_ _null_ _null_ ));+DESCR("vertical");+DATA(insert OID = 1415 ( ishorizontal PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 16 "628" _null_ _null_ _null_ _null_ _null_ line_horizontal _null_ _null_ _null_ ));+DESCR("horizontal");+DATA(insert OID = 1416 ( point PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 600 "718" _null_ _null_ _null_ _null_ _null_ circle_center _null_ _null_ _null_ ));+DESCR("center of");++DATA(insert OID = 1419 ( time PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 1083 "1186" _null_ _null_ _null_ _null_ _null_ interval_time _null_ _null_ _null_ ));+DESCR("convert interval to time");++DATA(insert OID = 1421 ( box PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 603 "600 600" _null_ _null_ _null_ _null_ _null_ points_box _null_ _null_ _null_ ));+DESCR("convert points to box");+DATA(insert OID = 1422 ( box_add PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 603 "603 600" _null_ _null_ _null_ _null_ _null_ box_add _null_ _null_ _null_ ));+DATA(insert OID = 1423 ( box_sub PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 603 "603 600" _null_ _null_ _null_ _null_ _null_ box_sub _null_ _null_ _null_ ));+DATA(insert OID = 1424 ( box_mul PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 603 "603 600" _null_ _null_ _null_ _null_ _null_ box_mul _null_ _null_ _null_ ));+DATA(insert OID = 1425 ( box_div PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 603 "603 600" _null_ _null_ _null_ _null_ _null_ box_div _null_ _null_ _null_ ));+DATA(insert OID = 1426 ( path_contain_pt PGNSP PGUID 14 1 0 0 0 f f f f t f i 2 0 16 "602 600" _null_ _null_ _null_ _null_ _null_ "select pg_catalog.on_ppath($2, $1)" _null_ _null_ _null_ ));+DATA(insert OID = 1428 ( poly_contain_pt PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "604 600" _null_ _null_ _null_ _null_ _null_ poly_contain_pt _null_ _null_ _null_ ));+DATA(insert OID = 1429 ( pt_contained_poly PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "600 604" _null_ _null_ _null_ _null_ _null_ pt_contained_poly _null_ _null_ _null_ ));++DATA(insert OID = 1430 ( isclosed PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 16 "602" _null_ _null_ _null_ _null_ _null_ path_isclosed _null_ _null_ _null_ ));+DESCR("path closed?");+DATA(insert OID = 1431 ( isopen PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 16 "602" _null_ _null_ _null_ _null_ _null_ path_isopen _null_ _null_ _null_ ));+DESCR("path open?");+DATA(insert OID = 1432 ( path_npoints PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 23 "602" _null_ _null_ _null_ _null_ _null_ path_npoints _null_ _null_ _null_ ));++/* pclose and popen might better be named close and open, but that crashes initdb.+ * - thomas 97/04/20+ */++DATA(insert OID = 1433 ( pclose PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 602 "602" _null_ _null_ _null_ _null_ _null_ path_close _null_ _null_ _null_ ));+DESCR("close path");+DATA(insert OID = 1434 ( popen PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 602 "602" _null_ _null_ _null_ _null_ _null_ path_open _null_ _null_ _null_ ));+DESCR("open path");+DATA(insert OID = 1435 ( path_add PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 602 "602 602" _null_ _null_ _null_ _null_ _null_ path_add _null_ _null_ _null_ ));+DATA(insert OID = 1436 ( path_add_pt PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 602 "602 600" _null_ _null_ _null_ _null_ _null_ path_add_pt _null_ _null_ _null_ ));+DATA(insert OID = 1437 ( path_sub_pt PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 602 "602 600" _null_ _null_ _null_ _null_ _null_ path_sub_pt _null_ _null_ _null_ ));+DATA(insert OID = 1438 ( path_mul_pt PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 602 "602 600" _null_ _null_ _null_ _null_ _null_ path_mul_pt _null_ _null_ _null_ ));+DATA(insert OID = 1439 ( path_div_pt PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 602 "602 600" _null_ _null_ _null_ _null_ _null_ path_div_pt _null_ _null_ _null_ ));++DATA(insert OID = 1440 ( point PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 600 "701 701" _null_ _null_ _null_ _null_ _null_ construct_point _null_ _null_ _null_ ));+DESCR("convert x, y to point");+DATA(insert OID = 1441 ( point_add PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 600 "600 600" _null_ _null_ _null_ _null_ _null_ point_add _null_ _null_ _null_ ));+DATA(insert OID = 1442 ( point_sub PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 600 "600 600" _null_ _null_ _null_ _null_ _null_ point_sub _null_ _null_ _null_ ));+DATA(insert OID = 1443 ( point_mul PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 600 "600 600" _null_ _null_ _null_ _null_ _null_ point_mul _null_ _null_ _null_ ));+DATA(insert OID = 1444 ( point_div PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 600 "600 600" _null_ _null_ _null_ _null_ _null_ point_div _null_ _null_ _null_ ));++DATA(insert OID = 1445 ( poly_npoints PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 23 "604" _null_ _null_ _null_ _null_ _null_ poly_npoints _null_ _null_ _null_ ));+DATA(insert OID = 1446 ( box PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 603 "604" _null_ _null_ _null_ _null_ _null_ poly_box _null_ _null_ _null_ ));+DESCR("convert polygon to bounding box");+DATA(insert OID = 1447 ( path PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 602 "604" _null_ _null_ _null_ _null_ _null_ poly_path _null_ _null_ _null_ ));+DESCR("convert polygon to path");+DATA(insert OID = 1448 ( polygon PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 604 "603" _null_ _null_ _null_ _null_ _null_ box_poly _null_ _null_ _null_ ));+DESCR("convert box to polygon");+DATA(insert OID = 1449 ( polygon PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 604 "602" _null_ _null_ _null_ _null_ _null_ path_poly _null_ _null_ _null_ ));+DESCR("convert path to polygon");++DATA(insert OID = 1450 ( circle_in PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 718 "2275" _null_ _null_ _null_ _null_ _null_ circle_in _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 1451 ( circle_out PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2275 "718" _null_ _null_ _null_ _null_ _null_ circle_out _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 1452 ( circle_same PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "718 718" _null_ _null_ _null_ _null_ _null_ circle_same _null_ _null_ _null_ ));+DATA(insert OID = 1453 ( circle_contain PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "718 718" _null_ _null_ _null_ _null_ _null_ circle_contain _null_ _null_ _null_ ));+DATA(insert OID = 1454 ( circle_left PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "718 718" _null_ _null_ _null_ _null_ _null_ circle_left _null_ _null_ _null_ ));+DATA(insert OID = 1455 ( circle_overleft PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "718 718" _null_ _null_ _null_ _null_ _null_ circle_overleft _null_ _null_ _null_ ));+DATA(insert OID = 1456 ( circle_overright PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "718 718" _null_ _null_ _null_ _null_ _null_ circle_overright _null_ _null_ _null_ ));+DATA(insert OID = 1457 ( circle_right PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "718 718" _null_ _null_ _null_ _null_ _null_ circle_right _null_ _null_ _null_ ));+DATA(insert OID = 1458 ( circle_contained PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "718 718" _null_ _null_ _null_ _null_ _null_ circle_contained _null_ _null_ _null_ ));+DATA(insert OID = 1459 ( circle_overlap PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "718 718" _null_ _null_ _null_ _null_ _null_ circle_overlap _null_ _null_ _null_ ));+DATA(insert OID = 1460 ( circle_below PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "718 718" _null_ _null_ _null_ _null_ _null_ circle_below _null_ _null_ _null_ ));+DATA(insert OID = 1461 ( circle_above PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "718 718" _null_ _null_ _null_ _null_ _null_ circle_above _null_ _null_ _null_ ));+DATA(insert OID = 1462 ( circle_eq PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "718 718" _null_ _null_ _null_ _null_ _null_ circle_eq _null_ _null_ _null_ ));+DATA(insert OID = 1463 ( circle_ne PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "718 718" _null_ _null_ _null_ _null_ _null_ circle_ne _null_ _null_ _null_ ));+DATA(insert OID = 1464 ( circle_lt PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "718 718" _null_ _null_ _null_ _null_ _null_ circle_lt _null_ _null_ _null_ ));+DATA(insert OID = 1465 ( circle_gt PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "718 718" _null_ _null_ _null_ _null_ _null_ circle_gt _null_ _null_ _null_ ));+DATA(insert OID = 1466 ( circle_le PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "718 718" _null_ _null_ _null_ _null_ _null_ circle_le _null_ _null_ _null_ ));+DATA(insert OID = 1467 ( circle_ge PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "718 718" _null_ _null_ _null_ _null_ _null_ circle_ge _null_ _null_ _null_ ));+DATA(insert OID = 1468 ( area PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 701 "718" _null_ _null_ _null_ _null_ _null_ circle_area _null_ _null_ _null_ ));+DESCR("area of circle");+DATA(insert OID = 1469 ( diameter PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 701 "718" _null_ _null_ _null_ _null_ _null_ circle_diameter _null_ _null_ _null_ ));+DESCR("diameter of circle");+DATA(insert OID = 1470 ( radius PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 701 "718" _null_ _null_ _null_ _null_ _null_ circle_radius _null_ _null_ _null_ ));+DESCR("radius of circle");+DATA(insert OID = 1471 ( circle_distance PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 701 "718 718" _null_ _null_ _null_ _null_ _null_ circle_distance _null_ _null_ _null_ ));+DATA(insert OID = 1472 ( circle_center PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 600 "718" _null_ _null_ _null_ _null_ _null_ circle_center _null_ _null_ _null_ ));+DATA(insert OID = 1473 ( circle PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 718 "600 701" _null_ _null_ _null_ _null_ _null_ cr_circle _null_ _null_ _null_ ));+DESCR("convert point and radius to circle");+DATA(insert OID = 1474 ( circle PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 718 "604" _null_ _null_ _null_ _null_ _null_ poly_circle _null_ _null_ _null_ ));+DESCR("convert polygon to circle");+DATA(insert OID = 1475 ( polygon PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 604 "23 718" _null_ _null_ _null_ _null_ _null_ circle_poly _null_ _null_ _null_ ));+DESCR("convert vertex count and circle to polygon");+DATA(insert OID = 1476 ( dist_pc PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 701 "600 718" _null_ _null_ _null_ _null_ _null_ dist_pc _null_ _null_ _null_ ));+DATA(insert OID = 1477 ( circle_contain_pt PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "718 600" _null_ _null_ _null_ _null_ _null_ circle_contain_pt _null_ _null_ _null_ ));+DATA(insert OID = 1478 ( pt_contained_circle PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "600 718" _null_ _null_ _null_ _null_ _null_ pt_contained_circle _null_ _null_ _null_ ));+DATA(insert OID = 4091 ( box PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 603 "600" _null_ _null_ _null_ _null_ _null_ point_box _null_ _null_ _null_ ));+DESCR("convert point to empty box");+DATA(insert OID = 1479 ( circle PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 718 "603" _null_ _null_ _null_ _null_ _null_ box_circle _null_ _null_ _null_ ));+DESCR("convert box to circle");+DATA(insert OID = 1480 ( box PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 603 "718" _null_ _null_ _null_ _null_ _null_ circle_box _null_ _null_ _null_ ));+DESCR("convert circle to box");+DATA(insert OID = 1481 ( tinterval PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 704 "702 702" _null_ _null_ _null_ _null_ _null_ mktinterval _null_ _null_ _null_ ));+DESCR("convert to tinterval");++DATA(insert OID = 1482 ( lseg_ne PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "601 601" _null_ _null_ _null_ _null_ _null_ lseg_ne _null_ _null_ _null_ ));+DATA(insert OID = 1483 ( lseg_lt PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "601 601" _null_ _null_ _null_ _null_ _null_ lseg_lt _null_ _null_ _null_ ));+DATA(insert OID = 1484 ( lseg_le PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "601 601" _null_ _null_ _null_ _null_ _null_ lseg_le _null_ _null_ _null_ ));+DATA(insert OID = 1485 ( lseg_gt PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "601 601" _null_ _null_ _null_ _null_ _null_ lseg_gt _null_ _null_ _null_ ));+DATA(insert OID = 1486 ( lseg_ge PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "601 601" _null_ _null_ _null_ _null_ _null_ lseg_ge _null_ _null_ _null_ ));+DATA(insert OID = 1487 ( lseg_length PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 701 "601" _null_ _null_ _null_ _null_ _null_ lseg_length _null_ _null_ _null_ ));+DATA(insert OID = 1488 ( close_ls PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 600 "628 601" _null_ _null_ _null_ _null_ _null_ close_ls _null_ _null_ _null_ ));+DATA(insert OID = 1489 ( close_lseg PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 600 "601 601" _null_ _null_ _null_ _null_ _null_ close_lseg _null_ _null_ _null_ ));++DATA(insert OID = 1490 ( line_in PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 628 "2275" _null_ _null_ _null_ _null_ _null_ line_in _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 1491 ( line_out PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2275 "628" _null_ _null_ _null_ _null_ _null_ line_out _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 1492 ( line_eq PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "628 628" _null_ _null_ _null_ _null_ _null_ line_eq _null_ _null_ _null_ ));+DATA(insert OID = 1493 ( line PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 628 "600 600" _null_ _null_ _null_ _null_ _null_ line_construct_pp _null_ _null_ _null_ ));+DESCR("construct line from points");+DATA(insert OID = 1494 ( line_interpt PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 600 "628 628" _null_ _null_ _null_ _null_ _null_ line_interpt _null_ _null_ _null_ ));+DATA(insert OID = 1495 ( line_intersect PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "628 628" _null_ _null_ _null_ _null_ _null_ line_intersect _null_ _null_ _null_ ));+DATA(insert OID = 1496 ( line_parallel PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "628 628" _null_ _null_ _null_ _null_ _null_ line_parallel _null_ _null_ _null_ ));+DATA(insert OID = 1497 ( line_perp PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "628 628" _null_ _null_ _null_ _null_ _null_ line_perp _null_ _null_ _null_ ));+DATA(insert OID = 1498 ( line_vertical PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 16 "628" _null_ _null_ _null_ _null_ _null_ line_vertical _null_ _null_ _null_ ));+DATA(insert OID = 1499 ( line_horizontal PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 16 "628" _null_ _null_ _null_ _null_ _null_ line_horizontal _null_ _null_ _null_ ));++/* OIDS 1500 - 1599 */++DATA(insert OID = 1530 ( length PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 701 "601" _null_ _null_ _null_ _null_ _null_ lseg_length _null_ _null_ _null_ ));+DESCR("distance between endpoints");+DATA(insert OID = 1531 ( length PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 701 "602" _null_ _null_ _null_ _null_ _null_ path_length _null_ _null_ _null_ ));+DESCR("sum of path segments");+++DATA(insert OID = 1532 ( point PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 600 "601" _null_ _null_ _null_ _null_ _null_ lseg_center _null_ _null_ _null_ ));+DESCR("center of");+DATA(insert OID = 1533 ( point PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 600 "602" _null_ _null_ _null_ _null_ _null_ path_center _null_ _null_ _null_ ));+DESCR("center of");+DATA(insert OID = 1534 ( point PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 600 "603" _null_ _null_ _null_ _null_ _null_ box_center _null_ _null_ _null_ ));+DESCR("center of");+DATA(insert OID = 1540 ( point PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 600 "604" _null_ _null_ _null_ _null_ _null_ poly_center _null_ _null_ _null_ ));+DESCR("center of");+DATA(insert OID = 1541 ( lseg PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 601 "603" _null_ _null_ _null_ _null_ _null_ box_diagonal _null_ _null_ _null_ ));+DESCR("diagonal of");+DATA(insert OID = 1542 ( center PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 600 "603" _null_ _null_ _null_ _null_ _null_ box_center _null_ _null_ _null_ ));+DESCR("center of");+DATA(insert OID = 1543 ( center PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 600 "718" _null_ _null_ _null_ _null_ _null_ circle_center _null_ _null_ _null_ ));+DESCR("center of");+DATA(insert OID = 1544 ( polygon PGNSP PGUID 14 1 0 0 0 f f f f t f i 1 0 604 "718" _null_ _null_ _null_ _null_ _null_ "select pg_catalog.polygon(12, $1)" _null_ _null_ _null_ ));+DESCR("convert circle to 12-vertex polygon");+DATA(insert OID = 1545 ( npoints PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 23 "602" _null_ _null_ _null_ _null_ _null_ path_npoints _null_ _null_ _null_ ));+DESCR("number of points");+DATA(insert OID = 1556 ( npoints PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 23 "604" _null_ _null_ _null_ _null_ _null_ poly_npoints _null_ _null_ _null_ ));+DESCR("number of points");++DATA(insert OID = 1564 ( bit_in PGNSP PGUID 12 1 0 0 0 f f f f t f i 3 0 1560 "2275 26 23" _null_ _null_ _null_ _null_ _null_ bit_in _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 1565 ( bit_out PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2275 "1560" _null_ _null_ _null_ _null_ _null_ bit_out _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2919 ( bittypmodin PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 23 "1263" _null_ _null_ _null_ _null_ _null_ bittypmodin _null_ _null_ _null_ ));+DESCR("I/O typmod");+DATA(insert OID = 2920 ( bittypmodout PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2275 "23" _null_ _null_ _null_ _null_ _null_ bittypmodout _null_ _null_ _null_ ));+DESCR("I/O typmod");++DATA(insert OID = 1569 ( like PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "25 25" _null_ _null_ _null_ _null_ _null_ textlike _null_ _null_ _null_ ));+DESCR("matches LIKE expression");+DATA(insert OID = 1570 ( notlike PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "25 25" _null_ _null_ _null_ _null_ _null_ textnlike _null_ _null_ _null_ ));+DESCR("does not match LIKE expression");+DATA(insert OID = 1571 ( like PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "19 25" _null_ _null_ _null_ _null_ _null_ namelike _null_ _null_ _null_ ));+DESCR("matches LIKE expression");+DATA(insert OID = 1572 ( notlike PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "19 25" _null_ _null_ _null_ _null_ _null_ namenlike _null_ _null_ _null_ ));+DESCR("does not match LIKE expression");+++/* SEQUENCE functions */+DATA(insert OID = 1574 ( nextval PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 20 "2205" _null_ _null_ _null_ _null_ _null_ nextval_oid _null_ _null_ _null_ ));+DESCR("sequence next value");+DATA(insert OID = 1575 ( currval PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 20 "2205" _null_ _null_ _null_ _null_ _null_ currval_oid _null_ _null_ _null_ ));+DESCR("sequence current value");+DATA(insert OID = 1576 ( setval PGNSP PGUID 12 1 0 0 0 f f f f t f v 2 0 20 "2205 20" _null_ _null_ _null_ _null_ _null_ setval_oid _null_ _null_ _null_ ));+DESCR("set sequence value");+DATA(insert OID = 1765 ( setval PGNSP PGUID 12 1 0 0 0 f f f f t f v 3 0 20 "2205 20 16" _null_ _null_ _null_ _null_ _null_ setval3_oid _null_ _null_ _null_ ));+DESCR("set sequence value and is_called status");+DATA(insert OID = 3078 ( pg_sequence_parameters PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 2249 "26" "{26,20,20,20,20,16}" "{i,o,o,o,o,o}" "{sequence_oid,start_value,minimum_value,maximum_value,increment,cycle_option}" _null_ _null_ pg_sequence_parameters _null_ _null_ _null_));+DESCR("sequence parameters, for use by information schema");++DATA(insert OID = 1579 ( varbit_in PGNSP PGUID 12 1 0 0 0 f f f f t f i 3 0 1562 "2275 26 23" _null_ _null_ _null_ _null_ _null_ varbit_in _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 1580 ( varbit_out PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2275 "1562" _null_ _null_ _null_ _null_ _null_ varbit_out _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2902 ( varbittypmodin PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 23 "1263" _null_ _null_ _null_ _null_ _null_ varbittypmodin _null_ _null_ _null_ ));+DESCR("I/O typmod");+DATA(insert OID = 2921 ( varbittypmodout PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2275 "23" _null_ _null_ _null_ _null_ _null_ varbittypmodout _null_ _null_ _null_ ));+DESCR("I/O typmod");++DATA(insert OID = 1581 ( biteq PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "1560 1560" _null_ _null_ _null_ _null_ _null_ biteq _null_ _null_ _null_ ));+DATA(insert OID = 1582 ( bitne PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "1560 1560" _null_ _null_ _null_ _null_ _null_ bitne _null_ _null_ _null_ ));+DATA(insert OID = 1592 ( bitge PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "1560 1560" _null_ _null_ _null_ _null_ _null_ bitge _null_ _null_ _null_ ));+DATA(insert OID = 1593 ( bitgt PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "1560 1560" _null_ _null_ _null_ _null_ _null_ bitgt _null_ _null_ _null_ ));+DATA(insert OID = 1594 ( bitle PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "1560 1560" _null_ _null_ _null_ _null_ _null_ bitle _null_ _null_ _null_ ));+DATA(insert OID = 1595 ( bitlt PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "1560 1560" _null_ _null_ _null_ _null_ _null_ bitlt _null_ _null_ _null_ ));+DATA(insert OID = 1596 ( bitcmp PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "1560 1560" _null_ _null_ _null_ _null_ _null_ bitcmp _null_ _null_ _null_ ));+DESCR("less-equal-greater");++DATA(insert OID = 1598 ( random PGNSP PGUID 12 1 0 0 0 f f f f t f v 0 0 701 "" _null_ _null_ _null_ _null_ _null_ drandom _null_ _null_ _null_ ));+DESCR("random value");+DATA(insert OID = 1599 ( setseed PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 2278 "701" _null_ _null_ _null_ _null_ _null_ setseed _null_ _null_ _null_ ));+DESCR("set random seed");++/* OIDS 1600 - 1699 */++DATA(insert OID = 1600 ( asin PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 701 "701" _null_ _null_ _null_ _null_ _null_ dasin _null_ _null_ _null_ ));+DESCR("arcsine");+DATA(insert OID = 1601 ( acos PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 701 "701" _null_ _null_ _null_ _null_ _null_ dacos _null_ _null_ _null_ ));+DESCR("arccosine");+DATA(insert OID = 1602 ( atan PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 701 "701" _null_ _null_ _null_ _null_ _null_ datan _null_ _null_ _null_ ));+DESCR("arctangent");+DATA(insert OID = 1603 ( atan2 PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 701 "701 701" _null_ _null_ _null_ _null_ _null_ datan2 _null_ _null_ _null_ ));+DESCR("arctangent, two arguments");+DATA(insert OID = 1604 ( sin PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 701 "701" _null_ _null_ _null_ _null_ _null_ dsin _null_ _null_ _null_ ));+DESCR("sine");+DATA(insert OID = 1605 ( cos PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 701 "701" _null_ _null_ _null_ _null_ _null_ dcos _null_ _null_ _null_ ));+DESCR("cosine");+DATA(insert OID = 1606 ( tan PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 701 "701" _null_ _null_ _null_ _null_ _null_ dtan _null_ _null_ _null_ ));+DESCR("tangent");+DATA(insert OID = 1607 ( cot PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 701 "701" _null_ _null_ _null_ _null_ _null_ dcot _null_ _null_ _null_ ));+DESCR("cotangent");+DATA(insert OID = 1608 ( degrees PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 701 "701" _null_ _null_ _null_ _null_ _null_ degrees _null_ _null_ _null_ ));+DESCR("radians to degrees");+DATA(insert OID = 1609 ( radians PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 701 "701" _null_ _null_ _null_ _null_ _null_ radians _null_ _null_ _null_ ));+DESCR("degrees to radians");+DATA(insert OID = 1610 ( pi PGNSP PGUID 12 1 0 0 0 f f f f t f i 0 0 701 "" _null_ _null_ _null_ _null_ _null_ dpi _null_ _null_ _null_ ));+DESCR("PI");++DATA(insert OID = 1618 ( interval_mul PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1186 "1186 701" _null_ _null_ _null_ _null_ _null_ interval_mul _null_ _null_ _null_ ));++DATA(insert OID = 1620 ( ascii PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 23 "25" _null_ _null_ _null_ _null_ _null_ ascii _null_ _null_ _null_ ));+DESCR("convert first char to int4");+DATA(insert OID = 1621 ( chr PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 25 "23" _null_ _null_ _null_ _null_ _null_ chr _null_ _null_ _null_ ));+DESCR("convert int4 to char");+DATA(insert OID = 1622 ( repeat PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 25 "25 23" _null_ _null_ _null_ _null_ _null_ repeat _null_ _null_ _null_ ));+DESCR("replicate string n times");++DATA(insert OID = 1623 ( similar_escape PGNSP PGUID 12 1 0 0 0 f f f f f f i 2 0 25 "25 25" _null_ _null_ _null_ _null_ _null_ similar_escape _null_ _null_ _null_ ));+DESCR("convert SQL99 regexp pattern to POSIX style");++DATA(insert OID = 1624 ( mul_d_interval PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1186 "701 1186" _null_ _null_ _null_ _null_ _null_ mul_d_interval _null_ _null_ _null_ ));++DATA(insert OID = 1631 ( bpcharlike PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "1042 25" _null_ _null_ _null_ _null_ _null_ textlike _null_ _null_ _null_ ));+DATA(insert OID = 1632 ( bpcharnlike PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "1042 25" _null_ _null_ _null_ _null_ _null_ textnlike _null_ _null_ _null_ ));++DATA(insert OID = 1633 ( texticlike PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "25 25" _null_ _null_ _null_ _null_ _null_ texticlike _null_ _null_ _null_ ));+DATA(insert OID = 1634 ( texticnlike PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "25 25" _null_ _null_ _null_ _null_ _null_ texticnlike _null_ _null_ _null_ ));+DATA(insert OID = 1635 ( nameiclike PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "19 25" _null_ _null_ _null_ _null_ _null_ nameiclike _null_ _null_ _null_ ));+DATA(insert OID = 1636 ( nameicnlike PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "19 25" _null_ _null_ _null_ _null_ _null_ nameicnlike _null_ _null_ _null_ ));+DATA(insert OID = 1637 ( like_escape PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 25 "25 25" _null_ _null_ _null_ _null_ _null_ like_escape _null_ _null_ _null_ ));+DESCR("convert LIKE pattern to use backslash escapes");++DATA(insert OID = 1656 ( bpcharicregexeq PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "1042 25" _null_ _null_ _null_ _null_ _null_ texticregexeq _null_ _null_ _null_ ));+DATA(insert OID = 1657 ( bpcharicregexne PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "1042 25" _null_ _null_ _null_ _null_ _null_ texticregexne _null_ _null_ _null_ ));+DATA(insert OID = 1658 ( bpcharregexeq PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "1042 25" _null_ _null_ _null_ _null_ _null_ textregexeq _null_ _null_ _null_ ));+DATA(insert OID = 1659 ( bpcharregexne PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "1042 25" _null_ _null_ _null_ _null_ _null_ textregexne _null_ _null_ _null_ ));+DATA(insert OID = 1660 ( bpchariclike PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "1042 25" _null_ _null_ _null_ _null_ _null_ texticlike _null_ _null_ _null_ ));+DATA(insert OID = 1661 ( bpcharicnlike PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "1042 25" _null_ _null_ _null_ _null_ _null_ texticnlike _null_ _null_ _null_ ));++/* Oracle Compatibility Related Functions - By Edmund Mergl <E.Mergl@bawue.de> */+DATA(insert OID = 868 ( strpos PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "25 25" _null_ _null_ _null_ _null_ _null_ textpos _null_ _null_ _null_ ));+DESCR("position of substring");+DATA(insert OID = 870 ( lower PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 25 "25" _null_ _null_ _null_ _null_ _null_ lower _null_ _null_ _null_ ));+DESCR("lowercase");+DATA(insert OID = 871 ( upper PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 25 "25" _null_ _null_ _null_ _null_ _null_ upper _null_ _null_ _null_ ));+DESCR("uppercase");+DATA(insert OID = 872 ( initcap PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 25 "25" _null_ _null_ _null_ _null_ _null_ initcap _null_ _null_ _null_ ));+DESCR("capitalize each word");+DATA(insert OID = 873 ( lpad PGNSP PGUID 12 1 0 0 0 f f f f t f i 3 0 25 "25 23 25" _null_ _null_ _null_ _null_ _null_ lpad _null_ _null_ _null_ ));+DESCR("left-pad string to length");+DATA(insert OID = 874 ( rpad PGNSP PGUID 12 1 0 0 0 f f f f t f i 3 0 25 "25 23 25" _null_ _null_ _null_ _null_ _null_ rpad _null_ _null_ _null_ ));+DESCR("right-pad string to length");+DATA(insert OID = 875 ( ltrim PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 25 "25 25" _null_ _null_ _null_ _null_ _null_ ltrim _null_ _null_ _null_ ));+DESCR("trim selected characters from left end of string");+DATA(insert OID = 876 ( rtrim PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 25 "25 25" _null_ _null_ _null_ _null_ _null_ rtrim _null_ _null_ _null_ ));+DESCR("trim selected characters from right end of string");+DATA(insert OID = 877 ( substr PGNSP PGUID 12 1 0 0 0 f f f f t f i 3 0 25 "25 23 23" _null_ _null_ _null_ _null_ _null_ text_substr _null_ _null_ _null_ ));+DESCR("extract portion of string");+DATA(insert OID = 878 ( translate PGNSP PGUID 12 1 0 0 0 f f f f t f i 3 0 25 "25 25 25" _null_ _null_ _null_ _null_ _null_ translate _null_ _null_ _null_ ));+DESCR("map a set of characters appearing in string");+DATA(insert OID = 879 ( lpad PGNSP PGUID 14 1 0 0 0 f f f f t f i 2 0 25 "25 23" _null_ _null_ _null_ _null_ _null_ "select pg_catalog.lpad($1, $2, '' '')" _null_ _null_ _null_ ));+DESCR("left-pad string to length");+DATA(insert OID = 880 ( rpad PGNSP PGUID 14 1 0 0 0 f f f f t f i 2 0 25 "25 23" _null_ _null_ _null_ _null_ _null_ "select pg_catalog.rpad($1, $2, '' '')" _null_ _null_ _null_ ));+DESCR("right-pad string to length");+DATA(insert OID = 881 ( ltrim PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 25 "25" _null_ _null_ _null_ _null_ _null_ ltrim1 _null_ _null_ _null_ ));+DESCR("trim spaces from left end of string");+DATA(insert OID = 882 ( rtrim PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 25 "25" _null_ _null_ _null_ _null_ _null_ rtrim1 _null_ _null_ _null_ ));+DESCR("trim spaces from right end of string");+DATA(insert OID = 883 ( substr PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 25 "25 23" _null_ _null_ _null_ _null_ _null_ text_substr_no_len _null_ _null_ _null_ ));+DESCR("extract portion of string");+DATA(insert OID = 884 ( btrim PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 25 "25 25" _null_ _null_ _null_ _null_ _null_ btrim _null_ _null_ _null_ ));+DESCR("trim selected characters from both ends of string");+DATA(insert OID = 885 ( btrim PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 25 "25" _null_ _null_ _null_ _null_ _null_ btrim1 _null_ _null_ _null_ ));+DESCR("trim spaces from both ends of string");++DATA(insert OID = 936 ( substring PGNSP PGUID 12 1 0 0 0 f f f f t f i 3 0 25 "25 23 23" _null_ _null_ _null_ _null_ _null_ text_substr _null_ _null_ _null_ ));+DESCR("extract portion of string");+DATA(insert OID = 937 ( substring PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 25 "25 23" _null_ _null_ _null_ _null_ _null_ text_substr_no_len _null_ _null_ _null_ ));+DESCR("extract portion of string");+DATA(insert OID = 2087 ( replace PGNSP PGUID 12 1 0 0 0 f f f f t f i 3 0 25 "25 25 25" _null_ _null_ _null_ _null_ _null_ replace_text _null_ _null_ _null_ ));+DESCR("replace all occurrences in string of old_substr with new_substr");+DATA(insert OID = 2284 ( regexp_replace PGNSP PGUID 12 1 0 0 0 f f f f t f i 3 0 25 "25 25 25" _null_ _null_ _null_ _null_ _null_ textregexreplace_noopt _null_ _null_ _null_ ));+DESCR("replace text using regexp");+DATA(insert OID = 2285 ( regexp_replace PGNSP PGUID 12 1 0 0 0 f f f f t f i 4 0 25 "25 25 25 25" _null_ _null_ _null_ _null_ _null_ textregexreplace _null_ _null_ _null_ ));+DESCR("replace text using regexp");+DATA(insert OID = 2763 ( regexp_matches PGNSP PGUID 12 1 1 0 0 f f f f t t i 2 0 1009 "25 25" _null_ _null_ _null_ _null_ _null_ regexp_matches_no_flags _null_ _null_ _null_ ));+DESCR("find all match groups for regexp");+DATA(insert OID = 2764 ( regexp_matches PGNSP PGUID 12 1 10 0 0 f f f f t t i 3 0 1009 "25 25 25" _null_ _null_ _null_ _null_ _null_ regexp_matches _null_ _null_ _null_ ));+DESCR("find all match groups for regexp");+DATA(insert OID = 2088 ( split_part PGNSP PGUID 12 1 0 0 0 f f f f t f i 3 0 25 "25 25 23" _null_ _null_ _null_ _null_ _null_ split_text _null_ _null_ _null_ ));+DESCR("split string by field_sep and return field_num");+DATA(insert OID = 2765 ( regexp_split_to_table PGNSP PGUID 12 1 1000 0 0 f f f f t t i 2 0 25 "25 25" _null_ _null_ _null_ _null_ _null_ regexp_split_to_table_no_flags _null_ _null_ _null_ ));+DESCR("split string by pattern");+DATA(insert OID = 2766 ( regexp_split_to_table PGNSP PGUID 12 1 1000 0 0 f f f f t t i 3 0 25 "25 25 25" _null_ _null_ _null_ _null_ _null_ regexp_split_to_table _null_ _null_ _null_ ));+DESCR("split string by pattern");+DATA(insert OID = 2767 ( regexp_split_to_array PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1009 "25 25" _null_ _null_ _null_ _null_ _null_ regexp_split_to_array_no_flags _null_ _null_ _null_ ));+DESCR("split string by pattern");+DATA(insert OID = 2768 ( regexp_split_to_array PGNSP PGUID 12 1 0 0 0 f f f f t f i 3 0 1009 "25 25 25" _null_ _null_ _null_ _null_ _null_ regexp_split_to_array _null_ _null_ _null_ ));+DESCR("split string by pattern");+DATA(insert OID = 2089 ( to_hex PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 25 "23" _null_ _null_ _null_ _null_ _null_ to_hex32 _null_ _null_ _null_ ));+DESCR("convert int4 number to hex");+DATA(insert OID = 2090 ( to_hex PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 25 "20" _null_ _null_ _null_ _null_ _null_ to_hex64 _null_ _null_ _null_ ));+DESCR("convert int8 number to hex");++/* for character set encoding support */++/* return database encoding name */+DATA(insert OID = 1039 ( getdatabaseencoding PGNSP PGUID 12 1 0 0 0 f f f f t f s 0 0 19 "" _null_ _null_ _null_ _null_ _null_ getdatabaseencoding _null_ _null_ _null_ ));+DESCR("encoding name of current database");++/* return client encoding name i.e. session encoding */+DATA(insert OID = 810 ( pg_client_encoding PGNSP PGUID 12 1 0 0 0 f f f f t f s 0 0 19 "" _null_ _null_ _null_ _null_ _null_ pg_client_encoding _null_ _null_ _null_ ));+DESCR("encoding name of current database");++DATA(insert OID = 1713 ( length PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 23 "17 19" _null_ _null_ _null_ _null_ _null_ length_in_encoding _null_ _null_ _null_ ));+DESCR("length of string in specified encoding");++DATA(insert OID = 1714 ( convert_from PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 25 "17 19" _null_ _null_ _null_ _null_ _null_ pg_convert_from _null_ _null_ _null_ ));+DESCR("convert string with specified source encoding name");++DATA(insert OID = 1717 ( convert_to PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 17 "25 19" _null_ _null_ _null_ _null_ _null_ pg_convert_to _null_ _null_ _null_ ));+DESCR("convert string with specified destination encoding name");++DATA(insert OID = 1813 ( convert PGNSP PGUID 12 1 0 0 0 f f f f t f s 3 0 17 "17 19 19" _null_ _null_ _null_ _null_ _null_ pg_convert _null_ _null_ _null_ ));+DESCR("convert string with specified encoding names");++DATA(insert OID = 1264 ( pg_char_to_encoding PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 23 "19" _null_ _null_ _null_ _null_ _null_ PG_char_to_encoding _null_ _null_ _null_ ));+DESCR("convert encoding name to encoding id");++DATA(insert OID = 1597 ( pg_encoding_to_char PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 19 "23" _null_ _null_ _null_ _null_ _null_ PG_encoding_to_char _null_ _null_ _null_ ));+DESCR("convert encoding id to encoding name");++DATA(insert OID = 2319 ( pg_encoding_max_length PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 23 "23" _null_ _null_ _null_ _null_ _null_ pg_encoding_max_length_sql _null_ _null_ _null_ ));+DESCR("maximum octet length of a character in given encoding");++DATA(insert OID = 1638 ( oidgt PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "26 26" _null_ _null_ _null_ _null_ _null_ oidgt _null_ _null_ _null_ ));+DATA(insert OID = 1639 ( oidge PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "26 26" _null_ _null_ _null_ _null_ _null_ oidge _null_ _null_ _null_ ));++/* System-view support functions */+DATA(insert OID = 1573 ( pg_get_ruledef PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 25 "26" _null_ _null_ _null_ _null_ _null_ pg_get_ruledef _null_ _null_ _null_ ));+DESCR("source text of a rule");+DATA(insert OID = 1640 ( pg_get_viewdef PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 25 "25" _null_ _null_ _null_ _null_ _null_ pg_get_viewdef_name _null_ _null_ _null_ ));+DESCR("select statement of a view");+DATA(insert OID = 1641 ( pg_get_viewdef PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 25 "26" _null_ _null_ _null_ _null_ _null_ pg_get_viewdef _null_ _null_ _null_ ));+DESCR("select statement of a view");+DATA(insert OID = 1642 ( pg_get_userbyid PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 19 "26" _null_ _null_ _null_ _null_ _null_ pg_get_userbyid _null_ _null_ _null_ ));+DESCR("role name by OID (with fallback)");+DATA(insert OID = 1643 ( pg_get_indexdef PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 25 "26" _null_ _null_ _null_ _null_ _null_ pg_get_indexdef _null_ _null_ _null_ ));+DESCR("index description");+DATA(insert OID = 1662 ( pg_get_triggerdef PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 25 "26" _null_ _null_ _null_ _null_ _null_ pg_get_triggerdef _null_ _null_ _null_ ));+DESCR("trigger description");+DATA(insert OID = 1387 ( pg_get_constraintdef PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 25 "26" _null_ _null_ _null_ _null_ _null_ pg_get_constraintdef _null_ _null_ _null_ ));+DESCR("constraint description");+DATA(insert OID = 1716 ( pg_get_expr PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 25 "194 26" _null_ _null_ _null_ _null_ _null_ pg_get_expr _null_ _null_ _null_ ));+DESCR("deparse an encoded expression");+DATA(insert OID = 1665 ( pg_get_serial_sequence PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 25 "25 25" _null_ _null_ _null_ _null_ _null_ pg_get_serial_sequence _null_ _null_ _null_ ));+DESCR("name of sequence for a serial column");+DATA(insert OID = 2098 ( pg_get_functiondef PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 25 "26" _null_ _null_ _null_ _null_ _null_ pg_get_functiondef _null_ _null_ _null_ ));+DESCR("definition of a function");+DATA(insert OID = 2162 ( pg_get_function_arguments PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 25 "26" _null_ _null_ _null_ _null_ _null_ pg_get_function_arguments _null_ _null_ _null_ ));+DESCR("argument list of a function");+DATA(insert OID = 2232 ( pg_get_function_identity_arguments PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 25 "26" _null_ _null_ _null_ _null_ _null_ pg_get_function_identity_arguments _null_ _null_ _null_ ));+DESCR("identity argument list of a function");+DATA(insert OID = 2165 ( pg_get_function_result PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 25 "26" _null_ _null_ _null_ _null_ _null_ pg_get_function_result _null_ _null_ _null_ ));+DESCR("result type of a function");+DATA(insert OID = 3808 ( pg_get_function_arg_default PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 25 "26 23" _null_ _null_ _null_ _null_ _null_ pg_get_function_arg_default _null_ _null_ _null_ ));+DESCR("function argument default");++DATA(insert OID = 1686 ( pg_get_keywords PGNSP PGUID 12 10 400 0 0 f f f f t t s 0 0 2249 "" "{25,18,25}" "{o,o,o}" "{word,catcode,catdesc}" _null_ _null_ pg_get_keywords _null_ _null_ _null_ ));+DESCR("list of SQL keywords");++DATA(insert OID = 2289 ( pg_options_to_table PGNSP PGUID 12 1 3 0 0 f f f f t t s 1 0 2249 "1009" "{1009,25,25}" "{i,o,o}" "{options_array,option_name,option_value}" _null_ _null_ pg_options_to_table _null_ _null_ _null_ ));+DESCR("convert generic options array to name/value table");++DATA(insert OID = 1619 ( pg_typeof PGNSP PGUID 12 1 0 0 0 f f f f f f s 1 0 2206 "2276" _null_ _null_ _null_ _null_ _null_ pg_typeof _null_ _null_ _null_ ));+DESCR("type of the argument");+DATA(insert OID = 3162 ( pg_collation_for PGNSP PGUID 12 1 0 0 0 f f f f f f s 1 0 25 "2276" _null_ _null_ _null_ _null_ _null_ pg_collation_for _null_ _null_ _null_ ));+DESCR("collation of the argument; implementation of the COLLATION FOR expression");++DATA(insert OID = 3842 ( pg_relation_is_updatable PGNSP PGUID 12 10 0 0 0 f f f f t f s 2 0 23 "2205 16" _null_ _null_ _null_ _null_ _null_ pg_relation_is_updatable _null_ _null_ _null_ ));+DESCR("is a relation insertable/updatable/deletable");+DATA(insert OID = 3843 ( pg_column_is_updatable PGNSP PGUID 12 10 0 0 0 f f f f t f s 3 0 16 "2205 21 16" _null_ _null_ _null_ _null_ _null_ pg_column_is_updatable _null_ _null_ _null_ ));+DESCR("is a column updatable");++/* Deferrable unique constraint trigger */+DATA(insert OID = 1250 ( unique_key_recheck PGNSP PGUID 12 1 0 0 0 f f f f t f v 0 0 2279 "" _null_ _null_ _null_ _null_ _null_ unique_key_recheck _null_ _null_ _null_ ));+DESCR("deferred UNIQUE constraint check");++/* Generic referential integrity constraint triggers */+DATA(insert OID = 1644 ( RI_FKey_check_ins PGNSP PGUID 12 1 0 0 0 f f f f t f v 0 0 2279 "" _null_ _null_ _null_ _null_ _null_ RI_FKey_check_ins _null_ _null_ _null_ ));+DESCR("referential integrity FOREIGN KEY ... REFERENCES");+DATA(insert OID = 1645 ( RI_FKey_check_upd PGNSP PGUID 12 1 0 0 0 f f f f t f v 0 0 2279 "" _null_ _null_ _null_ _null_ _null_ RI_FKey_check_upd _null_ _null_ _null_ ));+DESCR("referential integrity FOREIGN KEY ... REFERENCES");+DATA(insert OID = 1646 ( RI_FKey_cascade_del PGNSP PGUID 12 1 0 0 0 f f f f t f v 0 0 2279 "" _null_ _null_ _null_ _null_ _null_ RI_FKey_cascade_del _null_ _null_ _null_ ));+DESCR("referential integrity ON DELETE CASCADE");+DATA(insert OID = 1647 ( RI_FKey_cascade_upd PGNSP PGUID 12 1 0 0 0 f f f f t f v 0 0 2279 "" _null_ _null_ _null_ _null_ _null_ RI_FKey_cascade_upd _null_ _null_ _null_ ));+DESCR("referential integrity ON UPDATE CASCADE");+DATA(insert OID = 1648 ( RI_FKey_restrict_del PGNSP PGUID 12 1 0 0 0 f f f f t f v 0 0 2279 "" _null_ _null_ _null_ _null_ _null_ RI_FKey_restrict_del _null_ _null_ _null_ ));+DESCR("referential integrity ON DELETE RESTRICT");+DATA(insert OID = 1649 ( RI_FKey_restrict_upd PGNSP PGUID 12 1 0 0 0 f f f f t f v 0 0 2279 "" _null_ _null_ _null_ _null_ _null_ RI_FKey_restrict_upd _null_ _null_ _null_ ));+DESCR("referential integrity ON UPDATE RESTRICT");+DATA(insert OID = 1650 ( RI_FKey_setnull_del PGNSP PGUID 12 1 0 0 0 f f f f t f v 0 0 2279 "" _null_ _null_ _null_ _null_ _null_ RI_FKey_setnull_del _null_ _null_ _null_ ));+DESCR("referential integrity ON DELETE SET NULL");+DATA(insert OID = 1651 ( RI_FKey_setnull_upd PGNSP PGUID 12 1 0 0 0 f f f f t f v 0 0 2279 "" _null_ _null_ _null_ _null_ _null_ RI_FKey_setnull_upd _null_ _null_ _null_ ));+DESCR("referential integrity ON UPDATE SET NULL");+DATA(insert OID = 1652 ( RI_FKey_setdefault_del PGNSP PGUID 12 1 0 0 0 f f f f t f v 0 0 2279 "" _null_ _null_ _null_ _null_ _null_ RI_FKey_setdefault_del _null_ _null_ _null_ ));+DESCR("referential integrity ON DELETE SET DEFAULT");+DATA(insert OID = 1653 ( RI_FKey_setdefault_upd PGNSP PGUID 12 1 0 0 0 f f f f t f v 0 0 2279 "" _null_ _null_ _null_ _null_ _null_ RI_FKey_setdefault_upd _null_ _null_ _null_ ));+DESCR("referential integrity ON UPDATE SET DEFAULT");+DATA(insert OID = 1654 ( RI_FKey_noaction_del PGNSP PGUID 12 1 0 0 0 f f f f t f v 0 0 2279 "" _null_ _null_ _null_ _null_ _null_ RI_FKey_noaction_del _null_ _null_ _null_ ));+DESCR("referential integrity ON DELETE NO ACTION");+DATA(insert OID = 1655 ( RI_FKey_noaction_upd PGNSP PGUID 12 1 0 0 0 f f f f t f v 0 0 2279 "" _null_ _null_ _null_ _null_ _null_ RI_FKey_noaction_upd _null_ _null_ _null_ ));+DESCR("referential integrity ON UPDATE NO ACTION");++DATA(insert OID = 1666 ( varbiteq PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "1562 1562" _null_ _null_ _null_ _null_ _null_ biteq _null_ _null_ _null_ ));+DATA(insert OID = 1667 ( varbitne PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "1562 1562" _null_ _null_ _null_ _null_ _null_ bitne _null_ _null_ _null_ ));+DATA(insert OID = 1668 ( varbitge PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "1562 1562" _null_ _null_ _null_ _null_ _null_ bitge _null_ _null_ _null_ ));+DATA(insert OID = 1669 ( varbitgt PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "1562 1562" _null_ _null_ _null_ _null_ _null_ bitgt _null_ _null_ _null_ ));+DATA(insert OID = 1670 ( varbitle PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "1562 1562" _null_ _null_ _null_ _null_ _null_ bitle _null_ _null_ _null_ ));+DATA(insert OID = 1671 ( varbitlt PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "1562 1562" _null_ _null_ _null_ _null_ _null_ bitlt _null_ _null_ _null_ ));+DATA(insert OID = 1672 ( varbitcmp PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "1562 1562" _null_ _null_ _null_ _null_ _null_ bitcmp _null_ _null_ _null_ ));+DESCR("less-equal-greater");++DATA(insert OID = 1673 ( bitand PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1560 "1560 1560" _null_ _null_ _null_ _null_ _null_ bit_and _null_ _null_ _null_ ));+DATA(insert OID = 1674 ( bitor PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1560 "1560 1560" _null_ _null_ _null_ _null_ _null_ bit_or _null_ _null_ _null_ ));+DATA(insert OID = 1675 ( bitxor PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1560 "1560 1560" _null_ _null_ _null_ _null_ _null_ bitxor _null_ _null_ _null_ ));+DATA(insert OID = 1676 ( bitnot PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 1560 "1560" _null_ _null_ _null_ _null_ _null_ bitnot _null_ _null_ _null_ ));+DATA(insert OID = 1677 ( bitshiftleft PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1560 "1560 23" _null_ _null_ _null_ _null_ _null_ bitshiftleft _null_ _null_ _null_ ));+DATA(insert OID = 1678 ( bitshiftright PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1560 "1560 23" _null_ _null_ _null_ _null_ _null_ bitshiftright _null_ _null_ _null_ ));+DATA(insert OID = 1679 ( bitcat PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1562 "1562 1562" _null_ _null_ _null_ _null_ _null_ bitcat _null_ _null_ _null_ ));+DATA(insert OID = 1680 ( substring PGNSP PGUID 12 1 0 0 0 f f f f t f i 3 0 1560 "1560 23 23" _null_ _null_ _null_ _null_ _null_ bitsubstr _null_ _null_ _null_ ));+DESCR("extract portion of bitstring");+DATA(insert OID = 1681 ( length PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 23 "1560" _null_ _null_ _null_ _null_ _null_ bitlength _null_ _null_ _null_ ));+DESCR("bitstring length");+DATA(insert OID = 1682 ( octet_length PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 23 "1560" _null_ _null_ _null_ _null_ _null_ bitoctetlength _null_ _null_ _null_ ));+DESCR("octet length");+DATA(insert OID = 1683 ( bit PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1560 "23 23" _null_ _null_ _null_ _null_ _null_ bitfromint4 _null_ _null_ _null_ ));+DESCR("convert int4 to bitstring");+DATA(insert OID = 1684 ( int4 PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 23 "1560" _null_ _null_ _null_ _null_ _null_ bittoint4 _null_ _null_ _null_ ));+DESCR("convert bitstring to int4");++DATA(insert OID = 1685 ( bit PGNSP PGUID 12 1 0 0 0 f f f f t f i 3 0 1560 "1560 23 16" _null_ _null_ _null_ _null_ _null_ bit _null_ _null_ _null_ ));+DESCR("adjust bit() to typmod length");+DATA(insert OID = 3158 ( varbit_transform PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2281 "2281" _null_ _null_ _null_ _null_ _null_ varbit_transform _null_ _null_ _null_ ));+DESCR("transform a varbit length coercion");+DATA(insert OID = 1687 ( varbit PGNSP PGUID 12 1 0 0 varbit_transform f f f f t f i 3 0 1562 "1562 23 16" _null_ _null_ _null_ _null_ _null_ varbit _null_ _null_ _null_ ));+DESCR("adjust varbit() to typmod length");++DATA(insert OID = 1698 ( position PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "1560 1560" _null_ _null_ _null_ _null_ _null_ bitposition _null_ _null_ _null_ ));+DESCR("position of sub-bitstring");+DATA(insert OID = 1699 ( substring PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1560 "1560 23" _null_ _null_ _null_ _null_ _null_ bitsubstr_no_len _null_ _null_ _null_ ));+DESCR("extract portion of bitstring");++DATA(insert OID = 3030 ( overlay PGNSP PGUID 12 1 0 0 0 f f f f t f i 4 0 1560 "1560 1560 23 23" _null_ _null_ _null_ _null_ _null_ bitoverlay _null_ _null_ _null_ ));+DESCR("substitute portion of bitstring");+DATA(insert OID = 3031 ( overlay PGNSP PGUID 12 1 0 0 0 f f f f t f i 3 0 1560 "1560 1560 23" _null_ _null_ _null_ _null_ _null_ bitoverlay_no_len _null_ _null_ _null_ ));+DESCR("substitute portion of bitstring");+DATA(insert OID = 3032 ( get_bit PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "1560 23" _null_ _null_ _null_ _null_ _null_ bitgetbit _null_ _null_ _null_ ));+DESCR("get bit");+DATA(insert OID = 3033 ( set_bit PGNSP PGUID 12 1 0 0 0 f f f f t f i 3 0 1560 "1560 23 23" _null_ _null_ _null_ _null_ _null_ bitsetbit _null_ _null_ _null_ ));+DESCR("set bit");++/* for mac type support */+DATA(insert OID = 436 ( macaddr_in PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 829 "2275" _null_ _null_ _null_ _null_ _null_ macaddr_in _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 437 ( macaddr_out PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2275 "829" _null_ _null_ _null_ _null_ _null_ macaddr_out _null_ _null_ _null_ ));+DESCR("I/O");++DATA(insert OID = 753 ( trunc PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 829 "829" _null_ _null_ _null_ _null_ _null_ macaddr_trunc _null_ _null_ _null_ ));+DESCR("MAC manufacturer fields");++DATA(insert OID = 830 ( macaddr_eq PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "829 829" _null_ _null_ _null_ _null_ _null_ macaddr_eq _null_ _null_ _null_ ));+DATA(insert OID = 831 ( macaddr_lt PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "829 829" _null_ _null_ _null_ _null_ _null_ macaddr_lt _null_ _null_ _null_ ));+DATA(insert OID = 832 ( macaddr_le PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "829 829" _null_ _null_ _null_ _null_ _null_ macaddr_le _null_ _null_ _null_ ));+DATA(insert OID = 833 ( macaddr_gt PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "829 829" _null_ _null_ _null_ _null_ _null_ macaddr_gt _null_ _null_ _null_ ));+DATA(insert OID = 834 ( macaddr_ge PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "829 829" _null_ _null_ _null_ _null_ _null_ macaddr_ge _null_ _null_ _null_ ));+DATA(insert OID = 835 ( macaddr_ne PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "829 829" _null_ _null_ _null_ _null_ _null_ macaddr_ne _null_ _null_ _null_ ));+DATA(insert OID = 836 ( macaddr_cmp PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "829 829" _null_ _null_ _null_ _null_ _null_ macaddr_cmp _null_ _null_ _null_ ));+DESCR("less-equal-greater");+DATA(insert OID = 3144 ( macaddr_not PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 829 "829" _null_ _null_ _null_ _null_ _null_ macaddr_not _null_ _null_ _null_ ));+DATA(insert OID = 3145 ( macaddr_and PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 829 "829 829" _null_ _null_ _null_ _null_ _null_ macaddr_and _null_ _null_ _null_ ));+DATA(insert OID = 3146 ( macaddr_or PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 829 "829 829" _null_ _null_ _null_ _null_ _null_ macaddr_or _null_ _null_ _null_ ));++/* for inet type support */+DATA(insert OID = 910 ( inet_in PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 869 "2275" _null_ _null_ _null_ _null_ _null_ inet_in _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 911 ( inet_out PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2275 "869" _null_ _null_ _null_ _null_ _null_ inet_out _null_ _null_ _null_ ));+DESCR("I/O");++/* for cidr type support */+DATA(insert OID = 1267 ( cidr_in PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 650 "2275" _null_ _null_ _null_ _null_ _null_ cidr_in _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 1427 ( cidr_out PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2275 "650" _null_ _null_ _null_ _null_ _null_ cidr_out _null_ _null_ _null_ ));+DESCR("I/O");++/* these are used for both inet and cidr */+DATA(insert OID = 920 ( network_eq PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "869 869" _null_ _null_ _null_ _null_ _null_ network_eq _null_ _null_ _null_ ));+DATA(insert OID = 921 ( network_lt PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "869 869" _null_ _null_ _null_ _null_ _null_ network_lt _null_ _null_ _null_ ));+DATA(insert OID = 922 ( network_le PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "869 869" _null_ _null_ _null_ _null_ _null_ network_le _null_ _null_ _null_ ));+DATA(insert OID = 923 ( network_gt PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "869 869" _null_ _null_ _null_ _null_ _null_ network_gt _null_ _null_ _null_ ));+DATA(insert OID = 924 ( network_ge PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "869 869" _null_ _null_ _null_ _null_ _null_ network_ge _null_ _null_ _null_ ));+DATA(insert OID = 925 ( network_ne PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "869 869" _null_ _null_ _null_ _null_ _null_ network_ne _null_ _null_ _null_ ));+DATA(insert OID = 3562 ( network_larger PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 869 "869 869" _null_ _null_ _null_ _null_ _null_ network_larger _null_ _null_ _null_ ));+DESCR("larger of two");+DATA(insert OID = 3563 ( network_smaller PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 869 "869 869" _null_ _null_ _null_ _null_ _null_ network_smaller _null_ _null_ _null_ ));+DESCR("smaller of two");+DATA(insert OID = 926 ( network_cmp PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "869 869" _null_ _null_ _null_ _null_ _null_ network_cmp _null_ _null_ _null_ ));+DESCR("less-equal-greater");+DATA(insert OID = 927 ( network_sub PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "869 869" _null_ _null_ _null_ _null_ _null_ network_sub _null_ _null_ _null_ ));+DATA(insert OID = 928 ( network_subeq PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "869 869" _null_ _null_ _null_ _null_ _null_ network_subeq _null_ _null_ _null_ ));+DATA(insert OID = 929 ( network_sup PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "869 869" _null_ _null_ _null_ _null_ _null_ network_sup _null_ _null_ _null_ ));+DATA(insert OID = 930 ( network_supeq PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "869 869" _null_ _null_ _null_ _null_ _null_ network_supeq _null_ _null_ _null_ ));+DATA(insert OID = 3551 ( network_overlap PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "869 869" _null_ _null_ _null_ _null_ _null_ network_overlap _null_ _null_ _null_ ));++/* inet/cidr functions */+DATA(insert OID = 598 ( abbrev PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 25 "869" _null_ _null_ _null_ _null_ _null_ inet_abbrev _null_ _null_ _null_ ));+DESCR("abbreviated display of inet value");+DATA(insert OID = 599 ( abbrev PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 25 "650" _null_ _null_ _null_ _null_ _null_ cidr_abbrev _null_ _null_ _null_ ));+DESCR("abbreviated display of cidr value");+DATA(insert OID = 605 ( set_masklen PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 869 "869 23" _null_ _null_ _null_ _null_ _null_ inet_set_masklen _null_ _null_ _null_ ));+DESCR("change netmask of inet");+DATA(insert OID = 635 ( set_masklen PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 650 "650 23" _null_ _null_ _null_ _null_ _null_ cidr_set_masklen _null_ _null_ _null_ ));+DESCR("change netmask of cidr");+DATA(insert OID = 711 ( family PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 23 "869" _null_ _null_ _null_ _null_ _null_ network_family _null_ _null_ _null_ ));+DESCR("address family (4 for IPv4, 6 for IPv6)");+DATA(insert OID = 683 ( network PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 650 "869" _null_ _null_ _null_ _null_ _null_ network_network _null_ _null_ _null_ ));+DESCR("network part of address");+DATA(insert OID = 696 ( netmask PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 869 "869" _null_ _null_ _null_ _null_ _null_ network_netmask _null_ _null_ _null_ ));+DESCR("netmask of address");+DATA(insert OID = 697 ( masklen PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 23 "869" _null_ _null_ _null_ _null_ _null_ network_masklen _null_ _null_ _null_ ));+DESCR("netmask length");+DATA(insert OID = 698 ( broadcast PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 869 "869" _null_ _null_ _null_ _null_ _null_ network_broadcast _null_ _null_ _null_ ));+DESCR("broadcast address of network");+DATA(insert OID = 699 ( host PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 25 "869" _null_ _null_ _null_ _null_ _null_ network_host _null_ _null_ _null_ ));+DESCR("show address octets only");+DATA(insert OID = 730 ( text PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 25 "869" _null_ _null_ _null_ _null_ _null_ network_show _null_ _null_ _null_ ));+DESCR("show all parts of inet/cidr value");+DATA(insert OID = 1362 ( hostmask PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 869 "869" _null_ _null_ _null_ _null_ _null_ network_hostmask _null_ _null_ _null_ ));+DESCR("hostmask of address");+DATA(insert OID = 1715 ( cidr PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 650 "869" _null_ _null_ _null_ _null_ _null_ inet_to_cidr _null_ _null_ _null_ ));+DESCR("convert inet to cidr");++DATA(insert OID = 2196 ( inet_client_addr PGNSP PGUID 12 1 0 0 0 f f f f f f s 0 0 869 "" _null_ _null_ _null_ _null_ _null_ inet_client_addr _null_ _null_ _null_ ));+DESCR("inet address of the client");+DATA(insert OID = 2197 ( inet_client_port PGNSP PGUID 12 1 0 0 0 f f f f f f s 0 0 23 "" _null_ _null_ _null_ _null_ _null_ inet_client_port _null_ _null_ _null_ ));+DESCR("client's port number for this connection");+DATA(insert OID = 2198 ( inet_server_addr PGNSP PGUID 12 1 0 0 0 f f f f f f s 0 0 869 "" _null_ _null_ _null_ _null_ _null_ inet_server_addr _null_ _null_ _null_ ));+DESCR("inet address of the server");+DATA(insert OID = 2199 ( inet_server_port PGNSP PGUID 12 1 0 0 0 f f f f f f s 0 0 23 "" _null_ _null_ _null_ _null_ _null_ inet_server_port _null_ _null_ _null_ ));+DESCR("server's port number for this connection");++DATA(insert OID = 2627 ( inetnot PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 869 "869" _null_ _null_ _null_ _null_ _null_ inetnot _null_ _null_ _null_ ));+DATA(insert OID = 2628 ( inetand PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 869 "869 869" _null_ _null_ _null_ _null_ _null_ inetand _null_ _null_ _null_ ));+DATA(insert OID = 2629 ( inetor PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 869 "869 869" _null_ _null_ _null_ _null_ _null_ inetor _null_ _null_ _null_ ));+DATA(insert OID = 2630 ( inetpl PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 869 "869 20" _null_ _null_ _null_ _null_ _null_ inetpl _null_ _null_ _null_ ));+DATA(insert OID = 2631 ( int8pl_inet PGNSP PGUID 14 1 0 0 0 f f f f t f i 2 0 869 "20 869" _null_ _null_ _null_ _null_ _null_ "select $2 + $1" _null_ _null_ _null_ ));+DATA(insert OID = 2632 ( inetmi_int8 PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 869 "869 20" _null_ _null_ _null_ _null_ _null_ inetmi_int8 _null_ _null_ _null_ ));+DATA(insert OID = 2633 ( inetmi PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 20 "869 869" _null_ _null_ _null_ _null_ _null_ inetmi _null_ _null_ _null_ ));+DATA(insert OID = 4071 ( inet_same_family PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "869 869" _null_ _null_ _null_ _null_ _null_ inet_same_family _null_ _null_ _null_ ));+DESCR("are the addresses from the same family?");+DATA(insert OID = 4063 ( inet_merge PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 650 "869 869" _null_ _null_ _null_ _null_ _null_ inet_merge _null_ _null_ _null_ ));+DESCR("the smallest network which includes both of the given networks");++/* GiST support for inet and cidr */+DATA(insert OID = 3553 ( inet_gist_consistent PGNSP PGUID 12 1 0 0 0 f f f f t f i 5 0 16 "2281 869 23 26 2281" _null_ _null_ _null_ _null_ _null_ inet_gist_consistent _null_ _null_ _null_ ));+DESCR("GiST support");+DATA(insert OID = 3554 ( inet_gist_union PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 2281 "2281 2281" _null_ _null_ _null_ _null_ _null_ inet_gist_union _null_ _null_ _null_ ));+DESCR("GiST support");+DATA(insert OID = 3555 ( inet_gist_compress PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2281 "2281" _null_ _null_ _null_ _null_ _null_ inet_gist_compress _null_ _null_ _null_ ));+DESCR("GiST support");+DATA(insert OID = 3556 ( inet_gist_decompress PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2281 "2281" _null_ _null_ _null_ _null_ _null_ inet_gist_decompress _null_ _null_ _null_ ));+DESCR("GiST support");+DATA(insert OID = 3573 ( inet_gist_fetch PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2281 "2281" _null_ _null_ _null_ _null_ _null_ inet_gist_fetch _null_ _null_ _null_ ));+DESCR("GiST support");+DATA(insert OID = 3557 ( inet_gist_penalty PGNSP PGUID 12 1 0 0 0 f f f f t f i 3 0 2281 "2281 2281 2281" _null_ _null_ _null_ _null_ _null_ inet_gist_penalty _null_ _null_ _null_ ));+DESCR("GiST support");+DATA(insert OID = 3558 ( inet_gist_picksplit PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 2281 "2281 2281" _null_ _null_ _null_ _null_ _null_ inet_gist_picksplit _null_ _null_ _null_ ));+DESCR("GiST support");+DATA(insert OID = 3559 ( inet_gist_same PGNSP PGUID 12 1 0 0 0 f f f f t f i 3 0 2281 "869 869 2281" _null_ _null_ _null_ _null_ _null_ inet_gist_same _null_ _null_ _null_ ));+DESCR("GiST support");++/* Selectivity estimation for inet and cidr */+DATA(insert OID = 3560 ( networksel PGNSP PGUID 12 1 0 0 0 f f f f t f s 4 0 701 "2281 26 2281 23" _null_ _null_ _null_ _null_ _null_ networksel _null_ _null_ _null_ ));+DESCR("restriction selectivity for network operators");+DATA(insert OID = 3561 ( networkjoinsel PGNSP PGUID 12 1 0 0 0 f f f f t f s 5 0 701 "2281 26 2281 21 2281" _null_ _null_ _null_ _null_ _null_ networkjoinsel _null_ _null_ _null_ ));+DESCR("join selectivity for network operators");++DATA(insert OID = 1690 ( time_mi_time PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1186 "1083 1083" _null_ _null_ _null_ _null_ _null_ time_mi_time _null_ _null_ _null_ ));++DATA(insert OID = 1691 ( boolle PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "16 16" _null_ _null_ _null_ _null_ _null_ boolle _null_ _null_ _null_ ));+DATA(insert OID = 1692 ( boolge PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "16 16" _null_ _null_ _null_ _null_ _null_ boolge _null_ _null_ _null_ ));+DATA(insert OID = 1693 ( btboolcmp PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "16 16" _null_ _null_ _null_ _null_ _null_ btboolcmp _null_ _null_ _null_ ));+DESCR("less-equal-greater");++DATA(insert OID = 1688 ( time_hash PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 23 "1083" _null_ _null_ _null_ _null_ _null_ time_hash _null_ _null_ _null_ ));+DESCR("hash");+DATA(insert OID = 1696 ( timetz_hash PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 23 "1266" _null_ _null_ _null_ _null_ _null_ timetz_hash _null_ _null_ _null_ ));+DESCR("hash");+DATA(insert OID = 1697 ( interval_hash PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 23 "1186" _null_ _null_ _null_ _null_ _null_ interval_hash _null_ _null_ _null_ ));+DESCR("hash");+++/* OID's 1700 - 1799 NUMERIC data type */+DATA(insert OID = 1701 ( numeric_in PGNSP PGUID 12 1 0 0 0 f f f f t f i 3 0 1700 "2275 26 23" _null_ _null_ _null_ _null_ _null_ numeric_in _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 1702 ( numeric_out PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2275 "1700" _null_ _null_ _null_ _null_ _null_ numeric_out _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2917 ( numerictypmodin PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 23 "1263" _null_ _null_ _null_ _null_ _null_ numerictypmodin _null_ _null_ _null_ ));+DESCR("I/O typmod");+DATA(insert OID = 2918 ( numerictypmodout PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2275 "23" _null_ _null_ _null_ _null_ _null_ numerictypmodout _null_ _null_ _null_ ));+DESCR("I/O typmod");+DATA(insert OID = 3157 ( numeric_transform PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2281 "2281" _null_ _null_ _null_ _null_ _null_ numeric_transform _null_ _null_ _null_ ));+DESCR("transform a numeric length coercion");+DATA(insert OID = 1703 ( numeric PGNSP PGUID 12 1 0 0 numeric_transform f f f f t f i 2 0 1700 "1700 23" _null_ _null_ _null_ _null_ _null_ numeric _null_ _null_ _null_ ));+DESCR("adjust numeric to typmod precision/scale");+DATA(insert OID = 1704 ( numeric_abs PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 1700 "1700" _null_ _null_ _null_ _null_ _null_ numeric_abs _null_ _null_ _null_ ));+DATA(insert OID = 1705 ( abs PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 1700 "1700" _null_ _null_ _null_ _null_ _null_ numeric_abs _null_ _null_ _null_ ));+DESCR("absolute value");+DATA(insert OID = 1706 ( sign PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 1700 "1700" _null_ _null_ _null_ _null_ _null_ numeric_sign _null_ _null_ _null_ ));+DESCR("sign of value");+DATA(insert OID = 1707 ( round PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1700 "1700 23" _null_ _null_ _null_ _null_ _null_ numeric_round _null_ _null_ _null_ ));+DESCR("value rounded to 'scale'");+DATA(insert OID = 1708 ( round PGNSP PGUID 14 1 0 0 0 f f f f t f i 1 0 1700 "1700" _null_ _null_ _null_ _null_ _null_ "select pg_catalog.round($1,0)" _null_ _null_ _null_ ));+DESCR("value rounded to 'scale' of zero");+DATA(insert OID = 1709 ( trunc PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1700 "1700 23" _null_ _null_ _null_ _null_ _null_ numeric_trunc _null_ _null_ _null_ ));+DESCR("value truncated to 'scale'");+DATA(insert OID = 1710 ( trunc PGNSP PGUID 14 1 0 0 0 f f f f t f i 1 0 1700 "1700" _null_ _null_ _null_ _null_ _null_ "select pg_catalog.trunc($1,0)" _null_ _null_ _null_ ));+DESCR("value truncated to 'scale' of zero");+DATA(insert OID = 1711 ( ceil PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 1700 "1700" _null_ _null_ _null_ _null_ _null_ numeric_ceil _null_ _null_ _null_ ));+DESCR("smallest integer >= value");+DATA(insert OID = 2167 ( ceiling PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 1700 "1700" _null_ _null_ _null_ _null_ _null_ numeric_ceil _null_ _null_ _null_ ));+DESCR("smallest integer >= value");+DATA(insert OID = 1712 ( floor PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 1700 "1700" _null_ _null_ _null_ _null_ _null_ numeric_floor _null_ _null_ _null_ ));+DESCR("largest integer <= value");+DATA(insert OID = 1718 ( numeric_eq PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "1700 1700" _null_ _null_ _null_ _null_ _null_ numeric_eq _null_ _null_ _null_ ));+DATA(insert OID = 1719 ( numeric_ne PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "1700 1700" _null_ _null_ _null_ _null_ _null_ numeric_ne _null_ _null_ _null_ ));+DATA(insert OID = 1720 ( numeric_gt PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "1700 1700" _null_ _null_ _null_ _null_ _null_ numeric_gt _null_ _null_ _null_ ));+DATA(insert OID = 1721 ( numeric_ge PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "1700 1700" _null_ _null_ _null_ _null_ _null_ numeric_ge _null_ _null_ _null_ ));+DATA(insert OID = 1722 ( numeric_lt PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "1700 1700" _null_ _null_ _null_ _null_ _null_ numeric_lt _null_ _null_ _null_ ));+DATA(insert OID = 1723 ( numeric_le PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "1700 1700" _null_ _null_ _null_ _null_ _null_ numeric_le _null_ _null_ _null_ ));+DATA(insert OID = 1724 ( numeric_add PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1700 "1700 1700" _null_ _null_ _null_ _null_ _null_ numeric_add _null_ _null_ _null_ ));+DATA(insert OID = 1725 ( numeric_sub PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1700 "1700 1700" _null_ _null_ _null_ _null_ _null_ numeric_sub _null_ _null_ _null_ ));+DATA(insert OID = 1726 ( numeric_mul PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1700 "1700 1700" _null_ _null_ _null_ _null_ _null_ numeric_mul _null_ _null_ _null_ ));+DATA(insert OID = 1727 ( numeric_div PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1700 "1700 1700" _null_ _null_ _null_ _null_ _null_ numeric_div _null_ _null_ _null_ ));+DATA(insert OID = 1728 ( mod PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1700 "1700 1700" _null_ _null_ _null_ _null_ _null_ numeric_mod _null_ _null_ _null_ ));+DESCR("modulus");+DATA(insert OID = 1729 ( numeric_mod PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1700 "1700 1700" _null_ _null_ _null_ _null_ _null_ numeric_mod _null_ _null_ _null_ ));+DATA(insert OID = 1730 ( sqrt PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 1700 "1700" _null_ _null_ _null_ _null_ _null_ numeric_sqrt _null_ _null_ _null_ ));+DESCR("square root");+DATA(insert OID = 1731 ( numeric_sqrt PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 1700 "1700" _null_ _null_ _null_ _null_ _null_ numeric_sqrt _null_ _null_ _null_ ));+DESCR("square root");+DATA(insert OID = 1732 ( exp PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 1700 "1700" _null_ _null_ _null_ _null_ _null_ numeric_exp _null_ _null_ _null_ ));+DESCR("natural exponential (e^x)");+DATA(insert OID = 1733 ( numeric_exp PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 1700 "1700" _null_ _null_ _null_ _null_ _null_ numeric_exp _null_ _null_ _null_ ));+DESCR("natural exponential (e^x)");+DATA(insert OID = 1734 ( ln PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 1700 "1700" _null_ _null_ _null_ _null_ _null_ numeric_ln _null_ _null_ _null_ ));+DESCR("natural logarithm");+DATA(insert OID = 1735 ( numeric_ln PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 1700 "1700" _null_ _null_ _null_ _null_ _null_ numeric_ln _null_ _null_ _null_ ));+DESCR("natural logarithm");+DATA(insert OID = 1736 ( log PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1700 "1700 1700" _null_ _null_ _null_ _null_ _null_ numeric_log _null_ _null_ _null_ ));+DESCR("logarithm base m of n");+DATA(insert OID = 1737 ( numeric_log PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1700 "1700 1700" _null_ _null_ _null_ _null_ _null_ numeric_log _null_ _null_ _null_ ));+DESCR("logarithm base m of n");+DATA(insert OID = 1738 ( pow PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1700 "1700 1700" _null_ _null_ _null_ _null_ _null_ numeric_power _null_ _null_ _null_ ));+DESCR("exponentiation");+DATA(insert OID = 2169 ( power PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1700 "1700 1700" _null_ _null_ _null_ _null_ _null_ numeric_power _null_ _null_ _null_ ));+DESCR("exponentiation");+DATA(insert OID = 1739 ( numeric_power PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1700 "1700 1700" _null_ _null_ _null_ _null_ _null_ numeric_power _null_ _null_ _null_ ));+DATA(insert OID = 1740 ( numeric PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 1700 "23" _null_ _null_ _null_ _null_ _null_ int4_numeric _null_ _null_ _null_ ));+DESCR("convert int4 to numeric");+DATA(insert OID = 1741 ( log PGNSP PGUID 14 1 0 0 0 f f f f t f i 1 0 1700 "1700" _null_ _null_ _null_ _null_ _null_ "select pg_catalog.log(10, $1)" _null_ _null_ _null_ ));+DESCR("base 10 logarithm");+DATA(insert OID = 1742 ( numeric PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 1700 "700" _null_ _null_ _null_ _null_ _null_ float4_numeric _null_ _null_ _null_ ));+DESCR("convert float4 to numeric");+DATA(insert OID = 1743 ( numeric PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 1700 "701" _null_ _null_ _null_ _null_ _null_ float8_numeric _null_ _null_ _null_ ));+DESCR("convert float8 to numeric");+DATA(insert OID = 1744 ( int4 PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 23 "1700" _null_ _null_ _null_ _null_ _null_ numeric_int4 _null_ _null_ _null_ ));+DESCR("convert numeric to int4");+DATA(insert OID = 1745 ( float4 PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 700 "1700" _null_ _null_ _null_ _null_ _null_ numeric_float4 _null_ _null_ _null_ ));+DESCR("convert numeric to float4");+DATA(insert OID = 1746 ( float8 PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 701 "1700" _null_ _null_ _null_ _null_ _null_ numeric_float8 _null_ _null_ _null_ ));+DESCR("convert numeric to float8");+DATA(insert OID = 1973 ( div PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1700 "1700 1700" _null_ _null_ _null_ _null_ _null_ numeric_div_trunc _null_ _null_ _null_ ));+DESCR("trunc(x/y)");+DATA(insert OID = 1980 ( numeric_div_trunc PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1700 "1700 1700" _null_ _null_ _null_ _null_ _null_ numeric_div_trunc _null_ _null_ _null_ ));+DESCR("trunc(x/y)");+DATA(insert OID = 2170 ( width_bucket PGNSP PGUID 12 1 0 0 0 f f f f t f i 4 0 23 "1700 1700 1700 23" _null_ _null_ _null_ _null_ _null_ width_bucket_numeric _null_ _null_ _null_ ));+DESCR("bucket number of operand in equal-width histogram");++DATA(insert OID = 1747 ( time_pl_interval PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1083 "1083 1186" _null_ _null_ _null_ _null_ _null_ time_pl_interval _null_ _null_ _null_ ));+DATA(insert OID = 1748 ( time_mi_interval PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1083 "1083 1186" _null_ _null_ _null_ _null_ _null_ time_mi_interval _null_ _null_ _null_ ));+DATA(insert OID = 1749 ( timetz_pl_interval PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1266 "1266 1186" _null_ _null_ _null_ _null_ _null_ timetz_pl_interval _null_ _null_ _null_ ));+DATA(insert OID = 1750 ( timetz_mi_interval PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1266 "1266 1186" _null_ _null_ _null_ _null_ _null_ timetz_mi_interval _null_ _null_ _null_ ));++DATA(insert OID = 1764 ( numeric_inc PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 1700 "1700" _null_ _null_ _null_ _null_ _null_ numeric_inc _null_ _null_ _null_ ));+DESCR("increment by one");+DATA(insert OID = 1766 ( numeric_smaller PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1700 "1700 1700" _null_ _null_ _null_ _null_ _null_ numeric_smaller _null_ _null_ _null_ ));+DESCR("smaller of two");+DATA(insert OID = 1767 ( numeric_larger PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1700 "1700 1700" _null_ _null_ _null_ _null_ _null_ numeric_larger _null_ _null_ _null_ ));+DESCR("larger of two");+DATA(insert OID = 1769 ( numeric_cmp PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "1700 1700" _null_ _null_ _null_ _null_ _null_ numeric_cmp _null_ _null_ _null_ ));+DESCR("less-equal-greater");+DATA(insert OID = 3283 ( numeric_sortsupport PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2278 "2281" _null_ _null_ _null_ _null_ _null_ numeric_sortsupport _null_ _null_ _null_ ));+DESCR("sort support");+DATA(insert OID = 1771 ( numeric_uminus PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 1700 "1700" _null_ _null_ _null_ _null_ _null_ numeric_uminus _null_ _null_ _null_ ));+DATA(insert OID = 1779 ( int8 PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 20 "1700" _null_ _null_ _null_ _null_ _null_ numeric_int8 _null_ _null_ _null_ ));+DESCR("convert numeric to int8");+DATA(insert OID = 1781 ( numeric PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 1700 "20" _null_ _null_ _null_ _null_ _null_ int8_numeric _null_ _null_ _null_ ));+DESCR("convert int8 to numeric");+DATA(insert OID = 1782 ( numeric PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 1700 "21" _null_ _null_ _null_ _null_ _null_ int2_numeric _null_ _null_ _null_ ));+DESCR("convert int2 to numeric");+DATA(insert OID = 1783 ( int2 PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 21 "1700" _null_ _null_ _null_ _null_ _null_ numeric_int2 _null_ _null_ _null_ ));+DESCR("convert numeric to int2");++/* formatting */+DATA(insert OID = 1770 ( to_char PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 25 "1184 25" _null_ _null_ _null_ _null_ _null_ timestamptz_to_char _null_ _null_ _null_ ));+DESCR("format timestamp with time zone to text");+DATA(insert OID = 1772 ( to_char PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 25 "1700 25" _null_ _null_ _null_ _null_ _null_ numeric_to_char _null_ _null_ _null_ ));+DESCR("format numeric to text");+DATA(insert OID = 1773 ( to_char PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 25 "23 25" _null_ _null_ _null_ _null_ _null_ int4_to_char _null_ _null_ _null_ ));+DESCR("format int4 to text");+DATA(insert OID = 1774 ( to_char PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 25 "20 25" _null_ _null_ _null_ _null_ _null_ int8_to_char _null_ _null_ _null_ ));+DESCR("format int8 to text");+DATA(insert OID = 1775 ( to_char PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 25 "700 25" _null_ _null_ _null_ _null_ _null_ float4_to_char _null_ _null_ _null_ ));+DESCR("format float4 to text");+DATA(insert OID = 1776 ( to_char PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 25 "701 25" _null_ _null_ _null_ _null_ _null_ float8_to_char _null_ _null_ _null_ ));+DESCR("format float8 to text");+DATA(insert OID = 1777 ( to_number PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 1700 "25 25" _null_ _null_ _null_ _null_ _null_ numeric_to_number _null_ _null_ _null_ ));+DESCR("convert text to numeric");+DATA(insert OID = 1778 ( to_timestamp PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 1184 "25 25" _null_ _null_ _null_ _null_ _null_ to_timestamp _null_ _null_ _null_ ));+DESCR("convert text to timestamp with time zone");+DATA(insert OID = 1780 ( to_date PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 1082 "25 25" _null_ _null_ _null_ _null_ _null_ to_date _null_ _null_ _null_ ));+DESCR("convert text to date");+DATA(insert OID = 1768 ( to_char PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 25 "1186 25" _null_ _null_ _null_ _null_ _null_ interval_to_char _null_ _null_ _null_ ));+DESCR("format interval to text");++DATA(insert OID = 1282 ( quote_ident PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 25 "25" _null_ _null_ _null_ _null_ _null_ quote_ident _null_ _null_ _null_ ));+DESCR("quote an identifier for usage in a querystring");+DATA(insert OID = 1283 ( quote_literal PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 25 "25" _null_ _null_ _null_ _null_ _null_ quote_literal _null_ _null_ _null_ ));+DESCR("quote a literal for usage in a querystring");+DATA(insert OID = 1285 ( quote_literal PGNSP PGUID 14 1 0 0 0 f f f f t f s 1 0 25 "2283" _null_ _null_ _null_ _null_ _null_ "select pg_catalog.quote_literal($1::pg_catalog.text)" _null_ _null_ _null_ ));+DESCR("quote a data value for usage in a querystring");+DATA(insert OID = 1289 ( quote_nullable PGNSP PGUID 12 1 0 0 0 f f f f f f i 1 0 25 "25" _null_ _null_ _null_ _null_ _null_ quote_nullable _null_ _null_ _null_ ));+DESCR("quote a possibly-null literal for usage in a querystring");+DATA(insert OID = 1290 ( quote_nullable PGNSP PGUID 14 1 0 0 0 f f f f f f s 1 0 25 "2283" _null_ _null_ _null_ _null_ _null_ "select pg_catalog.quote_nullable($1::pg_catalog.text)" _null_ _null_ _null_ ));+DESCR("quote a possibly-null data value for usage in a querystring");++DATA(insert OID = 1798 ( oidin PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 26 "2275" _null_ _null_ _null_ _null_ _null_ oidin _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 1799 ( oidout PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2275 "26" _null_ _null_ _null_ _null_ _null_ oidout _null_ _null_ _null_ ));+DESCR("I/O");++DATA(insert OID = 3058 ( concat PGNSP PGUID 12 1 0 2276 0 f f f f f f s 1 0 25 "2276" "{2276}" "{v}" _null_ _null_ _null_ text_concat _null_ _null_ _null_ ));+DESCR("concatenate values");+DATA(insert OID = 3059 ( concat_ws PGNSP PGUID 12 1 0 2276 0 f f f f f f s 2 0 25 "25 2276" "{25,2276}" "{i,v}" _null_ _null_ _null_ text_concat_ws _null_ _null_ _null_ ));+DESCR("concatenate values with separators");+DATA(insert OID = 3060 ( left PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 25 "25 23" _null_ _null_ _null_ _null_ _null_ text_left _null_ _null_ _null_ ));+DESCR("extract the first n characters");+DATA(insert OID = 3061 ( right PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 25 "25 23" _null_ _null_ _null_ _null_ _null_ text_right _null_ _null_ _null_ ));+DESCR("extract the last n characters");+DATA(insert OID = 3062 ( reverse PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 25 "25" _null_ _null_ _null_ _null_ _null_ text_reverse _null_ _null_ _null_ ));+DESCR("reverse text");+DATA(insert OID = 3539 ( format PGNSP PGUID 12 1 0 2276 0 f f f f f f s 2 0 25 "25 2276" "{25,2276}" "{i,v}" _null_ _null_ _null_ text_format _null_ _null_ _null_ ));+DESCR("format text message");+DATA(insert OID = 3540 ( format PGNSP PGUID 12 1 0 0 0 f f f f f f s 1 0 25 "25" _null_ _null_ _null_ _null_ _null_ text_format_nv _null_ _null_ _null_ ));+DESCR("format text message");++DATA(insert OID = 1810 ( bit_length PGNSP PGUID 14 1 0 0 0 f f f f t f i 1 0 23 "17" _null_ _null_ _null_ _null_ _null_ "select pg_catalog.octet_length($1) * 8" _null_ _null_ _null_ ));+DESCR("length in bits");+DATA(insert OID = 1811 ( bit_length PGNSP PGUID 14 1 0 0 0 f f f f t f i 1 0 23 "25" _null_ _null_ _null_ _null_ _null_ "select pg_catalog.octet_length($1) * 8" _null_ _null_ _null_ ));+DESCR("length in bits");+DATA(insert OID = 1812 ( bit_length PGNSP PGUID 14 1 0 0 0 f f f f t f i 1 0 23 "1560" _null_ _null_ _null_ _null_ _null_ "select pg_catalog.length($1)" _null_ _null_ _null_ ));+DESCR("length in bits");++/* Selectivity estimators for LIKE and related operators */+DATA(insert OID = 1814 ( iclikesel PGNSP PGUID 12 1 0 0 0 f f f f t f s 4 0 701 "2281 26 2281 23" _null_ _null_ _null_ _null_ _null_ iclikesel _null_ _null_ _null_ ));+DESCR("restriction selectivity of ILIKE");+DATA(insert OID = 1815 ( icnlikesel PGNSP PGUID 12 1 0 0 0 f f f f t f s 4 0 701 "2281 26 2281 23" _null_ _null_ _null_ _null_ _null_ icnlikesel _null_ _null_ _null_ ));+DESCR("restriction selectivity of NOT ILIKE");+DATA(insert OID = 1816 ( iclikejoinsel PGNSP PGUID 12 1 0 0 0 f f f f t f s 5 0 701 "2281 26 2281 21 2281" _null_ _null_ _null_ _null_ _null_ iclikejoinsel _null_ _null_ _null_ ));+DESCR("join selectivity of ILIKE");+DATA(insert OID = 1817 ( icnlikejoinsel PGNSP PGUID 12 1 0 0 0 f f f f t f s 5 0 701 "2281 26 2281 21 2281" _null_ _null_ _null_ _null_ _null_ icnlikejoinsel _null_ _null_ _null_ ));+DESCR("join selectivity of NOT ILIKE");+DATA(insert OID = 1818 ( regexeqsel PGNSP PGUID 12 1 0 0 0 f f f f t f s 4 0 701 "2281 26 2281 23" _null_ _null_ _null_ _null_ _null_ regexeqsel _null_ _null_ _null_ ));+DESCR("restriction selectivity of regex match");+DATA(insert OID = 1819 ( likesel PGNSP PGUID 12 1 0 0 0 f f f f t f s 4 0 701 "2281 26 2281 23" _null_ _null_ _null_ _null_ _null_ likesel _null_ _null_ _null_ ));+DESCR("restriction selectivity of LIKE");+DATA(insert OID = 1820 ( icregexeqsel PGNSP PGUID 12 1 0 0 0 f f f f t f s 4 0 701 "2281 26 2281 23" _null_ _null_ _null_ _null_ _null_ icregexeqsel _null_ _null_ _null_ ));+DESCR("restriction selectivity of case-insensitive regex match");+DATA(insert OID = 1821 ( regexnesel PGNSP PGUID 12 1 0 0 0 f f f f t f s 4 0 701 "2281 26 2281 23" _null_ _null_ _null_ _null_ _null_ regexnesel _null_ _null_ _null_ ));+DESCR("restriction selectivity of regex non-match");+DATA(insert OID = 1822 ( nlikesel PGNSP PGUID 12 1 0 0 0 f f f f t f s 4 0 701 "2281 26 2281 23" _null_ _null_ _null_ _null_ _null_ nlikesel _null_ _null_ _null_ ));+DESCR("restriction selectivity of NOT LIKE");+DATA(insert OID = 1823 ( icregexnesel PGNSP PGUID 12 1 0 0 0 f f f f t f s 4 0 701 "2281 26 2281 23" _null_ _null_ _null_ _null_ _null_ icregexnesel _null_ _null_ _null_ ));+DESCR("restriction selectivity of case-insensitive regex non-match");+DATA(insert OID = 1824 ( regexeqjoinsel PGNSP PGUID 12 1 0 0 0 f f f f t f s 5 0 701 "2281 26 2281 21 2281" _null_ _null_ _null_ _null_ _null_ regexeqjoinsel _null_ _null_ _null_ ));+DESCR("join selectivity of regex match");+DATA(insert OID = 1825 ( likejoinsel PGNSP PGUID 12 1 0 0 0 f f f f t f s 5 0 701 "2281 26 2281 21 2281" _null_ _null_ _null_ _null_ _null_ likejoinsel _null_ _null_ _null_ ));+DESCR("join selectivity of LIKE");+DATA(insert OID = 1826 ( icregexeqjoinsel PGNSP PGUID 12 1 0 0 0 f f f f t f s 5 0 701 "2281 26 2281 21 2281" _null_ _null_ _null_ _null_ _null_ icregexeqjoinsel _null_ _null_ _null_ ));+DESCR("join selectivity of case-insensitive regex match");+DATA(insert OID = 1827 ( regexnejoinsel PGNSP PGUID 12 1 0 0 0 f f f f t f s 5 0 701 "2281 26 2281 21 2281" _null_ _null_ _null_ _null_ _null_ regexnejoinsel _null_ _null_ _null_ ));+DESCR("join selectivity of regex non-match");+DATA(insert OID = 1828 ( nlikejoinsel PGNSP PGUID 12 1 0 0 0 f f f f t f s 5 0 701 "2281 26 2281 21 2281" _null_ _null_ _null_ _null_ _null_ nlikejoinsel _null_ _null_ _null_ ));+DESCR("join selectivity of NOT LIKE");+DATA(insert OID = 1829 ( icregexnejoinsel PGNSP PGUID 12 1 0 0 0 f f f f t f s 5 0 701 "2281 26 2281 21 2281" _null_ _null_ _null_ _null_ _null_ icregexnejoinsel _null_ _null_ _null_ ));+DESCR("join selectivity of case-insensitive regex non-match");++/* Aggregate-related functions */+DATA(insert OID = 1830 ( float8_avg PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 701 "1022" _null_ _null_ _null_ _null_ _null_ float8_avg _null_ _null_ _null_ ));+DESCR("aggregate final function");+DATA(insert OID = 2512 ( float8_var_pop PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 701 "1022" _null_ _null_ _null_ _null_ _null_ float8_var_pop _null_ _null_ _null_ ));+DESCR("aggregate final function");+DATA(insert OID = 1831 ( float8_var_samp PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 701 "1022" _null_ _null_ _null_ _null_ _null_ float8_var_samp _null_ _null_ _null_ ));+DESCR("aggregate final function");+DATA(insert OID = 2513 ( float8_stddev_pop PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 701 "1022" _null_ _null_ _null_ _null_ _null_ float8_stddev_pop _null_ _null_ _null_ ));+DESCR("aggregate final function");+DATA(insert OID = 1832 ( float8_stddev_samp PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 701 "1022" _null_ _null_ _null_ _null_ _null_ float8_stddev_samp _null_ _null_ _null_ ));+DESCR("aggregate final function");+DATA(insert OID = 1833 ( numeric_accum PGNSP PGUID 12 1 0 0 0 f f f f f f i 2 0 2281 "2281 1700" _null_ _null_ _null_ _null_ _null_ numeric_accum _null_ _null_ _null_ ));+DESCR("aggregate transition function");+DATA(insert OID = 2858 ( numeric_avg_accum PGNSP PGUID 12 1 0 0 0 f f f f f f i 2 0 2281 "2281 1700" _null_ _null_ _null_ _null_ _null_ numeric_avg_accum _null_ _null_ _null_ ));+DESCR("aggregate transition function");+DATA(insert OID = 3548 ( numeric_accum_inv PGNSP PGUID 12 1 0 0 0 f f f f f f i 2 0 2281 "2281 1700" _null_ _null_ _null_ _null_ _null_ numeric_accum_inv _null_ _null_ _null_ ));+DESCR("aggregate transition function");+DATA(insert OID = 1834 ( int2_accum PGNSP PGUID 12 1 0 0 0 f f f f f f i 2 0 2281 "2281 21" _null_ _null_ _null_ _null_ _null_ int2_accum _null_ _null_ _null_ ));+DESCR("aggregate transition function");+DATA(insert OID = 1835 ( int4_accum PGNSP PGUID 12 1 0 0 0 f f f f f f i 2 0 2281 "2281 23" _null_ _null_ _null_ _null_ _null_ int4_accum _null_ _null_ _null_ ));+DESCR("aggregate transition function");+DATA(insert OID = 1836 ( int8_accum PGNSP PGUID 12 1 0 0 0 f f f f f f i 2 0 2281 "2281 20" _null_ _null_ _null_ _null_ _null_ int8_accum _null_ _null_ _null_ ));+DESCR("aggregate transition function");+DATA(insert OID = 2746 ( int8_avg_accum PGNSP PGUID 12 1 0 0 0 f f f f f f i 2 0 2281 "2281 20" _null_ _null_ _null_ _null_ _null_ int8_avg_accum _null_ _null_ _null_ ));+DESCR("aggregate transition function");+DATA(insert OID = 3567 ( int2_accum_inv PGNSP PGUID 12 1 0 0 0 f f f f f f i 2 0 2281 "2281 21" _null_ _null_ _null_ _null_ _null_ int2_accum_inv _null_ _null_ _null_ ));+DESCR("aggregate transition function");+DATA(insert OID = 3568 ( int4_accum_inv PGNSP PGUID 12 1 0 0 0 f f f f f f i 2 0 2281 "2281 23" _null_ _null_ _null_ _null_ _null_ int4_accum_inv _null_ _null_ _null_ ));+DESCR("aggregate transition function");+DATA(insert OID = 3569 ( int8_accum_inv PGNSP PGUID 12 1 0 0 0 f f f f f f i 2 0 2281 "2281 20" _null_ _null_ _null_ _null_ _null_ int8_accum_inv _null_ _null_ _null_ ));+DESCR("aggregate transition function");+DATA(insert OID = 3387 ( int8_avg_accum_inv PGNSP PGUID 12 1 0 0 0 f f f f f f i 2 0 2281 "2281 20" _null_ _null_ _null_ _null_ _null_ int8_avg_accum_inv _null_ _null_ _null_ ));+DESCR("aggregate transition function");+DATA(insert OID = 3178 ( numeric_sum PGNSP PGUID 12 1 0 0 0 f f f f f f i 1 0 1700 "2281" _null_ _null_ _null_ _null_ _null_ numeric_sum _null_ _null_ _null_ ));+DESCR("aggregate final function");+DATA(insert OID = 1837 ( numeric_avg PGNSP PGUID 12 1 0 0 0 f f f f f f i 1 0 1700 "2281" _null_ _null_ _null_ _null_ _null_ numeric_avg _null_ _null_ _null_ ));+DESCR("aggregate final function");+DATA(insert OID = 2514 ( numeric_var_pop PGNSP PGUID 12 1 0 0 0 f f f f f f i 1 0 1700 "2281" _null_ _null_ _null_ _null_ _null_ numeric_var_pop _null_ _null_ _null_ ));+DESCR("aggregate final function");+DATA(insert OID = 1838 ( numeric_var_samp PGNSP PGUID 12 1 0 0 0 f f f f f f i 1 0 1700 "2281" _null_ _null_ _null_ _null_ _null_ numeric_var_samp _null_ _null_ _null_ ));+DESCR("aggregate final function");+DATA(insert OID = 2596 ( numeric_stddev_pop PGNSP PGUID 12 1 0 0 0 f f f f f f i 1 0 1700 "2281" _null_ _null_ _null_ _null_ _null_ numeric_stddev_pop _null_ _null_ _null_ ));+DESCR("aggregate final function");+DATA(insert OID = 1839 ( numeric_stddev_samp PGNSP PGUID 12 1 0 0 0 f f f f f f i 1 0 1700 "2281" _null_ _null_ _null_ _null_ _null_ numeric_stddev_samp _null_ _null_ _null_ ));+DESCR("aggregate final function");+DATA(insert OID = 1840 ( int2_sum PGNSP PGUID 12 1 0 0 0 f f f f f f i 2 0 20 "20 21" _null_ _null_ _null_ _null_ _null_ int2_sum _null_ _null_ _null_ ));+DESCR("aggregate transition function");+DATA(insert OID = 1841 ( int4_sum PGNSP PGUID 12 1 0 0 0 f f f f f f i 2 0 20 "20 23" _null_ _null_ _null_ _null_ _null_ int4_sum _null_ _null_ _null_ ));+DESCR("aggregate transition function");+DATA(insert OID = 1842 ( int8_sum PGNSP PGUID 12 1 0 0 0 f f f f f f i 2 0 1700 "1700 20" _null_ _null_ _null_ _null_ _null_ int8_sum _null_ _null_ _null_ ));+DESCR("aggregate transition function");+DATA(insert OID = 3388 ( numeric_poly_sum PGNSP PGUID 12 1 0 0 0 f f f f f f i 1 0 1700 "2281" _null_ _null_ _null_ _null_ _null_ numeric_poly_sum _null_ _null_ _null_ ));+DESCR("aggregate final function");+DATA(insert OID = 3389 ( numeric_poly_avg PGNSP PGUID 12 1 0 0 0 f f f f f f i 1 0 1700 "2281" _null_ _null_ _null_ _null_ _null_ numeric_poly_avg _null_ _null_ _null_ ));+DESCR("aggregate final function");+DATA(insert OID = 3390 ( numeric_poly_var_pop PGNSP PGUID 12 1 0 0 0 f f f f f f i 1 0 1700 "2281" _null_ _null_ _null_ _null_ _null_ numeric_poly_var_pop _null_ _null_ _null_ ));+DESCR("aggregate final function");+DATA(insert OID = 3391 ( numeric_poly_var_samp PGNSP PGUID 12 1 0 0 0 f f f f f f i 1 0 1700 "2281" _null_ _null_ _null_ _null_ _null_ numeric_poly_var_samp _null_ _null_ _null_ ));+DESCR("aggregate final function");+DATA(insert OID = 3392 ( numeric_poly_stddev_pop PGNSP PGUID 12 1 0 0 0 f f f f f f i 1 0 1700 "2281" _null_ _null_ _null_ _null_ _null_ numeric_poly_stddev_pop _null_ _null_ _null_ ));+DESCR("aggregate final function");+DATA(insert OID = 3393 ( numeric_poly_stddev_samp PGNSP PGUID 12 1 0 0 0 f f f f f f i 1 0 1700 "2281" _null_ _null_ _null_ _null_ _null_ numeric_poly_stddev_samp _null_ _null_ _null_ ));+DESCR("aggregate final function");++DATA(insert OID = 1843 ( interval_accum PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1187 "1187 1186" _null_ _null_ _null_ _null_ _null_ interval_accum _null_ _null_ _null_ ));+DESCR("aggregate transition function");+DATA(insert OID = 3549 ( interval_accum_inv PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1187 "1187 1186" _null_ _null_ _null_ _null_ _null_ interval_accum_inv _null_ _null_ _null_ ));+DESCR("aggregate transition function");+DATA(insert OID = 1844 ( interval_avg PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 1186 "1187" _null_ _null_ _null_ _null_ _null_ interval_avg _null_ _null_ _null_ ));+DESCR("aggregate final function");+DATA(insert OID = 1962 ( int2_avg_accum PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1016 "1016 21" _null_ _null_ _null_ _null_ _null_ int2_avg_accum _null_ _null_ _null_ ));+DESCR("aggregate transition function");+DATA(insert OID = 1963 ( int4_avg_accum PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1016 "1016 23" _null_ _null_ _null_ _null_ _null_ int4_avg_accum _null_ _null_ _null_ ));+DESCR("aggregate transition function");+DATA(insert OID = 3570 ( int2_avg_accum_inv PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1016 "1016 21" _null_ _null_ _null_ _null_ _null_ int2_avg_accum_inv _null_ _null_ _null_ ));+DESCR("aggregate transition function");+DATA(insert OID = 3571 ( int4_avg_accum_inv PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1016 "1016 23" _null_ _null_ _null_ _null_ _null_ int4_avg_accum_inv _null_ _null_ _null_ ));+DESCR("aggregate transition function");+DATA(insert OID = 1964 ( int8_avg PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 1700 "1016" _null_ _null_ _null_ _null_ _null_ int8_avg _null_ _null_ _null_ ));+DESCR("aggregate final function");+DATA(insert OID = 3572 ( int2int4_sum PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 20 "1016" _null_ _null_ _null_ _null_ _null_ int2int4_sum _null_ _null_ _null_ ));+DESCR("aggregate final function");+DATA(insert OID = 2805 ( int8inc_float8_float8 PGNSP PGUID 12 1 0 0 0 f f f f t f i 3 0 20 "20 701 701" _null_ _null_ _null_ _null_ _null_ int8inc_float8_float8 _null_ _null_ _null_ ));+DESCR("aggregate transition function");+DATA(insert OID = 2806 ( float8_regr_accum PGNSP PGUID 12 1 0 0 0 f f f f t f i 3 0 1022 "1022 701 701" _null_ _null_ _null_ _null_ _null_ float8_regr_accum _null_ _null_ _null_ ));+DESCR("aggregate transition function");+DATA(insert OID = 2807 ( float8_regr_sxx PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 701 "1022" _null_ _null_ _null_ _null_ _null_ float8_regr_sxx _null_ _null_ _null_ ));+DESCR("aggregate final function");+DATA(insert OID = 2808 ( float8_regr_syy PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 701 "1022" _null_ _null_ _null_ _null_ _null_ float8_regr_syy _null_ _null_ _null_ ));+DESCR("aggregate final function");+DATA(insert OID = 2809 ( float8_regr_sxy PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 701 "1022" _null_ _null_ _null_ _null_ _null_ float8_regr_sxy _null_ _null_ _null_ ));+DESCR("aggregate final function");+DATA(insert OID = 2810 ( float8_regr_avgx PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 701 "1022" _null_ _null_ _null_ _null_ _null_ float8_regr_avgx _null_ _null_ _null_ ));+DESCR("aggregate final function");+DATA(insert OID = 2811 ( float8_regr_avgy PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 701 "1022" _null_ _null_ _null_ _null_ _null_ float8_regr_avgy _null_ _null_ _null_ ));+DESCR("aggregate final function");+DATA(insert OID = 2812 ( float8_regr_r2 PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 701 "1022" _null_ _null_ _null_ _null_ _null_ float8_regr_r2 _null_ _null_ _null_ ));+DESCR("aggregate final function");+DATA(insert OID = 2813 ( float8_regr_slope PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 701 "1022" _null_ _null_ _null_ _null_ _null_ float8_regr_slope _null_ _null_ _null_ ));+DESCR("aggregate final function");+DATA(insert OID = 2814 ( float8_regr_intercept PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 701 "1022" _null_ _null_ _null_ _null_ _null_ float8_regr_intercept _null_ _null_ _null_ ));+DESCR("aggregate final function");+DATA(insert OID = 2815 ( float8_covar_pop PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 701 "1022" _null_ _null_ _null_ _null_ _null_ float8_covar_pop _null_ _null_ _null_ ));+DESCR("aggregate final function");+DATA(insert OID = 2816 ( float8_covar_samp PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 701 "1022" _null_ _null_ _null_ _null_ _null_ float8_covar_samp _null_ _null_ _null_ ));+DESCR("aggregate final function");+DATA(insert OID = 2817 ( float8_corr PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 701 "1022" _null_ _null_ _null_ _null_ _null_ float8_corr _null_ _null_ _null_ ));+DESCR("aggregate final function");++DATA(insert OID = 3535 ( string_agg_transfn PGNSP PGUID 12 1 0 0 0 f f f f f f i 3 0 2281 "2281 25 25" _null_ _null_ _null_ _null_ _null_ string_agg_transfn _null_ _null_ _null_ ));+DESCR("aggregate transition function");+DATA(insert OID = 3536 ( string_agg_finalfn PGNSP PGUID 12 1 0 0 0 f f f f f f i 1 0 25 "2281" _null_ _null_ _null_ _null_ _null_ string_agg_finalfn _null_ _null_ _null_ ));+DESCR("aggregate final function");+DATA(insert OID = 3538 ( string_agg PGNSP PGUID 12 1 0 0 0 t f f f f f i 2 0 25 "25 25" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("concatenate aggregate input into a string");+DATA(insert OID = 3543 ( bytea_string_agg_transfn PGNSP PGUID 12 1 0 0 0 f f f f f f i 3 0 2281 "2281 17 17" _null_ _null_ _null_ _null_ _null_ bytea_string_agg_transfn _null_ _null_ _null_ ));+DESCR("aggregate transition function");+DATA(insert OID = 3544 ( bytea_string_agg_finalfn PGNSP PGUID 12 1 0 0 0 f f f f f f i 1 0 17 "2281" _null_ _null_ _null_ _null_ _null_ bytea_string_agg_finalfn _null_ _null_ _null_ ));+DESCR("aggregate final function");+DATA(insert OID = 3545 ( string_agg PGNSP PGUID 12 1 0 0 0 t f f f f f i 2 0 17 "17 17" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("concatenate aggregate input into a bytea");++/* To ASCII conversion */+DATA(insert OID = 1845 ( to_ascii PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 25 "25" _null_ _null_ _null_ _null_ _null_ to_ascii_default _null_ _null_ _null_ ));+DESCR("encode text from DB encoding to ASCII text");+DATA(insert OID = 1846 ( to_ascii PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 25 "25 23" _null_ _null_ _null_ _null_ _null_ to_ascii_enc _null_ _null_ _null_ ));+DESCR("encode text from encoding to ASCII text");+DATA(insert OID = 1847 ( to_ascii PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 25 "25 19" _null_ _null_ _null_ _null_ _null_ to_ascii_encname _null_ _null_ _null_ ));+DESCR("encode text from encoding to ASCII text");++DATA(insert OID = 1848 ( interval_pl_time PGNSP PGUID 14 1 0 0 0 f f f f t f i 2 0 1083 "1186 1083" _null_ _null_ _null_ _null_ _null_ "select $2 + $1" _null_ _null_ _null_ ));++DATA(insert OID = 1850 ( int28eq PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "21 20" _null_ _null_ _null_ _null_ _null_ int28eq _null_ _null_ _null_ ));+DATA(insert OID = 1851 ( int28ne PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "21 20" _null_ _null_ _null_ _null_ _null_ int28ne _null_ _null_ _null_ ));+DATA(insert OID = 1852 ( int28lt PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "21 20" _null_ _null_ _null_ _null_ _null_ int28lt _null_ _null_ _null_ ));+DATA(insert OID = 1853 ( int28gt PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "21 20" _null_ _null_ _null_ _null_ _null_ int28gt _null_ _null_ _null_ ));+DATA(insert OID = 1854 ( int28le PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "21 20" _null_ _null_ _null_ _null_ _null_ int28le _null_ _null_ _null_ ));+DATA(insert OID = 1855 ( int28ge PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "21 20" _null_ _null_ _null_ _null_ _null_ int28ge _null_ _null_ _null_ ));++DATA(insert OID = 1856 ( int82eq PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "20 21" _null_ _null_ _null_ _null_ _null_ int82eq _null_ _null_ _null_ ));+DATA(insert OID = 1857 ( int82ne PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "20 21" _null_ _null_ _null_ _null_ _null_ int82ne _null_ _null_ _null_ ));+DATA(insert OID = 1858 ( int82lt PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "20 21" _null_ _null_ _null_ _null_ _null_ int82lt _null_ _null_ _null_ ));+DATA(insert OID = 1859 ( int82gt PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "20 21" _null_ _null_ _null_ _null_ _null_ int82gt _null_ _null_ _null_ ));+DATA(insert OID = 1860 ( int82le PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "20 21" _null_ _null_ _null_ _null_ _null_ int82le _null_ _null_ _null_ ));+DATA(insert OID = 1861 ( int82ge PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "20 21" _null_ _null_ _null_ _null_ _null_ int82ge _null_ _null_ _null_ ));++DATA(insert OID = 1892 ( int2and PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 21 "21 21" _null_ _null_ _null_ _null_ _null_ int2and _null_ _null_ _null_ ));+DATA(insert OID = 1893 ( int2or PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 21 "21 21" _null_ _null_ _null_ _null_ _null_ int2or _null_ _null_ _null_ ));+DATA(insert OID = 1894 ( int2xor PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 21 "21 21" _null_ _null_ _null_ _null_ _null_ int2xor _null_ _null_ _null_ ));+DATA(insert OID = 1895 ( int2not PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 21 "21" _null_ _null_ _null_ _null_ _null_ int2not _null_ _null_ _null_ ));+DATA(insert OID = 1896 ( int2shl PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 21 "21 23" _null_ _null_ _null_ _null_ _null_ int2shl _null_ _null_ _null_ ));+DATA(insert OID = 1897 ( int2shr PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 21 "21 23" _null_ _null_ _null_ _null_ _null_ int2shr _null_ _null_ _null_ ));++DATA(insert OID = 1898 ( int4and PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "23 23" _null_ _null_ _null_ _null_ _null_ int4and _null_ _null_ _null_ ));+DATA(insert OID = 1899 ( int4or PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "23 23" _null_ _null_ _null_ _null_ _null_ int4or _null_ _null_ _null_ ));+DATA(insert OID = 1900 ( int4xor PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "23 23" _null_ _null_ _null_ _null_ _null_ int4xor _null_ _null_ _null_ ));+DATA(insert OID = 1901 ( int4not PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 23 "23" _null_ _null_ _null_ _null_ _null_ int4not _null_ _null_ _null_ ));+DATA(insert OID = 1902 ( int4shl PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "23 23" _null_ _null_ _null_ _null_ _null_ int4shl _null_ _null_ _null_ ));+DATA(insert OID = 1903 ( int4shr PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "23 23" _null_ _null_ _null_ _null_ _null_ int4shr _null_ _null_ _null_ ));++DATA(insert OID = 1904 ( int8and PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 20 "20 20" _null_ _null_ _null_ _null_ _null_ int8and _null_ _null_ _null_ ));+DATA(insert OID = 1905 ( int8or PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 20 "20 20" _null_ _null_ _null_ _null_ _null_ int8or _null_ _null_ _null_ ));+DATA(insert OID = 1906 ( int8xor PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 20 "20 20" _null_ _null_ _null_ _null_ _null_ int8xor _null_ _null_ _null_ ));+DATA(insert OID = 1907 ( int8not PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 20 "20" _null_ _null_ _null_ _null_ _null_ int8not _null_ _null_ _null_ ));+DATA(insert OID = 1908 ( int8shl PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 20 "20 23" _null_ _null_ _null_ _null_ _null_ int8shl _null_ _null_ _null_ ));+DATA(insert OID = 1909 ( int8shr PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 20 "20 23" _null_ _null_ _null_ _null_ _null_ int8shr _null_ _null_ _null_ ));++DATA(insert OID = 1910 ( int8up PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 20 "20" _null_ _null_ _null_ _null_ _null_ int8up _null_ _null_ _null_ ));+DATA(insert OID = 1911 ( int2up PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 21 "21" _null_ _null_ _null_ _null_ _null_ int2up _null_ _null_ _null_ ));+DATA(insert OID = 1912 ( int4up PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 23 "23" _null_ _null_ _null_ _null_ _null_ int4up _null_ _null_ _null_ ));+DATA(insert OID = 1913 ( float4up PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 700 "700" _null_ _null_ _null_ _null_ _null_ float4up _null_ _null_ _null_ ));+DATA(insert OID = 1914 ( float8up PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 701 "701" _null_ _null_ _null_ _null_ _null_ float8up _null_ _null_ _null_ ));+DATA(insert OID = 1915 ( numeric_uplus PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 1700 "1700" _null_ _null_ _null_ _null_ _null_ numeric_uplus _null_ _null_ _null_ ));++DATA(insert OID = 1922 ( has_table_privilege PGNSP PGUID 12 1 0 0 0 f f f f t f s 3 0 16 "19 25 25" _null_ _null_ _null_ _null_ _null_ has_table_privilege_name_name _null_ _null_ _null_ ));+DESCR("user privilege on relation by username, rel name");+DATA(insert OID = 1923 ( has_table_privilege PGNSP PGUID 12 1 0 0 0 f f f f t f s 3 0 16 "19 26 25" _null_ _null_ _null_ _null_ _null_ has_table_privilege_name_id _null_ _null_ _null_ ));+DESCR("user privilege on relation by username, rel oid");+DATA(insert OID = 1924 ( has_table_privilege PGNSP PGUID 12 1 0 0 0 f f f f t f s 3 0 16 "26 25 25" _null_ _null_ _null_ _null_ _null_ has_table_privilege_id_name _null_ _null_ _null_ ));+DESCR("user privilege on relation by user oid, rel name");+DATA(insert OID = 1925 ( has_table_privilege PGNSP PGUID 12 1 0 0 0 f f f f t f s 3 0 16 "26 26 25" _null_ _null_ _null_ _null_ _null_ has_table_privilege_id_id _null_ _null_ _null_ ));+DESCR("user privilege on relation by user oid, rel oid");+DATA(insert OID = 1926 ( has_table_privilege PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 16 "25 25" _null_ _null_ _null_ _null_ _null_ has_table_privilege_name _null_ _null_ _null_ ));+DESCR("current user privilege on relation by rel name");+DATA(insert OID = 1927 ( has_table_privilege PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 16 "26 25" _null_ _null_ _null_ _null_ _null_ has_table_privilege_id _null_ _null_ _null_ ));+DESCR("current user privilege on relation by rel oid");++DATA(insert OID = 2181 ( has_sequence_privilege PGNSP PGUID 12 1 0 0 0 f f f f t f s 3 0 16 "19 25 25" _null_ _null_ _null_ _null_ _null_ has_sequence_privilege_name_name _null_ _null_ _null_ ));+DESCR("user privilege on sequence by username, seq name");+DATA(insert OID = 2182 ( has_sequence_privilege PGNSP PGUID 12 1 0 0 0 f f f f t f s 3 0 16 "19 26 25" _null_ _null_ _null_ _null_ _null_ has_sequence_privilege_name_id _null_ _null_ _null_ ));+DESCR("user privilege on sequence by username, seq oid");+DATA(insert OID = 2183 ( has_sequence_privilege PGNSP PGUID 12 1 0 0 0 f f f f t f s 3 0 16 "26 25 25" _null_ _null_ _null_ _null_ _null_ has_sequence_privilege_id_name _null_ _null_ _null_ ));+DESCR("user privilege on sequence by user oid, seq name");+DATA(insert OID = 2184 ( has_sequence_privilege PGNSP PGUID 12 1 0 0 0 f f f f t f s 3 0 16 "26 26 25" _null_ _null_ _null_ _null_ _null_ has_sequence_privilege_id_id _null_ _null_ _null_ ));+DESCR("user privilege on sequence by user oid, seq oid");+DATA(insert OID = 2185 ( has_sequence_privilege PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 16 "25 25" _null_ _null_ _null_ _null_ _null_ has_sequence_privilege_name _null_ _null_ _null_ ));+DESCR("current user privilege on sequence by seq name");+DATA(insert OID = 2186 ( has_sequence_privilege PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 16 "26 25" _null_ _null_ _null_ _null_ _null_ has_sequence_privilege_id _null_ _null_ _null_ ));+DESCR("current user privilege on sequence by seq oid");++DATA(insert OID = 3012 ( has_column_privilege PGNSP PGUID 12 1 0 0 0 f f f f t f s 4 0 16 "19 25 25 25" _null_ _null_ _null_ _null_ _null_ has_column_privilege_name_name_name _null_ _null_ _null_ ));+DESCR("user privilege on column by username, rel name, col name");+DATA(insert OID = 3013 ( has_column_privilege PGNSP PGUID 12 1 0 0 0 f f f f t f s 4 0 16 "19 25 21 25" _null_ _null_ _null_ _null_ _null_ has_column_privilege_name_name_attnum _null_ _null_ _null_ ));+DESCR("user privilege on column by username, rel name, col attnum");+DATA(insert OID = 3014 ( has_column_privilege PGNSP PGUID 12 1 0 0 0 f f f f t f s 4 0 16 "19 26 25 25" _null_ _null_ _null_ _null_ _null_ has_column_privilege_name_id_name _null_ _null_ _null_ ));+DESCR("user privilege on column by username, rel oid, col name");+DATA(insert OID = 3015 ( has_column_privilege PGNSP PGUID 12 1 0 0 0 f f f f t f s 4 0 16 "19 26 21 25" _null_ _null_ _null_ _null_ _null_ has_column_privilege_name_id_attnum _null_ _null_ _null_ ));+DESCR("user privilege on column by username, rel oid, col attnum");+DATA(insert OID = 3016 ( has_column_privilege PGNSP PGUID 12 1 0 0 0 f f f f t f s 4 0 16 "26 25 25 25" _null_ _null_ _null_ _null_ _null_ has_column_privilege_id_name_name _null_ _null_ _null_ ));+DESCR("user privilege on column by user oid, rel name, col name");+DATA(insert OID = 3017 ( has_column_privilege PGNSP PGUID 12 1 0 0 0 f f f f t f s 4 0 16 "26 25 21 25" _null_ _null_ _null_ _null_ _null_ has_column_privilege_id_name_attnum _null_ _null_ _null_ ));+DESCR("user privilege on column by user oid, rel name, col attnum");+DATA(insert OID = 3018 ( has_column_privilege PGNSP PGUID 12 1 0 0 0 f f f f t f s 4 0 16 "26 26 25 25" _null_ _null_ _null_ _null_ _null_ has_column_privilege_id_id_name _null_ _null_ _null_ ));+DESCR("user privilege on column by user oid, rel oid, col name");+DATA(insert OID = 3019 ( has_column_privilege PGNSP PGUID 12 1 0 0 0 f f f f t f s 4 0 16 "26 26 21 25" _null_ _null_ _null_ _null_ _null_ has_column_privilege_id_id_attnum _null_ _null_ _null_ ));+DESCR("user privilege on column by user oid, rel oid, col attnum");+DATA(insert OID = 3020 ( has_column_privilege PGNSP PGUID 12 1 0 0 0 f f f f t f s 3 0 16 "25 25 25" _null_ _null_ _null_ _null_ _null_ has_column_privilege_name_name _null_ _null_ _null_ ));+DESCR("current user privilege on column by rel name, col name");+DATA(insert OID = 3021 ( has_column_privilege PGNSP PGUID 12 1 0 0 0 f f f f t f s 3 0 16 "25 21 25" _null_ _null_ _null_ _null_ _null_ has_column_privilege_name_attnum _null_ _null_ _null_ ));+DESCR("current user privilege on column by rel name, col attnum");+DATA(insert OID = 3022 ( has_column_privilege PGNSP PGUID 12 1 0 0 0 f f f f t f s 3 0 16 "26 25 25" _null_ _null_ _null_ _null_ _null_ has_column_privilege_id_name _null_ _null_ _null_ ));+DESCR("current user privilege on column by rel oid, col name");+DATA(insert OID = 3023 ( has_column_privilege PGNSP PGUID 12 1 0 0 0 f f f f t f s 3 0 16 "26 21 25" _null_ _null_ _null_ _null_ _null_ has_column_privilege_id_attnum _null_ _null_ _null_ ));+DESCR("current user privilege on column by rel oid, col attnum");++DATA(insert OID = 3024 ( has_any_column_privilege PGNSP PGUID 12 10 0 0 0 f f f f t f s 3 0 16 "19 25 25" _null_ _null_ _null_ _null_ _null_ has_any_column_privilege_name_name _null_ _null_ _null_ ));+DESCR("user privilege on any column by username, rel name");+DATA(insert OID = 3025 ( has_any_column_privilege PGNSP PGUID 12 10 0 0 0 f f f f t f s 3 0 16 "19 26 25" _null_ _null_ _null_ _null_ _null_ has_any_column_privilege_name_id _null_ _null_ _null_ ));+DESCR("user privilege on any column by username, rel oid");+DATA(insert OID = 3026 ( has_any_column_privilege PGNSP PGUID 12 10 0 0 0 f f f f t f s 3 0 16 "26 25 25" _null_ _null_ _null_ _null_ _null_ has_any_column_privilege_id_name _null_ _null_ _null_ ));+DESCR("user privilege on any column by user oid, rel name");+DATA(insert OID = 3027 ( has_any_column_privilege PGNSP PGUID 12 10 0 0 0 f f f f t f s 3 0 16 "26 26 25" _null_ _null_ _null_ _null_ _null_ has_any_column_privilege_id_id _null_ _null_ _null_ ));+DESCR("user privilege on any column by user oid, rel oid");+DATA(insert OID = 3028 ( has_any_column_privilege PGNSP PGUID 12 10 0 0 0 f f f f t f s 2 0 16 "25 25" _null_ _null_ _null_ _null_ _null_ has_any_column_privilege_name _null_ _null_ _null_ ));+DESCR("current user privilege on any column by rel name");+DATA(insert OID = 3029 ( has_any_column_privilege PGNSP PGUID 12 10 0 0 0 f f f f t f s 2 0 16 "26 25" _null_ _null_ _null_ _null_ _null_ has_any_column_privilege_id _null_ _null_ _null_ ));+DESCR("current user privilege on any column by rel oid");++DATA(insert OID = 1928 ( pg_stat_get_numscans PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 20 "26" _null_ _null_ _null_ _null_ _null_ pg_stat_get_numscans _null_ _null_ _null_ ));+DESCR("statistics: number of scans done for table/index");+DATA(insert OID = 1929 ( pg_stat_get_tuples_returned PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 20 "26" _null_ _null_ _null_ _null_ _null_ pg_stat_get_tuples_returned _null_ _null_ _null_ ));+DESCR("statistics: number of tuples read by seqscan");+DATA(insert OID = 1930 ( pg_stat_get_tuples_fetched PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 20 "26" _null_ _null_ _null_ _null_ _null_ pg_stat_get_tuples_fetched _null_ _null_ _null_ ));+DESCR("statistics: number of tuples fetched by idxscan");+DATA(insert OID = 1931 ( pg_stat_get_tuples_inserted PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 20 "26" _null_ _null_ _null_ _null_ _null_ pg_stat_get_tuples_inserted _null_ _null_ _null_ ));+DESCR("statistics: number of tuples inserted");+DATA(insert OID = 1932 ( pg_stat_get_tuples_updated PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 20 "26" _null_ _null_ _null_ _null_ _null_ pg_stat_get_tuples_updated _null_ _null_ _null_ ));+DESCR("statistics: number of tuples updated");+DATA(insert OID = 1933 ( pg_stat_get_tuples_deleted PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 20 "26" _null_ _null_ _null_ _null_ _null_ pg_stat_get_tuples_deleted _null_ _null_ _null_ ));+DESCR("statistics: number of tuples deleted");+DATA(insert OID = 1972 ( pg_stat_get_tuples_hot_updated PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 20 "26" _null_ _null_ _null_ _null_ _null_ pg_stat_get_tuples_hot_updated _null_ _null_ _null_ ));+DESCR("statistics: number of tuples hot updated");+DATA(insert OID = 2878 ( pg_stat_get_live_tuples PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 20 "26" _null_ _null_ _null_ _null_ _null_ pg_stat_get_live_tuples _null_ _null_ _null_ ));+DESCR("statistics: number of live tuples");+DATA(insert OID = 2879 ( pg_stat_get_dead_tuples PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 20 "26" _null_ _null_ _null_ _null_ _null_ pg_stat_get_dead_tuples _null_ _null_ _null_ ));+DESCR("statistics: number of dead tuples");+DATA(insert OID = 3177 ( pg_stat_get_mod_since_analyze PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 20 "26" _null_ _null_ _null_ _null_ _null_ pg_stat_get_mod_since_analyze _null_ _null_ _null_ ));+DESCR("statistics: number of tuples changed since last analyze");+DATA(insert OID = 1934 ( pg_stat_get_blocks_fetched PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 20 "26" _null_ _null_ _null_ _null_ _null_ pg_stat_get_blocks_fetched _null_ _null_ _null_ ));+DESCR("statistics: number of blocks fetched");+DATA(insert OID = 1935 ( pg_stat_get_blocks_hit PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 20 "26" _null_ _null_ _null_ _null_ _null_ pg_stat_get_blocks_hit _null_ _null_ _null_ ));+DESCR("statistics: number of blocks found in cache");+DATA(insert OID = 2781 ( pg_stat_get_last_vacuum_time PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 1184 "26" _null_ _null_ _null_ _null_ _null_ pg_stat_get_last_vacuum_time _null_ _null_ _null_ ));+DESCR("statistics: last manual vacuum time for a table");+DATA(insert OID = 2782 ( pg_stat_get_last_autovacuum_time PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 1184 "26" _null_ _null_ _null_ _null_ _null_ pg_stat_get_last_autovacuum_time _null_ _null_ _null_ ));+DESCR("statistics: last auto vacuum time for a table");+DATA(insert OID = 2783 ( pg_stat_get_last_analyze_time PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 1184 "26" _null_ _null_ _null_ _null_ _null_ pg_stat_get_last_analyze_time _null_ _null_ _null_ ));+DESCR("statistics: last manual analyze time for a table");+DATA(insert OID = 2784 ( pg_stat_get_last_autoanalyze_time PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 1184 "26" _null_ _null_ _null_ _null_ _null_ pg_stat_get_last_autoanalyze_time _null_ _null_ _null_ ));+DESCR("statistics: last auto analyze time for a table");+DATA(insert OID = 3054 ( pg_stat_get_vacuum_count PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 20 "26" _null_ _null_ _null_ _null_ _null_ pg_stat_get_vacuum_count _null_ _null_ _null_ ));+DESCR("statistics: number of manual vacuums for a table");+DATA(insert OID = 3055 ( pg_stat_get_autovacuum_count PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 20 "26" _null_ _null_ _null_ _null_ _null_ pg_stat_get_autovacuum_count _null_ _null_ _null_ ));+DESCR("statistics: number of auto vacuums for a table");+DATA(insert OID = 3056 ( pg_stat_get_analyze_count PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 20 "26" _null_ _null_ _null_ _null_ _null_ pg_stat_get_analyze_count _null_ _null_ _null_ ));+DESCR("statistics: number of manual analyzes for a table");+DATA(insert OID = 3057 ( pg_stat_get_autoanalyze_count PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 20 "26" _null_ _null_ _null_ _null_ _null_ pg_stat_get_autoanalyze_count _null_ _null_ _null_ ));+DESCR("statistics: number of auto analyzes for a table");+DATA(insert OID = 1936 ( pg_stat_get_backend_idset PGNSP PGUID 12 1 100 0 0 f f f f t t s 0 0 23 "" _null_ _null_ _null_ _null_ _null_ pg_stat_get_backend_idset _null_ _null_ _null_ ));+DESCR("statistics: currently active backend IDs");+DATA(insert OID = 2022 ( pg_stat_get_activity PGNSP PGUID 12 1 100 0 0 f f f f f t s 1 0 2249 "23" "{23,26,23,26,25,25,25,16,1184,1184,1184,1184,869,25,23,28,28,16,25,25,23,16,25}" "{i,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o}" "{pid,datid,pid,usesysid,application_name,state,query,waiting,xact_start,query_start,backend_start,state_change,client_addr,client_hostname,client_port,backend_xid,backend_xmin,ssl,sslversion,sslcipher,sslbits,sslcompression,sslclientdn}" _null_ _null_ pg_stat_get_activity _null_ _null_ _null_ ));+DESCR("statistics: information about currently active backends");+DATA(insert OID = 3099 ( pg_stat_get_wal_senders PGNSP PGUID 12 1 10 0 0 f f f f f t s 0 0 2249 "" "{23,25,3220,3220,3220,3220,23,25}" "{o,o,o,o,o,o,o,o}" "{pid,state,sent_location,write_location,flush_location,replay_location,sync_priority,sync_state}" _null_ _null_ pg_stat_get_wal_senders _null_ _null_ _null_ ));+DESCR("statistics: information about currently active replication");+DATA(insert OID = 2026 ( pg_backend_pid PGNSP PGUID 12 1 0 0 0 f f f f t f s 0 0 23 "" _null_ _null_ _null_ _null_ _null_ pg_backend_pid _null_ _null_ _null_ ));+DESCR("statistics: current backend PID");+DATA(insert OID = 1937 ( pg_stat_get_backend_pid PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 23 "23" _null_ _null_ _null_ _null_ _null_ pg_stat_get_backend_pid _null_ _null_ _null_ ));+DESCR("statistics: PID of backend");+DATA(insert OID = 1938 ( pg_stat_get_backend_dbid PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 26 "23" _null_ _null_ _null_ _null_ _null_ pg_stat_get_backend_dbid _null_ _null_ _null_ ));+DESCR("statistics: database ID of backend");+DATA(insert OID = 1939 ( pg_stat_get_backend_userid PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 26 "23" _null_ _null_ _null_ _null_ _null_ pg_stat_get_backend_userid _null_ _null_ _null_ ));+DESCR("statistics: user ID of backend");+DATA(insert OID = 1940 ( pg_stat_get_backend_activity PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 25 "23" _null_ _null_ _null_ _null_ _null_ pg_stat_get_backend_activity _null_ _null_ _null_ ));+DESCR("statistics: current query of backend");+DATA(insert OID = 2853 ( pg_stat_get_backend_waiting PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 16 "23" _null_ _null_ _null_ _null_ _null_ pg_stat_get_backend_waiting _null_ _null_ _null_ ));+DESCR("statistics: is backend currently waiting for a lock");+DATA(insert OID = 2094 ( pg_stat_get_backend_activity_start PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 1184 "23" _null_ _null_ _null_ _null_ _null_ pg_stat_get_backend_activity_start _null_ _null_ _null_ ));+DESCR("statistics: start time for current query of backend");+DATA(insert OID = 2857 ( pg_stat_get_backend_xact_start PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 1184 "23" _null_ _null_ _null_ _null_ _null_ pg_stat_get_backend_xact_start _null_ _null_ _null_ ));+DESCR("statistics: start time for backend's current transaction");+DATA(insert OID = 1391 ( pg_stat_get_backend_start PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 1184 "23" _null_ _null_ _null_ _null_ _null_ pg_stat_get_backend_start _null_ _null_ _null_ ));+DESCR("statistics: start time for current backend session");+DATA(insert OID = 1392 ( pg_stat_get_backend_client_addr PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 869 "23" _null_ _null_ _null_ _null_ _null_ pg_stat_get_backend_client_addr _null_ _null_ _null_ ));+DESCR("statistics: address of client connected to backend");+DATA(insert OID = 1393 ( pg_stat_get_backend_client_port PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 23 "23" _null_ _null_ _null_ _null_ _null_ pg_stat_get_backend_client_port _null_ _null_ _null_ ));+DESCR("statistics: port number of client connected to backend");+DATA(insert OID = 1941 ( pg_stat_get_db_numbackends PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 23 "26" _null_ _null_ _null_ _null_ _null_ pg_stat_get_db_numbackends _null_ _null_ _null_ ));+DESCR("statistics: number of backends in database");+DATA(insert OID = 1942 ( pg_stat_get_db_xact_commit PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 20 "26" _null_ _null_ _null_ _null_ _null_ pg_stat_get_db_xact_commit _null_ _null_ _null_ ));+DESCR("statistics: transactions committed");+DATA(insert OID = 1943 ( pg_stat_get_db_xact_rollback PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 20 "26" _null_ _null_ _null_ _null_ _null_ pg_stat_get_db_xact_rollback _null_ _null_ _null_ ));+DESCR("statistics: transactions rolled back");+DATA(insert OID = 1944 ( pg_stat_get_db_blocks_fetched PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 20 "26" _null_ _null_ _null_ _null_ _null_ pg_stat_get_db_blocks_fetched _null_ _null_ _null_ ));+DESCR("statistics: blocks fetched for database");+DATA(insert OID = 1945 ( pg_stat_get_db_blocks_hit PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 20 "26" _null_ _null_ _null_ _null_ _null_ pg_stat_get_db_blocks_hit _null_ _null_ _null_ ));+DESCR("statistics: blocks found in cache for database");+DATA(insert OID = 2758 ( pg_stat_get_db_tuples_returned PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 20 "26" _null_ _null_ _null_ _null_ _null_ pg_stat_get_db_tuples_returned _null_ _null_ _null_ ));+DESCR("statistics: tuples returned for database");+DATA(insert OID = 2759 ( pg_stat_get_db_tuples_fetched PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 20 "26" _null_ _null_ _null_ _null_ _null_ pg_stat_get_db_tuples_fetched _null_ _null_ _null_ ));+DESCR("statistics: tuples fetched for database");+DATA(insert OID = 2760 ( pg_stat_get_db_tuples_inserted PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 20 "26" _null_ _null_ _null_ _null_ _null_ pg_stat_get_db_tuples_inserted _null_ _null_ _null_ ));+DESCR("statistics: tuples inserted in database");+DATA(insert OID = 2761 ( pg_stat_get_db_tuples_updated PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 20 "26" _null_ _null_ _null_ _null_ _null_ pg_stat_get_db_tuples_updated _null_ _null_ _null_ ));+DESCR("statistics: tuples updated in database");+DATA(insert OID = 2762 ( pg_stat_get_db_tuples_deleted PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 20 "26" _null_ _null_ _null_ _null_ _null_ pg_stat_get_db_tuples_deleted _null_ _null_ _null_ ));+DESCR("statistics: tuples deleted in database");+DATA(insert OID = 3065 ( pg_stat_get_db_conflict_tablespace PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 20 "26" _null_ _null_ _null_ _null_ _null_ pg_stat_get_db_conflict_tablespace _null_ _null_ _null_ ));+DESCR("statistics: recovery conflicts in database caused by drop tablespace");+DATA(insert OID = 3066 ( pg_stat_get_db_conflict_lock PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 20 "26" _null_ _null_ _null_ _null_ _null_ pg_stat_get_db_conflict_lock _null_ _null_ _null_ ));+DESCR("statistics: recovery conflicts in database caused by relation lock");+DATA(insert OID = 3067 ( pg_stat_get_db_conflict_snapshot PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 20 "26" _null_ _null_ _null_ _null_ _null_ pg_stat_get_db_conflict_snapshot _null_ _null_ _null_ ));+DESCR("statistics: recovery conflicts in database caused by snapshot expiry");+DATA(insert OID = 3068 ( pg_stat_get_db_conflict_bufferpin PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 20 "26" _null_ _null_ _null_ _null_ _null_ pg_stat_get_db_conflict_bufferpin _null_ _null_ _null_ ));+DESCR("statistics: recovery conflicts in database caused by shared buffer pin");+DATA(insert OID = 3069 ( pg_stat_get_db_conflict_startup_deadlock PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 20 "26" _null_ _null_ _null_ _null_ _null_ pg_stat_get_db_conflict_startup_deadlock _null_ _null_ _null_ ));+DESCR("statistics: recovery conflicts in database caused by buffer deadlock");+DATA(insert OID = 3070 ( pg_stat_get_db_conflict_all PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 20 "26" _null_ _null_ _null_ _null_ _null_ pg_stat_get_db_conflict_all _null_ _null_ _null_ ));+DESCR("statistics: recovery conflicts in database");+DATA(insert OID = 3152 ( pg_stat_get_db_deadlocks PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 20 "26" _null_ _null_ _null_ _null_ _null_ pg_stat_get_db_deadlocks _null_ _null_ _null_ ));+DESCR("statistics: deadlocks detected in database");+DATA(insert OID = 3074 ( pg_stat_get_db_stat_reset_time PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 1184 "26" _null_ _null_ _null_ _null_ _null_ pg_stat_get_db_stat_reset_time _null_ _null_ _null_ ));+DESCR("statistics: last reset for a database");+DATA(insert OID = 3150 ( pg_stat_get_db_temp_files PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 20 "26" _null_ _null_ _null_ _null_ _null_ pg_stat_get_db_temp_files _null_ _null_ _null_ ));+DESCR("statistics: number of temporary files written");+DATA(insert OID = 3151 ( pg_stat_get_db_temp_bytes PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 20 "26" _null_ _null_ _null_ _null_ _null_ pg_stat_get_db_temp_bytes _null_ _null_ _null_ ));+DESCR("statistics: number of bytes in temporary files written");+DATA(insert OID = 2844 ( pg_stat_get_db_blk_read_time PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 701 "26" _null_ _null_ _null_ _null_ _null_ pg_stat_get_db_blk_read_time _null_ _null_ _null_ ));+DESCR("statistics: block read time, in msec");+DATA(insert OID = 2845 ( pg_stat_get_db_blk_write_time PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 701 "26" _null_ _null_ _null_ _null_ _null_ pg_stat_get_db_blk_write_time _null_ _null_ _null_ ));+DESCR("statistics: block write time, in msec");+DATA(insert OID = 3195 ( pg_stat_get_archiver PGNSP PGUID 12 1 0 0 0 f f f f f f s 0 0 2249 "" "{20,25,1184,20,25,1184,1184}" "{o,o,o,o,o,o,o}" "{archived_count,last_archived_wal,last_archived_time,failed_count,last_failed_wal,last_failed_time,stats_reset}" _null_ _null_ pg_stat_get_archiver _null_ _null_ _null_ ));+DESCR("statistics: information about WAL archiver");+DATA(insert OID = 2769 ( pg_stat_get_bgwriter_timed_checkpoints PGNSP PGUID 12 1 0 0 0 f f f f t f s 0 0 20 "" _null_ _null_ _null_ _null_ _null_ pg_stat_get_bgwriter_timed_checkpoints _null_ _null_ _null_ ));+DESCR("statistics: number of timed checkpoints started by the bgwriter");+DATA(insert OID = 2770 ( pg_stat_get_bgwriter_requested_checkpoints PGNSP PGUID 12 1 0 0 0 f f f f t f s 0 0 20 "" _null_ _null_ _null_ _null_ _null_ pg_stat_get_bgwriter_requested_checkpoints _null_ _null_ _null_ ));+DESCR("statistics: number of backend requested checkpoints started by the bgwriter");+DATA(insert OID = 2771 ( pg_stat_get_bgwriter_buf_written_checkpoints PGNSP PGUID 12 1 0 0 0 f f f f t f s 0 0 20 "" _null_ _null_ _null_ _null_ _null_ pg_stat_get_bgwriter_buf_written_checkpoints _null_ _null_ _null_ ));+DESCR("statistics: number of buffers written by the bgwriter during checkpoints");+DATA(insert OID = 2772 ( pg_stat_get_bgwriter_buf_written_clean PGNSP PGUID 12 1 0 0 0 f f f f t f s 0 0 20 "" _null_ _null_ _null_ _null_ _null_ pg_stat_get_bgwriter_buf_written_clean _null_ _null_ _null_ ));+DESCR("statistics: number of buffers written by the bgwriter for cleaning dirty buffers");+DATA(insert OID = 2773 ( pg_stat_get_bgwriter_maxwritten_clean PGNSP PGUID 12 1 0 0 0 f f f f t f s 0 0 20 "" _null_ _null_ _null_ _null_ _null_ pg_stat_get_bgwriter_maxwritten_clean _null_ _null_ _null_ ));+DESCR("statistics: number of times the bgwriter stopped processing when it had written too many buffers while cleaning");+DATA(insert OID = 3075 ( pg_stat_get_bgwriter_stat_reset_time PGNSP PGUID 12 1 0 0 0 f f f f t f s 0 0 1184 "" _null_ _null_ _null_ _null_ _null_ pg_stat_get_bgwriter_stat_reset_time _null_ _null_ _null_ ));+DESCR("statistics: last reset for the bgwriter");+DATA(insert OID = 3160 ( pg_stat_get_checkpoint_write_time PGNSP PGUID 12 1 0 0 0 f f f f t f s 0 0 701 "" _null_ _null_ _null_ _null_ _null_ pg_stat_get_checkpoint_write_time _null_ _null_ _null_ ));+DESCR("statistics: checkpoint time spent writing buffers to disk, in msec");+DATA(insert OID = 3161 ( pg_stat_get_checkpoint_sync_time PGNSP PGUID 12 1 0 0 0 f f f f t f s 0 0 701 "" _null_ _null_ _null_ _null_ _null_ pg_stat_get_checkpoint_sync_time _null_ _null_ _null_ ));+DESCR("statistics: checkpoint time spent synchronizing buffers to disk, in msec");+DATA(insert OID = 2775 ( pg_stat_get_buf_written_backend PGNSP PGUID 12 1 0 0 0 f f f f t f s 0 0 20 "" _null_ _null_ _null_ _null_ _null_ pg_stat_get_buf_written_backend _null_ _null_ _null_ ));+DESCR("statistics: number of buffers written by backends");+DATA(insert OID = 3063 ( pg_stat_get_buf_fsync_backend PGNSP PGUID 12 1 0 0 0 f f f f t f s 0 0 20 "" _null_ _null_ _null_ _null_ _null_ pg_stat_get_buf_fsync_backend _null_ _null_ _null_ ));+DESCR("statistics: number of backend buffer writes that did their own fsync");+DATA(insert OID = 2859 ( pg_stat_get_buf_alloc PGNSP PGUID 12 1 0 0 0 f f f f t f s 0 0 20 "" _null_ _null_ _null_ _null_ _null_ pg_stat_get_buf_alloc _null_ _null_ _null_ ));+DESCR("statistics: number of buffer allocations");++DATA(insert OID = 2978 ( pg_stat_get_function_calls PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 20 "26" _null_ _null_ _null_ _null_ _null_ pg_stat_get_function_calls _null_ _null_ _null_ ));+DESCR("statistics: number of function calls");+DATA(insert OID = 2979 ( pg_stat_get_function_total_time PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 701 "26" _null_ _null_ _null_ _null_ _null_ pg_stat_get_function_total_time _null_ _null_ _null_ ));+DESCR("statistics: total execution time of function, in msec");+DATA(insert OID = 2980 ( pg_stat_get_function_self_time PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 701 "26" _null_ _null_ _null_ _null_ _null_ pg_stat_get_function_self_time _null_ _null_ _null_ ));+DESCR("statistics: self execution time of function, in msec");++DATA(insert OID = 3037 ( pg_stat_get_xact_numscans PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 20 "26" _null_ _null_ _null_ _null_ _null_ pg_stat_get_xact_numscans _null_ _null_ _null_ ));+DESCR("statistics: number of scans done for table/index in current transaction");+DATA(insert OID = 3038 ( pg_stat_get_xact_tuples_returned PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 20 "26" _null_ _null_ _null_ _null_ _null_ pg_stat_get_xact_tuples_returned _null_ _null_ _null_ ));+DESCR("statistics: number of tuples read by seqscan in current transaction");+DATA(insert OID = 3039 ( pg_stat_get_xact_tuples_fetched PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 20 "26" _null_ _null_ _null_ _null_ _null_ pg_stat_get_xact_tuples_fetched _null_ _null_ _null_ ));+DESCR("statistics: number of tuples fetched by idxscan in current transaction");+DATA(insert OID = 3040 ( pg_stat_get_xact_tuples_inserted PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 20 "26" _null_ _null_ _null_ _null_ _null_ pg_stat_get_xact_tuples_inserted _null_ _null_ _null_ ));+DESCR("statistics: number of tuples inserted in current transaction");+DATA(insert OID = 3041 ( pg_stat_get_xact_tuples_updated PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 20 "26" _null_ _null_ _null_ _null_ _null_ pg_stat_get_xact_tuples_updated _null_ _null_ _null_ ));+DESCR("statistics: number of tuples updated in current transaction");+DATA(insert OID = 3042 ( pg_stat_get_xact_tuples_deleted PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 20 "26" _null_ _null_ _null_ _null_ _null_ pg_stat_get_xact_tuples_deleted _null_ _null_ _null_ ));+DESCR("statistics: number of tuples deleted in current transaction");+DATA(insert OID = 3043 ( pg_stat_get_xact_tuples_hot_updated PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 20 "26" _null_ _null_ _null_ _null_ _null_ pg_stat_get_xact_tuples_hot_updated _null_ _null_ _null_ ));+DESCR("statistics: number of tuples hot updated in current transaction");+DATA(insert OID = 3044 ( pg_stat_get_xact_blocks_fetched PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 20 "26" _null_ _null_ _null_ _null_ _null_ pg_stat_get_xact_blocks_fetched _null_ _null_ _null_ ));+DESCR("statistics: number of blocks fetched in current transaction");+DATA(insert OID = 3045 ( pg_stat_get_xact_blocks_hit PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 20 "26" _null_ _null_ _null_ _null_ _null_ pg_stat_get_xact_blocks_hit _null_ _null_ _null_ ));+DESCR("statistics: number of blocks found in cache in current transaction");+DATA(insert OID = 3046 ( pg_stat_get_xact_function_calls PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 20 "26" _null_ _null_ _null_ _null_ _null_ pg_stat_get_xact_function_calls _null_ _null_ _null_ ));+DESCR("statistics: number of function calls in current transaction");+DATA(insert OID = 3047 ( pg_stat_get_xact_function_total_time PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 701 "26" _null_ _null_ _null_ _null_ _null_ pg_stat_get_xact_function_total_time _null_ _null_ _null_ ));+DESCR("statistics: total execution time of function in current transaction, in msec");+DATA(insert OID = 3048 ( pg_stat_get_xact_function_self_time PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 701 "26" _null_ _null_ _null_ _null_ _null_ pg_stat_get_xact_function_self_time _null_ _null_ _null_ ));+DESCR("statistics: self execution time of function in current transaction, in msec");++DATA(insert OID = 3788 ( pg_stat_get_snapshot_timestamp PGNSP PGUID 12 1 0 0 0 f f f f t f s 0 0 1184 "" _null_ _null_ _null_ _null_ _null_ pg_stat_get_snapshot_timestamp _null_ _null_ _null_ ));+DESCR("statistics: timestamp of the current statistics snapshot");+DATA(insert OID = 2230 ( pg_stat_clear_snapshot PGNSP PGUID 12 1 0 0 0 f f f f f f v 0 0 2278 "" _null_ _null_ _null_ _null_ _null_ pg_stat_clear_snapshot _null_ _null_ _null_ ));+DESCR("statistics: discard current transaction's statistics snapshot");+DATA(insert OID = 2274 ( pg_stat_reset PGNSP PGUID 12 1 0 0 0 f f f f f f v 0 0 2278 "" _null_ _null_ _null_ _null_ _null_ pg_stat_reset _null_ _null_ _null_ ));+DESCR("statistics: reset collected statistics for current database");+DATA(insert OID = 3775 ( pg_stat_reset_shared PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 2278 "25" _null_ _null_ _null_ _null_ _null_ pg_stat_reset_shared _null_ _null_ _null_ ));+DESCR("statistics: reset collected statistics shared across the cluster");+DATA(insert OID = 3776 ( pg_stat_reset_single_table_counters PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 2278 "26" _null_ _null_ _null_ _null_ _null_ pg_stat_reset_single_table_counters _null_ _null_ _null_ ));+DESCR("statistics: reset collected statistics for a single table or index in the current database");+DATA(insert OID = 3777 ( pg_stat_reset_single_function_counters PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 2278 "26" _null_ _null_ _null_ _null_ _null_ pg_stat_reset_single_function_counters _null_ _null_ _null_ ));+DESCR("statistics: reset collected statistics for a single function in the current database");++DATA(insert OID = 3163 ( pg_trigger_depth PGNSP PGUID 12 1 0 0 0 f f f f t f s 0 0 23 "" _null_ _null_ _null_ _null_ _null_ pg_trigger_depth _null_ _null_ _null_ ));+DESCR("current trigger depth");++DATA(insert OID = 3778 ( pg_tablespace_location PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 25 "26" _null_ _null_ _null_ _null_ _null_ pg_tablespace_location _null_ _null_ _null_ ));+DESCR("tablespace location");++DATA(insert OID = 1946 ( encode PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 25 "17 25" _null_ _null_ _null_ _null_ _null_ binary_encode _null_ _null_ _null_ ));+DESCR("convert bytea value into some ascii-only text string");+DATA(insert OID = 1947 ( decode PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 17 "25 25" _null_ _null_ _null_ _null_ _null_ binary_decode _null_ _null_ _null_ ));+DESCR("convert ascii-encoded text string into bytea value");++DATA(insert OID = 1948 ( byteaeq PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "17 17" _null_ _null_ _null_ _null_ _null_ byteaeq _null_ _null_ _null_ ));+DATA(insert OID = 1949 ( bytealt PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "17 17" _null_ _null_ _null_ _null_ _null_ bytealt _null_ _null_ _null_ ));+DATA(insert OID = 1950 ( byteale PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "17 17" _null_ _null_ _null_ _null_ _null_ byteale _null_ _null_ _null_ ));+DATA(insert OID = 1951 ( byteagt PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "17 17" _null_ _null_ _null_ _null_ _null_ byteagt _null_ _null_ _null_ ));+DATA(insert OID = 1952 ( byteage PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "17 17" _null_ _null_ _null_ _null_ _null_ byteage _null_ _null_ _null_ ));+DATA(insert OID = 1953 ( byteane PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "17 17" _null_ _null_ _null_ _null_ _null_ byteane _null_ _null_ _null_ ));+DATA(insert OID = 1954 ( byteacmp PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "17 17" _null_ _null_ _null_ _null_ _null_ byteacmp _null_ _null_ _null_ ));+DESCR("less-equal-greater");++DATA(insert OID = 3917 ( timestamp_transform PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2281 "2281" _null_ _null_ _null_ _null_ _null_ timestamp_transform _null_ _null_ _null_ ));+DESCR("transform a timestamp length coercion");+DATA(insert OID = 3944 ( time_transform PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2281 "2281" _null_ _null_ _null_ _null_ _null_ time_transform _null_ _null_ _null_ ));+DESCR("transform a time length coercion");++DATA(insert OID = 1961 ( timestamp PGNSP PGUID 12 1 0 0 timestamp_transform f f f f t f i 2 0 1114 "1114 23" _null_ _null_ _null_ _null_ _null_ timestamp_scale _null_ _null_ _null_ ));+DESCR("adjust timestamp precision");++DATA(insert OID = 1965 ( oidlarger PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 26 "26 26" _null_ _null_ _null_ _null_ _null_ oidlarger _null_ _null_ _null_ ));+DESCR("larger of two");+DATA(insert OID = 1966 ( oidsmaller PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 26 "26 26" _null_ _null_ _null_ _null_ _null_ oidsmaller _null_ _null_ _null_ ));+DESCR("smaller of two");++DATA(insert OID = 1967 ( timestamptz PGNSP PGUID 12 1 0 0 timestamp_transform f f f f t f i 2 0 1184 "1184 23" _null_ _null_ _null_ _null_ _null_ timestamptz_scale _null_ _null_ _null_ ));+DESCR("adjust timestamptz precision");+DATA(insert OID = 1968 ( time PGNSP PGUID 12 1 0 0 time_transform f f f f t f i 2 0 1083 "1083 23" _null_ _null_ _null_ _null_ _null_ time_scale _null_ _null_ _null_ ));+DESCR("adjust time precision");+DATA(insert OID = 1969 ( timetz PGNSP PGUID 12 1 0 0 time_transform f f f f t f i 2 0 1266 "1266 23" _null_ _null_ _null_ _null_ _null_ timetz_scale _null_ _null_ _null_ ));+DESCR("adjust time with time zone precision");++DATA(insert OID = 2003 ( textanycat PGNSP PGUID 14 1 0 0 0 f f f f t f s 2 0 25 "25 2776" _null_ _null_ _null_ _null_ _null_ "select $1 || $2::pg_catalog.text" _null_ _null_ _null_ ));+DATA(insert OID = 2004 ( anytextcat PGNSP PGUID 14 1 0 0 0 f f f f t f s 2 0 25 "2776 25" _null_ _null_ _null_ _null_ _null_ "select $1::pg_catalog.text || $2" _null_ _null_ _null_ ));++DATA(insert OID = 2005 ( bytealike PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "17 17" _null_ _null_ _null_ _null_ _null_ bytealike _null_ _null_ _null_ ));+DATA(insert OID = 2006 ( byteanlike PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "17 17" _null_ _null_ _null_ _null_ _null_ byteanlike _null_ _null_ _null_ ));+DATA(insert OID = 2007 ( like PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "17 17" _null_ _null_ _null_ _null_ _null_ bytealike _null_ _null_ _null_ ));+DESCR("matches LIKE expression");+DATA(insert OID = 2008 ( notlike PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "17 17" _null_ _null_ _null_ _null_ _null_ byteanlike _null_ _null_ _null_ ));+DESCR("does not match LIKE expression");+DATA(insert OID = 2009 ( like_escape PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 17 "17 17" _null_ _null_ _null_ _null_ _null_ like_escape_bytea _null_ _null_ _null_ ));+DESCR("convert LIKE pattern to use backslash escapes");+DATA(insert OID = 2010 ( length PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 23 "17" _null_ _null_ _null_ _null_ _null_ byteaoctetlen _null_ _null_ _null_ ));+DESCR("octet length");+DATA(insert OID = 2011 ( byteacat PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 17 "17 17" _null_ _null_ _null_ _null_ _null_ byteacat _null_ _null_ _null_ ));+DATA(insert OID = 2012 ( substring PGNSP PGUID 12 1 0 0 0 f f f f t f i 3 0 17 "17 23 23" _null_ _null_ _null_ _null_ _null_ bytea_substr _null_ _null_ _null_ ));+DESCR("extract portion of string");+DATA(insert OID = 2013 ( substring PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 17 "17 23" _null_ _null_ _null_ _null_ _null_ bytea_substr_no_len _null_ _null_ _null_ ));+DESCR("extract portion of string");+DATA(insert OID = 2085 ( substr PGNSP PGUID 12 1 0 0 0 f f f f t f i 3 0 17 "17 23 23" _null_ _null_ _null_ _null_ _null_ bytea_substr _null_ _null_ _null_ ));+DESCR("extract portion of string");+DATA(insert OID = 2086 ( substr PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 17 "17 23" _null_ _null_ _null_ _null_ _null_ bytea_substr_no_len _null_ _null_ _null_ ));+DESCR("extract portion of string");+DATA(insert OID = 2014 ( position PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "17 17" _null_ _null_ _null_ _null_ _null_ byteapos _null_ _null_ _null_ ));+DESCR("position of substring");+DATA(insert OID = 2015 ( btrim PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 17 "17 17" _null_ _null_ _null_ _null_ _null_ byteatrim _null_ _null_ _null_ ));+DESCR("trim both ends of string");++DATA(insert OID = 2019 ( time PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 1083 "1184" _null_ _null_ _null_ _null_ _null_ timestamptz_time _null_ _null_ _null_ ));+DESCR("convert timestamp with time zone to time");+DATA(insert OID = 2020 ( date_trunc PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1114 "25 1114" _null_ _null_ _null_ _null_ _null_ timestamp_trunc _null_ _null_ _null_ ));+DESCR("truncate timestamp to specified units");+DATA(insert OID = 2021 ( date_part PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 701 "25 1114" _null_ _null_ _null_ _null_ _null_ timestamp_part _null_ _null_ _null_ ));+DESCR("extract field from timestamp");+DATA(insert OID = 2023 ( timestamp PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 1114 "702" _null_ _null_ _null_ _null_ _null_ abstime_timestamp _null_ _null_ _null_ ));+DESCR("convert abstime to timestamp");+DATA(insert OID = 2024 ( timestamp PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 1114 "1082" _null_ _null_ _null_ _null_ _null_ date_timestamp _null_ _null_ _null_ ));+DESCR("convert date to timestamp");+DATA(insert OID = 2025 ( timestamp PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1114 "1082 1083" _null_ _null_ _null_ _null_ _null_ datetime_timestamp _null_ _null_ _null_ ));+DESCR("convert date and time to timestamp");+DATA(insert OID = 2027 ( timestamp PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 1114 "1184" _null_ _null_ _null_ _null_ _null_ timestamptz_timestamp _null_ _null_ _null_ ));+DESCR("convert timestamp with time zone to timestamp");+DATA(insert OID = 2028 ( timestamptz PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 1184 "1114" _null_ _null_ _null_ _null_ _null_ timestamp_timestamptz _null_ _null_ _null_ ));+DESCR("convert timestamp to timestamp with time zone");+DATA(insert OID = 2029 ( date PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 1082 "1114" _null_ _null_ _null_ _null_ _null_ timestamp_date _null_ _null_ _null_ ));+DESCR("convert timestamp to date");+DATA(insert OID = 2030 ( abstime PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 702 "1114" _null_ _null_ _null_ _null_ _null_ timestamp_abstime _null_ _null_ _null_ ));+DESCR("convert timestamp to abstime");+DATA(insert OID = 2031 ( timestamp_mi PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1186 "1114 1114" _null_ _null_ _null_ _null_ _null_ timestamp_mi _null_ _null_ _null_ ));+DATA(insert OID = 2032 ( timestamp_pl_interval PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1114 "1114 1186" _null_ _null_ _null_ _null_ _null_ timestamp_pl_interval _null_ _null_ _null_ ));+DATA(insert OID = 2033 ( timestamp_mi_interval PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1114 "1114 1186" _null_ _null_ _null_ _null_ _null_ timestamp_mi_interval _null_ _null_ _null_ ));+DATA(insert OID = 2035 ( timestamp_smaller PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1114 "1114 1114" _null_ _null_ _null_ _null_ _null_ timestamp_smaller _null_ _null_ _null_ ));+DESCR("smaller of two");+DATA(insert OID = 2036 ( timestamp_larger PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1114 "1114 1114" _null_ _null_ _null_ _null_ _null_ timestamp_larger _null_ _null_ _null_ ));+DESCR("larger of two");+DATA(insert OID = 2037 ( timezone PGNSP PGUID 12 1 0 0 0 f f f f t f v 2 0 1266 "25 1266" _null_ _null_ _null_ _null_ _null_ timetz_zone _null_ _null_ _null_ ));+DESCR("adjust time with time zone to new zone");+DATA(insert OID = 2038 ( timezone PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1266 "1186 1266" _null_ _null_ _null_ _null_ _null_ timetz_izone _null_ _null_ _null_ ));+DESCR("adjust time with time zone to new zone");+DATA(insert OID = 2039 ( timestamp_hash PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 23 "1114" _null_ _null_ _null_ _null_ _null_ timestamp_hash _null_ _null_ _null_ ));+DESCR("hash");+DATA(insert OID = 2041 ( overlaps PGNSP PGUID 12 1 0 0 0 f f f f f f i 4 0 16 "1114 1114 1114 1114" _null_ _null_ _null_ _null_ _null_ overlaps_timestamp _null_ _null_ _null_ ));+DESCR("intervals overlap?");+DATA(insert OID = 2042 ( overlaps PGNSP PGUID 14 1 0 0 0 f f f f f f i 4 0 16 "1114 1186 1114 1186" _null_ _null_ _null_ _null_ _null_ "select ($1, ($1 + $2)) overlaps ($3, ($3 + $4))" _null_ _null_ _null_ ));+DESCR("intervals overlap?");+DATA(insert OID = 2043 ( overlaps PGNSP PGUID 14 1 0 0 0 f f f f f f i 4 0 16 "1114 1114 1114 1186" _null_ _null_ _null_ _null_ _null_ "select ($1, $2) overlaps ($3, ($3 + $4))" _null_ _null_ _null_ ));+DESCR("intervals overlap?");+DATA(insert OID = 2044 ( overlaps PGNSP PGUID 14 1 0 0 0 f f f f f f i 4 0 16 "1114 1186 1114 1114" _null_ _null_ _null_ _null_ _null_ "select ($1, ($1 + $2)) overlaps ($3, $4)" _null_ _null_ _null_ ));+DESCR("intervals overlap?");+DATA(insert OID = 2045 ( timestamp_cmp PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "1114 1114" _null_ _null_ _null_ _null_ _null_ timestamp_cmp _null_ _null_ _null_ ));+DESCR("less-equal-greater");+DATA(insert OID = 3137 ( timestamp_sortsupport PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2278 "2281" _null_ _null_ _null_ _null_ _null_ timestamp_sortsupport _null_ _null_ _null_ ));+DESCR("sort support");+DATA(insert OID = 2046 ( time PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 1083 "1266" _null_ _null_ _null_ _null_ _null_ timetz_time _null_ _null_ _null_ ));+DESCR("convert time with time zone to time");+DATA(insert OID = 2047 ( timetz PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 1266 "1083" _null_ _null_ _null_ _null_ _null_ time_timetz _null_ _null_ _null_ ));+DESCR("convert time to time with time zone");+DATA(insert OID = 2048 ( isfinite PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 16 "1114" _null_ _null_ _null_ _null_ _null_ timestamp_finite _null_ _null_ _null_ ));+DESCR("finite timestamp?");+DATA(insert OID = 2049 ( to_char PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 25 "1114 25" _null_ _null_ _null_ _null_ _null_ timestamp_to_char _null_ _null_ _null_ ));+DESCR("format timestamp to text");+DATA(insert OID = 2052 ( timestamp_eq PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "1114 1114" _null_ _null_ _null_ _null_ _null_ timestamp_eq _null_ _null_ _null_ ));+DATA(insert OID = 2053 ( timestamp_ne PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "1114 1114" _null_ _null_ _null_ _null_ _null_ timestamp_ne _null_ _null_ _null_ ));+DATA(insert OID = 2054 ( timestamp_lt PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "1114 1114" _null_ _null_ _null_ _null_ _null_ timestamp_lt _null_ _null_ _null_ ));+DATA(insert OID = 2055 ( timestamp_le PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "1114 1114" _null_ _null_ _null_ _null_ _null_ timestamp_le _null_ _null_ _null_ ));+DATA(insert OID = 2056 ( timestamp_ge PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "1114 1114" _null_ _null_ _null_ _null_ _null_ timestamp_ge _null_ _null_ _null_ ));+DATA(insert OID = 2057 ( timestamp_gt PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "1114 1114" _null_ _null_ _null_ _null_ _null_ timestamp_gt _null_ _null_ _null_ ));+DATA(insert OID = 2058 ( age PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1186 "1114 1114" _null_ _null_ _null_ _null_ _null_ timestamp_age _null_ _null_ _null_ ));+DESCR("date difference preserving months and years");+DATA(insert OID = 2059 ( age PGNSP PGUID 14 1 0 0 0 f f f f t f s 1 0 1186 "1114" _null_ _null_ _null_ _null_ _null_ "select pg_catalog.age(cast(current_date as timestamp without time zone), $1)" _null_ _null_ _null_ ));+DESCR("date difference from today preserving months and years");++DATA(insert OID = 2069 ( timezone PGNSP PGUID 12 1 0 0 timestamp_zone_transform f f f f t f i 2 0 1184 "25 1114" _null_ _null_ _null_ _null_ _null_ timestamp_zone _null_ _null_ _null_ ));+DESCR("adjust timestamp to new time zone");+DATA(insert OID = 2070 ( timezone PGNSP PGUID 12 1 0 0 timestamp_izone_transform f f f f t f i 2 0 1184 "1186 1114" _null_ _null_ _null_ _null_ _null_ timestamp_izone _null_ _null_ _null_ ));+DESCR("adjust timestamp to new time zone");+DATA(insert OID = 2071 ( date_pl_interval PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1114 "1082 1186" _null_ _null_ _null_ _null_ _null_ date_pl_interval _null_ _null_ _null_ ));+DATA(insert OID = 2072 ( date_mi_interval PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1114 "1082 1186" _null_ _null_ _null_ _null_ _null_ date_mi_interval _null_ _null_ _null_ ));++DATA(insert OID = 2073 ( substring PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 25 "25 25" _null_ _null_ _null_ _null_ _null_ textregexsubstr _null_ _null_ _null_ ));+DESCR("extract text matching regular expression");+DATA(insert OID = 2074 ( substring PGNSP PGUID 14 1 0 0 0 f f f f t f i 3 0 25 "25 25 25" _null_ _null_ _null_ _null_ _null_ "select pg_catalog.substring($1, pg_catalog.similar_escape($2, $3))" _null_ _null_ _null_ ));+DESCR("extract text matching SQL99 regular expression");++DATA(insert OID = 2075 ( bit PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1560 "20 23" _null_ _null_ _null_ _null_ _null_ bitfromint8 _null_ _null_ _null_ ));+DESCR("convert int8 to bitstring");+DATA(insert OID = 2076 ( int8 PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 20 "1560" _null_ _null_ _null_ _null_ _null_ bittoint8 _null_ _null_ _null_ ));+DESCR("convert bitstring to int8");++DATA(insert OID = 2077 ( current_setting PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 25 "25" _null_ _null_ _null_ _null_ _null_ show_config_by_name _null_ _null_ _null_ ));+DESCR("SHOW X as a function");+DATA(insert OID = 2078 ( set_config PGNSP PGUID 12 1 0 0 0 f f f f f f v 3 0 25 "25 25 16" _null_ _null_ _null_ _null_ _null_ set_config_by_name _null_ _null_ _null_ ));+DESCR("SET X as a function");+DATA(insert OID = 2084 ( pg_show_all_settings PGNSP PGUID 12 1 1000 0 0 f f f f t t s 0 0 2249 "" "{25,25,25,25,25,25,25,25,25,25,25,1009,25,25,25,23,16}" "{o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o,o}" "{name,setting,unit,category,short_desc,extra_desc,context,vartype,source,min_val,max_val,enumvals,boot_val,reset_val,sourcefile,sourceline,pending_restart}" _null_ _null_ show_all_settings _null_ _null_ _null_ ));+DESCR("SHOW ALL as a function");+DATA(insert OID = 3329 ( pg_show_all_file_settings PGNSP PGUID 12 1 1000 0 0 f f f f t t v 0 0 2249 "" "{25,23,23,25,25,16,25}" "{o,o,o,o,o,o,o}" "{sourcefile,sourceline,seqno,name,setting,applied,error}" _null_ _null_ show_all_file_settings _null_ _null_ _null_ ));+DESCR("show config file settings");+DATA(insert OID = 1371 ( pg_lock_status PGNSP PGUID 12 1 1000 0 0 f f f f t t v 0 0 2249 "" "{25,26,26,23,21,25,28,26,26,21,25,23,25,16,16}" "{o,o,o,o,o,o,o,o,o,o,o,o,o,o,o}" "{locktype,database,relation,page,tuple,virtualxid,transactionid,classid,objid,objsubid,virtualtransaction,pid,mode,granted,fastpath}" _null_ _null_ pg_lock_status _null_ _null_ _null_ ));+DESCR("view system lock information");+DATA(insert OID = 1065 ( pg_prepared_xact PGNSP PGUID 12 1 1000 0 0 f f f f t t v 0 0 2249 "" "{28,25,1184,26,26}" "{o,o,o,o,o}" "{transaction,gid,prepared,ownerid,dbid}" _null_ _null_ pg_prepared_xact _null_ _null_ _null_ ));+DESCR("view two-phase transactions");+DATA(insert OID = 3819 ( pg_get_multixact_members PGNSP PGUID 12 1 1000 0 0 f f f f t t v 1 0 2249 "28" "{28,28,25}" "{i,o,o}" "{multixid,xid,mode}" _null_ _null_ pg_get_multixact_members _null_ _null_ _null_ ));+DESCR("view members of a multixactid");++DATA(insert OID = 3581 ( pg_xact_commit_timestamp PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 1184 "28" _null_ _null_ _null_ _null_ _null_ pg_xact_commit_timestamp _null_ _null_ _null_ ));+DESCR("get commit timestamp of a transaction");++DATA(insert OID = 3583 ( pg_last_committed_xact PGNSP PGUID 12 1 0 0 0 f f f f t f v 0 0 2249 "" "{28,1184}" "{o,o}" "{xid,timestamp}" _null_ _null_ pg_last_committed_xact _null_ _null_ _null_ ));+DESCR("get transaction Id and commit timestamp of latest transaction commit");++DATA(insert OID = 3537 ( pg_describe_object PGNSP PGUID 12 1 0 0 0 f f f f t f s 3 0 25 "26 26 23" _null_ _null_ _null_ _null_ _null_ pg_describe_object _null_ _null_ _null_ ));+DESCR("get identification of SQL object");++DATA(insert OID = 3839 ( pg_identify_object PGNSP PGUID 12 1 0 0 0 f f f f t f s 3 0 2249 "26 26 23" "{26,26,23,25,25,25,25}" "{i,i,i,o,o,o,o}" "{classid,objid,subobjid,type,schema,name,identity}" _null_ _null_ pg_identify_object _null_ _null_ _null_ ));+DESCR("get machine-parseable identification of SQL object");++DATA(insert OID = 3382 ( pg_identify_object_as_address PGNSP PGUID 12 1 0 0 0 f f f f t f s 3 0 2249 "26 26 23" "{26,26,23,25,1009,1009}" "{i,i,i,o,o,o}" "{classid,objid,subobjid,type,object_names,object_args}" _null_ _null_ pg_identify_object_as_address _null_ _null_ _null_ ));+DESCR("get identification of SQL object for pg_get_object_address()");++DATA(insert OID = 3954 ( pg_get_object_address PGNSP PGUID 12 1 0 0 0 f f f f t f s 3 0 2249 "25 1009 1009" "{25,1009,1009,26,26,23}" "{i,i,i,o,o,o}" "{type,name,args,classid,objid,subobjid}" _null_ _null_ pg_get_object_address _null_ _null_ _null_ ));+DESCR("get OID-based object address from name/args arrays");++DATA(insert OID = 2079 ( pg_table_is_visible PGNSP PGUID 12 10 0 0 0 f f f f t f s 1 0 16 "26" _null_ _null_ _null_ _null_ _null_ pg_table_is_visible _null_ _null_ _null_ ));+DESCR("is table visible in search path?");+DATA(insert OID = 2080 ( pg_type_is_visible PGNSP PGUID 12 10 0 0 0 f f f f t f s 1 0 16 "26" _null_ _null_ _null_ _null_ _null_ pg_type_is_visible _null_ _null_ _null_ ));+DESCR("is type visible in search path?");+DATA(insert OID = 2081 ( pg_function_is_visible PGNSP PGUID 12 10 0 0 0 f f f f t f s 1 0 16 "26" _null_ _null_ _null_ _null_ _null_ pg_function_is_visible _null_ _null_ _null_ ));+DESCR("is function visible in search path?");+DATA(insert OID = 2082 ( pg_operator_is_visible PGNSP PGUID 12 10 0 0 0 f f f f t f s 1 0 16 "26" _null_ _null_ _null_ _null_ _null_ pg_operator_is_visible _null_ _null_ _null_ ));+DESCR("is operator visible in search path?");+DATA(insert OID = 2083 ( pg_opclass_is_visible PGNSP PGUID 12 10 0 0 0 f f f f t f s 1 0 16 "26" _null_ _null_ _null_ _null_ _null_ pg_opclass_is_visible _null_ _null_ _null_ ));+DESCR("is opclass visible in search path?");+DATA(insert OID = 3829 ( pg_opfamily_is_visible PGNSP PGUID 12 10 0 0 0 f f f f t f s 1 0 16 "26" _null_ _null_ _null_ _null_ _null_ pg_opfamily_is_visible _null_ _null_ _null_ ));+DESCR("is opfamily visible in search path?");+DATA(insert OID = 2093 ( pg_conversion_is_visible PGNSP PGUID 12 10 0 0 0 f f f f t f s 1 0 16 "26" _null_ _null_ _null_ _null_ _null_ pg_conversion_is_visible _null_ _null_ _null_ ));+DESCR("is conversion visible in search path?");+DATA(insert OID = 3756 ( pg_ts_parser_is_visible PGNSP PGUID 12 10 0 0 0 f f f f t f s 1 0 16 "26" _null_ _null_ _null_ _null_ _null_ pg_ts_parser_is_visible _null_ _null_ _null_ ));+DESCR("is text search parser visible in search path?");+DATA(insert OID = 3757 ( pg_ts_dict_is_visible PGNSP PGUID 12 10 0 0 0 f f f f t f s 1 0 16 "26" _null_ _null_ _null_ _null_ _null_ pg_ts_dict_is_visible _null_ _null_ _null_ ));+DESCR("is text search dictionary visible in search path?");+DATA(insert OID = 3768 ( pg_ts_template_is_visible PGNSP PGUID 12 10 0 0 0 f f f f t f s 1 0 16 "26" _null_ _null_ _null_ _null_ _null_ pg_ts_template_is_visible _null_ _null_ _null_ ));+DESCR("is text search template visible in search path?");+DATA(insert OID = 3758 ( pg_ts_config_is_visible PGNSP PGUID 12 10 0 0 0 f f f f t f s 1 0 16 "26" _null_ _null_ _null_ _null_ _null_ pg_ts_config_is_visible _null_ _null_ _null_ ));+DESCR("is text search configuration visible in search path?");+DATA(insert OID = 3815 ( pg_collation_is_visible PGNSP PGUID 12 10 0 0 0 f f f f t f s 1 0 16 "26" _null_ _null_ _null_ _null_ _null_ pg_collation_is_visible _null_ _null_ _null_ ));+DESCR("is collation visible in search path?");++DATA(insert OID = 2854 ( pg_my_temp_schema PGNSP PGUID 12 1 0 0 0 f f f f t f s 0 0 26 "" _null_ _null_ _null_ _null_ _null_ pg_my_temp_schema _null_ _null_ _null_ ));+DESCR("get OID of current session's temp schema, if any");+DATA(insert OID = 2855 ( pg_is_other_temp_schema PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 16 "26" _null_ _null_ _null_ _null_ _null_ pg_is_other_temp_schema _null_ _null_ _null_ ));+DESCR("is schema another session's temp schema?");++DATA(insert OID = 2171 ( pg_cancel_backend PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 16 "23" _null_ _null_ _null_ _null_ _null_ pg_cancel_backend _null_ _null_ _null_ ));+DESCR("cancel a server process' current query");+DATA(insert OID = 2096 ( pg_terminate_backend PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 16 "23" _null_ _null_ _null_ _null_ _null_ pg_terminate_backend _null_ _null_ _null_ ));+DESCR("terminate a server process");+DATA(insert OID = 2172 ( pg_start_backup PGNSP PGUID 12 1 0 0 0 f f f f t f v 2 0 3220 "25 16" _null_ _null_ _null_ _null_ _null_ pg_start_backup _null_ _null_ _null_ ));+DESCR("prepare for taking an online backup");+DATA(insert OID = 2173 ( pg_stop_backup PGNSP PGUID 12 1 0 0 0 f f f f t f v 0 0 3220 "" _null_ _null_ _null_ _null_ _null_ pg_stop_backup _null_ _null_ _null_ ));+DESCR("finish taking an online backup");+DATA(insert OID = 3813 ( pg_is_in_backup PGNSP PGUID 12 1 0 0 0 f f f f t f v 0 0 16 "" _null_ _null_ _null_ _null_ _null_ pg_is_in_backup _null_ _null_ _null_ ));+DESCR("true if server is in online backup");+DATA(insert OID = 3814 ( pg_backup_start_time PGNSP PGUID 12 1 0 0 0 f f f f t f s 0 0 1184 "" _null_ _null_ _null_ _null_ _null_ pg_backup_start_time _null_ _null_ _null_ ));+DESCR("start time of an online backup");+DATA(insert OID = 2848 ( pg_switch_xlog PGNSP PGUID 12 1 0 0 0 f f f f t f v 0 0 3220 "" _null_ _null_ _null_ _null_ _null_ pg_switch_xlog _null_ _null_ _null_ ));+DESCR("switch to new xlog file");+DATA(insert OID = 3098 ( pg_create_restore_point PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 3220 "25" _null_ _null_ _null_ _null_ _null_ pg_create_restore_point _null_ _null_ _null_ ));+DESCR("create a named restore point");+DATA(insert OID = 2849 ( pg_current_xlog_location PGNSP PGUID 12 1 0 0 0 f f f f t f v 0 0 3220 "" _null_ _null_ _null_ _null_ _null_ pg_current_xlog_location _null_ _null_ _null_ ));+DESCR("current xlog write location");+DATA(insert OID = 2852 ( pg_current_xlog_insert_location PGNSP PGUID 12 1 0 0 0 f f f f t f v 0 0 3220 "" _null_ _null_ _null_ _null_ _null_ pg_current_xlog_insert_location _null_ _null_ _null_ ));+DESCR("current xlog insert location");+DATA(insert OID = 2850 ( pg_xlogfile_name_offset PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2249 "3220" "{3220,25,23}" "{i,o,o}" "{wal_location,file_name,file_offset}" _null_ _null_ pg_xlogfile_name_offset _null_ _null_ _null_ ));+DESCR("xlog filename and byte offset, given an xlog location");+DATA(insert OID = 2851 ( pg_xlogfile_name PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 25 "3220" _null_ _null_ _null_ _null_ _null_ pg_xlogfile_name _null_ _null_ _null_ ));+DESCR("xlog filename, given an xlog location");++DATA(insert OID = 3165 ( pg_xlog_location_diff PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1700 "3220 3220" _null_ _null_ _null_ _null_ _null_ pg_xlog_location_diff _null_ _null_ _null_ ));+DESCR("difference in bytes, given two xlog locations");++DATA(insert OID = 3809 ( pg_export_snapshot PGNSP PGUID 12 1 0 0 0 f f f f t f v 0 0 25 "" _null_ _null_ _null_ _null_ _null_ pg_export_snapshot _null_ _null_ _null_ ));+DESCR("export a snapshot");++DATA(insert OID = 3810 ( pg_is_in_recovery PGNSP PGUID 12 1 0 0 0 f f f f t f v 0 0 16 "" _null_ _null_ _null_ _null_ _null_ pg_is_in_recovery _null_ _null_ _null_ ));+DESCR("true if server is in recovery");++DATA(insert OID = 3820 ( pg_last_xlog_receive_location PGNSP PGUID 12 1 0 0 0 f f f f t f v 0 0 3220 "" _null_ _null_ _null_ _null_ _null_ pg_last_xlog_receive_location _null_ _null_ _null_ ));+DESCR("current xlog flush location");+DATA(insert OID = 3821 ( pg_last_xlog_replay_location PGNSP PGUID 12 1 0 0 0 f f f f t f v 0 0 3220 "" _null_ _null_ _null_ _null_ _null_ pg_last_xlog_replay_location _null_ _null_ _null_ ));+DESCR("last xlog replay location");+DATA(insert OID = 3830 ( pg_last_xact_replay_timestamp PGNSP PGUID 12 1 0 0 0 f f f f t f v 0 0 1184 "" _null_ _null_ _null_ _null_ _null_ pg_last_xact_replay_timestamp _null_ _null_ _null_ ));+DESCR("timestamp of last replay xact");++DATA(insert OID = 3071 ( pg_xlog_replay_pause PGNSP PGUID 12 1 0 0 0 f f f f t f v 0 0 2278 "" _null_ _null_ _null_ _null_ _null_ pg_xlog_replay_pause _null_ _null_ _null_ ));+DESCR("pause xlog replay");+DATA(insert OID = 3072 ( pg_xlog_replay_resume PGNSP PGUID 12 1 0 0 0 f f f f t f v 0 0 2278 "" _null_ _null_ _null_ _null_ _null_ pg_xlog_replay_resume _null_ _null_ _null_ ));+DESCR("resume xlog replay, if it was paused");+DATA(insert OID = 3073 ( pg_is_xlog_replay_paused PGNSP PGUID 12 1 0 0 0 f f f f t f v 0 0 16 "" _null_ _null_ _null_ _null_ _null_ pg_is_xlog_replay_paused _null_ _null_ _null_ ));+DESCR("true if xlog replay is paused");++DATA(insert OID = 2621 ( pg_reload_conf PGNSP PGUID 12 1 0 0 0 f f f f t f v 0 0 16 "" _null_ _null_ _null_ _null_ _null_ pg_reload_conf _null_ _null_ _null_ ));+DESCR("reload configuration files");+DATA(insert OID = 2622 ( pg_rotate_logfile PGNSP PGUID 12 1 0 0 0 f f f f t f v 0 0 16 "" _null_ _null_ _null_ _null_ _null_ pg_rotate_logfile _null_ _null_ _null_ ));+DESCR("rotate log file");++DATA(insert OID = 2623 ( pg_stat_file PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 2249 "25" "{25,20,1184,1184,1184,1184,16}" "{i,o,o,o,o,o,o}" "{filename,size,access,modification,change,creation,isdir}" _null_ _null_ pg_stat_file_1arg _null_ _null_ _null_ ));+DESCR("get information about file");+DATA(insert OID = 3307 ( pg_stat_file PGNSP PGUID 12 1 0 0 0 f f f f t f v 2 0 2249 "25 16" "{25,16,20,1184,1184,1184,1184,16}" "{i,i,o,o,o,o,o,o}" "{filename,missing_ok,size,access,modification,change,creation,isdir}" _null_ _null_ pg_stat_file _null_ _null_ _null_ ));+DESCR("get information about file");+DATA(insert OID = 2624 ( pg_read_file PGNSP PGUID 12 1 0 0 0 f f f f t f v 3 0 25 "25 20 20" _null_ _null_ _null_ _null_ _null_ pg_read_file_off_len _null_ _null_ _null_ ));+DESCR("read text from a file");+DATA(insert OID = 3293 ( pg_read_file PGNSP PGUID 12 1 0 0 0 f f f f t f v 4 0 25 "25 20 20 16" _null_ _null_ _null_ _null_ _null_ pg_read_file _null_ _null_ _null_ ));+DESCR("read text from a file");+DATA(insert OID = 3826 ( pg_read_file PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 25 "25" _null_ _null_ _null_ _null_ _null_ pg_read_file_all _null_ _null_ _null_ ));+DESCR("read text from a file");+DATA(insert OID = 3827 ( pg_read_binary_file PGNSP PGUID 12 1 0 0 0 f f f f t f v 3 0 17 "25 20 20" _null_ _null_ _null_ _null_ _null_ pg_read_binary_file_off_len _null_ _null_ _null_ ));+DESCR("read bytea from a file");+DATA(insert OID = 3295 ( pg_read_binary_file PGNSP PGUID 12 1 0 0 0 f f f f t f v 4 0 17 "25 20 20 16" _null_ _null_ _null_ _null_ _null_ pg_read_binary_file _null_ _null_ _null_ ));+DESCR("read bytea from a file");+DATA(insert OID = 3828 ( pg_read_binary_file PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 17 "25" _null_ _null_ _null_ _null_ _null_ pg_read_binary_file_all _null_ _null_ _null_ ));+DESCR("read bytea from a file");+DATA(insert OID = 2625 ( pg_ls_dir PGNSP PGUID 12 1 1000 0 0 f f f f t t v 1 0 25 "25" _null_ _null_ _null_ _null_ _null_ pg_ls_dir_1arg _null_ _null_ _null_ ));+DESCR("list all files in a directory");+DATA(insert OID = 3297 ( pg_ls_dir PGNSP PGUID 12 1 1000 0 0 f f f f t t v 3 0 25 "25 16 16" _null_ _null_ _null_ _null_ _null_ pg_ls_dir _null_ _null_ _null_ ));+DESCR("list all files in a directory");+DATA(insert OID = 2626 ( pg_sleep PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 2278 "701" _null_ _null_ _null_ _null_ _null_ pg_sleep _null_ _null_ _null_ ));+DESCR("sleep for the specified time in seconds");+DATA(insert OID = 3935 ( pg_sleep_for PGNSP PGUID 14 1 0 0 0 f f f f t f v 1 0 2278 "1186" _null_ _null_ _null_ _null_ _null_ "select pg_catalog.pg_sleep(extract(epoch from pg_catalog.clock_timestamp() operator(pg_catalog.+) $1) operator(pg_catalog.-) extract(epoch from pg_catalog.clock_timestamp()))" _null_ _null_ _null_ ));+DESCR("sleep for the specified interval");+DATA(insert OID = 3936 ( pg_sleep_until PGNSP PGUID 14 1 0 0 0 f f f f t f v 1 0 2278 "1184" _null_ _null_ _null_ _null_ _null_ "select pg_catalog.pg_sleep(extract(epoch from $1) operator(pg_catalog.-) extract(epoch from pg_catalog.clock_timestamp()))" _null_ _null_ _null_ ));+DESCR("sleep until the specified time");++DATA(insert OID = 2971 ( text PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 25 "16" _null_ _null_ _null_ _null_ _null_ booltext _null_ _null_ _null_ ));+DESCR("convert boolean to text");++/* Aggregates (moved here from pg_aggregate for 7.3) */++DATA(insert OID = 2100 ( avg PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 1700 "20" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("the average (arithmetic mean) as numeric of all bigint values");+DATA(insert OID = 2101 ( avg PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 1700 "23" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("the average (arithmetic mean) as numeric of all integer values");+DATA(insert OID = 2102 ( avg PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 1700 "21" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("the average (arithmetic mean) as numeric of all smallint values");+DATA(insert OID = 2103 ( avg PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 1700 "1700" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("the average (arithmetic mean) as numeric of all numeric values");+DATA(insert OID = 2104 ( avg PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 701 "700" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("the average (arithmetic mean) as float8 of all float4 values");+DATA(insert OID = 2105 ( avg PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 701 "701" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("the average (arithmetic mean) as float8 of all float8 values");+DATA(insert OID = 2106 ( avg PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 1186 "1186" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("the average (arithmetic mean) as interval of all interval values");++DATA(insert OID = 2107 ( sum PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 1700 "20" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("sum as numeric across all bigint input values");+DATA(insert OID = 2108 ( sum PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 20 "23" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("sum as bigint across all integer input values");+DATA(insert OID = 2109 ( sum PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 20 "21" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("sum as bigint across all smallint input values");+DATA(insert OID = 2110 ( sum PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 700 "700" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("sum as float4 across all float4 input values");+DATA(insert OID = 2111 ( sum PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 701 "701" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("sum as float8 across all float8 input values");+DATA(insert OID = 2112 ( sum PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 790 "790" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("sum as money across all money input values");+DATA(insert OID = 2113 ( sum PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 1186 "1186" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("sum as interval across all interval input values");+DATA(insert OID = 2114 ( sum PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 1700 "1700" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("sum as numeric across all numeric input values");++DATA(insert OID = 2115 ( max PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 20 "20" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("maximum value of all bigint input values");+DATA(insert OID = 2116 ( max PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 23 "23" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("maximum value of all integer input values");+DATA(insert OID = 2117 ( max PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 21 "21" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("maximum value of all smallint input values");+DATA(insert OID = 2118 ( max PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 26 "26" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("maximum value of all oid input values");+DATA(insert OID = 2119 ( max PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 700 "700" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("maximum value of all float4 input values");+DATA(insert OID = 2120 ( max PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 701 "701" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("maximum value of all float8 input values");+DATA(insert OID = 2121 ( max PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 702 "702" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("maximum value of all abstime input values");+DATA(insert OID = 2122 ( max PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 1082 "1082" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("maximum value of all date input values");+DATA(insert OID = 2123 ( max PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 1083 "1083" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("maximum value of all time input values");+DATA(insert OID = 2124 ( max PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 1266 "1266" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("maximum value of all time with time zone input values");+DATA(insert OID = 2125 ( max PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 790 "790" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("maximum value of all money input values");+DATA(insert OID = 2126 ( max PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 1114 "1114" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("maximum value of all timestamp input values");+DATA(insert OID = 2127 ( max PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 1184 "1184" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("maximum value of all timestamp with time zone input values");+DATA(insert OID = 2128 ( max PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 1186 "1186" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("maximum value of all interval input values");+DATA(insert OID = 2129 ( max PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 25 "25" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("maximum value of all text input values");+DATA(insert OID = 2130 ( max PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 1700 "1700" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("maximum value of all numeric input values");+DATA(insert OID = 2050 ( max PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 2277 "2277" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("maximum value of all anyarray input values");+DATA(insert OID = 2244 ( max PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 1042 "1042" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("maximum value of all bpchar input values");+DATA(insert OID = 2797 ( max PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 27 "27" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("maximum value of all tid input values");+DATA(insert OID = 3564 ( max PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 869 "869" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("maximum value of all inet input values");++DATA(insert OID = 2131 ( min PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 20 "20" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("minimum value of all bigint input values");+DATA(insert OID = 2132 ( min PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 23 "23" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("minimum value of all integer input values");+DATA(insert OID = 2133 ( min PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 21 "21" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("minimum value of all smallint input values");+DATA(insert OID = 2134 ( min PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 26 "26" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("minimum value of all oid input values");+DATA(insert OID = 2135 ( min PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 700 "700" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("minimum value of all float4 input values");+DATA(insert OID = 2136 ( min PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 701 "701" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("minimum value of all float8 input values");+DATA(insert OID = 2137 ( min PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 702 "702" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("minimum value of all abstime input values");+DATA(insert OID = 2138 ( min PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 1082 "1082" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("minimum value of all date input values");+DATA(insert OID = 2139 ( min PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 1083 "1083" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("minimum value of all time input values");+DATA(insert OID = 2140 ( min PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 1266 "1266" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("minimum value of all time with time zone input values");+DATA(insert OID = 2141 ( min PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 790 "790" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("minimum value of all money input values");+DATA(insert OID = 2142 ( min PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 1114 "1114" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("minimum value of all timestamp input values");+DATA(insert OID = 2143 ( min PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 1184 "1184" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("minimum value of all timestamp with time zone input values");+DATA(insert OID = 2144 ( min PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 1186 "1186" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("minimum value of all interval input values");+DATA(insert OID = 2145 ( min PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 25 "25" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("minimum value of all text values");+DATA(insert OID = 2146 ( min PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 1700 "1700" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("minimum value of all numeric input values");+DATA(insert OID = 2051 ( min PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 2277 "2277" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("minimum value of all anyarray input values");+DATA(insert OID = 2245 ( min PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 1042 "1042" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("minimum value of all bpchar input values");+DATA(insert OID = 2798 ( min PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 27 "27" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("minimum value of all tid input values");+DATA(insert OID = 3565 ( min PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 869 "869" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("minimum value of all inet input values");++/* count has two forms: count(any) and count(*) */+DATA(insert OID = 2147 ( count PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 20 "2276" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("number of input rows for which the input expression is not null");+DATA(insert OID = 2803 ( count PGNSP PGUID 12 1 0 0 0 t f f f f f i 0 0 20 "" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("number of input rows");++DATA(insert OID = 2718 ( var_pop PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 1700 "20" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("population variance of bigint input values (square of the population standard deviation)");+DATA(insert OID = 2719 ( var_pop PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 1700 "23" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("population variance of integer input values (square of the population standard deviation)");+DATA(insert OID = 2720 ( var_pop PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 1700 "21" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("population variance of smallint input values (square of the population standard deviation)");+DATA(insert OID = 2721 ( var_pop PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 701 "700" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("population variance of float4 input values (square of the population standard deviation)");+DATA(insert OID = 2722 ( var_pop PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 701 "701" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("population variance of float8 input values (square of the population standard deviation)");+DATA(insert OID = 2723 ( var_pop PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 1700 "1700" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("population variance of numeric input values (square of the population standard deviation)");++DATA(insert OID = 2641 ( var_samp PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 1700 "20" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("sample variance of bigint input values (square of the sample standard deviation)");+DATA(insert OID = 2642 ( var_samp PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 1700 "23" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("sample variance of integer input values (square of the sample standard deviation)");+DATA(insert OID = 2643 ( var_samp PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 1700 "21" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("sample variance of smallint input values (square of the sample standard deviation)");+DATA(insert OID = 2644 ( var_samp PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 701 "700" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("sample variance of float4 input values (square of the sample standard deviation)");++DATA(insert OID = 2645 ( var_samp PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 701 "701" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("sample variance of float8 input values (square of the sample standard deviation)");+DATA(insert OID = 2646 ( var_samp PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 1700 "1700" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("sample variance of numeric input values (square of the sample standard deviation)");++DATA(insert OID = 2148 ( variance PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 1700 "20" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("historical alias for var_samp");+DATA(insert OID = 2149 ( variance PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 1700 "23" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("historical alias for var_samp");+DATA(insert OID = 2150 ( variance PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 1700 "21" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("historical alias for var_samp");+DATA(insert OID = 2151 ( variance PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 701 "700" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("historical alias for var_samp");+DATA(insert OID = 2152 ( variance PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 701 "701" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("historical alias for var_samp");+DATA(insert OID = 2153 ( variance PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 1700 "1700" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("historical alias for var_samp");++DATA(insert OID = 2724 ( stddev_pop PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 1700 "20" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("population standard deviation of bigint input values");+DATA(insert OID = 2725 ( stddev_pop PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 1700 "23" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("population standard deviation of integer input values");+DATA(insert OID = 2726 ( stddev_pop PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 1700 "21" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("population standard deviation of smallint input values");+DATA(insert OID = 2727 ( stddev_pop PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 701 "700" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("population standard deviation of float4 input values");+DATA(insert OID = 2728 ( stddev_pop PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 701 "701" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("population standard deviation of float8 input values");+DATA(insert OID = 2729 ( stddev_pop PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 1700 "1700" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("population standard deviation of numeric input values");++DATA(insert OID = 2712 ( stddev_samp PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 1700 "20" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("sample standard deviation of bigint input values");+DATA(insert OID = 2713 ( stddev_samp PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 1700 "23" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("sample standard deviation of integer input values");+DATA(insert OID = 2714 ( stddev_samp PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 1700 "21" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("sample standard deviation of smallint input values");+DATA(insert OID = 2715 ( stddev_samp PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 701 "700" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("sample standard deviation of float4 input values");+DATA(insert OID = 2716 ( stddev_samp PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 701 "701" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("sample standard deviation of float8 input values");+DATA(insert OID = 2717 ( stddev_samp PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 1700 "1700" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("sample standard deviation of numeric input values");++DATA(insert OID = 2154 ( stddev PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 1700 "20" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("historical alias for stddev_samp");+DATA(insert OID = 2155 ( stddev PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 1700 "23" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("historical alias for stddev_samp");+DATA(insert OID = 2156 ( stddev PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 1700 "21" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("historical alias for stddev_samp");+DATA(insert OID = 2157 ( stddev PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 701 "700" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("historical alias for stddev_samp");+DATA(insert OID = 2158 ( stddev PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 701 "701" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("historical alias for stddev_samp");+DATA(insert OID = 2159 ( stddev PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 1700 "1700" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("historical alias for stddev_samp");++DATA(insert OID = 2818 ( regr_count PGNSP PGUID 12 1 0 0 0 t f f f f f i 2 0 20 "701 701" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("number of input rows in which both expressions are not null");+DATA(insert OID = 2819 ( regr_sxx PGNSP PGUID 12 1 0 0 0 t f f f f f i 2 0 701 "701 701" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("sum of squares of the independent variable (sum(X^2) - sum(X)^2/N)");+DATA(insert OID = 2820 ( regr_syy PGNSP PGUID 12 1 0 0 0 t f f f f f i 2 0 701 "701 701" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("sum of squares of the dependent variable (sum(Y^2) - sum(Y)^2/N)");+DATA(insert OID = 2821 ( regr_sxy PGNSP PGUID 12 1 0 0 0 t f f f f f i 2 0 701 "701 701" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("sum of products of independent times dependent variable (sum(X*Y) - sum(X) * sum(Y)/N)");+DATA(insert OID = 2822 ( regr_avgx PGNSP PGUID 12 1 0 0 0 t f f f f f i 2 0 701 "701 701" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("average of the independent variable (sum(X)/N)");+DATA(insert OID = 2823 ( regr_avgy PGNSP PGUID 12 1 0 0 0 t f f f f f i 2 0 701 "701 701" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("average of the dependent variable (sum(Y)/N)");+DATA(insert OID = 2824 ( regr_r2 PGNSP PGUID 12 1 0 0 0 t f f f f f i 2 0 701 "701 701" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("square of the correlation coefficient");+DATA(insert OID = 2825 ( regr_slope PGNSP PGUID 12 1 0 0 0 t f f f f f i 2 0 701 "701 701" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("slope of the least-squares-fit linear equation determined by the (X, Y) pairs");+DATA(insert OID = 2826 ( regr_intercept PGNSP PGUID 12 1 0 0 0 t f f f f f i 2 0 701 "701 701" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("y-intercept of the least-squares-fit linear equation determined by the (X, Y) pairs");++DATA(insert OID = 2827 ( covar_pop PGNSP PGUID 12 1 0 0 0 t f f f f f i 2 0 701 "701 701" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("population covariance");+DATA(insert OID = 2828 ( covar_samp PGNSP PGUID 12 1 0 0 0 t f f f f f i 2 0 701 "701 701" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("sample covariance");+DATA(insert OID = 2829 ( corr PGNSP PGUID 12 1 0 0 0 t f f f f f i 2 0 701 "701 701" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("correlation coefficient");++DATA(insert OID = 2160 ( text_pattern_lt PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "25 25" _null_ _null_ _null_ _null_ _null_ text_pattern_lt _null_ _null_ _null_ ));+DATA(insert OID = 2161 ( text_pattern_le PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "25 25" _null_ _null_ _null_ _null_ _null_ text_pattern_le _null_ _null_ _null_ ));+DATA(insert OID = 2163 ( text_pattern_ge PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "25 25" _null_ _null_ _null_ _null_ _null_ text_pattern_ge _null_ _null_ _null_ ));+DATA(insert OID = 2164 ( text_pattern_gt PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "25 25" _null_ _null_ _null_ _null_ _null_ text_pattern_gt _null_ _null_ _null_ ));+DATA(insert OID = 2166 ( bttext_pattern_cmp PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "25 25" _null_ _null_ _null_ _null_ _null_ bttext_pattern_cmp _null_ _null_ _null_ ));+DESCR("less-equal-greater");++DATA(insert OID = 2174 ( bpchar_pattern_lt PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "1042 1042" _null_ _null_ _null_ _null_ _null_ bpchar_pattern_lt _null_ _null_ _null_ ));+DATA(insert OID = 2175 ( bpchar_pattern_le PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "1042 1042" _null_ _null_ _null_ _null_ _null_ bpchar_pattern_le _null_ _null_ _null_ ));+DATA(insert OID = 2177 ( bpchar_pattern_ge PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "1042 1042" _null_ _null_ _null_ _null_ _null_ bpchar_pattern_ge _null_ _null_ _null_ ));+DATA(insert OID = 2178 ( bpchar_pattern_gt PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "1042 1042" _null_ _null_ _null_ _null_ _null_ bpchar_pattern_gt _null_ _null_ _null_ ));+DATA(insert OID = 2180 ( btbpchar_pattern_cmp PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "1042 1042" _null_ _null_ _null_ _null_ _null_ btbpchar_pattern_cmp _null_ _null_ _null_ ));+DESCR("less-equal-greater");++DATA(insert OID = 2188 ( btint48cmp PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "23 20" _null_ _null_ _null_ _null_ _null_ btint48cmp _null_ _null_ _null_ ));+DESCR("less-equal-greater");+DATA(insert OID = 2189 ( btint84cmp PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "20 23" _null_ _null_ _null_ _null_ _null_ btint84cmp _null_ _null_ _null_ ));+DESCR("less-equal-greater");+DATA(insert OID = 2190 ( btint24cmp PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "21 23" _null_ _null_ _null_ _null_ _null_ btint24cmp _null_ _null_ _null_ ));+DESCR("less-equal-greater");+DATA(insert OID = 2191 ( btint42cmp PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "23 21" _null_ _null_ _null_ _null_ _null_ btint42cmp _null_ _null_ _null_ ));+DESCR("less-equal-greater");+DATA(insert OID = 2192 ( btint28cmp PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "21 20" _null_ _null_ _null_ _null_ _null_ btint28cmp _null_ _null_ _null_ ));+DESCR("less-equal-greater");+DATA(insert OID = 2193 ( btint82cmp PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "20 21" _null_ _null_ _null_ _null_ _null_ btint82cmp _null_ _null_ _null_ ));+DESCR("less-equal-greater");+DATA(insert OID = 2194 ( btfloat48cmp PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "700 701" _null_ _null_ _null_ _null_ _null_ btfloat48cmp _null_ _null_ _null_ ));+DESCR("less-equal-greater");+DATA(insert OID = 2195 ( btfloat84cmp PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "701 700" _null_ _null_ _null_ _null_ _null_ btfloat84cmp _null_ _null_ _null_ ));+DESCR("less-equal-greater");++DATA(insert OID = 2212 ( regprocedurein PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 2202 "2275" _null_ _null_ _null_ _null_ _null_ regprocedurein _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2213 ( regprocedureout PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 2275 "2202" _null_ _null_ _null_ _null_ _null_ regprocedureout _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2214 ( regoperin PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 2203 "2275" _null_ _null_ _null_ _null_ _null_ regoperin _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2215 ( regoperout PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 2275 "2203" _null_ _null_ _null_ _null_ _null_ regoperout _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 3492 ( to_regoper PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 2203 "2275" _null_ _null_ _null_ _null_ _null_ to_regoper _null_ _null_ _null_ ));+DESCR("convert operator name to regoper");+DATA(insert OID = 3476 ( to_regoperator PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 2204 "2275" _null_ _null_ _null_ _null_ _null_ to_regoperator _null_ _null_ _null_ ));+DESCR("convert operator name to regoperator");+DATA(insert OID = 2216 ( regoperatorin PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 2204 "2275" _null_ _null_ _null_ _null_ _null_ regoperatorin _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2217 ( regoperatorout PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 2275 "2204" _null_ _null_ _null_ _null_ _null_ regoperatorout _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2218 ( regclassin PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 2205 "2275" _null_ _null_ _null_ _null_ _null_ regclassin _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2219 ( regclassout PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 2275 "2205" _null_ _null_ _null_ _null_ _null_ regclassout _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 3495 ( to_regclass PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 2205 "2275" _null_ _null_ _null_ _null_ _null_ to_regclass _null_ _null_ _null_ ));+DESCR("convert classname to regclass");+DATA(insert OID = 2220 ( regtypein PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 2206 "2275" _null_ _null_ _null_ _null_ _null_ regtypein _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2221 ( regtypeout PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 2275 "2206" _null_ _null_ _null_ _null_ _null_ regtypeout _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 3493 ( to_regtype PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 2206 "2275" _null_ _null_ _null_ _null_ _null_ to_regtype _null_ _null_ _null_ ));+DESCR("convert type name to regtype");+DATA(insert OID = 1079 ( regclass PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 2205 "25" _null_ _null_ _null_ _null_ _null_ text_regclass _null_ _null_ _null_ ));+DESCR("convert text to regclass");++DATA(insert OID = 4098 ( regrolein PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 4096 "2275" _null_ _null_ _null_ _null_ _null_ regrolein _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 4092 ( regroleout PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 2275 "4096" _null_ _null_ _null_ _null_ _null_ regroleout _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 4093 ( to_regrole PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 4096 "2275" _null_ _null_ _null_ _null_ _null_ to_regrole _null_ _null_ _null_ ));+DESCR("convert role name to regrole");++DATA(insert OID = 4084 ( regnamespacein PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 4089 "2275" _null_ _null_ _null_ _null_ _null_ regnamespacein _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 4085 ( regnamespaceout PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 2275 "4089" _null_ _null_ _null_ _null_ _null_ regnamespaceout _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 4086 ( to_regnamespace PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 4089 "2275" _null_ _null_ _null_ _null_ _null_ to_regnamespace _null_ _null_ _null_ ));+DESCR("convert namespace name to regnamespace");++DATA(insert OID = 2246 ( fmgr_internal_validator PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 2278 "26" _null_ _null_ _null_ _null_ _null_ fmgr_internal_validator _null_ _null_ _null_ ));+DESCR("(internal)");+DATA(insert OID = 2247 ( fmgr_c_validator PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 2278 "26" _null_ _null_ _null_ _null_ _null_ fmgr_c_validator _null_ _null_ _null_ ));+DESCR("(internal)");+DATA(insert OID = 2248 ( fmgr_sql_validator PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 2278 "26" _null_ _null_ _null_ _null_ _null_ fmgr_sql_validator _null_ _null_ _null_ ));+DESCR("(internal)");++DATA(insert OID = 2250 ( has_database_privilege PGNSP PGUID 12 1 0 0 0 f f f f t f s 3 0 16 "19 25 25" _null_ _null_ _null_ _null_ _null_ has_database_privilege_name_name _null_ _null_ _null_ ));+DESCR("user privilege on database by username, database name");+DATA(insert OID = 2251 ( has_database_privilege PGNSP PGUID 12 1 0 0 0 f f f f t f s 3 0 16 "19 26 25" _null_ _null_ _null_ _null_ _null_ has_database_privilege_name_id _null_ _null_ _null_ ));+DESCR("user privilege on database by username, database oid");+DATA(insert OID = 2252 ( has_database_privilege PGNSP PGUID 12 1 0 0 0 f f f f t f s 3 0 16 "26 25 25" _null_ _null_ _null_ _null_ _null_ has_database_privilege_id_name _null_ _null_ _null_ ));+DESCR("user privilege on database by user oid, database name");+DATA(insert OID = 2253 ( has_database_privilege PGNSP PGUID 12 1 0 0 0 f f f f t f s 3 0 16 "26 26 25" _null_ _null_ _null_ _null_ _null_ has_database_privilege_id_id _null_ _null_ _null_ ));+DESCR("user privilege on database by user oid, database oid");+DATA(insert OID = 2254 ( has_database_privilege PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 16 "25 25" _null_ _null_ _null_ _null_ _null_ has_database_privilege_name _null_ _null_ _null_ ));+DESCR("current user privilege on database by database name");+DATA(insert OID = 2255 ( has_database_privilege PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 16 "26 25" _null_ _null_ _null_ _null_ _null_ has_database_privilege_id _null_ _null_ _null_ ));+DESCR("current user privilege on database by database oid");++DATA(insert OID = 2256 ( has_function_privilege PGNSP PGUID 12 1 0 0 0 f f f f t f s 3 0 16 "19 25 25" _null_ _null_ _null_ _null_ _null_ has_function_privilege_name_name _null_ _null_ _null_ ));+DESCR("user privilege on function by username, function name");+DATA(insert OID = 2257 ( has_function_privilege PGNSP PGUID 12 1 0 0 0 f f f f t f s 3 0 16 "19 26 25" _null_ _null_ _null_ _null_ _null_ has_function_privilege_name_id _null_ _null_ _null_ ));+DESCR("user privilege on function by username, function oid");+DATA(insert OID = 2258 ( has_function_privilege PGNSP PGUID 12 1 0 0 0 f f f f t f s 3 0 16 "26 25 25" _null_ _null_ _null_ _null_ _null_ has_function_privilege_id_name _null_ _null_ _null_ ));+DESCR("user privilege on function by user oid, function name");+DATA(insert OID = 2259 ( has_function_privilege PGNSP PGUID 12 1 0 0 0 f f f f t f s 3 0 16 "26 26 25" _null_ _null_ _null_ _null_ _null_ has_function_privilege_id_id _null_ _null_ _null_ ));+DESCR("user privilege on function by user oid, function oid");+DATA(insert OID = 2260 ( has_function_privilege PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 16 "25 25" _null_ _null_ _null_ _null_ _null_ has_function_privilege_name _null_ _null_ _null_ ));+DESCR("current user privilege on function by function name");+DATA(insert OID = 2261 ( has_function_privilege PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 16 "26 25" _null_ _null_ _null_ _null_ _null_ has_function_privilege_id _null_ _null_ _null_ ));+DESCR("current user privilege on function by function oid");++DATA(insert OID = 2262 ( has_language_privilege PGNSP PGUID 12 1 0 0 0 f f f f t f s 3 0 16 "19 25 25" _null_ _null_ _null_ _null_ _null_ has_language_privilege_name_name _null_ _null_ _null_ ));+DESCR("user privilege on language by username, language name");+DATA(insert OID = 2263 ( has_language_privilege PGNSP PGUID 12 1 0 0 0 f f f f t f s 3 0 16 "19 26 25" _null_ _null_ _null_ _null_ _null_ has_language_privilege_name_id _null_ _null_ _null_ ));+DESCR("user privilege on language by username, language oid");+DATA(insert OID = 2264 ( has_language_privilege PGNSP PGUID 12 1 0 0 0 f f f f t f s 3 0 16 "26 25 25" _null_ _null_ _null_ _null_ _null_ has_language_privilege_id_name _null_ _null_ _null_ ));+DESCR("user privilege on language by user oid, language name");+DATA(insert OID = 2265 ( has_language_privilege PGNSP PGUID 12 1 0 0 0 f f f f t f s 3 0 16 "26 26 25" _null_ _null_ _null_ _null_ _null_ has_language_privilege_id_id _null_ _null_ _null_ ));+DESCR("user privilege on language by user oid, language oid");+DATA(insert OID = 2266 ( has_language_privilege PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 16 "25 25" _null_ _null_ _null_ _null_ _null_ has_language_privilege_name _null_ _null_ _null_ ));+DESCR("current user privilege on language by language name");+DATA(insert OID = 2267 ( has_language_privilege PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 16 "26 25" _null_ _null_ _null_ _null_ _null_ has_language_privilege_id _null_ _null_ _null_ ));+DESCR("current user privilege on language by language oid");++DATA(insert OID = 2268 ( has_schema_privilege PGNSP PGUID 12 1 0 0 0 f f f f t f s 3 0 16 "19 25 25" _null_ _null_ _null_ _null_ _null_ has_schema_privilege_name_name _null_ _null_ _null_ ));+DESCR("user privilege on schema by username, schema name");+DATA(insert OID = 2269 ( has_schema_privilege PGNSP PGUID 12 1 0 0 0 f f f f t f s 3 0 16 "19 26 25" _null_ _null_ _null_ _null_ _null_ has_schema_privilege_name_id _null_ _null_ _null_ ));+DESCR("user privilege on schema by username, schema oid");+DATA(insert OID = 2270 ( has_schema_privilege PGNSP PGUID 12 1 0 0 0 f f f f t f s 3 0 16 "26 25 25" _null_ _null_ _null_ _null_ _null_ has_schema_privilege_id_name _null_ _null_ _null_ ));+DESCR("user privilege on schema by user oid, schema name");+DATA(insert OID = 2271 ( has_schema_privilege PGNSP PGUID 12 1 0 0 0 f f f f t f s 3 0 16 "26 26 25" _null_ _null_ _null_ _null_ _null_ has_schema_privilege_id_id _null_ _null_ _null_ ));+DESCR("user privilege on schema by user oid, schema oid");+DATA(insert OID = 2272 ( has_schema_privilege PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 16 "25 25" _null_ _null_ _null_ _null_ _null_ has_schema_privilege_name _null_ _null_ _null_ ));+DESCR("current user privilege on schema by schema name");+DATA(insert OID = 2273 ( has_schema_privilege PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 16 "26 25" _null_ _null_ _null_ _null_ _null_ has_schema_privilege_id _null_ _null_ _null_ ));+DESCR("current user privilege on schema by schema oid");++DATA(insert OID = 2390 ( has_tablespace_privilege PGNSP PGUID 12 1 0 0 0 f f f f t f s 3 0 16 "19 25 25" _null_ _null_ _null_ _null_ _null_ has_tablespace_privilege_name_name _null_ _null_ _null_ ));+DESCR("user privilege on tablespace by username, tablespace name");+DATA(insert OID = 2391 ( has_tablespace_privilege PGNSP PGUID 12 1 0 0 0 f f f f t f s 3 0 16 "19 26 25" _null_ _null_ _null_ _null_ _null_ has_tablespace_privilege_name_id _null_ _null_ _null_ ));+DESCR("user privilege on tablespace by username, tablespace oid");+DATA(insert OID = 2392 ( has_tablespace_privilege PGNSP PGUID 12 1 0 0 0 f f f f t f s 3 0 16 "26 25 25" _null_ _null_ _null_ _null_ _null_ has_tablespace_privilege_id_name _null_ _null_ _null_ ));+DESCR("user privilege on tablespace by user oid, tablespace name");+DATA(insert OID = 2393 ( has_tablespace_privilege PGNSP PGUID 12 1 0 0 0 f f f f t f s 3 0 16 "26 26 25" _null_ _null_ _null_ _null_ _null_ has_tablespace_privilege_id_id _null_ _null_ _null_ ));+DESCR("user privilege on tablespace by user oid, tablespace oid");+DATA(insert OID = 2394 ( has_tablespace_privilege PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 16 "25 25" _null_ _null_ _null_ _null_ _null_ has_tablespace_privilege_name _null_ _null_ _null_ ));+DESCR("current user privilege on tablespace by tablespace name");+DATA(insert OID = 2395 ( has_tablespace_privilege PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 16 "26 25" _null_ _null_ _null_ _null_ _null_ has_tablespace_privilege_id _null_ _null_ _null_ ));+DESCR("current user privilege on tablespace by tablespace oid");++DATA(insert OID = 3000 ( has_foreign_data_wrapper_privilege PGNSP PGUID 12 1 0 0 0 f f f f t f s 3 0 16 "19 25 25" _null_ _null_ _null_ _null_ _null_ has_foreign_data_wrapper_privilege_name_name _null_ _null_ _null_ ));+DESCR("user privilege on foreign data wrapper by username, foreign data wrapper name");+DATA(insert OID = 3001 ( has_foreign_data_wrapper_privilege PGNSP PGUID 12 1 0 0 0 f f f f t f s 3 0 16 "19 26 25" _null_ _null_ _null_ _null_ _null_ has_foreign_data_wrapper_privilege_name_id _null_ _null_ _null_ ));+DESCR("user privilege on foreign data wrapper by username, foreign data wrapper oid");+DATA(insert OID = 3002 ( has_foreign_data_wrapper_privilege PGNSP PGUID 12 1 0 0 0 f f f f t f s 3 0 16 "26 25 25" _null_ _null_ _null_ _null_ _null_ has_foreign_data_wrapper_privilege_id_name _null_ _null_ _null_ ));+DESCR("user privilege on foreign data wrapper by user oid, foreign data wrapper name");+DATA(insert OID = 3003 ( has_foreign_data_wrapper_privilege PGNSP PGUID 12 1 0 0 0 f f f f t f s 3 0 16 "26 26 25" _null_ _null_ _null_ _null_ _null_ has_foreign_data_wrapper_privilege_id_id _null_ _null_ _null_ ));+DESCR("user privilege on foreign data wrapper by user oid, foreign data wrapper oid");+DATA(insert OID = 3004 ( has_foreign_data_wrapper_privilege PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 16 "25 25" _null_ _null_ _null_ _null_ _null_ has_foreign_data_wrapper_privilege_name _null_ _null_ _null_ ));+DESCR("current user privilege on foreign data wrapper by foreign data wrapper name");+DATA(insert OID = 3005 ( has_foreign_data_wrapper_privilege PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 16 "26 25" _null_ _null_ _null_ _null_ _null_ has_foreign_data_wrapper_privilege_id _null_ _null_ _null_ ));+DESCR("current user privilege on foreign data wrapper by foreign data wrapper oid");++DATA(insert OID = 3006 ( has_server_privilege PGNSP PGUID 12 1 0 0 0 f f f f t f s 3 0 16 "19 25 25" _null_ _null_ _null_ _null_ _null_ has_server_privilege_name_name _null_ _null_ _null_ ));+DESCR("user privilege on server by username, server name");+DATA(insert OID = 3007 ( has_server_privilege PGNSP PGUID 12 1 0 0 0 f f f f t f s 3 0 16 "19 26 25" _null_ _null_ _null_ _null_ _null_ has_server_privilege_name_id _null_ _null_ _null_ ));+DESCR("user privilege on server by username, server oid");+DATA(insert OID = 3008 ( has_server_privilege PGNSP PGUID 12 1 0 0 0 f f f f t f s 3 0 16 "26 25 25" _null_ _null_ _null_ _null_ _null_ has_server_privilege_id_name _null_ _null_ _null_ ));+DESCR("user privilege on server by user oid, server name");+DATA(insert OID = 3009 ( has_server_privilege PGNSP PGUID 12 1 0 0 0 f f f f t f s 3 0 16 "26 26 25" _null_ _null_ _null_ _null_ _null_ has_server_privilege_id_id _null_ _null_ _null_ ));+DESCR("user privilege on server by user oid, server oid");+DATA(insert OID = 3010 ( has_server_privilege PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 16 "25 25" _null_ _null_ _null_ _null_ _null_ has_server_privilege_name _null_ _null_ _null_ ));+DESCR("current user privilege on server by server name");+DATA(insert OID = 3011 ( has_server_privilege PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 16 "26 25" _null_ _null_ _null_ _null_ _null_ has_server_privilege_id _null_ _null_ _null_ ));+DESCR("current user privilege on server by server oid");++DATA(insert OID = 3138 ( has_type_privilege PGNSP PGUID 12 1 0 0 0 f f f f t f s 3 0 16 "19 25 25" _null_ _null_ _null_ _null_ _null_ has_type_privilege_name_name _null_ _null_ _null_ ));+DESCR("user privilege on type by username, type name");+DATA(insert OID = 3139 ( has_type_privilege PGNSP PGUID 12 1 0 0 0 f f f f t f s 3 0 16 "19 26 25" _null_ _null_ _null_ _null_ _null_ has_type_privilege_name_id _null_ _null_ _null_ ));+DESCR("user privilege on type by username, type oid");+DATA(insert OID = 3140 ( has_type_privilege PGNSP PGUID 12 1 0 0 0 f f f f t f s 3 0 16 "26 25 25" _null_ _null_ _null_ _null_ _null_ has_type_privilege_id_name _null_ _null_ _null_ ));+DESCR("user privilege on type by user oid, type name");+DATA(insert OID = 3141 ( has_type_privilege PGNSP PGUID 12 1 0 0 0 f f f f t f s 3 0 16 "26 26 25" _null_ _null_ _null_ _null_ _null_ has_type_privilege_id_id _null_ _null_ _null_ ));+DESCR("user privilege on type by user oid, type oid");+DATA(insert OID = 3142 ( has_type_privilege PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 16 "25 25" _null_ _null_ _null_ _null_ _null_ has_type_privilege_name _null_ _null_ _null_ ));+DESCR("current user privilege on type by type name");+DATA(insert OID = 3143 ( has_type_privilege PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 16 "26 25" _null_ _null_ _null_ _null_ _null_ has_type_privilege_id _null_ _null_ _null_ ));+DESCR("current user privilege on type by type oid");++DATA(insert OID = 2705 ( pg_has_role PGNSP PGUID 12 1 0 0 0 f f f f t f s 3 0 16 "19 19 25" _null_ _null_ _null_ _null_ _null_ pg_has_role_name_name _null_ _null_ _null_ ));+DESCR("user privilege on role by username, role name");+DATA(insert OID = 2706 ( pg_has_role PGNSP PGUID 12 1 0 0 0 f f f f t f s 3 0 16 "19 26 25" _null_ _null_ _null_ _null_ _null_ pg_has_role_name_id _null_ _null_ _null_ ));+DESCR("user privilege on role by username, role oid");+DATA(insert OID = 2707 ( pg_has_role PGNSP PGUID 12 1 0 0 0 f f f f t f s 3 0 16 "26 19 25" _null_ _null_ _null_ _null_ _null_ pg_has_role_id_name _null_ _null_ _null_ ));+DESCR("user privilege on role by user oid, role name");+DATA(insert OID = 2708 ( pg_has_role PGNSP PGUID 12 1 0 0 0 f f f f t f s 3 0 16 "26 26 25" _null_ _null_ _null_ _null_ _null_ pg_has_role_id_id _null_ _null_ _null_ ));+DESCR("user privilege on role by user oid, role oid");+DATA(insert OID = 2709 ( pg_has_role PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 16 "19 25" _null_ _null_ _null_ _null_ _null_ pg_has_role_name _null_ _null_ _null_ ));+DESCR("current user privilege on role by role name");+DATA(insert OID = 2710 ( pg_has_role PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 16 "26 25" _null_ _null_ _null_ _null_ _null_ pg_has_role_id _null_ _null_ _null_ ));+DESCR("current user privilege on role by role oid");++DATA(insert OID = 1269 ( pg_column_size PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 23 "2276" _null_ _null_ _null_ _null_ _null_ pg_column_size _null_ _null_ _null_ ));+DESCR("bytes required to store the value, perhaps with compression");+DATA(insert OID = 2322 ( pg_tablespace_size PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 20 "26" _null_ _null_ _null_ _null_ _null_ pg_tablespace_size_oid _null_ _null_ _null_ ));+DESCR("total disk space usage for the specified tablespace");+DATA(insert OID = 2323 ( pg_tablespace_size PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 20 "19" _null_ _null_ _null_ _null_ _null_ pg_tablespace_size_name _null_ _null_ _null_ ));+DESCR("total disk space usage for the specified tablespace");+DATA(insert OID = 2324 ( pg_database_size PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 20 "26" _null_ _null_ _null_ _null_ _null_ pg_database_size_oid _null_ _null_ _null_ ));+DESCR("total disk space usage for the specified database");+DATA(insert OID = 2168 ( pg_database_size PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 20 "19" _null_ _null_ _null_ _null_ _null_ pg_database_size_name _null_ _null_ _null_ ));+DESCR("total disk space usage for the specified database");+DATA(insert OID = 2325 ( pg_relation_size PGNSP PGUID 14 1 0 0 0 f f f f t f v 1 0 20 "2205" _null_ _null_ _null_ _null_ _null_ "select pg_catalog.pg_relation_size($1, ''main'')" _null_ _null_ _null_ ));+DESCR("disk space usage for the main fork of the specified table or index");+DATA(insert OID = 2332 ( pg_relation_size PGNSP PGUID 12 1 0 0 0 f f f f t f v 2 0 20 "2205 25" _null_ _null_ _null_ _null_ _null_ pg_relation_size _null_ _null_ _null_ ));+DESCR("disk space usage for the specified fork of a table or index");+DATA(insert OID = 2286 ( pg_total_relation_size PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 20 "2205" _null_ _null_ _null_ _null_ _null_ pg_total_relation_size _null_ _null_ _null_ ));+DESCR("total disk space usage for the specified table and associated indexes");+DATA(insert OID = 2288 ( pg_size_pretty PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 25 "20" _null_ _null_ _null_ _null_ _null_ pg_size_pretty _null_ _null_ _null_ ));+DESCR("convert a long int to a human readable text using size units");+DATA(insert OID = 3166 ( pg_size_pretty PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 25 "1700" _null_ _null_ _null_ _null_ _null_ pg_size_pretty_numeric _null_ _null_ _null_ ));+DESCR("convert a numeric to a human readable text using size units");+DATA(insert OID = 2997 ( pg_table_size PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 20 "2205" _null_ _null_ _null_ _null_ _null_ pg_table_size _null_ _null_ _null_ ));+DESCR("disk space usage for the specified table, including TOAST, free space and visibility map");+DATA(insert OID = 2998 ( pg_indexes_size PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 20 "2205" _null_ _null_ _null_ _null_ _null_ pg_indexes_size _null_ _null_ _null_ ));+DESCR("disk space usage for all indexes attached to the specified table");+DATA(insert OID = 2999 ( pg_relation_filenode PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 26 "2205" _null_ _null_ _null_ _null_ _null_ pg_relation_filenode _null_ _null_ _null_ ));+DESCR("filenode identifier of relation");+DATA(insert OID = 3454 ( pg_filenode_relation PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 2205 "26 26" _null_ _null_ _null_ _null_ _null_ pg_filenode_relation _null_ _null_ _null_ ));+DESCR("relation OID for filenode and tablespace");+DATA(insert OID = 3034 ( pg_relation_filepath PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 25 "2205" _null_ _null_ _null_ _null_ _null_ pg_relation_filepath _null_ _null_ _null_ ));+DESCR("file path of relation");++DATA(insert OID = 2316 ( postgresql_fdw_validator PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "1009 26" _null_ _null_ _null_ _null_ _null_ postgresql_fdw_validator _null_ _null_ _null_));+DESCR("(internal)");++DATA(insert OID = 2290 ( record_in PGNSP PGUID 12 1 0 0 0 f f f f t f s 3 0 2249 "2275 26 23" _null_ _null_ _null_ _null_ _null_ record_in _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2291 ( record_out PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 2275 "2249" _null_ _null_ _null_ _null_ _null_ record_out _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2292 ( cstring_in PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2275 "2275" _null_ _null_ _null_ _null_ _null_ cstring_in _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2293 ( cstring_out PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2275 "2275" _null_ _null_ _null_ _null_ _null_ cstring_out _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2294 ( any_in PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2276 "2275" _null_ _null_ _null_ _null_ _null_ any_in _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2295 ( any_out PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2275 "2276" _null_ _null_ _null_ _null_ _null_ any_out _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2296 ( anyarray_in PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2277 "2275" _null_ _null_ _null_ _null_ _null_ anyarray_in _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2297 ( anyarray_out PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 2275 "2277" _null_ _null_ _null_ _null_ _null_ anyarray_out _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2298 ( void_in PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2278 "2275" _null_ _null_ _null_ _null_ _null_ void_in _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2299 ( void_out PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2275 "2278" _null_ _null_ _null_ _null_ _null_ void_out _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2300 ( trigger_in PGNSP PGUID 12 1 0 0 0 f f f f f f i 1 0 2279 "2275" _null_ _null_ _null_ _null_ _null_ trigger_in _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2301 ( trigger_out PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2275 "2279" _null_ _null_ _null_ _null_ _null_ trigger_out _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 3594 ( event_trigger_in PGNSP PGUID 12 1 0 0 0 f f f f f f i 1 0 3838 "2275" _null_ _null_ _null_ _null_ _null_ event_trigger_in _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 3595 ( event_trigger_out PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2275 "3838" _null_ _null_ _null_ _null_ _null_ event_trigger_out _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2302 ( language_handler_in PGNSP PGUID 12 1 0 0 0 f f f f f f i 1 0 2280 "2275" _null_ _null_ _null_ _null_ _null_ language_handler_in _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2303 ( language_handler_out PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2275 "2280" _null_ _null_ _null_ _null_ _null_ language_handler_out _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2304 ( internal_in PGNSP PGUID 12 1 0 0 0 f f f f f f i 1 0 2281 "2275" _null_ _null_ _null_ _null_ _null_ internal_in _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2305 ( internal_out PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2275 "2281" _null_ _null_ _null_ _null_ _null_ internal_out _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2306 ( opaque_in PGNSP PGUID 12 1 0 0 0 f f f f f f i 1 0 2282 "2275" _null_ _null_ _null_ _null_ _null_ opaque_in _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2307 ( opaque_out PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2275 "2282" _null_ _null_ _null_ _null_ _null_ opaque_out _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2312 ( anyelement_in PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2283 "2275" _null_ _null_ _null_ _null_ _null_ anyelement_in _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2313 ( anyelement_out PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2275 "2283" _null_ _null_ _null_ _null_ _null_ anyelement_out _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2398 ( shell_in PGNSP PGUID 12 1 0 0 0 f f f f f f i 1 0 2282 "2275" _null_ _null_ _null_ _null_ _null_ shell_in _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2399 ( shell_out PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2275 "2282" _null_ _null_ _null_ _null_ _null_ shell_out _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2597 ( domain_in PGNSP PGUID 12 1 0 0 0 f f f f f f s 3 0 2276 "2275 26 23" _null_ _null_ _null_ _null_ _null_ domain_in _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2598 ( domain_recv PGNSP PGUID 12 1 0 0 0 f f f f f f s 3 0 2276 "2281 26 23" _null_ _null_ _null_ _null_ _null_ domain_recv _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2777 ( anynonarray_in PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2776 "2275" _null_ _null_ _null_ _null_ _null_ anynonarray_in _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2778 ( anynonarray_out PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2275 "2776" _null_ _null_ _null_ _null_ _null_ anynonarray_out _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 3116 ( fdw_handler_in PGNSP PGUID 12 1 0 0 0 f f f f f f i 1 0 3115 "2275" _null_ _null_ _null_ _null_ _null_ fdw_handler_in _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 3117 ( fdw_handler_out PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2275 "3115" _null_ _null_ _null_ _null_ _null_ fdw_handler_out _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 3311 ( tsm_handler_in PGNSP PGUID 12 1 0 0 0 f f f f f f i 1 0 3310 "2275" _null_ _null_ _null_ _null_ _null_ tsm_handler_in _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 3312 ( tsm_handler_out PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2275 "3310" _null_ _null_ _null_ _null_ _null_ tsm_handler_out _null_ _null_ _null_ ));+DESCR("I/O");++/* tablesample method handlers */+DATA(insert OID = 3313 ( bernoulli PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 3310 "2281" _null_ _null_ _null_ _null_ _null_ tsm_bernoulli_handler _null_ _null_ _null_ ));+DESCR("BERNOULLI tablesample method handler");+DATA(insert OID = 3314 ( system PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 3310 "2281" _null_ _null_ _null_ _null_ _null_ tsm_system_handler _null_ _null_ _null_ ));+DESCR("SYSTEM tablesample method handler");++/* cryptographic */+DATA(insert OID = 2311 ( md5 PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 25 "25" _null_ _null_ _null_ _null_ _null_ md5_text _null_ _null_ _null_ ));+DESCR("MD5 hash");+DATA(insert OID = 2321 ( md5 PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 25 "17" _null_ _null_ _null_ _null_ _null_ md5_bytea _null_ _null_ _null_ ));+DESCR("MD5 hash");++/* crosstype operations for date vs. timestamp and timestamptz */+DATA(insert OID = 2338 ( date_lt_timestamp PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "1082 1114" _null_ _null_ _null_ _null_ _null_ date_lt_timestamp _null_ _null_ _null_ ));+DATA(insert OID = 2339 ( date_le_timestamp PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "1082 1114" _null_ _null_ _null_ _null_ _null_ date_le_timestamp _null_ _null_ _null_ ));+DATA(insert OID = 2340 ( date_eq_timestamp PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "1082 1114" _null_ _null_ _null_ _null_ _null_ date_eq_timestamp _null_ _null_ _null_ ));+DATA(insert OID = 2341 ( date_gt_timestamp PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "1082 1114" _null_ _null_ _null_ _null_ _null_ date_gt_timestamp _null_ _null_ _null_ ));+DATA(insert OID = 2342 ( date_ge_timestamp PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "1082 1114" _null_ _null_ _null_ _null_ _null_ date_ge_timestamp _null_ _null_ _null_ ));+DATA(insert OID = 2343 ( date_ne_timestamp PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "1082 1114" _null_ _null_ _null_ _null_ _null_ date_ne_timestamp _null_ _null_ _null_ ));+DATA(insert OID = 2344 ( date_cmp_timestamp PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "1082 1114" _null_ _null_ _null_ _null_ _null_ date_cmp_timestamp _null_ _null_ _null_ ));+DESCR("less-equal-greater");++DATA(insert OID = 2351 ( date_lt_timestamptz PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 16 "1082 1184" _null_ _null_ _null_ _null_ _null_ date_lt_timestamptz _null_ _null_ _null_ ));+DATA(insert OID = 2352 ( date_le_timestamptz PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 16 "1082 1184" _null_ _null_ _null_ _null_ _null_ date_le_timestamptz _null_ _null_ _null_ ));+DATA(insert OID = 2353 ( date_eq_timestamptz PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 16 "1082 1184" _null_ _null_ _null_ _null_ _null_ date_eq_timestamptz _null_ _null_ _null_ ));+DATA(insert OID = 2354 ( date_gt_timestamptz PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 16 "1082 1184" _null_ _null_ _null_ _null_ _null_ date_gt_timestamptz _null_ _null_ _null_ ));+DATA(insert OID = 2355 ( date_ge_timestamptz PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 16 "1082 1184" _null_ _null_ _null_ _null_ _null_ date_ge_timestamptz _null_ _null_ _null_ ));+DATA(insert OID = 2356 ( date_ne_timestamptz PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 16 "1082 1184" _null_ _null_ _null_ _null_ _null_ date_ne_timestamptz _null_ _null_ _null_ ));+DATA(insert OID = 2357 ( date_cmp_timestamptz PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 23 "1082 1184" _null_ _null_ _null_ _null_ _null_ date_cmp_timestamptz _null_ _null_ _null_ ));+DESCR("less-equal-greater");++DATA(insert OID = 2364 ( timestamp_lt_date PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "1114 1082" _null_ _null_ _null_ _null_ _null_ timestamp_lt_date _null_ _null_ _null_ ));+DATA(insert OID = 2365 ( timestamp_le_date PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "1114 1082" _null_ _null_ _null_ _null_ _null_ timestamp_le_date _null_ _null_ _null_ ));+DATA(insert OID = 2366 ( timestamp_eq_date PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "1114 1082" _null_ _null_ _null_ _null_ _null_ timestamp_eq_date _null_ _null_ _null_ ));+DATA(insert OID = 2367 ( timestamp_gt_date PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "1114 1082" _null_ _null_ _null_ _null_ _null_ timestamp_gt_date _null_ _null_ _null_ ));+DATA(insert OID = 2368 ( timestamp_ge_date PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "1114 1082" _null_ _null_ _null_ _null_ _null_ timestamp_ge_date _null_ _null_ _null_ ));+DATA(insert OID = 2369 ( timestamp_ne_date PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "1114 1082" _null_ _null_ _null_ _null_ _null_ timestamp_ne_date _null_ _null_ _null_ ));+DATA(insert OID = 2370 ( timestamp_cmp_date PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "1114 1082" _null_ _null_ _null_ _null_ _null_ timestamp_cmp_date _null_ _null_ _null_ ));+DESCR("less-equal-greater");++DATA(insert OID = 2377 ( timestamptz_lt_date PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 16 "1184 1082" _null_ _null_ _null_ _null_ _null_ timestamptz_lt_date _null_ _null_ _null_ ));+DATA(insert OID = 2378 ( timestamptz_le_date PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 16 "1184 1082" _null_ _null_ _null_ _null_ _null_ timestamptz_le_date _null_ _null_ _null_ ));+DATA(insert OID = 2379 ( timestamptz_eq_date PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 16 "1184 1082" _null_ _null_ _null_ _null_ _null_ timestamptz_eq_date _null_ _null_ _null_ ));+DATA(insert OID = 2380 ( timestamptz_gt_date PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 16 "1184 1082" _null_ _null_ _null_ _null_ _null_ timestamptz_gt_date _null_ _null_ _null_ ));+DATA(insert OID = 2381 ( timestamptz_ge_date PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 16 "1184 1082" _null_ _null_ _null_ _null_ _null_ timestamptz_ge_date _null_ _null_ _null_ ));+DATA(insert OID = 2382 ( timestamptz_ne_date PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 16 "1184 1082" _null_ _null_ _null_ _null_ _null_ timestamptz_ne_date _null_ _null_ _null_ ));+DATA(insert OID = 2383 ( timestamptz_cmp_date PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 23 "1184 1082" _null_ _null_ _null_ _null_ _null_ timestamptz_cmp_date _null_ _null_ _null_ ));+DESCR("less-equal-greater");++/* crosstype operations for timestamp vs. timestamptz */+DATA(insert OID = 2520 ( timestamp_lt_timestamptz PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 16 "1114 1184" _null_ _null_ _null_ _null_ _null_ timestamp_lt_timestamptz _null_ _null_ _null_ ));+DATA(insert OID = 2521 ( timestamp_le_timestamptz PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 16 "1114 1184" _null_ _null_ _null_ _null_ _null_ timestamp_le_timestamptz _null_ _null_ _null_ ));+DATA(insert OID = 2522 ( timestamp_eq_timestamptz PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 16 "1114 1184" _null_ _null_ _null_ _null_ _null_ timestamp_eq_timestamptz _null_ _null_ _null_ ));+DATA(insert OID = 2523 ( timestamp_gt_timestamptz PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 16 "1114 1184" _null_ _null_ _null_ _null_ _null_ timestamp_gt_timestamptz _null_ _null_ _null_ ));+DATA(insert OID = 2524 ( timestamp_ge_timestamptz PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 16 "1114 1184" _null_ _null_ _null_ _null_ _null_ timestamp_ge_timestamptz _null_ _null_ _null_ ));+DATA(insert OID = 2525 ( timestamp_ne_timestamptz PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 16 "1114 1184" _null_ _null_ _null_ _null_ _null_ timestamp_ne_timestamptz _null_ _null_ _null_ ));+DATA(insert OID = 2526 ( timestamp_cmp_timestamptz PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 23 "1114 1184" _null_ _null_ _null_ _null_ _null_ timestamp_cmp_timestamptz _null_ _null_ _null_ ));+DESCR("less-equal-greater");++DATA(insert OID = 2527 ( timestamptz_lt_timestamp PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 16 "1184 1114" _null_ _null_ _null_ _null_ _null_ timestamptz_lt_timestamp _null_ _null_ _null_ ));+DATA(insert OID = 2528 ( timestamptz_le_timestamp PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 16 "1184 1114" _null_ _null_ _null_ _null_ _null_ timestamptz_le_timestamp _null_ _null_ _null_ ));+DATA(insert OID = 2529 ( timestamptz_eq_timestamp PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 16 "1184 1114" _null_ _null_ _null_ _null_ _null_ timestamptz_eq_timestamp _null_ _null_ _null_ ));+DATA(insert OID = 2530 ( timestamptz_gt_timestamp PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 16 "1184 1114" _null_ _null_ _null_ _null_ _null_ timestamptz_gt_timestamp _null_ _null_ _null_ ));+DATA(insert OID = 2531 ( timestamptz_ge_timestamp PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 16 "1184 1114" _null_ _null_ _null_ _null_ _null_ timestamptz_ge_timestamp _null_ _null_ _null_ ));+DATA(insert OID = 2532 ( timestamptz_ne_timestamp PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 16 "1184 1114" _null_ _null_ _null_ _null_ _null_ timestamptz_ne_timestamp _null_ _null_ _null_ ));+DATA(insert OID = 2533 ( timestamptz_cmp_timestamp PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 23 "1184 1114" _null_ _null_ _null_ _null_ _null_ timestamptz_cmp_timestamp _null_ _null_ _null_ ));+DESCR("less-equal-greater");+++/* send/receive functions */+DATA(insert OID = 2400 ( array_recv PGNSP PGUID 12 1 0 0 0 f f f f t f s 3 0 2277 "2281 26 23" _null_ _null_ _null_ _null_ _null_ array_recv _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2401 ( array_send PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 17 "2277" _null_ _null_ _null_ _null_ _null_ array_send _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2402 ( record_recv PGNSP PGUID 12 1 0 0 0 f f f f t f s 3 0 2249 "2281 26 23" _null_ _null_ _null_ _null_ _null_ record_recv _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2403 ( record_send PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 17 "2249" _null_ _null_ _null_ _null_ _null_ record_send _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2404 ( int2recv PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 21 "2281" _null_ _null_ _null_ _null_ _null_ int2recv _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2405 ( int2send PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 17 "21" _null_ _null_ _null_ _null_ _null_ int2send _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2406 ( int4recv PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 23 "2281" _null_ _null_ _null_ _null_ _null_ int4recv _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2407 ( int4send PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 17 "23" _null_ _null_ _null_ _null_ _null_ int4send _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2408 ( int8recv PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 20 "2281" _null_ _null_ _null_ _null_ _null_ int8recv _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2409 ( int8send PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 17 "20" _null_ _null_ _null_ _null_ _null_ int8send _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2410 ( int2vectorrecv PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 22 "2281" _null_ _null_ _null_ _null_ _null_ int2vectorrecv _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2411 ( int2vectorsend PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 17 "22" _null_ _null_ _null_ _null_ _null_ int2vectorsend _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2412 ( bytearecv PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 17 "2281" _null_ _null_ _null_ _null_ _null_ bytearecv _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2413 ( byteasend PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 17 "17" _null_ _null_ _null_ _null_ _null_ byteasend _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2414 ( textrecv PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 25 "2281" _null_ _null_ _null_ _null_ _null_ textrecv _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2415 ( textsend PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 17 "25" _null_ _null_ _null_ _null_ _null_ textsend _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2416 ( unknownrecv PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 705 "2281" _null_ _null_ _null_ _null_ _null_ unknownrecv _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2417 ( unknownsend PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 17 "705" _null_ _null_ _null_ _null_ _null_ unknownsend _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2418 ( oidrecv PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 26 "2281" _null_ _null_ _null_ _null_ _null_ oidrecv _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2419 ( oidsend PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 17 "26" _null_ _null_ _null_ _null_ _null_ oidsend _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2420 ( oidvectorrecv PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 30 "2281" _null_ _null_ _null_ _null_ _null_ oidvectorrecv _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2421 ( oidvectorsend PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 17 "30" _null_ _null_ _null_ _null_ _null_ oidvectorsend _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2422 ( namerecv PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 19 "2281" _null_ _null_ _null_ _null_ _null_ namerecv _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2423 ( namesend PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 17 "19" _null_ _null_ _null_ _null_ _null_ namesend _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2424 ( float4recv PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 700 "2281" _null_ _null_ _null_ _null_ _null_ float4recv _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2425 ( float4send PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 17 "700" _null_ _null_ _null_ _null_ _null_ float4send _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2426 ( float8recv PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 701 "2281" _null_ _null_ _null_ _null_ _null_ float8recv _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2427 ( float8send PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 17 "701" _null_ _null_ _null_ _null_ _null_ float8send _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2428 ( point_recv PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 600 "2281" _null_ _null_ _null_ _null_ _null_ point_recv _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2429 ( point_send PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 17 "600" _null_ _null_ _null_ _null_ _null_ point_send _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2430 ( bpcharrecv PGNSP PGUID 12 1 0 0 0 f f f f t f s 3 0 1042 "2281 26 23" _null_ _null_ _null_ _null_ _null_ bpcharrecv _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2431 ( bpcharsend PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 17 "1042" _null_ _null_ _null_ _null_ _null_ bpcharsend _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2432 ( varcharrecv PGNSP PGUID 12 1 0 0 0 f f f f t f s 3 0 1043 "2281 26 23" _null_ _null_ _null_ _null_ _null_ varcharrecv _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2433 ( varcharsend PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 17 "1043" _null_ _null_ _null_ _null_ _null_ varcharsend _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2434 ( charrecv PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 18 "2281" _null_ _null_ _null_ _null_ _null_ charrecv _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2435 ( charsend PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 17 "18" _null_ _null_ _null_ _null_ _null_ charsend _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2436 ( boolrecv PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 16 "2281" _null_ _null_ _null_ _null_ _null_ boolrecv _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2437 ( boolsend PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 17 "16" _null_ _null_ _null_ _null_ _null_ boolsend _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2438 ( tidrecv PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 27 "2281" _null_ _null_ _null_ _null_ _null_ tidrecv _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2439 ( tidsend PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 17 "27" _null_ _null_ _null_ _null_ _null_ tidsend _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2440 ( xidrecv PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 28 "2281" _null_ _null_ _null_ _null_ _null_ xidrecv _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2441 ( xidsend PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 17 "28" _null_ _null_ _null_ _null_ _null_ xidsend _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2442 ( cidrecv PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 29 "2281" _null_ _null_ _null_ _null_ _null_ cidrecv _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2443 ( cidsend PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 17 "29" _null_ _null_ _null_ _null_ _null_ cidsend _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2444 ( regprocrecv PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 24 "2281" _null_ _null_ _null_ _null_ _null_ regprocrecv _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2445 ( regprocsend PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 17 "24" _null_ _null_ _null_ _null_ _null_ regprocsend _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2446 ( regprocedurerecv PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2202 "2281" _null_ _null_ _null_ _null_ _null_ regprocedurerecv _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2447 ( regproceduresend PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 17 "2202" _null_ _null_ _null_ _null_ _null_ regproceduresend _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2448 ( regoperrecv PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2203 "2281" _null_ _null_ _null_ _null_ _null_ regoperrecv _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2449 ( regopersend PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 17 "2203" _null_ _null_ _null_ _null_ _null_ regopersend _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2450 ( regoperatorrecv PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2204 "2281" _null_ _null_ _null_ _null_ _null_ regoperatorrecv _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2451 ( regoperatorsend PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 17 "2204" _null_ _null_ _null_ _null_ _null_ regoperatorsend _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2452 ( regclassrecv PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2205 "2281" _null_ _null_ _null_ _null_ _null_ regclassrecv _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2453 ( regclasssend PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 17 "2205" _null_ _null_ _null_ _null_ _null_ regclasssend _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2454 ( regtyperecv PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2206 "2281" _null_ _null_ _null_ _null_ _null_ regtyperecv _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2455 ( regtypesend PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 17 "2206" _null_ _null_ _null_ _null_ _null_ regtypesend _null_ _null_ _null_ ));+DESCR("I/O");++DATA(insert OID = 4094 ( regrolerecv PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 4096 "2281" _null_ _null_ _null_ _null_ _null_ regrolerecv _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 4095 ( regrolesend PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 17 "4096" _null_ _null_ _null_ _null_ _null_ regrolesend _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 4087 ( regnamespacerecv PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 4089 "2281" _null_ _null_ _null_ _null_ _null_ regnamespacerecv _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 4088 ( regnamespacesend PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 17 "4089" _null_ _null_ _null_ _null_ _null_ regnamespacesend _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2456 ( bit_recv PGNSP PGUID 12 1 0 0 0 f f f f t f i 3 0 1560 "2281 26 23" _null_ _null_ _null_ _null_ _null_ bit_recv _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2457 ( bit_send PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 17 "1560" _null_ _null_ _null_ _null_ _null_ bit_send _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2458 ( varbit_recv PGNSP PGUID 12 1 0 0 0 f f f f t f i 3 0 1562 "2281 26 23" _null_ _null_ _null_ _null_ _null_ varbit_recv _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2459 ( varbit_send PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 17 "1562" _null_ _null_ _null_ _null_ _null_ varbit_send _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2460 ( numeric_recv PGNSP PGUID 12 1 0 0 0 f f f f t f i 3 0 1700 "2281 26 23" _null_ _null_ _null_ _null_ _null_ numeric_recv _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2461 ( numeric_send PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 17 "1700" _null_ _null_ _null_ _null_ _null_ numeric_send _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2462 ( abstimerecv PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 702 "2281" _null_ _null_ _null_ _null_ _null_ abstimerecv _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2463 ( abstimesend PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 17 "702" _null_ _null_ _null_ _null_ _null_ abstimesend _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2464 ( reltimerecv PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 703 "2281" _null_ _null_ _null_ _null_ _null_ reltimerecv _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2465 ( reltimesend PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 17 "703" _null_ _null_ _null_ _null_ _null_ reltimesend _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2466 ( tintervalrecv PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 704 "2281" _null_ _null_ _null_ _null_ _null_ tintervalrecv _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2467 ( tintervalsend PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 17 "704" _null_ _null_ _null_ _null_ _null_ tintervalsend _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2468 ( date_recv PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 1082 "2281" _null_ _null_ _null_ _null_ _null_ date_recv _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2469 ( date_send PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 17 "1082" _null_ _null_ _null_ _null_ _null_ date_send _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2470 ( time_recv PGNSP PGUID 12 1 0 0 0 f f f f t f i 3 0 1083 "2281 26 23" _null_ _null_ _null_ _null_ _null_ time_recv _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2471 ( time_send PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 17 "1083" _null_ _null_ _null_ _null_ _null_ time_send _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2472 ( timetz_recv PGNSP PGUID 12 1 0 0 0 f f f f t f i 3 0 1266 "2281 26 23" _null_ _null_ _null_ _null_ _null_ timetz_recv _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2473 ( timetz_send PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 17 "1266" _null_ _null_ _null_ _null_ _null_ timetz_send _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2474 ( timestamp_recv PGNSP PGUID 12 1 0 0 0 f f f f t f i 3 0 1114 "2281 26 23" _null_ _null_ _null_ _null_ _null_ timestamp_recv _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2475 ( timestamp_send PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 17 "1114" _null_ _null_ _null_ _null_ _null_ timestamp_send _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2476 ( timestamptz_recv PGNSP PGUID 12 1 0 0 0 f f f f t f i 3 0 1184 "2281 26 23" _null_ _null_ _null_ _null_ _null_ timestamptz_recv _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2477 ( timestamptz_send PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 17 "1184" _null_ _null_ _null_ _null_ _null_ timestamptz_send _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2478 ( interval_recv PGNSP PGUID 12 1 0 0 0 f f f f t f i 3 0 1186 "2281 26 23" _null_ _null_ _null_ _null_ _null_ interval_recv _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2479 ( interval_send PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 17 "1186" _null_ _null_ _null_ _null_ _null_ interval_send _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2480 ( lseg_recv PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 601 "2281" _null_ _null_ _null_ _null_ _null_ lseg_recv _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2481 ( lseg_send PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 17 "601" _null_ _null_ _null_ _null_ _null_ lseg_send _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2482 ( path_recv PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 602 "2281" _null_ _null_ _null_ _null_ _null_ path_recv _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2483 ( path_send PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 17 "602" _null_ _null_ _null_ _null_ _null_ path_send _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2484 ( box_recv PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 603 "2281" _null_ _null_ _null_ _null_ _null_ box_recv _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2485 ( box_send PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 17 "603" _null_ _null_ _null_ _null_ _null_ box_send _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2486 ( poly_recv PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 604 "2281" _null_ _null_ _null_ _null_ _null_ poly_recv _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2487 ( poly_send PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 17 "604" _null_ _null_ _null_ _null_ _null_ poly_send _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2488 ( line_recv PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 628 "2281" _null_ _null_ _null_ _null_ _null_ line_recv _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2489 ( line_send PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 17 "628" _null_ _null_ _null_ _null_ _null_ line_send _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2490 ( circle_recv PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 718 "2281" _null_ _null_ _null_ _null_ _null_ circle_recv _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2491 ( circle_send PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 17 "718" _null_ _null_ _null_ _null_ _null_ circle_send _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2492 ( cash_recv PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 790 "2281" _null_ _null_ _null_ _null_ _null_ cash_recv _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2493 ( cash_send PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 17 "790" _null_ _null_ _null_ _null_ _null_ cash_send _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2494 ( macaddr_recv PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 829 "2281" _null_ _null_ _null_ _null_ _null_ macaddr_recv _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2495 ( macaddr_send PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 17 "829" _null_ _null_ _null_ _null_ _null_ macaddr_send _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2496 ( inet_recv PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 869 "2281" _null_ _null_ _null_ _null_ _null_ inet_recv _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2497 ( inet_send PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 17 "869" _null_ _null_ _null_ _null_ _null_ inet_send _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2498 ( cidr_recv PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 650 "2281" _null_ _null_ _null_ _null_ _null_ cidr_recv _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2499 ( cidr_send PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 17 "650" _null_ _null_ _null_ _null_ _null_ cidr_send _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2500 ( cstring_recv PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 2275 "2281" _null_ _null_ _null_ _null_ _null_ cstring_recv _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2501 ( cstring_send PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 17 "2275" _null_ _null_ _null_ _null_ _null_ cstring_send _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2502 ( anyarray_recv PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 2277 "2281" _null_ _null_ _null_ _null_ _null_ anyarray_recv _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2503 ( anyarray_send PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 17 "2277" _null_ _null_ _null_ _null_ _null_ anyarray_send _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 3120 ( void_recv PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2278 "2281" _null_ _null_ _null_ _null_ _null_ void_recv _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 3121 ( void_send PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 17 "2278" _null_ _null_ _null_ _null_ _null_ void_send _null_ _null_ _null_ ));+DESCR("I/O");++/* System-view support functions with pretty-print option */+DATA(insert OID = 2504 ( pg_get_ruledef PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 25 "26 16" _null_ _null_ _null_ _null_ _null_ pg_get_ruledef_ext _null_ _null_ _null_ ));+DESCR("source text of a rule with pretty-print option");+DATA(insert OID = 2505 ( pg_get_viewdef PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 25 "25 16" _null_ _null_ _null_ _null_ _null_ pg_get_viewdef_name_ext _null_ _null_ _null_ ));+DESCR("select statement of a view with pretty-print option");+DATA(insert OID = 2506 ( pg_get_viewdef PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 25 "26 16" _null_ _null_ _null_ _null_ _null_ pg_get_viewdef_ext _null_ _null_ _null_ ));+DESCR("select statement of a view with pretty-print option");+DATA(insert OID = 3159 ( pg_get_viewdef PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 25 "26 23" _null_ _null_ _null_ _null_ _null_ pg_get_viewdef_wrap _null_ _null_ _null_ ));+DESCR("select statement of a view with pretty-printing and specified line wrapping");+DATA(insert OID = 2507 ( pg_get_indexdef PGNSP PGUID 12 1 0 0 0 f f f f t f s 3 0 25 "26 23 16" _null_ _null_ _null_ _null_ _null_ pg_get_indexdef_ext _null_ _null_ _null_ ));+DESCR("index description (full create statement or single expression) with pretty-print option");+DATA(insert OID = 2508 ( pg_get_constraintdef PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 25 "26 16" _null_ _null_ _null_ _null_ _null_ pg_get_constraintdef_ext _null_ _null_ _null_ ));+DESCR("constraint description with pretty-print option");+DATA(insert OID = 2509 ( pg_get_expr PGNSP PGUID 12 1 0 0 0 f f f f t f s 3 0 25 "194 26 16" _null_ _null_ _null_ _null_ _null_ pg_get_expr_ext _null_ _null_ _null_ ));+DESCR("deparse an encoded expression with pretty-print option");+DATA(insert OID = 2510 ( pg_prepared_statement PGNSP PGUID 12 1 1000 0 0 f f f f t t s 0 0 2249 "" "{25,25,1184,2211,16}" "{o,o,o,o,o}" "{name,statement,prepare_time,parameter_types,from_sql}" _null_ _null_ pg_prepared_statement _null_ _null_ _null_ ));+DESCR("get the prepared statements for this session");+DATA(insert OID = 2511 ( pg_cursor PGNSP PGUID 12 1 1000 0 0 f f f f t t s 0 0 2249 "" "{25,25,16,16,16,1184}" "{o,o,o,o,o,o}" "{name,statement,is_holdable,is_binary,is_scrollable,creation_time}" _null_ _null_ pg_cursor _null_ _null_ _null_ ));+DESCR("get the open cursors for this session");+DATA(insert OID = 2599 ( pg_timezone_abbrevs PGNSP PGUID 12 1 1000 0 0 f f f f t t s 0 0 2249 "" "{25,1186,16}" "{o,o,o}" "{abbrev,utc_offset,is_dst}" _null_ _null_ pg_timezone_abbrevs _null_ _null_ _null_ ));+DESCR("get the available time zone abbreviations");+DATA(insert OID = 2856 ( pg_timezone_names PGNSP PGUID 12 1 1000 0 0 f f f f t t s 0 0 2249 "" "{25,25,1186,16}" "{o,o,o,o}" "{name,abbrev,utc_offset,is_dst}" _null_ _null_ pg_timezone_names _null_ _null_ _null_ ));+DESCR("get the available time zone names");+DATA(insert OID = 2730 ( pg_get_triggerdef PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 25 "26 16" _null_ _null_ _null_ _null_ _null_ pg_get_triggerdef_ext _null_ _null_ _null_ ));+DESCR("trigger description with pretty-print option");+DATA(insert OID = 3035 ( pg_listening_channels PGNSP PGUID 12 1 10 0 0 f f f f t t s 0 0 25 "" _null_ _null_ _null_ _null_ _null_ pg_listening_channels _null_ _null_ _null_ ));+DESCR("get the channels that the current backend listens to");+DATA(insert OID = 3036 ( pg_notify PGNSP PGUID 12 1 0 0 0 f f f f f f v 2 0 2278 "25 25" _null_ _null_ _null_ _null_ _null_ pg_notify _null_ _null_ _null_ ));+DESCR("send a notification event");++/* non-persistent series generator */+DATA(insert OID = 1066 ( generate_series PGNSP PGUID 12 1 1000 0 0 f f f f t t i 3 0 23 "23 23 23" _null_ _null_ _null_ _null_ _null_ generate_series_step_int4 _null_ _null_ _null_ ));+DESCR("non-persistent series generator");+DATA(insert OID = 1067 ( generate_series PGNSP PGUID 12 1 1000 0 0 f f f f t t i 2 0 23 "23 23" _null_ _null_ _null_ _null_ _null_ generate_series_int4 _null_ _null_ _null_ ));+DESCR("non-persistent series generator");+DATA(insert OID = 1068 ( generate_series PGNSP PGUID 12 1 1000 0 0 f f f f t t i 3 0 20 "20 20 20" _null_ _null_ _null_ _null_ _null_ generate_series_step_int8 _null_ _null_ _null_ ));+DESCR("non-persistent series generator");+DATA(insert OID = 1069 ( generate_series PGNSP PGUID 12 1 1000 0 0 f f f f t t i 2 0 20 "20 20" _null_ _null_ _null_ _null_ _null_ generate_series_int8 _null_ _null_ _null_ ));+DESCR("non-persistent series generator");+DATA(insert OID = 3259 ( generate_series PGNSP PGUID 12 1 1000 0 0 f f f f t t i 3 0 1700 "1700 1700 1700" _null_ _null_ _null_ _null_ _null_ generate_series_step_numeric _null_ _null_ _null_ ));+DESCR("non-persistent series generator");+DATA(insert OID = 3260 ( generate_series PGNSP PGUID 12 1 1000 0 0 f f f f t t i 2 0 1700 "1700 1700" _null_ _null_ _null_ _null_ _null_ generate_series_numeric _null_ _null_ _null_ ));+DESCR("non-persistent series generator");+DATA(insert OID = 938 ( generate_series PGNSP PGUID 12 1 1000 0 0 f f f f t t i 3 0 1114 "1114 1114 1186" _null_ _null_ _null_ _null_ _null_ generate_series_timestamp _null_ _null_ _null_ ));+DESCR("non-persistent series generator");+DATA(insert OID = 939 ( generate_series PGNSP PGUID 12 1 1000 0 0 f f f f t t s 3 0 1184 "1184 1184 1186" _null_ _null_ _null_ _null_ _null_ generate_series_timestamptz _null_ _null_ _null_ ));+DESCR("non-persistent series generator");++/* boolean aggregates */+DATA(insert OID = 2515 ( booland_statefunc PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "16 16" _null_ _null_ _null_ _null_ _null_ booland_statefunc _null_ _null_ _null_ ));+DESCR("aggregate transition function");+DATA(insert OID = 2516 ( boolor_statefunc PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "16 16" _null_ _null_ _null_ _null_ _null_ boolor_statefunc _null_ _null_ _null_ ));+DESCR("aggregate transition function");+DATA(insert OID = 3496 ( bool_accum PGNSP PGUID 12 1 0 0 0 f f f f f f i 2 0 2281 "2281 16" _null_ _null_ _null_ _null_ _null_ bool_accum _null_ _null_ _null_ ));+DESCR("aggregate transition function");+DATA(insert OID = 3497 ( bool_accum_inv PGNSP PGUID 12 1 0 0 0 f f f f f f i 2 0 2281 "2281 16" _null_ _null_ _null_ _null_ _null_ bool_accum_inv _null_ _null_ _null_ ));+DESCR("aggregate transition function");+DATA(insert OID = 3498 ( bool_alltrue PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 16 "2281" _null_ _null_ _null_ _null_ _null_ bool_alltrue _null_ _null_ _null_ ));+DESCR("aggregate final function");+DATA(insert OID = 3499 ( bool_anytrue PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 16 "2281" _null_ _null_ _null_ _null_ _null_ bool_anytrue _null_ _null_ _null_ ));+DESCR("aggregate final function");+DATA(insert OID = 2517 ( bool_and PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 16 "16" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("boolean-and aggregate");+/* ANY, SOME? These names conflict with subquery operators. See doc. */+DATA(insert OID = 2518 ( bool_or PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 16 "16" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("boolean-or aggregate");+DATA(insert OID = 2519 ( every PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 16 "16" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("boolean-and aggregate");++/* bitwise integer aggregates */+DATA(insert OID = 2236 ( bit_and PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 21 "21" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("bitwise-and smallint aggregate");+DATA(insert OID = 2237 ( bit_or PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 21 "21" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("bitwise-or smallint aggregate");+DATA(insert OID = 2238 ( bit_and PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 23 "23" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("bitwise-and integer aggregate");+DATA(insert OID = 2239 ( bit_or PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 23 "23" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("bitwise-or integer aggregate");+DATA(insert OID = 2240 ( bit_and PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 20 "20" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("bitwise-and bigint aggregate");+DATA(insert OID = 2241 ( bit_or PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 20 "20" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("bitwise-or bigint aggregate");+DATA(insert OID = 2242 ( bit_and PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 1560 "1560" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("bitwise-and bit aggregate");+DATA(insert OID = 2243 ( bit_or PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 1560 "1560" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("bitwise-or bit aggregate");++/* formerly-missing interval + datetime operators */+DATA(insert OID = 2546 ( interval_pl_date PGNSP PGUID 14 1 0 0 0 f f f f t f i 2 0 1114 "1186 1082" _null_ _null_ _null_ _null_ _null_ "select $2 + $1" _null_ _null_ _null_ ));+DATA(insert OID = 2547 ( interval_pl_timetz PGNSP PGUID 14 1 0 0 0 f f f f t f i 2 0 1266 "1186 1266" _null_ _null_ _null_ _null_ _null_ "select $2 + $1" _null_ _null_ _null_ ));+DATA(insert OID = 2548 ( interval_pl_timestamp PGNSP PGUID 14 1 0 0 0 f f f f t f i 2 0 1114 "1186 1114" _null_ _null_ _null_ _null_ _null_ "select $2 + $1" _null_ _null_ _null_ ));+DATA(insert OID = 2549 ( interval_pl_timestamptz PGNSP PGUID 14 1 0 0 0 f f f f t f s 2 0 1184 "1186 1184" _null_ _null_ _null_ _null_ _null_ "select $2 + $1" _null_ _null_ _null_ ));+DATA(insert OID = 2550 ( integer_pl_date PGNSP PGUID 14 1 0 0 0 f f f f t f i 2 0 1082 "23 1082" _null_ _null_ _null_ _null_ _null_ "select $2 + $1" _null_ _null_ _null_ ));++DATA(insert OID = 2556 ( pg_tablespace_databases PGNSP PGUID 12 1 1000 0 0 f f f f t t s 1 0 26 "26" _null_ _null_ _null_ _null_ _null_ pg_tablespace_databases _null_ _null_ _null_ ));+DESCR("get OIDs of databases in a tablespace");++DATA(insert OID = 2557 ( bool PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 16 "23" _null_ _null_ _null_ _null_ _null_ int4_bool _null_ _null_ _null_ ));+DESCR("convert int4 to boolean");+DATA(insert OID = 2558 ( int4 PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 23 "16" _null_ _null_ _null_ _null_ _null_ bool_int4 _null_ _null_ _null_ ));+DESCR("convert boolean to int4");+DATA(insert OID = 2559 ( lastval PGNSP PGUID 12 1 0 0 0 f f f f t f v 0 0 20 "" _null_ _null_ _null_ _null_ _null_ lastval _null_ _null_ _null_ ));+DESCR("current value from last used sequence");++/* start time function */+DATA(insert OID = 2560 ( pg_postmaster_start_time PGNSP PGUID 12 1 0 0 0 f f f f t f s 0 0 1184 "" _null_ _null_ _null_ _null_ _null_ pg_postmaster_start_time _null_ _null_ _null_ ));+DESCR("postmaster start time");+/* config reload time function */+DATA(insert OID = 2034 ( pg_conf_load_time PGNSP PGUID 12 1 0 0 0 f f f f t f s 0 0 1184 "" _null_ _null_ _null_ _null_ _null_ pg_conf_load_time _null_ _null_ _null_ ));+DESCR("configuration load time");++/* new functions for Y-direction rtree opclasses */+DATA(insert OID = 2562 ( box_below PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "603 603" _null_ _null_ _null_ _null_ _null_ box_below _null_ _null_ _null_ ));+DATA(insert OID = 2563 ( box_overbelow PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "603 603" _null_ _null_ _null_ _null_ _null_ box_overbelow _null_ _null_ _null_ ));+DATA(insert OID = 2564 ( box_overabove PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "603 603" _null_ _null_ _null_ _null_ _null_ box_overabove _null_ _null_ _null_ ));+DATA(insert OID = 2565 ( box_above PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "603 603" _null_ _null_ _null_ _null_ _null_ box_above _null_ _null_ _null_ ));+DATA(insert OID = 2566 ( poly_below PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "604 604" _null_ _null_ _null_ _null_ _null_ poly_below _null_ _null_ _null_ ));+DATA(insert OID = 2567 ( poly_overbelow PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "604 604" _null_ _null_ _null_ _null_ _null_ poly_overbelow _null_ _null_ _null_ ));+DATA(insert OID = 2568 ( poly_overabove PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "604 604" _null_ _null_ _null_ _null_ _null_ poly_overabove _null_ _null_ _null_ ));+DATA(insert OID = 2569 ( poly_above PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "604 604" _null_ _null_ _null_ _null_ _null_ poly_above _null_ _null_ _null_ ));+DATA(insert OID = 2587 ( circle_overbelow PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "718 718" _null_ _null_ _null_ _null_ _null_ circle_overbelow _null_ _null_ _null_ ));+DATA(insert OID = 2588 ( circle_overabove PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "718 718" _null_ _null_ _null_ _null_ _null_ circle_overabove _null_ _null_ _null_ ));++/* support functions for GiST r-tree emulation */+DATA(insert OID = 2578 ( gist_box_consistent PGNSP PGUID 12 1 0 0 0 f f f f t f i 5 0 16 "2281 603 23 26 2281" _null_ _null_ _null_ _null_ _null_ gist_box_consistent _null_ _null_ _null_ ));+DESCR("GiST support");+DATA(insert OID = 2579 ( gist_box_compress PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2281 "2281" _null_ _null_ _null_ _null_ _null_ gist_box_compress _null_ _null_ _null_ ));+DESCR("GiST support");+DATA(insert OID = 2580 ( gist_box_decompress PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2281 "2281" _null_ _null_ _null_ _null_ _null_ gist_box_decompress _null_ _null_ _null_ ));+DESCR("GiST support");+DATA(insert OID = 3281 ( gist_box_fetch PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2281 "2281" _null_ _null_ _null_ _null_ _null_ gist_box_fetch _null_ _null_ _null_ ));+DESCR("GiST support");+DATA(insert OID = 2581 ( gist_box_penalty PGNSP PGUID 12 1 0 0 0 f f f f t f i 3 0 2281 "2281 2281 2281" _null_ _null_ _null_ _null_ _null_ gist_box_penalty _null_ _null_ _null_ ));+DESCR("GiST support");+DATA(insert OID = 2582 ( gist_box_picksplit PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 2281 "2281 2281" _null_ _null_ _null_ _null_ _null_ gist_box_picksplit _null_ _null_ _null_ ));+DESCR("GiST support");+DATA(insert OID = 2583 ( gist_box_union PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 603 "2281 2281" _null_ _null_ _null_ _null_ _null_ gist_box_union _null_ _null_ _null_ ));+DESCR("GiST support");+DATA(insert OID = 2584 ( gist_box_same PGNSP PGUID 12 1 0 0 0 f f f f t f i 3 0 2281 "603 603 2281" _null_ _null_ _null_ _null_ _null_ gist_box_same _null_ _null_ _null_ ));+DESCR("GiST support");+DATA(insert OID = 2585 ( gist_poly_consistent PGNSP PGUID 12 1 0 0 0 f f f f t f i 5 0 16 "2281 604 23 26 2281" _null_ _null_ _null_ _null_ _null_ gist_poly_consistent _null_ _null_ _null_ ));+DESCR("GiST support");+DATA(insert OID = 2586 ( gist_poly_compress PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2281 "2281" _null_ _null_ _null_ _null_ _null_ gist_poly_compress _null_ _null_ _null_ ));+DESCR("GiST support");+DATA(insert OID = 2591 ( gist_circle_consistent PGNSP PGUID 12 1 0 0 0 f f f f t f i 5 0 16 "2281 718 23 26 2281" _null_ _null_ _null_ _null_ _null_ gist_circle_consistent _null_ _null_ _null_ ));+DESCR("GiST support");+DATA(insert OID = 2592 ( gist_circle_compress PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2281 "2281" _null_ _null_ _null_ _null_ _null_ gist_circle_compress _null_ _null_ _null_ ));+DESCR("GiST support");+DATA(insert OID = 1030 ( gist_point_compress PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2281 "2281" _null_ _null_ _null_ _null_ _null_ gist_point_compress _null_ _null_ _null_ ));+DESCR("GiST support");+DATA(insert OID = 3282 ( gist_point_fetch PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2281 "2281" _null_ _null_ _null_ _null_ _null_ gist_point_fetch _null_ _null_ _null_ ));+DESCR("GiST support");+DATA(insert OID = 2179 ( gist_point_consistent PGNSP PGUID 12 1 0 0 0 f f f f t f i 5 0 16 "2281 600 23 26 2281" _null_ _null_ _null_ _null_ _null_ gist_point_consistent _null_ _null_ _null_ ));+DESCR("GiST support");+DATA(insert OID = 3064 ( gist_point_distance PGNSP PGUID 12 1 0 0 0 f f f f t f i 4 0 701 "2281 600 23 26" _null_ _null_ _null_ _null_ _null_ gist_point_distance _null_ _null_ _null_ ));+DESCR("GiST support");+DATA(insert OID = 3288 ( gist_bbox_distance PGNSP PGUID 12 1 0 0 0 f f f f t f i 4 0 701 "2281 600 23 26" _null_ _null_ _null_ _null_ _null_ gist_bbox_distance _null_ _null_ _null_ ));+DESCR("GiST support");++/* GIN */+DATA(insert OID = 2731 ( gingetbitmap PGNSP PGUID 12 1 0 0 0 f f f f t f v 2 0 20 "2281 2281" _null_ _null_ _null_ _null_ _null_ gingetbitmap _null_ _null_ _null_ ));+DESCR("gin(internal)");+DATA(insert OID = 2732 ( gininsert PGNSP PGUID 12 1 0 0 0 f f f f t f v 6 0 16 "2281 2281 2281 2281 2281 2281" _null_ _null_ _null_ _null_ _null_ gininsert _null_ _null_ _null_ ));+DESCR("gin(internal)");+DATA(insert OID = 2733 ( ginbeginscan PGNSP PGUID 12 1 0 0 0 f f f f t f v 3 0 2281 "2281 2281 2281" _null_ _null_ _null_ _null_ _null_ ginbeginscan _null_ _null_ _null_ ));+DESCR("gin(internal)");+DATA(insert OID = 2734 ( ginrescan PGNSP PGUID 12 1 0 0 0 f f f f t f v 5 0 2278 "2281 2281 2281 2281 2281" _null_ _null_ _null_ _null_ _null_ ginrescan _null_ _null_ _null_ ));+DESCR("gin(internal)");+DATA(insert OID = 2735 ( ginendscan PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 2278 "2281" _null_ _null_ _null_ _null_ _null_ ginendscan _null_ _null_ _null_ ));+DESCR("gin(internal)");+DATA(insert OID = 2736 ( ginmarkpos PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 2278 "2281" _null_ _null_ _null_ _null_ _null_ ginmarkpos _null_ _null_ _null_ ));+DESCR("gin(internal)");+DATA(insert OID = 2737 ( ginrestrpos PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 2278 "2281" _null_ _null_ _null_ _null_ _null_ ginrestrpos _null_ _null_ _null_ ));+DESCR("gin(internal)");+DATA(insert OID = 2738 ( ginbuild PGNSP PGUID 12 1 0 0 0 f f f f t f v 3 0 2281 "2281 2281 2281" _null_ _null_ _null_ _null_ _null_ ginbuild _null_ _null_ _null_ ));+DESCR("gin(internal)");+DATA(insert OID = 325 ( ginbuildempty PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 2278 "2281" _null_ _null_ _null_ _null_ _null_ ginbuildempty _null_ _null_ _null_ ));+DESCR("gin(internal)");+DATA(insert OID = 2739 ( ginbulkdelete PGNSP PGUID 12 1 0 0 0 f f f f t f v 4 0 2281 "2281 2281 2281 2281" _null_ _null_ _null_ _null_ _null_ ginbulkdelete _null_ _null_ _null_ ));+DESCR("gin(internal)");+DATA(insert OID = 2740 ( ginvacuumcleanup PGNSP PGUID 12 1 0 0 0 f f f f t f v 2 0 2281 "2281 2281" _null_ _null_ _null_ _null_ _null_ ginvacuumcleanup _null_ _null_ _null_ ));+DESCR("gin(internal)");+DATA(insert OID = 2741 ( gincostestimate PGNSP PGUID 12 1 0 0 0 f f f f t f v 7 0 2278 "2281 2281 2281 2281 2281 2281 2281" _null_ _null_ _null_ _null_ _null_ gincostestimate _null_ _null_ _null_ ));+DESCR("gin(internal)");+DATA(insert OID = 2788 ( ginoptions PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 17 "1009 16" _null_ _null_ _null_ _null_ _null_ ginoptions _null_ _null_ _null_ ));+DESCR("gin(internal)");++/* GIN array support */+DATA(insert OID = 2743 ( ginarrayextract PGNSP PGUID 12 1 0 0 0 f f f f t f i 3 0 2281 "2277 2281 2281" _null_ _null_ _null_ _null_ _null_ ginarrayextract _null_ _null_ _null_ ));+DESCR("GIN array support");+DATA(insert OID = 2774 ( ginqueryarrayextract PGNSP PGUID 12 1 0 0 0 f f f f t f i 7 0 2281 "2277 2281 21 2281 2281 2281 2281" _null_ _null_ _null_ _null_ _null_ ginqueryarrayextract _null_ _null_ _null_ ));+DESCR("GIN array support");+DATA(insert OID = 2744 ( ginarrayconsistent PGNSP PGUID 12 1 0 0 0 f f f f t f i 8 0 16 "2281 21 2277 23 2281 2281 2281 2281" _null_ _null_ _null_ _null_ _null_ ginarrayconsistent _null_ _null_ _null_ ));+DESCR("GIN array support");+DATA(insert OID = 3920 ( ginarraytriconsistent PGNSP PGUID 12 1 0 0 0 f f f f t f i 7 0 18 "2281 21 2277 23 2281 2281 2281" _null_ _null_ _null_ _null_ _null_ ginarraytriconsistent _null_ _null_ _null_ ));+DESCR("GIN array support");+DATA(insert OID = 3076 ( ginarrayextract PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 2281 "2277 2281" _null_ _null_ _null_ _null_ _null_ ginarrayextract_2args _null_ _null_ _null_ ));+DESCR("GIN array support (obsolete)");++/* overlap/contains/contained */+DATA(insert OID = 2747 ( arrayoverlap PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "2277 2277" _null_ _null_ _null_ _null_ _null_ arrayoverlap _null_ _null_ _null_ ));+DATA(insert OID = 2748 ( arraycontains PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "2277 2277" _null_ _null_ _null_ _null_ _null_ arraycontains _null_ _null_ _null_ ));+DATA(insert OID = 2749 ( arraycontained PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "2277 2277" _null_ _null_ _null_ _null_ _null_ arraycontained _null_ _null_ _null_ ));++/* BRIN minmax */+DATA(insert OID = 3383 ( brin_minmax_opcinfo PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2281 "2281" _null_ _null_ _null_ _null_ _null_ brin_minmax_opcinfo _null_ _null_ _null_ ));+DESCR("BRIN minmax support");+DATA(insert OID = 3384 ( brin_minmax_add_value PGNSP PGUID 12 1 0 0 0 f f f f t f i 4 0 16 "2281 2281 2281 2281" _null_ _null_ _null_ _null_ _null_ brin_minmax_add_value _null_ _null_ _null_ ));+DESCR("BRIN minmax support");+DATA(insert OID = 3385 ( brin_minmax_consistent PGNSP PGUID 12 1 0 0 0 f f f f t f i 3 0 16 "2281 2281 2281" _null_ _null_ _null_ _null_ _null_ brin_minmax_consistent _null_ _null_ _null_ ));+DESCR("BRIN minmax support");+DATA(insert OID = 3386 ( brin_minmax_union PGNSP PGUID 12 1 0 0 0 f f f f t f i 3 0 16 "2281 2281 2281" _null_ _null_ _null_ _null_ _null_ brin_minmax_union _null_ _null_ _null_ ));+DESCR("BRIN minmax support");++/* BRIN inclusion */+DATA(insert OID = 4105 ( brin_inclusion_opcinfo PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2281 "2281" _null_ _null_ _null_ _null_ _null_ brin_inclusion_opcinfo _null_ _null_ _null_ ));+DESCR("BRIN inclusion support");+DATA(insert OID = 4106 ( brin_inclusion_add_value PGNSP PGUID 12 1 0 0 0 f f f f t f i 4 0 16 "2281 2281 2281 2281" _null_ _null_ _null_ _null_ _null_ brin_inclusion_add_value _null_ _null_ _null_ ));+DESCR("BRIN inclusion support");+DATA(insert OID = 4107 ( brin_inclusion_consistent PGNSP PGUID 12 1 0 0 0 f f f f t f i 3 0 16 "2281 2281 2281" _null_ _null_ _null_ _null_ _null_ brin_inclusion_consistent _null_ _null_ _null_ ));+DESCR("BRIN inclusion support");+DATA(insert OID = 4108 ( brin_inclusion_union PGNSP PGUID 12 1 0 0 0 f f f f t f i 3 0 16 "2281 2281 2281" _null_ _null_ _null_ _null_ _null_ brin_inclusion_union _null_ _null_ _null_ ));+DESCR("BRIN inclusion support");++/* userlock replacements */+DATA(insert OID = 2880 ( pg_advisory_lock PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 2278 "20" _null_ _null_ _null_ _null_ _null_ pg_advisory_lock_int8 _null_ _null_ _null_ ));+DESCR("obtain exclusive advisory lock");+DATA(insert OID = 3089 ( pg_advisory_xact_lock PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 2278 "20" _null_ _null_ _null_ _null_ _null_ pg_advisory_xact_lock_int8 _null_ _null_ _null_ ));+DESCR("obtain exclusive advisory lock");+DATA(insert OID = 2881 ( pg_advisory_lock_shared PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 2278 "20" _null_ _null_ _null_ _null_ _null_ pg_advisory_lock_shared_int8 _null_ _null_ _null_ ));+DESCR("obtain shared advisory lock");+DATA(insert OID = 3090 ( pg_advisory_xact_lock_shared PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 2278 "20" _null_ _null_ _null_ _null_ _null_ pg_advisory_xact_lock_shared_int8 _null_ _null_ _null_ ));+DESCR("obtain shared advisory lock");+DATA(insert OID = 2882 ( pg_try_advisory_lock PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 16 "20" _null_ _null_ _null_ _null_ _null_ pg_try_advisory_lock_int8 _null_ _null_ _null_ ));+DESCR("obtain exclusive advisory lock if available");+DATA(insert OID = 3091 ( pg_try_advisory_xact_lock PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 16 "20" _null_ _null_ _null_ _null_ _null_ pg_try_advisory_xact_lock_int8 _null_ _null_ _null_ ));+DESCR("obtain exclusive advisory lock if available");+DATA(insert OID = 2883 ( pg_try_advisory_lock_shared PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 16 "20" _null_ _null_ _null_ _null_ _null_ pg_try_advisory_lock_shared_int8 _null_ _null_ _null_ ));+DESCR("obtain shared advisory lock if available");+DATA(insert OID = 3092 ( pg_try_advisory_xact_lock_shared PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 16 "20" _null_ _null_ _null_ _null_ _null_ pg_try_advisory_xact_lock_shared_int8 _null_ _null_ _null_ ));+DESCR("obtain shared advisory lock if available");+DATA(insert OID = 2884 ( pg_advisory_unlock PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 16 "20" _null_ _null_ _null_ _null_ _null_ pg_advisory_unlock_int8 _null_ _null_ _null_ ));+DESCR("release exclusive advisory lock");+DATA(insert OID = 2885 ( pg_advisory_unlock_shared PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 16 "20" _null_ _null_ _null_ _null_ _null_ pg_advisory_unlock_shared_int8 _null_ _null_ _null_ ));+DESCR("release shared advisory lock");+DATA(insert OID = 2886 ( pg_advisory_lock PGNSP PGUID 12 1 0 0 0 f f f f t f v 2 0 2278 "23 23" _null_ _null_ _null_ _null_ _null_ pg_advisory_lock_int4 _null_ _null_ _null_ ));+DESCR("obtain exclusive advisory lock");+DATA(insert OID = 3093 ( pg_advisory_xact_lock PGNSP PGUID 12 1 0 0 0 f f f f t f v 2 0 2278 "23 23" _null_ _null_ _null_ _null_ _null_ pg_advisory_xact_lock_int4 _null_ _null_ _null_ ));+DESCR("obtain exclusive advisory lock");+DATA(insert OID = 2887 ( pg_advisory_lock_shared PGNSP PGUID 12 1 0 0 0 f f f f t f v 2 0 2278 "23 23" _null_ _null_ _null_ _null_ _null_ pg_advisory_lock_shared_int4 _null_ _null_ _null_ ));+DESCR("obtain shared advisory lock");+DATA(insert OID = 3094 ( pg_advisory_xact_lock_shared PGNSP PGUID 12 1 0 0 0 f f f f t f v 2 0 2278 "23 23" _null_ _null_ _null_ _null_ _null_ pg_advisory_xact_lock_shared_int4 _null_ _null_ _null_ ));+DESCR("obtain shared advisory lock");+DATA(insert OID = 2888 ( pg_try_advisory_lock PGNSP PGUID 12 1 0 0 0 f f f f t f v 2 0 16 "23 23" _null_ _null_ _null_ _null_ _null_ pg_try_advisory_lock_int4 _null_ _null_ _null_ ));+DESCR("obtain exclusive advisory lock if available");+DATA(insert OID = 3095 ( pg_try_advisory_xact_lock PGNSP PGUID 12 1 0 0 0 f f f f t f v 2 0 16 "23 23" _null_ _null_ _null_ _null_ _null_ pg_try_advisory_xact_lock_int4 _null_ _null_ _null_ ));+DESCR("obtain exclusive advisory lock if available");+DATA(insert OID = 2889 ( pg_try_advisory_lock_shared PGNSP PGUID 12 1 0 0 0 f f f f t f v 2 0 16 "23 23" _null_ _null_ _null_ _null_ _null_ pg_try_advisory_lock_shared_int4 _null_ _null_ _null_ ));+DESCR("obtain shared advisory lock if available");+DATA(insert OID = 3096 ( pg_try_advisory_xact_lock_shared PGNSP PGUID 12 1 0 0 0 f f f f t f v 2 0 16 "23 23" _null_ _null_ _null_ _null_ _null_ pg_try_advisory_xact_lock_shared_int4 _null_ _null_ _null_ ));+DESCR("obtain shared advisory lock if available");+DATA(insert OID = 2890 ( pg_advisory_unlock PGNSP PGUID 12 1 0 0 0 f f f f t f v 2 0 16 "23 23" _null_ _null_ _null_ _null_ _null_ pg_advisory_unlock_int4 _null_ _null_ _null_ ));+DESCR("release exclusive advisory lock");+DATA(insert OID = 2891 ( pg_advisory_unlock_shared PGNSP PGUID 12 1 0 0 0 f f f f t f v 2 0 16 "23 23" _null_ _null_ _null_ _null_ _null_ pg_advisory_unlock_shared_int4 _null_ _null_ _null_ ));+DESCR("release shared advisory lock");+DATA(insert OID = 2892 ( pg_advisory_unlock_all PGNSP PGUID 12 1 0 0 0 f f f f t f v 0 0 2278 "" _null_ _null_ _null_ _null_ _null_ pg_advisory_unlock_all _null_ _null_ _null_ ));+DESCR("release all advisory locks");++/* XML support */+DATA(insert OID = 2893 ( xml_in PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 142 "2275" _null_ _null_ _null_ _null_ _null_ xml_in _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2894 ( xml_out PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2275 "142" _null_ _null_ _null_ _null_ _null_ xml_out _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2895 ( xmlcomment PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 142 "25" _null_ _null_ _null_ _null_ _null_ xmlcomment _null_ _null_ _null_ ));+DESCR("generate XML comment");+DATA(insert OID = 2896 ( xml PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 142 "25" _null_ _null_ _null_ _null_ _null_ texttoxml _null_ _null_ _null_ ));+DESCR("perform a non-validating parse of a character string to produce an XML value");+DATA(insert OID = 2897 ( xmlvalidate PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "142 25" _null_ _null_ _null_ _null_ _null_ xmlvalidate _null_ _null_ _null_ ));+DESCR("validate an XML value");+DATA(insert OID = 2898 ( xml_recv PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 142 "2281" _null_ _null_ _null_ _null_ _null_ xml_recv _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2899 ( xml_send PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 17 "142" _null_ _null_ _null_ _null_ _null_ xml_send _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2900 ( xmlconcat2 PGNSP PGUID 12 1 0 0 0 f f f f f f i 2 0 142 "142 142" _null_ _null_ _null_ _null_ _null_ xmlconcat2 _null_ _null_ _null_ ));+DESCR("aggregate transition function");+DATA(insert OID = 2901 ( xmlagg PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 142 "142" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("concatenate XML values");+DATA(insert OID = 2922 ( text PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 25 "142" _null_ _null_ _null_ _null_ _null_ xmltotext _null_ _null_ _null_ ));+DESCR("serialize an XML value to a character string");++DATA(insert OID = 2923 ( table_to_xml PGNSP PGUID 12 100 0 0 0 f f f f t f s 4 0 142 "2205 16 16 25" _null_ _null_ "{tbl,nulls,tableforest,targetns}" _null_ _null_ table_to_xml _null_ _null_ _null_ ));+DESCR("map table contents to XML");+DATA(insert OID = 2924 ( query_to_xml PGNSP PGUID 12 100 0 0 0 f f f f t f s 4 0 142 "25 16 16 25" _null_ _null_ "{query,nulls,tableforest,targetns}" _null_ _null_ query_to_xml _null_ _null_ _null_ ));+DESCR("map query result to XML");+DATA(insert OID = 2925 ( cursor_to_xml PGNSP PGUID 12 100 0 0 0 f f f f t f s 5 0 142 "1790 23 16 16 25" _null_ _null_ "{cursor,count,nulls,tableforest,targetns}" _null_ _null_ cursor_to_xml _null_ _null_ _null_ ));+DESCR("map rows from cursor to XML");+DATA(insert OID = 2926 ( table_to_xmlschema PGNSP PGUID 12 100 0 0 0 f f f f t f s 4 0 142 "2205 16 16 25" _null_ _null_ "{tbl,nulls,tableforest,targetns}" _null_ _null_ table_to_xmlschema _null_ _null_ _null_ ));+DESCR("map table structure to XML Schema");+DATA(insert OID = 2927 ( query_to_xmlschema PGNSP PGUID 12 100 0 0 0 f f f f t f s 4 0 142 "25 16 16 25" _null_ _null_ "{query,nulls,tableforest,targetns}" _null_ _null_ query_to_xmlschema _null_ _null_ _null_ ));+DESCR("map query result structure to XML Schema");+DATA(insert OID = 2928 ( cursor_to_xmlschema PGNSP PGUID 12 100 0 0 0 f f f f t f s 4 0 142 "1790 16 16 25" _null_ _null_ "{cursor,nulls,tableforest,targetns}" _null_ _null_ cursor_to_xmlschema _null_ _null_ _null_ ));+DESCR("map cursor structure to XML Schema");+DATA(insert OID = 2929 ( table_to_xml_and_xmlschema PGNSP PGUID 12 100 0 0 0 f f f f t f s 4 0 142 "2205 16 16 25" _null_ _null_ "{tbl,nulls,tableforest,targetns}" _null_ _null_ table_to_xml_and_xmlschema _null_ _null_ _null_ ));+DESCR("map table contents and structure to XML and XML Schema");+DATA(insert OID = 2930 ( query_to_xml_and_xmlschema PGNSP PGUID 12 100 0 0 0 f f f f t f s 4 0 142 "25 16 16 25" _null_ _null_ "{query,nulls,tableforest,targetns}" _null_ _null_ query_to_xml_and_xmlschema _null_ _null_ _null_ ));+DESCR("map query result and structure to XML and XML Schema");++DATA(insert OID = 2933 ( schema_to_xml PGNSP PGUID 12 100 0 0 0 f f f f t f s 4 0 142 "19 16 16 25" _null_ _null_ "{schema,nulls,tableforest,targetns}" _null_ _null_ schema_to_xml _null_ _null_ _null_ ));+DESCR("map schema contents to XML");+DATA(insert OID = 2934 ( schema_to_xmlschema PGNSP PGUID 12 100 0 0 0 f f f f t f s 4 0 142 "19 16 16 25" _null_ _null_ "{schema,nulls,tableforest,targetns}" _null_ _null_ schema_to_xmlschema _null_ _null_ _null_ ));+DESCR("map schema structure to XML Schema");+DATA(insert OID = 2935 ( schema_to_xml_and_xmlschema PGNSP PGUID 12 100 0 0 0 f f f f t f s 4 0 142 "19 16 16 25" _null_ _null_ "{schema,nulls,tableforest,targetns}" _null_ _null_ schema_to_xml_and_xmlschema _null_ _null_ _null_ ));+DESCR("map schema contents and structure to XML and XML Schema");++DATA(insert OID = 2936 ( database_to_xml PGNSP PGUID 12 100 0 0 0 f f f f t f s 3 0 142 "16 16 25" _null_ _null_ "{nulls,tableforest,targetns}" _null_ _null_ database_to_xml _null_ _null_ _null_ ));+DESCR("map database contents to XML");+DATA(insert OID = 2937 ( database_to_xmlschema PGNSP PGUID 12 100 0 0 0 f f f f t f s 3 0 142 "16 16 25" _null_ _null_ "{nulls,tableforest,targetns}" _null_ _null_ database_to_xmlschema _null_ _null_ _null_ ));+DESCR("map database structure to XML Schema");+DATA(insert OID = 2938 ( database_to_xml_and_xmlschema PGNSP PGUID 12 100 0 0 0 f f f f t f s 3 0 142 "16 16 25" _null_ _null_ "{nulls,tableforest,targetns}" _null_ _null_ database_to_xml_and_xmlschema _null_ _null_ _null_ ));+DESCR("map database contents and structure to XML and XML Schema");++DATA(insert OID = 2931 ( xpath PGNSP PGUID 12 1 0 0 0 f f f f t f i 3 0 143 "25 142 1009" _null_ _null_ _null_ _null_ _null_ xpath _null_ _null_ _null_ ));+DESCR("evaluate XPath expression, with namespaces support");+DATA(insert OID = 2932 ( xpath PGNSP PGUID 14 1 0 0 0 f f f f t f i 2 0 143 "25 142" _null_ _null_ _null_ _null_ _null_ "select pg_catalog.xpath($1, $2, ''{}''::pg_catalog.text[])" _null_ _null_ _null_ ));+DESCR("evaluate XPath expression");++DATA(insert OID = 2614 ( xmlexists PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "25 142" _null_ _null_ _null_ _null_ _null_ xmlexists _null_ _null_ _null_ ));+DESCR("test XML value against XPath expression");++DATA(insert OID = 3049 ( xpath_exists PGNSP PGUID 12 1 0 0 0 f f f f t f i 3 0 16 "25 142 1009" _null_ _null_ _null_ _null_ _null_ xpath_exists _null_ _null_ _null_ ));+DESCR("test XML value against XPath expression, with namespace support");+DATA(insert OID = 3050 ( xpath_exists PGNSP PGUID 14 1 0 0 0 f f f f t f i 2 0 16 "25 142" _null_ _null_ _null_ _null_ _null_ "select pg_catalog.xpath_exists($1, $2, ''{}''::pg_catalog.text[])" _null_ _null_ _null_ ));+DESCR("test XML value against XPath expression");+DATA(insert OID = 3051 ( xml_is_well_formed PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 16 "25" _null_ _null_ _null_ _null_ _null_ xml_is_well_formed _null_ _null_ _null_ ));+DESCR("determine if a string is well formed XML");+DATA(insert OID = 3052 ( xml_is_well_formed_document PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 16 "25" _null_ _null_ _null_ _null_ _null_ xml_is_well_formed_document _null_ _null_ _null_ ));+DESCR("determine if a string is well formed XML document");+DATA(insert OID = 3053 ( xml_is_well_formed_content PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 16 "25" _null_ _null_ _null_ _null_ _null_ xml_is_well_formed_content _null_ _null_ _null_ ));+DESCR("determine if a string is well formed XML content");++/* json */+DATA(insert OID = 321 ( json_in PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 114 "2275" _null_ _null_ _null_ _null_ _null_ json_in _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 322 ( json_out PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2275 "114" _null_ _null_ _null_ _null_ _null_ json_out _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 323 ( json_recv PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 114 "2281" _null_ _null_ _null_ _null_ _null_ json_recv _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 324 ( json_send PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 17 "114" _null_ _null_ _null_ _null_ _null_ json_send _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 3153 ( array_to_json PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 114 "2277" _null_ _null_ _null_ _null_ _null_ array_to_json _null_ _null_ _null_ ));+DESCR("map array to json");+DATA(insert OID = 3154 ( array_to_json PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 114 "2277 16" _null_ _null_ _null_ _null_ _null_ array_to_json_pretty _null_ _null_ _null_ ));+DESCR("map array to json with optional pretty printing");+DATA(insert OID = 3155 ( row_to_json PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 114 "2249" _null_ _null_ _null_ _null_ _null_ row_to_json _null_ _null_ _null_ ));+DESCR("map row to json");+DATA(insert OID = 3156 ( row_to_json PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 114 "2249 16" _null_ _null_ _null_ _null_ _null_ row_to_json_pretty _null_ _null_ _null_ ));+DESCR("map row to json with optional pretty printing");+DATA(insert OID = 3173 ( json_agg_transfn PGNSP PGUID 12 1 0 0 0 f f f f f f s 2 0 2281 "2281 2283" _null_ _null_ _null_ _null_ _null_ json_agg_transfn _null_ _null_ _null_ ));+DESCR("json aggregate transition function");+DATA(insert OID = 3174 ( json_agg_finalfn PGNSP PGUID 12 1 0 0 0 f f f f f f i 1 0 114 "2281" _null_ _null_ _null_ _null_ _null_ json_agg_finalfn _null_ _null_ _null_ ));+DESCR("json aggregate final function");+DATA(insert OID = 3175 ( json_agg PGNSP PGUID 12 1 0 0 0 t f f f f f s 1 0 114 "2283" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("aggregate input into json");+DATA(insert OID = 3180 ( json_object_agg_transfn PGNSP PGUID 12 1 0 0 0 f f f f f f s 3 0 2281 "2281 2276 2276" _null_ _null_ _null_ _null_ _null_ json_object_agg_transfn _null_ _null_ _null_ ));+DESCR("json object aggregate transition function");+DATA(insert OID = 3196 ( json_object_agg_finalfn PGNSP PGUID 12 1 0 0 0 f f f f f f i 1 0 114 "2281" _null_ _null_ _null_ _null_ _null_ json_object_agg_finalfn _null_ _null_ _null_ ));+DESCR("json object aggregate final function");+DATA(insert OID = 3197 ( json_object_agg PGNSP PGUID 12 1 0 0 0 t f f f f f s 2 0 114 "2276 2276" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("aggregate input into a json object");+DATA(insert OID = 3198 ( json_build_array PGNSP PGUID 12 1 0 2276 0 f f f f f f s 1 0 114 "2276" "{2276}" "{v}" _null_ _null_ _null_ json_build_array _null_ _null_ _null_ ));+DESCR("build a json array from any inputs");+DATA(insert OID = 3199 ( json_build_array PGNSP PGUID 12 1 0 0 0 f f f f f f s 0 0 114 "" _null_ _null_ _null_ _null_ _null_ json_build_array_noargs _null_ _null_ _null_ ));+DESCR("build an empty json array");+DATA(insert OID = 3200 ( json_build_object PGNSP PGUID 12 1 0 2276 0 f f f f f f s 1 0 114 "2276" "{2276}" "{v}" _null_ _null_ _null_ json_build_object _null_ _null_ _null_ ));+DESCR("build a json object from pairwise key/value inputs");+DATA(insert OID = 3201 ( json_build_object PGNSP PGUID 12 1 0 0 0 f f f f f f s 0 0 114 "" _null_ _null_ _null_ _null_ _null_ json_build_object_noargs _null_ _null_ _null_ ));+DESCR("build an empty json object");+DATA(insert OID = 3202 ( json_object PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 114 "1009" _null_ _null_ _null_ _null_ _null_ json_object _null_ _null_ _null_ ));+DESCR("map text array of key value pairs to json object");+DATA(insert OID = 3203 ( json_object PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 114 "1009 1009" _null_ _null_ _null_ _null_ _null_ json_object_two_arg _null_ _null_ _null_ ));+DESCR("map text arrays of keys and values to json object");+DATA(insert OID = 3176 ( to_json PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 114 "2283" _null_ _null_ _null_ _null_ _null_ to_json _null_ _null_ _null_ ));+DESCR("map input to json");+DATA(insert OID = 3261 ( json_strip_nulls PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 114 "114" _null_ _null_ _null_ _null_ _null_ json_strip_nulls _null_ _null_ _null_ ));+DESCR("remove object fields with null values from json");++DATA(insert OID = 3947 ( json_object_field PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 114 "114 25" _null_ _null_ "{from_json, field_name}" _null_ _null_ json_object_field _null_ _null_ _null_ ));+DATA(insert OID = 3948 ( json_object_field_text PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 25 "114 25" _null_ _null_ "{from_json, field_name}" _null_ _null_ json_object_field_text _null_ _null_ _null_ ));+DATA(insert OID = 3949 ( json_array_element PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 114 "114 23" _null_ _null_ "{from_json, element_index}" _null_ _null_ json_array_element _null_ _null_ _null_ ));+DATA(insert OID = 3950 ( json_array_element_text PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 25 "114 23" _null_ _null_ "{from_json, element_index}" _null_ _null_ json_array_element_text _null_ _null_ _null_ ));+DATA(insert OID = 3951 ( json_extract_path PGNSP PGUID 12 1 0 25 0 f f f f t f i 2 0 114 "114 1009" "{114,1009}" "{i,v}" "{from_json,path_elems}" _null_ _null_ json_extract_path _null_ _null_ _null_ ));+DESCR("get value from json with path elements");+DATA(insert OID = 3953 ( json_extract_path_text PGNSP PGUID 12 1 0 25 0 f f f f t f i 2 0 25 "114 1009" "{114,1009}" "{i,v}" "{from_json,path_elems}" _null_ _null_ json_extract_path_text _null_ _null_ _null_ ));+DESCR("get value from json as text with path elements");+DATA(insert OID = 3955 ( json_array_elements PGNSP PGUID 12 1 100 0 0 f f f f t t i 1 0 114 "114" "{114,114}" "{i,o}" "{from_json,value}" _null_ _null_ json_array_elements _null_ _null_ _null_ ));+DESCR("key value pairs of a json object");+DATA(insert OID = 3969 ( json_array_elements_text PGNSP PGUID 12 1 100 0 0 f f f f t t i 1 0 25 "114" "{114,25}" "{i,o}" "{from_json,value}" _null_ _null_ json_array_elements_text _null_ _null_ _null_ ));+DESCR("elements of json array");+DATA(insert OID = 3956 ( json_array_length PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 23 "114" _null_ _null_ _null_ _null_ _null_ json_array_length _null_ _null_ _null_ ));+DESCR("length of json array");+DATA(insert OID = 3957 ( json_object_keys PGNSP PGUID 12 1 100 0 0 f f f f t t i 1 0 25 "114" _null_ _null_ _null_ _null_ _null_ json_object_keys _null_ _null_ _null_ ));+DESCR("get json object keys");+DATA(insert OID = 3958 ( json_each PGNSP PGUID 12 1 100 0 0 f f f f t t i 1 0 2249 "114" "{114,25,114}" "{i,o,o}" "{from_json,key,value}" _null_ _null_ json_each _null_ _null_ _null_ ));+DESCR("key value pairs of a json object");+DATA(insert OID = 3959 ( json_each_text PGNSP PGUID 12 1 100 0 0 f f f f t t i 1 0 2249 "114" "{114,25,25}" "{i,o,o}" "{from_json,key,value}" _null_ _null_ json_each_text _null_ _null_ _null_ ));+DESCR("key value pairs of a json object");+DATA(insert OID = 3960 ( json_populate_record PGNSP PGUID 12 1 0 0 0 f f f f f f s 3 0 2283 "2283 114 16" _null_ _null_ _null_ _null_ _null_ json_populate_record _null_ _null_ _null_ ));+DESCR("get record fields from a json object");+DATA(insert OID = 3961 ( json_populate_recordset PGNSP PGUID 12 1 100 0 0 f f f f f t s 3 0 2283 "2283 114 16" _null_ _null_ _null_ _null_ _null_ json_populate_recordset _null_ _null_ _null_ ));+DESCR("get set of records with fields from a json array of objects");+DATA(insert OID = 3204 ( json_to_record PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 2249 "114" _null_ _null_ _null_ _null_ _null_ json_to_record _null_ _null_ _null_ ));+DESCR("get record fields from a json object");+DATA(insert OID = 3205 ( json_to_recordset PGNSP PGUID 12 1 100 0 0 f f f f f t s 1 0 2249 "114" _null_ _null_ _null_ _null_ _null_ json_to_recordset _null_ _null_ _null_ ));+DESCR("get set of records with fields from a json array of objects");+DATA(insert OID = 3968 ( json_typeof PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 25 "114" _null_ _null_ _null_ _null_ _null_ json_typeof _null_ _null_ _null_ ));+DESCR("get the type of a json value");++/* uuid */+DATA(insert OID = 2952 ( uuid_in PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2950 "2275" _null_ _null_ _null_ _null_ _null_ uuid_in _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2953 ( uuid_out PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2275 "2950" _null_ _null_ _null_ _null_ _null_ uuid_out _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2954 ( uuid_lt PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "2950 2950" _null_ _null_ _null_ _null_ _null_ uuid_lt _null_ _null_ _null_ ));+DATA(insert OID = 2955 ( uuid_le PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "2950 2950" _null_ _null_ _null_ _null_ _null_ uuid_le _null_ _null_ _null_ ));+DATA(insert OID = 2956 ( uuid_eq PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "2950 2950" _null_ _null_ _null_ _null_ _null_ uuid_eq _null_ _null_ _null_ ));+DATA(insert OID = 2957 ( uuid_ge PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "2950 2950" _null_ _null_ _null_ _null_ _null_ uuid_ge _null_ _null_ _null_ ));+DATA(insert OID = 2958 ( uuid_gt PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "2950 2950" _null_ _null_ _null_ _null_ _null_ uuid_gt _null_ _null_ _null_ ));+DATA(insert OID = 2959 ( uuid_ne PGNSP PGUID 12 1 0 0 0 f f f t t f i 2 0 16 "2950 2950" _null_ _null_ _null_ _null_ _null_ uuid_ne _null_ _null_ _null_ ));+DATA(insert OID = 2960 ( uuid_cmp PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "2950 2950" _null_ _null_ _null_ _null_ _null_ uuid_cmp _null_ _null_ _null_ ));+DESCR("less-equal-greater");+DATA(insert OID = 2961 ( uuid_recv PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2950 "2281" _null_ _null_ _null_ _null_ _null_ uuid_recv _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2962 ( uuid_send PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 17 "2950" _null_ _null_ _null_ _null_ _null_ uuid_send _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2963 ( uuid_hash PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 23 "2950" _null_ _null_ _null_ _null_ _null_ uuid_hash _null_ _null_ _null_ ));+DESCR("hash");++/* pg_lsn */+DATA(insert OID = 3229 ( pg_lsn_in PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 3220 "2275" _null_ _null_ _null_ _null_ _null_ pg_lsn_in _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 3230 ( pg_lsn_out PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2275 "3220" _null_ _null_ _null_ _null_ _null_ pg_lsn_out _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 3231 ( pg_lsn_lt PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "3220 3220" _null_ _null_ _null_ _null_ _null_ pg_lsn_lt _null_ _null_ _null_ ));+DATA(insert OID = 3232 ( pg_lsn_le PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "3220 3220" _null_ _null_ _null_ _null_ _null_ pg_lsn_le _null_ _null_ _null_ ));+DATA(insert OID = 3233 ( pg_lsn_eq PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "3220 3220" _null_ _null_ _null_ _null_ _null_ pg_lsn_eq _null_ _null_ _null_ ));+DATA(insert OID = 3234 ( pg_lsn_ge PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "3220 3220" _null_ _null_ _null_ _null_ _null_ pg_lsn_ge _null_ _null_ _null_ ));+DATA(insert OID = 3235 ( pg_lsn_gt PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "3220 3220" _null_ _null_ _null_ _null_ _null_ pg_lsn_gt _null_ _null_ _null_ ));+DATA(insert OID = 3236 ( pg_lsn_ne PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "3220 3220" _null_ _null_ _null_ _null_ _null_ pg_lsn_ne _null_ _null_ _null_ ));+DATA(insert OID = 3237 ( pg_lsn_mi PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1700 "3220 3220" _null_ _null_ _null_ _null_ _null_ pg_lsn_mi _null_ _null_ _null_ ));+DATA(insert OID = 3238 ( pg_lsn_recv PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 3220 "2281" _null_ _null_ _null_ _null_ _null_ pg_lsn_recv _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 3239 ( pg_lsn_send PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 17 "3220" _null_ _null_ _null_ _null_ _null_ pg_lsn_send _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 3251 ( pg_lsn_cmp PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "3220 3220" _null_ _null_ _null_ _null_ _null_ pg_lsn_cmp _null_ _null_ _null_ ));+DESCR("less-equal-greater");+DATA(insert OID = 3252 ( pg_lsn_hash PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 23 "3220" _null_ _null_ _null_ _null_ _null_ pg_lsn_hash _null_ _null_ _null_ ));+DESCR("hash");++/* enum related procs */+DATA(insert OID = 3504 ( anyenum_in PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 3500 "2275" _null_ _null_ _null_ _null_ _null_ anyenum_in _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 3505 ( anyenum_out PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 2275 "3500" _null_ _null_ _null_ _null_ _null_ anyenum_out _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 3506 ( enum_in PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 3500 "2275 26" _null_ _null_ _null_ _null_ _null_ enum_in _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 3507 ( enum_out PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 2275 "3500" _null_ _null_ _null_ _null_ _null_ enum_out _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 3508 ( enum_eq PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "3500 3500" _null_ _null_ _null_ _null_ _null_ enum_eq _null_ _null_ _null_ ));+DATA(insert OID = 3509 ( enum_ne PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "3500 3500" _null_ _null_ _null_ _null_ _null_ enum_ne _null_ _null_ _null_ ));+DATA(insert OID = 3510 ( enum_lt PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "3500 3500" _null_ _null_ _null_ _null_ _null_ enum_lt _null_ _null_ _null_ ));+DATA(insert OID = 3511 ( enum_gt PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "3500 3500" _null_ _null_ _null_ _null_ _null_ enum_gt _null_ _null_ _null_ ));+DATA(insert OID = 3512 ( enum_le PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "3500 3500" _null_ _null_ _null_ _null_ _null_ enum_le _null_ _null_ _null_ ));+DATA(insert OID = 3513 ( enum_ge PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "3500 3500" _null_ _null_ _null_ _null_ _null_ enum_ge _null_ _null_ _null_ ));+DATA(insert OID = 3514 ( enum_cmp PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "3500 3500" _null_ _null_ _null_ _null_ _null_ enum_cmp _null_ _null_ _null_ ));+DESCR("less-equal-greater");+DATA(insert OID = 3515 ( hashenum PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 23 "3500" _null_ _null_ _null_ _null_ _null_ hashenum _null_ _null_ _null_ ));+DESCR("hash");+DATA(insert OID = 3524 ( enum_smaller PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 3500 "3500 3500" _null_ _null_ _null_ _null_ _null_ enum_smaller _null_ _null_ _null_ ));+DESCR("smaller of two");+DATA(insert OID = 3525 ( enum_larger PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 3500 "3500 3500" _null_ _null_ _null_ _null_ _null_ enum_larger _null_ _null_ _null_ ));+DESCR("larger of two");+DATA(insert OID = 3526 ( max PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 3500 "3500" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("maximum value of all enum input values");+DATA(insert OID = 3527 ( min PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 3500 "3500" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("minimum value of all enum input values");+DATA(insert OID = 3528 ( enum_first PGNSP PGUID 12 1 0 0 0 f f f f f f s 1 0 3500 "3500" _null_ _null_ _null_ _null_ _null_ enum_first _null_ _null_ _null_ ));+DESCR("first value of the input enum type");+DATA(insert OID = 3529 ( enum_last PGNSP PGUID 12 1 0 0 0 f f f f f f s 1 0 3500 "3500" _null_ _null_ _null_ _null_ _null_ enum_last _null_ _null_ _null_ ));+DESCR("last value of the input enum type");+DATA(insert OID = 3530 ( enum_range PGNSP PGUID 12 1 0 0 0 f f f f f f s 2 0 2277 "3500 3500" _null_ _null_ _null_ _null_ _null_ enum_range_bounds _null_ _null_ _null_ ));+DESCR("range between the two given enum values, as an ordered array");+DATA(insert OID = 3531 ( enum_range PGNSP PGUID 12 1 0 0 0 f f f f f f s 1 0 2277 "3500" _null_ _null_ _null_ _null_ _null_ enum_range_all _null_ _null_ _null_ ));+DESCR("range of the given enum type, as an ordered array");+DATA(insert OID = 3532 ( enum_recv PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 3500 "2281 26" _null_ _null_ _null_ _null_ _null_ enum_recv _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 3533 ( enum_send PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 17 "3500" _null_ _null_ _null_ _null_ _null_ enum_send _null_ _null_ _null_ ));+DESCR("I/O");++/* text search stuff */+DATA(insert OID = 3610 ( tsvectorin PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 3614 "2275" _null_ _null_ _null_ _null_ _null_ tsvectorin _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 3639 ( tsvectorrecv PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 3614 "2281" _null_ _null_ _null_ _null_ _null_ tsvectorrecv _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 3611 ( tsvectorout PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2275 "3614" _null_ _null_ _null_ _null_ _null_ tsvectorout _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 3638 ( tsvectorsend PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 17 "3614" _null_ _null_ _null_ _null_ _null_ tsvectorsend _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 3612 ( tsqueryin PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 3615 "2275" _null_ _null_ _null_ _null_ _null_ tsqueryin _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 3641 ( tsqueryrecv PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 3615 "2281" _null_ _null_ _null_ _null_ _null_ tsqueryrecv _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 3613 ( tsqueryout PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2275 "3615" _null_ _null_ _null_ _null_ _null_ tsqueryout _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 3640 ( tsquerysend PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 17 "3615" _null_ _null_ _null_ _null_ _null_ tsquerysend _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 3646 ( gtsvectorin PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 3642 "2275" _null_ _null_ _null_ _null_ _null_ gtsvectorin _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 3647 ( gtsvectorout PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2275 "3642" _null_ _null_ _null_ _null_ _null_ gtsvectorout _null_ _null_ _null_ ));+DESCR("I/O");++DATA(insert OID = 3616 ( tsvector_lt PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "3614 3614" _null_ _null_ _null_ _null_ _null_ tsvector_lt _null_ _null_ _null_ ));+DATA(insert OID = 3617 ( tsvector_le PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "3614 3614" _null_ _null_ _null_ _null_ _null_ tsvector_le _null_ _null_ _null_ ));+DATA(insert OID = 3618 ( tsvector_eq PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "3614 3614" _null_ _null_ _null_ _null_ _null_ tsvector_eq _null_ _null_ _null_ ));+DATA(insert OID = 3619 ( tsvector_ne PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "3614 3614" _null_ _null_ _null_ _null_ _null_ tsvector_ne _null_ _null_ _null_ ));+DATA(insert OID = 3620 ( tsvector_ge PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "3614 3614" _null_ _null_ _null_ _null_ _null_ tsvector_ge _null_ _null_ _null_ ));+DATA(insert OID = 3621 ( tsvector_gt PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "3614 3614" _null_ _null_ _null_ _null_ _null_ tsvector_gt _null_ _null_ _null_ ));+DATA(insert OID = 3622 ( tsvector_cmp PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "3614 3614" _null_ _null_ _null_ _null_ _null_ tsvector_cmp _null_ _null_ _null_ ));+DESCR("less-equal-greater");++DATA(insert OID = 3711 ( length PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 23 "3614" _null_ _null_ _null_ _null_ _null_ tsvector_length _null_ _null_ _null_ ));+DESCR("number of lexemes");+DATA(insert OID = 3623 ( strip PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 3614 "3614" _null_ _null_ _null_ _null_ _null_ tsvector_strip _null_ _null_ _null_ ));+DESCR("strip position information");+DATA(insert OID = 3624 ( setweight PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 3614 "3614 18" _null_ _null_ _null_ _null_ _null_ tsvector_setweight _null_ _null_ _null_ ));+DESCR("set weight of lexeme's entries");+DATA(insert OID = 3625 ( tsvector_concat PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 3614 "3614 3614" _null_ _null_ _null_ _null_ _null_ tsvector_concat _null_ _null_ _null_ ));++DATA(insert OID = 3634 ( ts_match_vq PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "3614 3615" _null_ _null_ _null_ _null_ _null_ ts_match_vq _null_ _null_ _null_ ));+DATA(insert OID = 3635 ( ts_match_qv PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "3615 3614" _null_ _null_ _null_ _null_ _null_ ts_match_qv _null_ _null_ _null_ ));+DATA(insert OID = 3760 ( ts_match_tt PGNSP PGUID 12 100 0 0 0 f f f f t f s 2 0 16 "25 25" _null_ _null_ _null_ _null_ _null_ ts_match_tt _null_ _null_ _null_ ));+DATA(insert OID = 3761 ( ts_match_tq PGNSP PGUID 12 100 0 0 0 f f f f t f s 2 0 16 "25 3615" _null_ _null_ _null_ _null_ _null_ ts_match_tq _null_ _null_ _null_ ));++DATA(insert OID = 3648 ( gtsvector_compress PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2281 "2281" _null_ _null_ _null_ _null_ _null_ gtsvector_compress _null_ _null_ _null_ ));+DESCR("GiST tsvector support");+DATA(insert OID = 3649 ( gtsvector_decompress PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2281 "2281" _null_ _null_ _null_ _null_ _null_ gtsvector_decompress _null_ _null_ _null_ ));+DESCR("GiST tsvector support");+DATA(insert OID = 3650 ( gtsvector_picksplit PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 2281 "2281 2281" _null_ _null_ _null_ _null_ _null_ gtsvector_picksplit _null_ _null_ _null_ ));+DESCR("GiST tsvector support");+DATA(insert OID = 3651 ( gtsvector_union PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 2281 "2281 2281" _null_ _null_ _null_ _null_ _null_ gtsvector_union _null_ _null_ _null_ ));+DESCR("GiST tsvector support");+DATA(insert OID = 3652 ( gtsvector_same PGNSP PGUID 12 1 0 0 0 f f f f t f i 3 0 2281 "3642 3642 2281" _null_ _null_ _null_ _null_ _null_ gtsvector_same _null_ _null_ _null_ ));+DESCR("GiST tsvector support");+DATA(insert OID = 3653 ( gtsvector_penalty PGNSP PGUID 12 1 0 0 0 f f f f t f i 3 0 2281 "2281 2281 2281" _null_ _null_ _null_ _null_ _null_ gtsvector_penalty _null_ _null_ _null_ ));+DESCR("GiST tsvector support");+DATA(insert OID = 3654 ( gtsvector_consistent PGNSP PGUID 12 1 0 0 0 f f f f t f i 5 0 16 "2281 3642 23 26 2281" _null_ _null_ _null_ _null_ _null_ gtsvector_consistent _null_ _null_ _null_ ));+DESCR("GiST tsvector support");++DATA(insert OID = 3656 ( gin_extract_tsvector PGNSP PGUID 12 1 0 0 0 f f f f t f i 3 0 2281 "3614 2281 2281" _null_ _null_ _null_ _null_ _null_ gin_extract_tsvector _null_ _null_ _null_ ));+DESCR("GIN tsvector support");+DATA(insert OID = 3657 ( gin_extract_tsquery PGNSP PGUID 12 1 0 0 0 f f f f t f i 7 0 2281 "3615 2281 21 2281 2281 2281 2281" _null_ _null_ _null_ _null_ _null_ gin_extract_tsquery _null_ _null_ _null_ ));+DESCR("GIN tsvector support");+DATA(insert OID = 3658 ( gin_tsquery_consistent PGNSP PGUID 12 1 0 0 0 f f f f t f i 8 0 16 "2281 21 3615 23 2281 2281 2281 2281" _null_ _null_ _null_ _null_ _null_ gin_tsquery_consistent _null_ _null_ _null_ ));+DESCR("GIN tsvector support");+DATA(insert OID = 3921 ( gin_tsquery_triconsistent PGNSP PGUID 12 1 0 0 0 f f f f t f i 7 0 18 "2281 21 3615 23 2281 2281 2281" _null_ _null_ _null_ _null_ _null_ gin_tsquery_triconsistent _null_ _null_ _null_ ));+DESCR("GIN tsvector support");+DATA(insert OID = 3724 ( gin_cmp_tslexeme PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "25 25" _null_ _null_ _null_ _null_ _null_ gin_cmp_tslexeme _null_ _null_ _null_ ));+DESCR("GIN tsvector support");+DATA(insert OID = 2700 ( gin_cmp_prefix PGNSP PGUID 12 1 0 0 0 f f f f t f i 4 0 23 "25 25 21 2281" _null_ _null_ _null_ _null_ _null_ gin_cmp_prefix _null_ _null_ _null_ ));+DESCR("GIN tsvector support");+DATA(insert OID = 3077 ( gin_extract_tsvector PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 2281 "3614 2281" _null_ _null_ _null_ _null_ _null_ gin_extract_tsvector_2args _null_ _null_ _null_ ));+DESCR("GIN tsvector support (obsolete)");+DATA(insert OID = 3087 ( gin_extract_tsquery PGNSP PGUID 12 1 0 0 0 f f f f t f i 5 0 2281 "3615 2281 21 2281 2281" _null_ _null_ _null_ _null_ _null_ gin_extract_tsquery_5args _null_ _null_ _null_ ));+DESCR("GIN tsvector support (obsolete)");+DATA(insert OID = 3088 ( gin_tsquery_consistent PGNSP PGUID 12 1 0 0 0 f f f f t f i 6 0 16 "2281 21 3615 23 2281 2281" _null_ _null_ _null_ _null_ _null_ gin_tsquery_consistent_6args _null_ _null_ _null_ ));+DESCR("GIN tsvector support (obsolete)");++DATA(insert OID = 3662 ( tsquery_lt PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "3615 3615" _null_ _null_ _null_ _null_ _null_ tsquery_lt _null_ _null_ _null_ ));+DATA(insert OID = 3663 ( tsquery_le PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "3615 3615" _null_ _null_ _null_ _null_ _null_ tsquery_le _null_ _null_ _null_ ));+DATA(insert OID = 3664 ( tsquery_eq PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "3615 3615" _null_ _null_ _null_ _null_ _null_ tsquery_eq _null_ _null_ _null_ ));+DATA(insert OID = 3665 ( tsquery_ne PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "3615 3615" _null_ _null_ _null_ _null_ _null_ tsquery_ne _null_ _null_ _null_ ));+DATA(insert OID = 3666 ( tsquery_ge PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "3615 3615" _null_ _null_ _null_ _null_ _null_ tsquery_ge _null_ _null_ _null_ ));+DATA(insert OID = 3667 ( tsquery_gt PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "3615 3615" _null_ _null_ _null_ _null_ _null_ tsquery_gt _null_ _null_ _null_ ));+DATA(insert OID = 3668 ( tsquery_cmp PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "3615 3615" _null_ _null_ _null_ _null_ _null_ tsquery_cmp _null_ _null_ _null_ ));+DESCR("less-equal-greater");++DATA(insert OID = 3669 ( tsquery_and PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 3615 "3615 3615" _null_ _null_ _null_ _null_ _null_ tsquery_and _null_ _null_ _null_ ));+DATA(insert OID = 3670 ( tsquery_or PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 3615 "3615 3615" _null_ _null_ _null_ _null_ _null_ tsquery_or _null_ _null_ _null_ ));+DATA(insert OID = 3671 ( tsquery_not PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 3615 "3615" _null_ _null_ _null_ _null_ _null_ tsquery_not _null_ _null_ _null_ ));++DATA(insert OID = 3691 ( tsq_mcontains PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "3615 3615" _null_ _null_ _null_ _null_ _null_ tsq_mcontains _null_ _null_ _null_ ));+DATA(insert OID = 3692 ( tsq_mcontained PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "3615 3615" _null_ _null_ _null_ _null_ _null_ tsq_mcontained _null_ _null_ _null_ ));++DATA(insert OID = 3672 ( numnode PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 23 "3615" _null_ _null_ _null_ _null_ _null_ tsquery_numnode _null_ _null_ _null_ ));+DESCR("number of nodes");+DATA(insert OID = 3673 ( querytree PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 25 "3615" _null_ _null_ _null_ _null_ _null_ tsquerytree _null_ _null_ _null_ ));+DESCR("show real useful query for GiST index");++DATA(insert OID = 3684 ( ts_rewrite PGNSP PGUID 12 1 0 0 0 f f f f t f i 3 0 3615 "3615 3615 3615" _null_ _null_ _null_ _null_ _null_ tsquery_rewrite _null_ _null_ _null_ ));+DESCR("rewrite tsquery");+DATA(insert OID = 3685 ( ts_rewrite PGNSP PGUID 12 100 0 0 0 f f f f t f v 2 0 3615 "3615 25" _null_ _null_ _null_ _null_ _null_ tsquery_rewrite_query _null_ _null_ _null_ ));+DESCR("rewrite tsquery");++DATA(insert OID = 3695 ( gtsquery_compress PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2281 "2281" _null_ _null_ _null_ _null_ _null_ gtsquery_compress _null_ _null_ _null_ ));+DESCR("GiST tsquery support");+DATA(insert OID = 3696 ( gtsquery_decompress PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2281 "2281" _null_ _null_ _null_ _null_ _null_ gtsquery_decompress _null_ _null_ _null_ ));+DESCR("GiST tsquery support");+DATA(insert OID = 3697 ( gtsquery_picksplit PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 2281 "2281 2281" _null_ _null_ _null_ _null_ _null_ gtsquery_picksplit _null_ _null_ _null_ ));+DESCR("GiST tsquery support");+DATA(insert OID = 3698 ( gtsquery_union PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 2281 "2281 2281" _null_ _null_ _null_ _null_ _null_ gtsquery_union _null_ _null_ _null_ ));+DESCR("GiST tsquery support");+DATA(insert OID = 3699 ( gtsquery_same PGNSP PGUID 12 1 0 0 0 f f f f t f i 3 0 2281 "20 20 2281" _null_ _null_ _null_ _null_ _null_ gtsquery_same _null_ _null_ _null_ ));+DESCR("GiST tsquery support");+DATA(insert OID = 3700 ( gtsquery_penalty PGNSP PGUID 12 1 0 0 0 f f f f t f i 3 0 2281 "2281 2281 2281" _null_ _null_ _null_ _null_ _null_ gtsquery_penalty _null_ _null_ _null_ ));+DESCR("GiST tsquery support");+DATA(insert OID = 3701 ( gtsquery_consistent PGNSP PGUID 12 1 0 0 0 f f f f t f i 5 0 16 "2281 2281 23 26 2281" _null_ _null_ _null_ _null_ _null_ gtsquery_consistent _null_ _null_ _null_ ));+DESCR("GiST tsquery support");++DATA(insert OID = 3686 ( tsmatchsel PGNSP PGUID 12 1 0 0 0 f f f f t f s 4 0 701 "2281 26 2281 23" _null_ _null_ _null_ _null_ _null_ tsmatchsel _null_ _null_ _null_ ));+DESCR("restriction selectivity of tsvector @@ tsquery");+DATA(insert OID = 3687 ( tsmatchjoinsel PGNSP PGUID 12 1 0 0 0 f f f f t f s 5 0 701 "2281 26 2281 21 2281" _null_ _null_ _null_ _null_ _null_ tsmatchjoinsel _null_ _null_ _null_ ));+DESCR("join selectivity of tsvector @@ tsquery");+DATA(insert OID = 3688 ( ts_typanalyze PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 16 "2281" _null_ _null_ _null_ _null_ _null_ ts_typanalyze _null_ _null_ _null_ ));+DESCR("tsvector typanalyze");++DATA(insert OID = 3689 ( ts_stat PGNSP PGUID 12 10 10000 0 0 f f f f t t v 1 0 2249 "25" "{25,25,23,23}" "{i,o,o,o}" "{query,word,ndoc,nentry}" _null_ _null_ ts_stat1 _null_ _null_ _null_ ));+DESCR("statistics of tsvector column");+DATA(insert OID = 3690 ( ts_stat PGNSP PGUID 12 10 10000 0 0 f f f f t t v 2 0 2249 "25 25" "{25,25,25,23,23}" "{i,i,o,o,o}" "{query,weights,word,ndoc,nentry}" _null_ _null_ ts_stat2 _null_ _null_ _null_ ));+DESCR("statistics of tsvector column");++DATA(insert OID = 3703 ( ts_rank PGNSP PGUID 12 1 0 0 0 f f f f t f i 4 0 700 "1021 3614 3615 23" _null_ _null_ _null_ _null_ _null_ ts_rank_wttf _null_ _null_ _null_ ));+DESCR("relevance");+DATA(insert OID = 3704 ( ts_rank PGNSP PGUID 12 1 0 0 0 f f f f t f i 3 0 700 "1021 3614 3615" _null_ _null_ _null_ _null_ _null_ ts_rank_wtt _null_ _null_ _null_ ));+DESCR("relevance");+DATA(insert OID = 3705 ( ts_rank PGNSP PGUID 12 1 0 0 0 f f f f t f i 3 0 700 "3614 3615 23" _null_ _null_ _null_ _null_ _null_ ts_rank_ttf _null_ _null_ _null_ ));+DESCR("relevance");+DATA(insert OID = 3706 ( ts_rank PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 700 "3614 3615" _null_ _null_ _null_ _null_ _null_ ts_rank_tt _null_ _null_ _null_ ));+DESCR("relevance");+DATA(insert OID = 3707 ( ts_rank_cd PGNSP PGUID 12 1 0 0 0 f f f f t f i 4 0 700 "1021 3614 3615 23" _null_ _null_ _null_ _null_ _null_ ts_rankcd_wttf _null_ _null_ _null_ ));+DESCR("relevance");+DATA(insert OID = 3708 ( ts_rank_cd PGNSP PGUID 12 1 0 0 0 f f f f t f i 3 0 700 "1021 3614 3615" _null_ _null_ _null_ _null_ _null_ ts_rankcd_wtt _null_ _null_ _null_ ));+DESCR("relevance");+DATA(insert OID = 3709 ( ts_rank_cd PGNSP PGUID 12 1 0 0 0 f f f f t f i 3 0 700 "3614 3615 23" _null_ _null_ _null_ _null_ _null_ ts_rankcd_ttf _null_ _null_ _null_ ));+DESCR("relevance");+DATA(insert OID = 3710 ( ts_rank_cd PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 700 "3614 3615" _null_ _null_ _null_ _null_ _null_ ts_rankcd_tt _null_ _null_ _null_ ));+DESCR("relevance");++DATA(insert OID = 3713 ( ts_token_type PGNSP PGUID 12 1 16 0 0 f f f f t t i 1 0 2249 "26" "{26,23,25,25}" "{i,o,o,o}" "{parser_oid,tokid,alias,description}" _null_ _null_ ts_token_type_byid _null_ _null_ _null_ ));+DESCR("get parser's token types");+DATA(insert OID = 3714 ( ts_token_type PGNSP PGUID 12 1 16 0 0 f f f f t t s 1 0 2249 "25" "{25,23,25,25}" "{i,o,o,o}" "{parser_name,tokid,alias,description}" _null_ _null_ ts_token_type_byname _null_ _null_ _null_ ));+DESCR("get parser's token types");+DATA(insert OID = 3715 ( ts_parse PGNSP PGUID 12 1 1000 0 0 f f f f t t i 2 0 2249 "26 25" "{26,25,23,25}" "{i,i,o,o}" "{parser_oid,txt,tokid,token}" _null_ _null_ ts_parse_byid _null_ _null_ _null_ ));+DESCR("parse text to tokens");+DATA(insert OID = 3716 ( ts_parse PGNSP PGUID 12 1 1000 0 0 f f f f t t s 2 0 2249 "25 25" "{25,25,23,25}" "{i,i,o,o}" "{parser_name,txt,tokid,token}" _null_ _null_ ts_parse_byname _null_ _null_ _null_ ));+DESCR("parse text to tokens");++DATA(insert OID = 3717 ( prsd_start PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 2281 "2281 23" _null_ _null_ _null_ _null_ _null_ prsd_start _null_ _null_ _null_ ));+DESCR("(internal)");+DATA(insert OID = 3718 ( prsd_nexttoken PGNSP PGUID 12 1 0 0 0 f f f f t f i 3 0 2281 "2281 2281 2281" _null_ _null_ _null_ _null_ _null_ prsd_nexttoken _null_ _null_ _null_ ));+DESCR("(internal)");+DATA(insert OID = 3719 ( prsd_end PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2278 "2281" _null_ _null_ _null_ _null_ _null_ prsd_end _null_ _null_ _null_ ));+DESCR("(internal)");+DATA(insert OID = 3720 ( prsd_headline PGNSP PGUID 12 1 0 0 0 f f f f t f i 3 0 2281 "2281 2281 3615" _null_ _null_ _null_ _null_ _null_ prsd_headline _null_ _null_ _null_ ));+DESCR("(internal)");+DATA(insert OID = 3721 ( prsd_lextype PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2281 "2281" _null_ _null_ _null_ _null_ _null_ prsd_lextype _null_ _null_ _null_ ));+DESCR("(internal)");++DATA(insert OID = 3723 ( ts_lexize PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 1009 "3769 25" _null_ _null_ _null_ _null_ _null_ ts_lexize _null_ _null_ _null_ ));+DESCR("normalize one word by dictionary");++DATA(insert OID = 3725 ( dsimple_init PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2281 "2281" _null_ _null_ _null_ _null_ _null_ dsimple_init _null_ _null_ _null_ ));+DESCR("(internal)");+DATA(insert OID = 3726 ( dsimple_lexize PGNSP PGUID 12 1 0 0 0 f f f f t f i 4 0 2281 "2281 2281 2281 2281" _null_ _null_ _null_ _null_ _null_ dsimple_lexize _null_ _null_ _null_ ));+DESCR("(internal)");++DATA(insert OID = 3728 ( dsynonym_init PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2281 "2281" _null_ _null_ _null_ _null_ _null_ dsynonym_init _null_ _null_ _null_ ));+DESCR("(internal)");+DATA(insert OID = 3729 ( dsynonym_lexize PGNSP PGUID 12 1 0 0 0 f f f f t f i 4 0 2281 "2281 2281 2281 2281" _null_ _null_ _null_ _null_ _null_ dsynonym_lexize _null_ _null_ _null_ ));+DESCR("(internal)");++DATA(insert OID = 3731 ( dispell_init PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2281 "2281" _null_ _null_ _null_ _null_ _null_ dispell_init _null_ _null_ _null_ ));+DESCR("(internal)");+DATA(insert OID = 3732 ( dispell_lexize PGNSP PGUID 12 1 0 0 0 f f f f t f i 4 0 2281 "2281 2281 2281 2281" _null_ _null_ _null_ _null_ _null_ dispell_lexize _null_ _null_ _null_ ));+DESCR("(internal)");++DATA(insert OID = 3740 ( thesaurus_init PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2281 "2281" _null_ _null_ _null_ _null_ _null_ thesaurus_init _null_ _null_ _null_ ));+DESCR("(internal)");+DATA(insert OID = 3741 ( thesaurus_lexize PGNSP PGUID 12 1 0 0 0 f f f f t f i 4 0 2281 "2281 2281 2281 2281" _null_ _null_ _null_ _null_ _null_ thesaurus_lexize _null_ _null_ _null_ ));+DESCR("(internal)");++DATA(insert OID = 3743 ( ts_headline PGNSP PGUID 12 100 0 0 0 f f f f t f i 4 0 25 "3734 25 3615 25" _null_ _null_ _null_ _null_ _null_ ts_headline_byid_opt _null_ _null_ _null_ ));+DESCR("generate headline");+DATA(insert OID = 3744 ( ts_headline PGNSP PGUID 12 100 0 0 0 f f f f t f i 3 0 25 "3734 25 3615" _null_ _null_ _null_ _null_ _null_ ts_headline_byid _null_ _null_ _null_ ));+DESCR("generate headline");+DATA(insert OID = 3754 ( ts_headline PGNSP PGUID 12 100 0 0 0 f f f f t f s 3 0 25 "25 3615 25" _null_ _null_ _null_ _null_ _null_ ts_headline_opt _null_ _null_ _null_ ));+DESCR("generate headline");+DATA(insert OID = 3755 ( ts_headline PGNSP PGUID 12 100 0 0 0 f f f f t f s 2 0 25 "25 3615" _null_ _null_ _null_ _null_ _null_ ts_headline _null_ _null_ _null_ ));+DESCR("generate headline");++DATA(insert OID = 3745 ( to_tsvector PGNSP PGUID 12 100 0 0 0 f f f f t f i 2 0 3614 "3734 25" _null_ _null_ _null_ _null_ _null_ to_tsvector_byid _null_ _null_ _null_ ));+DESCR("transform to tsvector");+DATA(insert OID = 3746 ( to_tsquery PGNSP PGUID 12 100 0 0 0 f f f f t f i 2 0 3615 "3734 25" _null_ _null_ _null_ _null_ _null_ to_tsquery_byid _null_ _null_ _null_ ));+DESCR("make tsquery");+DATA(insert OID = 3747 ( plainto_tsquery PGNSP PGUID 12 100 0 0 0 f f f f t f i 2 0 3615 "3734 25" _null_ _null_ _null_ _null_ _null_ plainto_tsquery_byid _null_ _null_ _null_ ));+DESCR("transform to tsquery");+DATA(insert OID = 3749 ( to_tsvector PGNSP PGUID 12 100 0 0 0 f f f f t f s 1 0 3614 "25" _null_ _null_ _null_ _null_ _null_ to_tsvector _null_ _null_ _null_ ));+DESCR("transform to tsvector");+DATA(insert OID = 3750 ( to_tsquery PGNSP PGUID 12 100 0 0 0 f f f f t f s 1 0 3615 "25" _null_ _null_ _null_ _null_ _null_ to_tsquery _null_ _null_ _null_ ));+DESCR("make tsquery");+DATA(insert OID = 3751 ( plainto_tsquery PGNSP PGUID 12 100 0 0 0 f f f f t f s 1 0 3615 "25" _null_ _null_ _null_ _null_ _null_ plainto_tsquery _null_ _null_ _null_ ));+DESCR("transform to tsquery");++DATA(insert OID = 3752 ( tsvector_update_trigger PGNSP PGUID 12 1 0 0 0 f f f f f f v 0 0 2279 "" _null_ _null_ _null_ _null_ _null_ tsvector_update_trigger_byid _null_ _null_ _null_ ));+DESCR("trigger for automatic update of tsvector column");+DATA(insert OID = 3753 ( tsvector_update_trigger_column PGNSP PGUID 12 1 0 0 0 f f f f f f v 0 0 2279 "" _null_ _null_ _null_ _null_ _null_ tsvector_update_trigger_bycolumn _null_ _null_ _null_ ));+DESCR("trigger for automatic update of tsvector column");++DATA(insert OID = 3759 ( get_current_ts_config PGNSP PGUID 12 1 0 0 0 f f f f t f s 0 0 3734 "" _null_ _null_ _null_ _null_ _null_ get_current_ts_config _null_ _null_ _null_ ));+DESCR("get current tsearch configuration");++DATA(insert OID = 3736 ( regconfigin PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 3734 "2275" _null_ _null_ _null_ _null_ _null_ regconfigin _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 3737 ( regconfigout PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 2275 "3734" _null_ _null_ _null_ _null_ _null_ regconfigout _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 3738 ( regconfigrecv PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 3734 "2281" _null_ _null_ _null_ _null_ _null_ regconfigrecv _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 3739 ( regconfigsend PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 17 "3734" _null_ _null_ _null_ _null_ _null_ regconfigsend _null_ _null_ _null_ ));+DESCR("I/O");++DATA(insert OID = 3771 ( regdictionaryin PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 3769 "2275" _null_ _null_ _null_ _null_ _null_ regdictionaryin _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 3772 ( regdictionaryout PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 2275 "3769" _null_ _null_ _null_ _null_ _null_ regdictionaryout _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 3773 ( regdictionaryrecv PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 3769 "2281" _null_ _null_ _null_ _null_ _null_ regdictionaryrecv _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 3774 ( regdictionarysend PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 17 "3769" _null_ _null_ _null_ _null_ _null_ regdictionarysend _null_ _null_ _null_ ));+DESCR("I/O");++/* jsonb */+DATA(insert OID = 3806 ( jsonb_in PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 3802 "2275" _null_ _null_ _null_ _null_ _null_ jsonb_in _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 3805 ( jsonb_recv PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 3802 "2281" _null_ _null_ _null_ _null_ _null_ jsonb_recv _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 3804 ( jsonb_out PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2275 "3802" _null_ _null_ _null_ _null_ _null_ jsonb_out _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 3803 ( jsonb_send PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 17 "3802" _null_ _null_ _null_ _null_ _null_ jsonb_send _null_ _null_ _null_ ));+DESCR("I/O");++DATA(insert OID = 3263 ( jsonb_object PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 3802 "1009" _null_ _null_ _null_ _null_ _null_ jsonb_object _null_ _null_ _null_ ));+DESCR("map text array of key value pairs to jsonb object");+DATA(insert OID = 3264 ( jsonb_object PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 3802 "1009 1009" _null_ _null_ _null_ _null_ _null_ jsonb_object_two_arg _null_ _null_ _null_ ));+DESCR("map text array of key value pairs to jsonb object");+DATA(insert OID = 3787 ( to_jsonb PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 3802 "2283" _null_ _null_ _null_ _null_ _null_ to_jsonb _null_ _null_ _null_ ));+DESCR("map input to jsonb");+DATA(insert OID = 3265 ( jsonb_agg_transfn PGNSP PGUID 12 1 0 0 0 f f f f f f s 2 0 2281 "2281 2283" _null_ _null_ _null_ _null_ _null_ jsonb_agg_transfn _null_ _null_ _null_ ));+DESCR("jsonb aggregate transition function");+DATA(insert OID = 3266 ( jsonb_agg_finalfn PGNSP PGUID 12 1 0 0 0 f f f f f f s 1 0 3802 "2281" _null_ _null_ _null_ _null_ _null_ jsonb_agg_finalfn _null_ _null_ _null_ ));+DESCR("jsonb aggregate final function");+DATA(insert OID = 3267 ( jsonb_agg PGNSP PGUID 12 1 0 0 0 t f f f f f s 1 0 3802 "2283" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("aggregate input into jsonb");+DATA(insert OID = 3268 ( jsonb_object_agg_transfn PGNSP PGUID 12 1 0 0 0 f f f f f f s 3 0 2281 "2281 2276 2276" _null_ _null_ _null_ _null_ _null_ jsonb_object_agg_transfn _null_ _null_ _null_ ));+DESCR("jsonb object aggregate transition function");+DATA(insert OID = 3269 ( jsonb_object_agg_finalfn PGNSP PGUID 12 1 0 0 0 f f f f f f s 1 0 3802 "2281" _null_ _null_ _null_ _null_ _null_ jsonb_object_agg_finalfn _null_ _null_ _null_ ));+DESCR("jsonb object aggregate final function");+DATA(insert OID = 3270 ( jsonb_object_agg PGNSP PGUID 12 1 0 0 0 t f f f f f i 2 0 3802 "2276 2276" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("aggregate inputs into jsonb object");+DATA(insert OID = 3271 ( jsonb_build_array PGNSP PGUID 12 1 0 2276 0 f f f f f f s 1 0 3802 "2276" "{2276}" "{v}" _null_ _null_ _null_ jsonb_build_array _null_ _null_ _null_ ));+DESCR("build a jsonb array from any inputs");+DATA(insert OID = 3272 ( jsonb_build_array PGNSP PGUID 12 1 0 0 0 f f f f f f s 0 0 3802 "" _null_ _null_ _null_ _null_ _null_ jsonb_build_array_noargs _null_ _null_ _null_ ));+DESCR("build an empty jsonb array");+DATA(insert OID = 3273 ( jsonb_build_object PGNSP PGUID 12 1 0 2276 0 f f f f f f s 1 0 3802 "2276" "{2276}" "{v}" _null_ _null_ _null_ jsonb_build_object _null_ _null_ _null_ ));+DESCR("build a jsonb object from pairwise key/value inputs");+DATA(insert OID = 3274 ( jsonb_build_object PGNSP PGUID 12 1 0 0 0 f f f f f f s 0 0 3802 "" _null_ _null_ _null_ _null_ _null_ jsonb_build_object_noargs _null_ _null_ _null_ ));+DESCR("build an empty jsonb object");+DATA(insert OID = 3262 ( jsonb_strip_nulls PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 3802 "3802" _null_ _null_ _null_ _null_ _null_ jsonb_strip_nulls _null_ _null_ _null_ ));+DESCR("remove object fields with null values from jsonb");++DATA(insert OID = 3478 ( jsonb_object_field PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 3802 "3802 25" _null_ _null_ "{from_json, field_name}" _null_ _null_ jsonb_object_field _null_ _null_ _null_ ));+DATA(insert OID = 3214 ( jsonb_object_field_text PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 25 "3802 25" _null_ _null_ "{from_json, field_name}" _null_ _null_ jsonb_object_field_text _null_ _null_ _null_ ));+DATA(insert OID = 3215 ( jsonb_array_element PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 3802 "3802 23" _null_ _null_ "{from_json, element_index}" _null_ _null_ jsonb_array_element _null_ _null_ _null_ ));+DATA(insert OID = 3216 ( jsonb_array_element_text PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 25 "3802 23" _null_ _null_ "{from_json, element_index}" _null_ _null_ jsonb_array_element_text _null_ _null_ _null_ ));+DATA(insert OID = 3217 ( jsonb_extract_path PGNSP PGUID 12 1 0 25 0 f f f f t f i 2 0 3802 "3802 1009" "{3802,1009}" "{i,v}" "{from_json,path_elems}" _null_ _null_ jsonb_extract_path _null_ _null_ _null_ ));+DESCR("get value from jsonb with path elements");+DATA(insert OID = 3940 ( jsonb_extract_path_text PGNSP PGUID 12 1 0 25 0 f f f f t f i 2 0 25 "3802 1009" "{3802,1009}" "{i,v}" "{from_json,path_elems}" _null_ _null_ jsonb_extract_path_text _null_ _null_ _null_ ));+DESCR("get value from jsonb as text with path elements");+DATA(insert OID = 3219 ( jsonb_array_elements PGNSP PGUID 12 1 100 0 0 f f f f t t i 1 0 3802 "3802" "{3802,3802}" "{i,o}" "{from_json,value}" _null_ _null_ jsonb_array_elements _null_ _null_ _null_ ));+DESCR("elements of a jsonb array");+DATA(insert OID = 3465 ( jsonb_array_elements_text PGNSP PGUID 12 1 100 0 0 f f f f t t i 1 0 25 "3802" "{3802,25}" "{i,o}" "{from_json,value}" _null_ _null_ jsonb_array_elements_text _null_ _null_ _null_ ));+DESCR("elements of jsonb array");+DATA(insert OID = 3207 ( jsonb_array_length PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 23 "3802" _null_ _null_ _null_ _null_ _null_ jsonb_array_length _null_ _null_ _null_ ));+DESCR("length of jsonb array");+DATA(insert OID = 3931 ( jsonb_object_keys PGNSP PGUID 12 1 100 0 0 f f f f t t i 1 0 25 "3802" _null_ _null_ _null_ _null_ _null_ jsonb_object_keys _null_ _null_ _null_ ));+DESCR("get jsonb object keys");+DATA(insert OID = 3208 ( jsonb_each PGNSP PGUID 12 1 100 0 0 f f f f t t i 1 0 2249 "3802" "{3802,25,3802}" "{i,o,o}" "{from_json,key,value}" _null_ _null_ jsonb_each _null_ _null_ _null_ ));+DESCR("key value pairs of a jsonb object");+DATA(insert OID = 3932 ( jsonb_each_text PGNSP PGUID 12 1 100 0 0 f f f f t t i 1 0 2249 "3802" "{3802,25,25}" "{i,o,o}" "{from_json,key,value}" _null_ _null_ jsonb_each_text _null_ _null_ _null_ ));+DESCR("key value pairs of a jsonb object");+DATA(insert OID = 3209 ( jsonb_populate_record PGNSP PGUID 12 1 0 0 0 f f f f f f s 2 0 2283 "2283 3802" _null_ _null_ _null_ _null_ _null_ jsonb_populate_record _null_ _null_ _null_ ));+DESCR("get record fields from a jsonb object");+DATA(insert OID = 3475 ( jsonb_populate_recordset PGNSP PGUID 12 1 100 0 0 f f f f f t s 2 0 2283 "2283 3802" _null_ _null_ _null_ _null_ _null_ jsonb_populate_recordset _null_ _null_ _null_ ));+DESCR("get set of records with fields from a jsonb array of objects");+DATA(insert OID = 3490 ( jsonb_to_record PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 2249 "3802" _null_ _null_ _null_ _null_ _null_ jsonb_to_record _null_ _null_ _null_ ));+DESCR("get record fields from a jsonb object");+DATA(insert OID = 3491 ( jsonb_to_recordset PGNSP PGUID 12 1 100 0 0 f f f f f t s 1 0 2249 "3802" _null_ _null_ _null_ _null_ _null_ jsonb_to_recordset _null_ _null_ _null_ ));+DESCR("get set of records with fields from a jsonb array of objects");+DATA(insert OID = 3210 ( jsonb_typeof PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 25 "3802" _null_ _null_ _null_ _null_ _null_ jsonb_typeof _null_ _null_ _null_ ));+DESCR("get the type of a jsonb value");+DATA(insert OID = 4038 ( jsonb_ne PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "3802 3802" _null_ _null_ _null_ _null_ _null_ jsonb_ne _null_ _null_ _null_ ));+DATA(insert OID = 4039 ( jsonb_lt PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "3802 3802" _null_ _null_ _null_ _null_ _null_ jsonb_lt _null_ _null_ _null_ ));+DATA(insert OID = 4040 ( jsonb_gt PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "3802 3802" _null_ _null_ _null_ _null_ _null_ jsonb_gt _null_ _null_ _null_ ));+DATA(insert OID = 4041 ( jsonb_le PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "3802 3802" _null_ _null_ _null_ _null_ _null_ jsonb_le _null_ _null_ _null_ ));+DATA(insert OID = 4042 ( jsonb_ge PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "3802 3802" _null_ _null_ _null_ _null_ _null_ jsonb_ge _null_ _null_ _null_ ));+DATA(insert OID = 4043 ( jsonb_eq PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "3802 3802" _null_ _null_ _null_ _null_ _null_ jsonb_eq _null_ _null_ _null_ ));+DATA(insert OID = 4044 ( jsonb_cmp PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "3802 3802" _null_ _null_ _null_ _null_ _null_ jsonb_cmp _null_ _null_ _null_ ));+DESCR("less-equal-greater");+DATA(insert OID = 4045 ( jsonb_hash PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 23 "3802" _null_ _null_ _null_ _null_ _null_ jsonb_hash _null_ _null_ _null_ ));+DESCR("hash");+DATA(insert OID = 4046 ( jsonb_contains PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "3802 3802" _null_ _null_ _null_ _null_ _null_ jsonb_contains _null_ _null_ _null_ ));+DESCR("implementation of @> operator");+DATA(insert OID = 4047 ( jsonb_exists PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "3802 25" _null_ _null_ _null_ _null_ _null_ jsonb_exists _null_ _null_ _null_ ));+DESCR("implementation of ? operator");+DATA(insert OID = 4048 ( jsonb_exists_any PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "3802 1009" _null_ _null_ _null_ _null_ _null_ jsonb_exists_any _null_ _null_ _null_ ));+DESCR("implementation of ?| operator");+DATA(insert OID = 4049 ( jsonb_exists_all PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "3802 1009" _null_ _null_ _null_ _null_ _null_ jsonb_exists_all _null_ _null_ _null_ ));+DESCR("implementation of ?& operator");+DATA(insert OID = 4050 ( jsonb_contained PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "3802 3802" _null_ _null_ _null_ _null_ _null_ jsonb_contained _null_ _null_ _null_ ));+DESCR("implementation of <@ operator");+DATA(insert OID = 3480 ( gin_compare_jsonb PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "25 25" _null_ _null_ _null_ _null_ _null_ gin_compare_jsonb _null_ _null_ _null_ ));+DESCR("GIN support");+DATA(insert OID = 3482 ( gin_extract_jsonb PGNSP PGUID 12 1 0 0 0 f f f f t f i 3 0 2281 "2281 2281 2281" _null_ _null_ _null_ _null_ _null_ gin_extract_jsonb _null_ _null_ _null_ ));+DESCR("GIN support");+DATA(insert OID = 3483 ( gin_extract_jsonb_query PGNSP PGUID 12 1 0 0 0 f f f f t f i 7 0 2281 "2277 2281 21 2281 2281 2281 2281" _null_ _null_ _null_ _null_ _null_ gin_extract_jsonb_query _null_ _null_ _null_ ));+DESCR("GIN support");+DATA(insert OID = 3484 ( gin_consistent_jsonb PGNSP PGUID 12 1 0 0 0 f f f f t f i 8 0 16 "2281 21 2277 23 2281 2281 2281 2281" _null_ _null_ _null_ _null_ _null_ gin_consistent_jsonb _null_ _null_ _null_ ));+DESCR("GIN support");+DATA(insert OID = 3488 ( gin_triconsistent_jsonb PGNSP PGUID 12 1 0 0 0 f f f f t f i 7 0 18 "2281 21 2277 23 2281 2281 2281" _null_ _null_ _null_ _null_ _null_ gin_triconsistent_jsonb _null_ _null_ _null_ ));+DESCR("GIN support");+DATA(insert OID = 3485 ( gin_extract_jsonb_path PGNSP PGUID 12 1 0 0 0 f f f f t f i 3 0 2281 "2281 2281 2281" _null_ _null_ _null_ _null_ _null_ gin_extract_jsonb_path _null_ _null_ _null_ ));+DESCR("GIN support");+DATA(insert OID = 3486 ( gin_extract_jsonb_query_path PGNSP PGUID 12 1 0 0 0 f f f f t f i 7 0 2281 "2277 2281 21 2281 2281 2281 2281" _null_ _null_ _null_ _null_ _null_ gin_extract_jsonb_query_path _null_ _null_ _null_ ));+DESCR("GIN support");+DATA(insert OID = 3487 ( gin_consistent_jsonb_path PGNSP PGUID 12 1 0 0 0 f f f f t f i 8 0 16 "2281 21 2277 23 2281 2281 2281 2281" _null_ _null_ _null_ _null_ _null_ gin_consistent_jsonb_path _null_ _null_ _null_ ));+DESCR("GIN support");+DATA(insert OID = 3489 ( gin_triconsistent_jsonb_path PGNSP PGUID 12 1 0 0 0 f f f f t f i 7 0 18 "2281 21 2277 23 2281 2281 2281" _null_ _null_ _null_ _null_ _null_ gin_triconsistent_jsonb_path _null_ _null_ _null_ ));+DESCR("GIN support");+DATA(insert OID = 3301 ( jsonb_concat PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 3802 "3802 3802" _null_ _null_ _null_ _null_ _null_ jsonb_concat _null_ _null_ _null_ ));+DATA(insert OID = 3302 ( jsonb_delete PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 3802 "3802 25" _null_ _null_ _null_ _null_ _null_ jsonb_delete _null_ _null_ _null_ ));+DATA(insert OID = 3303 ( jsonb_delete PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 3802 "3802 23" _null_ _null_ _null_ _null_ _null_ jsonb_delete_idx _null_ _null_ _null_ ));+DATA(insert OID = 3304 ( jsonb_delete_path PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 3802 "3802 1009" _null_ _null_ _null_ _null_ _null_ jsonb_delete_path _null_ _null_ _null_ ));+DATA(insert OID = 3305 ( jsonb_set PGNSP PGUID 12 1 0 0 0 f f f f t f i 4 0 3802 "3802 1009 3802 16" _null_ _null_ _null_ _null_ _null_ jsonb_set _null_ _null_ _null_ ));+DESCR("Set part of a jsonb");+DATA(insert OID = 3306 ( jsonb_pretty PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 25 "3802" _null_ _null_ _null_ _null_ _null_ jsonb_pretty _null_ _null_ _null_ ));+DESCR("Indented text from jsonb");+/* txid */+DATA(insert OID = 2939 ( txid_snapshot_in PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2970 "2275" _null_ _null_ _null_ _null_ _null_ txid_snapshot_in _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2940 ( txid_snapshot_out PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2275 "2970" _null_ _null_ _null_ _null_ _null_ txid_snapshot_out _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2941 ( txid_snapshot_recv PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2970 "2281" _null_ _null_ _null_ _null_ _null_ txid_snapshot_recv _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2942 ( txid_snapshot_send PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 17 "2970" _null_ _null_ _null_ _null_ _null_ txid_snapshot_send _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 2943 ( txid_current PGNSP PGUID 12 1 0 0 0 f f f f t f s 0 0 20 "" _null_ _null_ _null_ _null_ _null_ txid_current _null_ _null_ _null_ ));+DESCR("get current transaction ID");+DATA(insert OID = 2944 ( txid_current_snapshot PGNSP PGUID 12 1 0 0 0 f f f f t f s 0 0 2970 "" _null_ _null_ _null_ _null_ _null_ txid_current_snapshot _null_ _null_ _null_ ));+DESCR("get current snapshot");+DATA(insert OID = 2945 ( txid_snapshot_xmin PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 20 "2970" _null_ _null_ _null_ _null_ _null_ txid_snapshot_xmin _null_ _null_ _null_ ));+DESCR("get xmin of snapshot");+DATA(insert OID = 2946 ( txid_snapshot_xmax PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 20 "2970" _null_ _null_ _null_ _null_ _null_ txid_snapshot_xmax _null_ _null_ _null_ ));+DESCR("get xmax of snapshot");+DATA(insert OID = 2947 ( txid_snapshot_xip PGNSP PGUID 12 1 50 0 0 f f f f t t i 1 0 20 "2970" _null_ _null_ _null_ _null_ _null_ txid_snapshot_xip _null_ _null_ _null_ ));+DESCR("get set of in-progress txids in snapshot");+DATA(insert OID = 2948 ( txid_visible_in_snapshot PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "20 2970" _null_ _null_ _null_ _null_ _null_ txid_visible_in_snapshot _null_ _null_ _null_ ));+DESCR("is txid visible in snapshot?");++/* record comparison using normal comparison rules */+DATA(insert OID = 2981 ( record_eq PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "2249 2249" _null_ _null_ _null_ _null_ _null_ record_eq _null_ _null_ _null_ ));+DATA(insert OID = 2982 ( record_ne PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "2249 2249" _null_ _null_ _null_ _null_ _null_ record_ne _null_ _null_ _null_ ));+DATA(insert OID = 2983 ( record_lt PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "2249 2249" _null_ _null_ _null_ _null_ _null_ record_lt _null_ _null_ _null_ ));+DATA(insert OID = 2984 ( record_gt PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "2249 2249" _null_ _null_ _null_ _null_ _null_ record_gt _null_ _null_ _null_ ));+DATA(insert OID = 2985 ( record_le PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "2249 2249" _null_ _null_ _null_ _null_ _null_ record_le _null_ _null_ _null_ ));+DATA(insert OID = 2986 ( record_ge PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "2249 2249" _null_ _null_ _null_ _null_ _null_ record_ge _null_ _null_ _null_ ));+DATA(insert OID = 2987 ( btrecordcmp PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "2249 2249" _null_ _null_ _null_ _null_ _null_ btrecordcmp _null_ _null_ _null_ ));+DESCR("less-equal-greater");++/* record comparison using raw byte images */+DATA(insert OID = 3181 ( record_image_eq PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "2249 2249" _null_ _null_ _null_ _null_ _null_ record_image_eq _null_ _null_ _null_ ));+DATA(insert OID = 3182 ( record_image_ne PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "2249 2249" _null_ _null_ _null_ _null_ _null_ record_image_ne _null_ _null_ _null_ ));+DATA(insert OID = 3183 ( record_image_lt PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "2249 2249" _null_ _null_ _null_ _null_ _null_ record_image_lt _null_ _null_ _null_ ));+DATA(insert OID = 3184 ( record_image_gt PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "2249 2249" _null_ _null_ _null_ _null_ _null_ record_image_gt _null_ _null_ _null_ ));+DATA(insert OID = 3185 ( record_image_le PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "2249 2249" _null_ _null_ _null_ _null_ _null_ record_image_le _null_ _null_ _null_ ));+DATA(insert OID = 3186 ( record_image_ge PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "2249 2249" _null_ _null_ _null_ _null_ _null_ record_image_ge _null_ _null_ _null_ ));+DATA(insert OID = 3187 ( btrecordimagecmp PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "2249 2249" _null_ _null_ _null_ _null_ _null_ btrecordimagecmp _null_ _null_ _null_ ));+DESCR("less-equal-greater based on byte images");++/* Extensions */+DATA(insert OID = 3082 ( pg_available_extensions PGNSP PGUID 12 10 100 0 0 f f f f t t s 0 0 2249 "" "{19,25,25}" "{o,o,o}" "{name,default_version,comment}" _null_ _null_ pg_available_extensions _null_ _null_ _null_ ));+DESCR("list available extensions");+DATA(insert OID = 3083 ( pg_available_extension_versions PGNSP PGUID 12 10 100 0 0 f f f f t t s 0 0 2249 "" "{19,25,16,16,19,1003,25}" "{o,o,o,o,o,o,o}" "{name,version,superuser,relocatable,schema,requires,comment}" _null_ _null_ pg_available_extension_versions _null_ _null_ _null_ ));+DESCR("list available extension versions");+DATA(insert OID = 3084 ( pg_extension_update_paths PGNSP PGUID 12 10 100 0 0 f f f f t t s 1 0 2249 "19" "{19,25,25,25}" "{i,o,o,o}" "{name,source,target,path}" _null_ _null_ pg_extension_update_paths _null_ _null_ _null_ ));+DESCR("list an extension's version update paths");+DATA(insert OID = 3086 ( pg_extension_config_dump PGNSP PGUID 12 1 0 0 0 f f f f t f v 2 0 2278 "2205 25" _null_ _null_ _null_ _null_ _null_ pg_extension_config_dump _null_ _null_ _null_ ));+DESCR("flag an extension's table contents to be emitted by pg_dump");++/* SQL-spec window functions */+DATA(insert OID = 3100 ( row_number PGNSP PGUID 12 1 0 0 0 f t f f f f i 0 0 20 "" _null_ _null_ _null_ _null_ _null_ window_row_number _null_ _null_ _null_ ));+DESCR("row number within partition");+DATA(insert OID = 3101 ( rank PGNSP PGUID 12 1 0 0 0 f t f f f f i 0 0 20 "" _null_ _null_ _null_ _null_ _null_ window_rank _null_ _null_ _null_ ));+DESCR("integer rank with gaps");+DATA(insert OID = 3102 ( dense_rank PGNSP PGUID 12 1 0 0 0 f t f f f f i 0 0 20 "" _null_ _null_ _null_ _null_ _null_ window_dense_rank _null_ _null_ _null_ ));+DESCR("integer rank without gaps");+DATA(insert OID = 3103 ( percent_rank PGNSP PGUID 12 1 0 0 0 f t f f f f i 0 0 701 "" _null_ _null_ _null_ _null_ _null_ window_percent_rank _null_ _null_ _null_ ));+DESCR("fractional rank within partition");+DATA(insert OID = 3104 ( cume_dist PGNSP PGUID 12 1 0 0 0 f t f f f f i 0 0 701 "" _null_ _null_ _null_ _null_ _null_ window_cume_dist _null_ _null_ _null_ ));+DESCR("fractional row number within partition");+DATA(insert OID = 3105 ( ntile PGNSP PGUID 12 1 0 0 0 f t f f t f i 1 0 23 "23" _null_ _null_ _null_ _null_ _null_ window_ntile _null_ _null_ _null_ ));+DESCR("split rows into N groups");+DATA(insert OID = 3106 ( lag PGNSP PGUID 12 1 0 0 0 f t f f t f i 1 0 2283 "2283" _null_ _null_ _null_ _null_ _null_ window_lag _null_ _null_ _null_ ));+DESCR("fetch the preceding row value");+DATA(insert OID = 3107 ( lag PGNSP PGUID 12 1 0 0 0 f t f f t f i 2 0 2283 "2283 23" _null_ _null_ _null_ _null_ _null_ window_lag_with_offset _null_ _null_ _null_ ));+DESCR("fetch the Nth preceding row value");+DATA(insert OID = 3108 ( lag PGNSP PGUID 12 1 0 0 0 f t f f t f i 3 0 2283 "2283 23 2283" _null_ _null_ _null_ _null_ _null_ window_lag_with_offset_and_default _null_ _null_ _null_ ));+DESCR("fetch the Nth preceding row value with default");+DATA(insert OID = 3109 ( lead PGNSP PGUID 12 1 0 0 0 f t f f t f i 1 0 2283 "2283" _null_ _null_ _null_ _null_ _null_ window_lead _null_ _null_ _null_ ));+DESCR("fetch the following row value");+DATA(insert OID = 3110 ( lead PGNSP PGUID 12 1 0 0 0 f t f f t f i 2 0 2283 "2283 23" _null_ _null_ _null_ _null_ _null_ window_lead_with_offset _null_ _null_ _null_ ));+DESCR("fetch the Nth following row value");+DATA(insert OID = 3111 ( lead PGNSP PGUID 12 1 0 0 0 f t f f t f i 3 0 2283 "2283 23 2283" _null_ _null_ _null_ _null_ _null_ window_lead_with_offset_and_default _null_ _null_ _null_ ));+DESCR("fetch the Nth following row value with default");+DATA(insert OID = 3112 ( first_value PGNSP PGUID 12 1 0 0 0 f t f f t f i 1 0 2283 "2283" _null_ _null_ _null_ _null_ _null_ window_first_value _null_ _null_ _null_ ));+DESCR("fetch the first row value");+DATA(insert OID = 3113 ( last_value PGNSP PGUID 12 1 0 0 0 f t f f t f i 1 0 2283 "2283" _null_ _null_ _null_ _null_ _null_ window_last_value _null_ _null_ _null_ ));+DESCR("fetch the last row value");+DATA(insert OID = 3114 ( nth_value PGNSP PGUID 12 1 0 0 0 f t f f t f i 2 0 2283 "2283 23" _null_ _null_ _null_ _null_ _null_ window_nth_value _null_ _null_ _null_ ));+DESCR("fetch the Nth row value");++/* functions for range types */+DATA(insert OID = 3832 ( anyrange_in PGNSP PGUID 12 1 0 0 0 f f f f t f s 3 0 3831 "2275 26 23" _null_ _null_ _null_ _null_ _null_ anyrange_in _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 3833 ( anyrange_out PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 2275 "3831" _null_ _null_ _null_ _null_ _null_ anyrange_out _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 3834 ( range_in PGNSP PGUID 12 1 0 0 0 f f f f t f s 3 0 3831 "2275 26 23" _null_ _null_ _null_ _null_ _null_ range_in _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 3835 ( range_out PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 2275 "3831" _null_ _null_ _null_ _null_ _null_ range_out _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 3836 ( range_recv PGNSP PGUID 12 1 0 0 0 f f f f t f s 3 0 3831 "2281 26 23" _null_ _null_ _null_ _null_ _null_ range_recv _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 3837 ( range_send PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 17 "3831" _null_ _null_ _null_ _null_ _null_ range_send _null_ _null_ _null_ ));+DESCR("I/O");+DATA(insert OID = 3848 ( lower PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2283 "3831" _null_ _null_ _null_ _null_ _null_ range_lower _null_ _null_ _null_ ));+DESCR("lower bound of range");+DATA(insert OID = 3849 ( upper PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2283 "3831" _null_ _null_ _null_ _null_ _null_ range_upper _null_ _null_ _null_ ));+DESCR("upper bound of range");+DATA(insert OID = 3850 ( isempty PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 16 "3831" _null_ _null_ _null_ _null_ _null_ range_empty _null_ _null_ _null_ ));+DESCR("is the range empty?");+DATA(insert OID = 3851 ( lower_inc PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 16 "3831" _null_ _null_ _null_ _null_ _null_ range_lower_inc _null_ _null_ _null_ ));+DESCR("is the range's lower bound inclusive?");+DATA(insert OID = 3852 ( upper_inc PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 16 "3831" _null_ _null_ _null_ _null_ _null_ range_upper_inc _null_ _null_ _null_ ));+DESCR("is the range's upper bound inclusive?");+DATA(insert OID = 3853 ( lower_inf PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 16 "3831" _null_ _null_ _null_ _null_ _null_ range_lower_inf _null_ _null_ _null_ ));+DESCR("is the range's lower bound infinite?");+DATA(insert OID = 3854 ( upper_inf PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 16 "3831" _null_ _null_ _null_ _null_ _null_ range_upper_inf _null_ _null_ _null_ ));+DESCR("is the range's upper bound infinite?");+DATA(insert OID = 3855 ( range_eq PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "3831 3831" _null_ _null_ _null_ _null_ _null_ range_eq _null_ _null_ _null_ ));+DESCR("implementation of = operator");+DATA(insert OID = 3856 ( range_ne PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "3831 3831" _null_ _null_ _null_ _null_ _null_ range_ne _null_ _null_ _null_ ));+DESCR("implementation of <> operator");+DATA(insert OID = 3857 ( range_overlaps PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "3831 3831" _null_ _null_ _null_ _null_ _null_ range_overlaps _null_ _null_ _null_ ));+DESCR("implementation of && operator");+DATA(insert OID = 3858 ( range_contains_elem PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "3831 2283" _null_ _null_ _null_ _null_ _null_ range_contains_elem _null_ _null_ _null_ ));+DESCR("implementation of @> operator");+DATA(insert OID = 3859 ( range_contains PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "3831 3831" _null_ _null_ _null_ _null_ _null_ range_contains _null_ _null_ _null_ ));+DESCR("implementation of @> operator");+DATA(insert OID = 3860 ( elem_contained_by_range PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "2283 3831" _null_ _null_ _null_ _null_ _null_ elem_contained_by_range _null_ _null_ _null_ ));+DESCR("implementation of <@ operator");+DATA(insert OID = 3861 ( range_contained_by PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "3831 3831" _null_ _null_ _null_ _null_ _null_ range_contained_by _null_ _null_ _null_ ));+DESCR("implementation of <@ operator");+DATA(insert OID = 3862 ( range_adjacent PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "3831 3831" _null_ _null_ _null_ _null_ _null_ range_adjacent _null_ _null_ _null_ ));+DESCR("implementation of -|- operator");+DATA(insert OID = 3863 ( range_before PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "3831 3831" _null_ _null_ _null_ _null_ _null_ range_before _null_ _null_ _null_ ));+DESCR("implementation of << operator");+DATA(insert OID = 3864 ( range_after PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "3831 3831" _null_ _null_ _null_ _null_ _null_ range_after _null_ _null_ _null_ ));+DESCR("implementation of >> operator");+DATA(insert OID = 3865 ( range_overleft PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "3831 3831" _null_ _null_ _null_ _null_ _null_ range_overleft _null_ _null_ _null_ ));+DESCR("implementation of &< operator");+DATA(insert OID = 3866 ( range_overright PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "3831 3831" _null_ _null_ _null_ _null_ _null_ range_overright _null_ _null_ _null_ ));+DESCR("implementation of &> operator");+DATA(insert OID = 3867 ( range_union PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 3831 "3831 3831" _null_ _null_ _null_ _null_ _null_ range_union _null_ _null_ _null_ ));+DESCR("implementation of + operator");+DATA(insert OID = 4057 ( range_merge PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 3831 "3831 3831" _null_ _null_ _null_ _null_ _null_ range_merge _null_ _null_ _null_ ));+DESCR("the smallest range which includes both of the given ranges");+DATA(insert OID = 3868 ( range_intersect PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 3831 "3831 3831" _null_ _null_ _null_ _null_ _null_ range_intersect _null_ _null_ _null_ ));+DESCR("implementation of * operator");+DATA(insert OID = 3869 ( range_minus PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 3831 "3831 3831" _null_ _null_ _null_ _null_ _null_ range_minus _null_ _null_ _null_ ));+DESCR("implementation of - operator");+DATA(insert OID = 3870 ( range_cmp PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 23 "3831 3831" _null_ _null_ _null_ _null_ _null_ range_cmp _null_ _null_ _null_ ));+DESCR("less-equal-greater");+DATA(insert OID = 3871 ( range_lt PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "3831 3831" _null_ _null_ _null_ _null_ _null_ range_lt _null_ _null_ _null_ ));+DATA(insert OID = 3872 ( range_le PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "3831 3831" _null_ _null_ _null_ _null_ _null_ range_le _null_ _null_ _null_ ));+DATA(insert OID = 3873 ( range_ge PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "3831 3831" _null_ _null_ _null_ _null_ _null_ range_ge _null_ _null_ _null_ ));+DATA(insert OID = 3874 ( range_gt PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "3831 3831" _null_ _null_ _null_ _null_ _null_ range_gt _null_ _null_ _null_ ));+DATA(insert OID = 3875 ( range_gist_consistent PGNSP PGUID 12 1 0 0 0 f f f f t f i 5 0 16 "2281 3831 23 26 2281" _null_ _null_ _null_ _null_ _null_ range_gist_consistent _null_ _null_ _null_ ));+DESCR("GiST support");+DATA(insert OID = 3876 ( range_gist_union PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 2281 "2281 2281" _null_ _null_ _null_ _null_ _null_ range_gist_union _null_ _null_ _null_ ));+DESCR("GiST support");+DATA(insert OID = 3877 ( range_gist_compress PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2281 "2281" _null_ _null_ _null_ _null_ _null_ range_gist_compress _null_ _null_ _null_ ));+DESCR("GiST support");+DATA(insert OID = 3878 ( range_gist_decompress PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2281 "2281" _null_ _null_ _null_ _null_ _null_ range_gist_decompress _null_ _null_ _null_ ));+DESCR("GiST support");+DATA(insert OID = 3996 ( range_gist_fetch PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2281 "2281" _null_ _null_ _null_ _null_ _null_ range_gist_fetch _null_ _null_ _null_ ));+DESCR("GiST support");+DATA(insert OID = 3879 ( range_gist_penalty PGNSP PGUID 12 1 0 0 0 f f f f t f i 3 0 2281 "2281 2281 2281" _null_ _null_ _null_ _null_ _null_ range_gist_penalty _null_ _null_ _null_ ));+DESCR("GiST support");+DATA(insert OID = 3880 ( range_gist_picksplit PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 2281 "2281 2281" _null_ _null_ _null_ _null_ _null_ range_gist_picksplit _null_ _null_ _null_ ));+DESCR("GiST support");+DATA(insert OID = 3881 ( range_gist_same PGNSP PGUID 12 1 0 0 0 f f f f t f i 3 0 2281 "3831 3831 2281" _null_ _null_ _null_ _null_ _null_ range_gist_same _null_ _null_ _null_ ));+DESCR("GiST support");+DATA(insert OID = 3902 ( hash_range PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 23 "3831" _null_ _null_ _null_ _null_ _null_ hash_range _null_ _null_ _null_ ));+DESCR("hash a range");+DATA(insert OID = 3916 ( range_typanalyze PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 16 "2281" _null_ _null_ _null_ _null_ _null_ range_typanalyze _null_ _null_ _null_ ));+DESCR("range typanalyze");+DATA(insert OID = 3169 ( rangesel PGNSP PGUID 12 1 0 0 0 f f f f t f s 4 0 701 "2281 26 2281 23" _null_ _null_ _null_ _null_ _null_ rangesel _null_ _null_ _null_ ));+DESCR("restriction selectivity for range operators");++DATA(insert OID = 3914 ( int4range_canonical PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 3904 "3904" _null_ _null_ _null_ _null_ _null_ int4range_canonical _null_ _null_ _null_ ));+DESCR("convert an int4 range to canonical form");+DATA(insert OID = 3928 ( int8range_canonical PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 3926 "3926" _null_ _null_ _null_ _null_ _null_ int8range_canonical _null_ _null_ _null_ ));+DESCR("convert an int8 range to canonical form");+DATA(insert OID = 3915 ( daterange_canonical PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 3912 "3912" _null_ _null_ _null_ _null_ _null_ daterange_canonical _null_ _null_ _null_ ));+DESCR("convert a date range to canonical form");+DATA(insert OID = 3922 ( int4range_subdiff PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 701 "23 23" _null_ _null_ _null_ _null_ _null_ int4range_subdiff _null_ _null_ _null_ ));+DESCR("float8 difference of two int4 values");+DATA(insert OID = 3923 ( int8range_subdiff PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 701 "20 20" _null_ _null_ _null_ _null_ _null_ int8range_subdiff _null_ _null_ _null_ ));+DESCR("float8 difference of two int8 values");+DATA(insert OID = 3924 ( numrange_subdiff PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 701 "1700 1700" _null_ _null_ _null_ _null_ _null_ numrange_subdiff _null_ _null_ _null_ ));+DESCR("float8 difference of two numeric values");+DATA(insert OID = 3925 ( daterange_subdiff PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 701 "1082 1082" _null_ _null_ _null_ _null_ _null_ daterange_subdiff _null_ _null_ _null_ ));+DESCR("float8 difference of two date values");+DATA(insert OID = 3929 ( tsrange_subdiff PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 701 "1114 1114" _null_ _null_ _null_ _null_ _null_ tsrange_subdiff _null_ _null_ _null_ ));+DESCR("float8 difference of two timestamp values");+DATA(insert OID = 3930 ( tstzrange_subdiff PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 701 "1184 1184" _null_ _null_ _null_ _null_ _null_ tstzrange_subdiff _null_ _null_ _null_ ));+DESCR("float8 difference of two timestamp with time zone values");++DATA(insert OID = 3840 ( int4range PGNSP PGUID 12 1 0 0 0 f f f f f f i 2 0 3904 "23 23" _null_ _null_ _null_ _null_ _null_ range_constructor2 _null_ _null_ _null_ ));+DESCR("int4range constructor");+DATA(insert OID = 3841 ( int4range PGNSP PGUID 12 1 0 0 0 f f f f f f i 3 0 3904 "23 23 25" _null_ _null_ _null_ _null_ _null_ range_constructor3 _null_ _null_ _null_ ));+DESCR("int4range constructor");+DATA(insert OID = 3844 ( numrange PGNSP PGUID 12 1 0 0 0 f f f f f f i 2 0 3906 "1700 1700" _null_ _null_ _null_ _null_ _null_ range_constructor2 _null_ _null_ _null_ ));+DESCR("numrange constructor");+DATA(insert OID = 3845 ( numrange PGNSP PGUID 12 1 0 0 0 f f f f f f i 3 0 3906 "1700 1700 25" _null_ _null_ _null_ _null_ _null_ range_constructor3 _null_ _null_ _null_ ));+DESCR("numrange constructor");+DATA(insert OID = 3933 ( tsrange PGNSP PGUID 12 1 0 0 0 f f f f f f i 2 0 3908 "1114 1114" _null_ _null_ _null_ _null_ _null_ range_constructor2 _null_ _null_ _null_ ));+DESCR("tsrange constructor");+DATA(insert OID = 3934 ( tsrange PGNSP PGUID 12 1 0 0 0 f f f f f f i 3 0 3908 "1114 1114 25" _null_ _null_ _null_ _null_ _null_ range_constructor3 _null_ _null_ _null_ ));+DESCR("tsrange constructor");+DATA(insert OID = 3937 ( tstzrange PGNSP PGUID 12 1 0 0 0 f f f f f f i 2 0 3910 "1184 1184" _null_ _null_ _null_ _null_ _null_ range_constructor2 _null_ _null_ _null_ ));+DESCR("tstzrange constructor");+DATA(insert OID = 3938 ( tstzrange PGNSP PGUID 12 1 0 0 0 f f f f f f i 3 0 3910 "1184 1184 25" _null_ _null_ _null_ _null_ _null_ range_constructor3 _null_ _null_ _null_ ));+DESCR("tstzrange constructor");+DATA(insert OID = 3941 ( daterange PGNSP PGUID 12 1 0 0 0 f f f f f f i 2 0 3912 "1082 1082" _null_ _null_ _null_ _null_ _null_ range_constructor2 _null_ _null_ _null_ ));+DESCR("daterange constructor");+DATA(insert OID = 3942 ( daterange PGNSP PGUID 12 1 0 0 0 f f f f f f i 3 0 3912 "1082 1082 25" _null_ _null_ _null_ _null_ _null_ range_constructor3 _null_ _null_ _null_ ));+DESCR("daterange constructor");+DATA(insert OID = 3945 ( int8range PGNSP PGUID 12 1 0 0 0 f f f f f f i 2 0 3926 "20 20" _null_ _null_ _null_ _null_ _null_ range_constructor2 _null_ _null_ _null_ ));+DESCR("int8range constructor");+DATA(insert OID = 3946 ( int8range PGNSP PGUID 12 1 0 0 0 f f f f f f i 3 0 3926 "20 20 25" _null_ _null_ _null_ _null_ _null_ range_constructor3 _null_ _null_ _null_ ));+DESCR("int8range constructor");++/* date, time, timestamp constructors */+DATA(insert OID = 3846 ( make_date PGNSP PGUID 12 1 0 0 0 f f f f t f i 3 0 1082 "23 23 23" _null_ _null_ "{year,month,day}" _null_ _null_ make_date _null_ _null_ _null_ ));+DESCR("construct date");+DATA(insert OID = 3847 ( make_time PGNSP PGUID 12 1 0 0 0 f f f f t f i 3 0 1083 "23 23 701" _null_ _null_ "{hour,min,sec}" _null_ _null_ make_time _null_ _null_ _null_ ));+DESCR("construct time");+DATA(insert OID = 3461 ( make_timestamp PGNSP PGUID 12 1 0 0 0 f f f f t f i 6 0 1114 "23 23 23 23 23 701" _null_ _null_ "{year,month,mday,hour,min,sec}" _null_ _null_ make_timestamp _null_ _null_ _null_ ));+DESCR("construct timestamp");+DATA(insert OID = 3462 ( make_timestamptz PGNSP PGUID 12 1 0 0 0 f f f f t f s 6 0 1184 "23 23 23 23 23 701" _null_ _null_ "{year,month,mday,hour,min,sec}" _null_ _null_ make_timestamptz _null_ _null_ _null_ ));+DESCR("construct timestamp with time zone");+DATA(insert OID = 3463 ( make_timestamptz PGNSP PGUID 12 1 0 0 0 f f f f t f s 7 0 1184 "23 23 23 23 23 701 25" _null_ _null_ "{year,month,mday,hour,min,sec,timezone}" _null_ _null_ make_timestamptz_at_timezone _null_ _null_ _null_ ));+DESCR("construct timestamp with time zone");+DATA(insert OID = 3464 ( make_interval PGNSP PGUID 12 1 0 0 0 f f f f t f i 7 0 1186 "23 23 23 23 23 23 701" _null_ _null_ "{years,months,weeks,days,hours,mins,secs}" _null_ _null_ make_interval _null_ _null_ _null_ ));+DESCR("construct interval");++/* spgist support functions */+DATA(insert OID = 4001 ( spggettuple PGNSP PGUID 12 1 0 0 0 f f f f t f v 2 0 16 "2281 2281" _null_ _null_ _null_ _null_ _null_ spggettuple _null_ _null_ _null_ ));+DESCR("spgist(internal)");+DATA(insert OID = 4002 ( spggetbitmap PGNSP PGUID 12 1 0 0 0 f f f f t f v 2 0 20 "2281 2281" _null_ _null_ _null_ _null_ _null_ spggetbitmap _null_ _null_ _null_ ));+DESCR("spgist(internal)");+DATA(insert OID = 4003 ( spginsert PGNSP PGUID 12 1 0 0 0 f f f f t f v 6 0 16 "2281 2281 2281 2281 2281 2281" _null_ _null_ _null_ _null_ _null_ spginsert _null_ _null_ _null_ ));+DESCR("spgist(internal)");+DATA(insert OID = 4004 ( spgbeginscan PGNSP PGUID 12 1 0 0 0 f f f f t f v 3 0 2281 "2281 2281 2281" _null_ _null_ _null_ _null_ _null_ spgbeginscan _null_ _null_ _null_ ));+DESCR("spgist(internal)");+DATA(insert OID = 4005 ( spgrescan PGNSP PGUID 12 1 0 0 0 f f f f t f v 5 0 2278 "2281 2281 2281 2281 2281" _null_ _null_ _null_ _null_ _null_ spgrescan _null_ _null_ _null_ ));+DESCR("spgist(internal)");+DATA(insert OID = 4006 ( spgendscan PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 2278 "2281" _null_ _null_ _null_ _null_ _null_ spgendscan _null_ _null_ _null_ ));+DESCR("spgist(internal)");+DATA(insert OID = 4007 ( spgmarkpos PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 2278 "2281" _null_ _null_ _null_ _null_ _null_ spgmarkpos _null_ _null_ _null_ ));+DESCR("spgist(internal)");+DATA(insert OID = 4008 ( spgrestrpos PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 2278 "2281" _null_ _null_ _null_ _null_ _null_ spgrestrpos _null_ _null_ _null_ ));+DESCR("spgist(internal)");+DATA(insert OID = 4009 ( spgbuild PGNSP PGUID 12 1 0 0 0 f f f f t f v 3 0 2281 "2281 2281 2281" _null_ _null_ _null_ _null_ _null_ spgbuild _null_ _null_ _null_ ));+DESCR("spgist(internal)");+DATA(insert OID = 4010 ( spgbuildempty PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 2278 "2281" _null_ _null_ _null_ _null_ _null_ spgbuildempty _null_ _null_ _null_ ));+DESCR("spgist(internal)");+DATA(insert OID = 4011 ( spgbulkdelete PGNSP PGUID 12 1 0 0 0 f f f f t f v 4 0 2281 "2281 2281 2281 2281" _null_ _null_ _null_ _null_ _null_ spgbulkdelete _null_ _null_ _null_ ));+DESCR("spgist(internal)");+DATA(insert OID = 4012 ( spgvacuumcleanup PGNSP PGUID 12 1 0 0 0 f f f f t f v 2 0 2281 "2281 2281" _null_ _null_ _null_ _null_ _null_ spgvacuumcleanup _null_ _null_ _null_ ));+DESCR("spgist(internal)");+DATA(insert OID = 4032 ( spgcanreturn PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 16 "2281 23" _null_ _null_ _null_ _null_ _null_ spgcanreturn _null_ _null_ _null_ ));+DESCR("spgist(internal)");+DATA(insert OID = 4013 ( spgcostestimate PGNSP PGUID 12 1 0 0 0 f f f f t f v 7 0 2278 "2281 2281 2281 2281 2281 2281 2281" _null_ _null_ _null_ _null_ _null_ spgcostestimate _null_ _null_ _null_ ));+DESCR("spgist(internal)");+DATA(insert OID = 4014 ( spgoptions PGNSP PGUID 12 1 0 0 0 f f f f t f s 2 0 17 "1009 16" _null_ _null_ _null_ _null_ _null_ spgoptions _null_ _null_ _null_ ));+DESCR("spgist(internal)");++/* spgist opclasses */+DATA(insert OID = 4018 ( spg_quad_config PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 2278 "2281 2281" _null_ _null_ _null_ _null_ _null_ spg_quad_config _null_ _null_ _null_ ));+DESCR("SP-GiST support for quad tree over point");+DATA(insert OID = 4019 ( spg_quad_choose PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 2278 "2281 2281" _null_ _null_ _null_ _null_ _null_ spg_quad_choose _null_ _null_ _null_ ));+DESCR("SP-GiST support for quad tree over point");+DATA(insert OID = 4020 ( spg_quad_picksplit PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 2278 "2281 2281" _null_ _null_ _null_ _null_ _null_ spg_quad_picksplit _null_ _null_ _null_ ));+DESCR("SP-GiST support for quad tree over point");+DATA(insert OID = 4021 ( spg_quad_inner_consistent PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 2278 "2281 2281" _null_ _null_ _null_ _null_ _null_ spg_quad_inner_consistent _null_ _null_ _null_ ));+DESCR("SP-GiST support for quad tree over point");+DATA(insert OID = 4022 ( spg_quad_leaf_consistent PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "2281 2281" _null_ _null_ _null_ _null_ _null_ spg_quad_leaf_consistent _null_ _null_ _null_ ));+DESCR("SP-GiST support for quad tree and k-d tree over point");++DATA(insert OID = 4023 ( spg_kd_config PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 2278 "2281 2281" _null_ _null_ _null_ _null_ _null_ spg_kd_config _null_ _null_ _null_ ));+DESCR("SP-GiST support for k-d tree over point");+DATA(insert OID = 4024 ( spg_kd_choose PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 2278 "2281 2281" _null_ _null_ _null_ _null_ _null_ spg_kd_choose _null_ _null_ _null_ ));+DESCR("SP-GiST support for k-d tree over point");+DATA(insert OID = 4025 ( spg_kd_picksplit PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 2278 "2281 2281" _null_ _null_ _null_ _null_ _null_ spg_kd_picksplit _null_ _null_ _null_ ));+DESCR("SP-GiST support for k-d tree over point");+DATA(insert OID = 4026 ( spg_kd_inner_consistent PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 2278 "2281 2281" _null_ _null_ _null_ _null_ _null_ spg_kd_inner_consistent _null_ _null_ _null_ ));+DESCR("SP-GiST support for k-d tree over point");++DATA(insert OID = 4027 ( spg_text_config PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 2278 "2281 2281" _null_ _null_ _null_ _null_ _null_ spg_text_config _null_ _null_ _null_ ));+DESCR("SP-GiST support for radix tree over text");+DATA(insert OID = 4028 ( spg_text_choose PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 2278 "2281 2281" _null_ _null_ _null_ _null_ _null_ spg_text_choose _null_ _null_ _null_ ));+DESCR("SP-GiST support for radix tree over text");+DATA(insert OID = 4029 ( spg_text_picksplit PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 2278 "2281 2281" _null_ _null_ _null_ _null_ _null_ spg_text_picksplit _null_ _null_ _null_ ));+DESCR("SP-GiST support for radix tree over text");+DATA(insert OID = 4030 ( spg_text_inner_consistent PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 2278 "2281 2281" _null_ _null_ _null_ _null_ _null_ spg_text_inner_consistent _null_ _null_ _null_ ));+DESCR("SP-GiST support for radix tree over text");+DATA(insert OID = 4031 ( spg_text_leaf_consistent PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "2281 2281" _null_ _null_ _null_ _null_ _null_ spg_text_leaf_consistent _null_ _null_ _null_ ));+DESCR("SP-GiST support for radix tree over text");++DATA(insert OID = 3469 ( spg_range_quad_config PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 2278 "2281 2281" _null_ _null_ _null_ _null_ _null_ spg_range_quad_config _null_ _null_ _null_ ));+DESCR("SP-GiST support for quad tree over range");+DATA(insert OID = 3470 ( spg_range_quad_choose PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 2278 "2281 2281" _null_ _null_ _null_ _null_ _null_ spg_range_quad_choose _null_ _null_ _null_ ));+DESCR("SP-GiST support for quad tree over range");+DATA(insert OID = 3471 ( spg_range_quad_picksplit PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 2278 "2281 2281" _null_ _null_ _null_ _null_ _null_ spg_range_quad_picksplit _null_ _null_ _null_ ));+DESCR("SP-GiST support for quad tree over range");+DATA(insert OID = 3472 ( spg_range_quad_inner_consistent PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 2278 "2281 2281" _null_ _null_ _null_ _null_ _null_ spg_range_quad_inner_consistent _null_ _null_ _null_ ));+DESCR("SP-GiST support for quad tree over range");+DATA(insert OID = 3473 ( spg_range_quad_leaf_consistent PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 16 "2281 2281" _null_ _null_ _null_ _null_ _null_ spg_range_quad_leaf_consistent _null_ _null_ _null_ ));+DESCR("SP-GiST support for quad tree over range");++/* replication slots */+DATA(insert OID = 3779 ( pg_create_physical_replication_slot PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 2249 "19" "{19,19,3220}" "{i,o,o}" "{slot_name,slot_name,xlog_position}" _null_ _null_ pg_create_physical_replication_slot _null_ _null_ _null_ ));+DESCR("create a physical replication slot");+DATA(insert OID = 3780 ( pg_drop_replication_slot PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 2278 "19" _null_ _null_ _null_ _null_ _null_ pg_drop_replication_slot _null_ _null_ _null_ ));+DESCR("drop a replication slot");+DATA(insert OID = 3781 ( pg_get_replication_slots PGNSP PGUID 12 1 10 0 0 f f f f f t s 0 0 2249 "" "{19,19,25,26,16,23,28,28,3220}" "{o,o,o,o,o,o,o,o,o}" "{slot_name,plugin,slot_type,datoid,active,active_pid,xmin,catalog_xmin,restart_lsn}" _null_ _null_ pg_get_replication_slots _null_ _null_ _null_ ));+DESCR("information about replication slots currently in use");+DATA(insert OID = 3786 ( pg_create_logical_replication_slot PGNSP PGUID 12 1 0 0 0 f f f f t f v 2 0 2249 "19 19" "{19,19,25,3220}" "{i,i,o,o}" "{slot_name,plugin,slot_name,xlog_position}" _null_ _null_ pg_create_logical_replication_slot _null_ _null_ _null_ ));+DESCR("set up a logical replication slot");+DATA(insert OID = 3782 ( pg_logical_slot_get_changes PGNSP PGUID 12 1000 1000 25 0 f f f f f t v 4 0 2249 "19 3220 23 1009" "{19,3220,23,1009,3220,28,25}" "{i,i,i,v,o,o,o}" "{slot_name,upto_lsn,upto_nchanges,options,location,xid,data}" _null_ _null_ pg_logical_slot_get_changes _null_ _null_ _null_ ));+DESCR("get changes from replication slot");+DATA(insert OID = 3783 ( pg_logical_slot_get_binary_changes PGNSP PGUID 12 1000 1000 25 0 f f f f f t v 4 0 2249 "19 3220 23 1009" "{19,3220,23,1009,3220,28,17}" "{i,i,i,v,o,o,o}" "{slot_name,upto_lsn,upto_nchanges,options,location,xid,data}" _null_ _null_ pg_logical_slot_get_binary_changes _null_ _null_ _null_ ));+DESCR("get binary changes from replication slot");+DATA(insert OID = 3784 ( pg_logical_slot_peek_changes PGNSP PGUID 12 1000 1000 25 0 f f f f f t v 4 0 2249 "19 3220 23 1009" "{19,3220,23,1009,3220,28,25}" "{i,i,i,v,o,o,o}" "{slot_name,upto_lsn,upto_nchanges,options,location,xid,data}" _null_ _null_ pg_logical_slot_peek_changes _null_ _null_ _null_ ));+DESCR("peek at changes from replication slot");+DATA(insert OID = 3785 ( pg_logical_slot_peek_binary_changes PGNSP PGUID 12 1000 1000 25 0 f f f f f t v 4 0 2249 "19 3220 23 1009" "{19,3220,23,1009,3220,28,17}" "{i,i,i,v,o,o,o}" "{slot_name,upto_lsn,upto_nchanges,options,location,xid,data}" _null_ _null_ pg_logical_slot_peek_binary_changes _null_ _null_ _null_ ));+DESCR("peek at binary changes from replication slot");++/* event triggers */+DATA(insert OID = 3566 ( pg_event_trigger_dropped_objects PGNSP PGUID 12 10 100 0 0 f f f f t t s 0 0 2249 "" "{26,26,23,16,16,16,25,25,25,25,1009,1009}" "{o,o,o,o,o,o,o,o,o,o,o,o}" "{classid, objid, objsubid, original, normal, is_temporary, object_type, schema_name, object_name, object_identity, address_names, address_args}" _null_ _null_ pg_event_trigger_dropped_objects _null_ _null_ _null_ ));+DESCR("list objects dropped by the current command");+DATA(insert OID = 4566 ( pg_event_trigger_table_rewrite_oid PGNSP PGUID 12 1 0 0 0 f f f f t f s 0 0 26 "" "{26}" "{o}" "{oid}" _null_ _null_ pg_event_trigger_table_rewrite_oid _null_ _null_ _null_ ));+DESCR("return Oid of the table getting rewritten");+DATA(insert OID = 4567 ( pg_event_trigger_table_rewrite_reason PGNSP PGUID 12 1 0 0 0 f f f f t f s 0 0 23 "" _null_ _null_ _null_ _null_ _null_ pg_event_trigger_table_rewrite_reason _null_ _null_ _null_ ));+DESCR("return reason code for table getting rewritten");+DATA(insert OID = 4568 ( pg_event_trigger_ddl_commands PGNSP PGUID 12 10 100 0 0 f f f f t t s 0 0 2249 "" "{26,26,23,25,25,25,25,16,32}" "{o,o,o,o,o,o,o,o,o}" "{classid, objid, objsubid, command_tag, object_type, schema_name, object_identity, in_extension, command}" _null_ _null_ pg_event_trigger_ddl_commands _null_ _null_ _null_ ));+DESCR("list DDL actions being executed by the current command");++/* generic transition functions for ordered-set aggregates */+DATA(insert OID = 3970 ( ordered_set_transition PGNSP PGUID 12 1 0 0 0 f f f f f f i 2 0 2281 "2281 2276" _null_ _null_ _null_ _null_ _null_ ordered_set_transition _null_ _null_ _null_ ));+DESCR("aggregate transition function");+DATA(insert OID = 3971 ( ordered_set_transition_multi PGNSP PGUID 12 1 0 2276 0 f f f f f f i 2 0 2281 "2281 2276" "{2281,2276}" "{i,v}" _null_ _null_ _null_ ordered_set_transition_multi _null_ _null_ _null_ ));+DESCR("aggregate transition function");++/* inverse distribution aggregates (and their support functions) */+DATA(insert OID = 3972 ( percentile_disc PGNSP PGUID 12 1 0 0 0 t f f f f f i 2 0 2283 "701 2283" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("discrete percentile");+DATA(insert OID = 3973 ( percentile_disc_final PGNSP PGUID 12 1 0 0 0 f f f f f f i 3 0 2283 "2281 701 2283" _null_ _null_ _null_ _null_ _null_ percentile_disc_final _null_ _null_ _null_ ));+DESCR("aggregate final function");+DATA(insert OID = 3974 ( percentile_cont PGNSP PGUID 12 1 0 0 0 t f f f f f i 2 0 701 "701 701" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("continuous distribution percentile");+DATA(insert OID = 3975 ( percentile_cont_float8_final PGNSP PGUID 12 1 0 0 0 f f f f f f i 2 0 701 "2281 701" _null_ _null_ _null_ _null_ _null_ percentile_cont_float8_final _null_ _null_ _null_ ));+DESCR("aggregate final function");+DATA(insert OID = 3976 ( percentile_cont PGNSP PGUID 12 1 0 0 0 t f f f f f i 2 0 1186 "701 1186" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("continuous distribution percentile");+DATA(insert OID = 3977 ( percentile_cont_interval_final PGNSP PGUID 12 1 0 0 0 f f f f f f i 2 0 1186 "2281 701" _null_ _null_ _null_ _null_ _null_ percentile_cont_interval_final _null_ _null_ _null_ ));+DESCR("aggregate final function");+DATA(insert OID = 3978 ( percentile_disc PGNSP PGUID 12 1 0 0 0 t f f f f f i 2 0 2277 "1022 2283" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("multiple discrete percentiles");+DATA(insert OID = 3979 ( percentile_disc_multi_final PGNSP PGUID 12 1 0 0 0 f f f f f f i 3 0 2277 "2281 1022 2283" _null_ _null_ _null_ _null_ _null_ percentile_disc_multi_final _null_ _null_ _null_ ));+DESCR("aggregate final function");+DATA(insert OID = 3980 ( percentile_cont PGNSP PGUID 12 1 0 0 0 t f f f f f i 2 0 1022 "1022 701" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("multiple continuous percentiles");+DATA(insert OID = 3981 ( percentile_cont_float8_multi_final PGNSP PGUID 12 1 0 0 0 f f f f f f i 2 0 1022 "2281 1022" _null_ _null_ _null_ _null_ _null_ percentile_cont_float8_multi_final _null_ _null_ _null_ ));+DESCR("aggregate final function");+DATA(insert OID = 3982 ( percentile_cont PGNSP PGUID 12 1 0 0 0 t f f f f f i 2 0 1187 "1022 1186" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("multiple continuous percentiles");+DATA(insert OID = 3983 ( percentile_cont_interval_multi_final PGNSP PGUID 12 1 0 0 0 f f f f f f i 2 0 1187 "2281 1022" _null_ _null_ _null_ _null_ _null_ percentile_cont_interval_multi_final _null_ _null_ _null_ ));+DESCR("aggregate final function");+DATA(insert OID = 3984 ( mode PGNSP PGUID 12 1 0 0 0 t f f f f f i 1 0 2283 "2283" _null_ _null_ _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("most common value");+DATA(insert OID = 3985 ( mode_final PGNSP PGUID 12 1 0 0 0 f f f f f f i 2 0 2283 "2281 2283" _null_ _null_ _null_ _null_ _null_ mode_final _null_ _null_ _null_ ));+DESCR("aggregate final function");++/* hypothetical-set aggregates (and their support functions) */+DATA(insert OID = 3986 ( rank PGNSP PGUID 12 1 0 2276 0 t f f f f f i 1 0 20 "2276" "{2276}" "{v}" _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("rank of hypothetical row");+DATA(insert OID = 3987 ( rank_final PGNSP PGUID 12 1 0 2276 0 f f f f f f i 2 0 20 "2281 2276" "{2281,2276}" "{i,v}" _null_ _null_ _null_ hypothetical_rank_final _null_ _null_ _null_ ));+DESCR("aggregate final function");+DATA(insert OID = 3988 ( percent_rank PGNSP PGUID 12 1 0 2276 0 t f f f f f i 1 0 701 "2276" "{2276}" "{v}" _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("fractional rank of hypothetical row");+DATA(insert OID = 3989 ( percent_rank_final PGNSP PGUID 12 1 0 2276 0 f f f f f f i 2 0 701 "2281 2276" "{2281,2276}" "{i,v}" _null_ _null_ _null_ hypothetical_percent_rank_final _null_ _null_ _null_ ));+DESCR("aggregate final function");+DATA(insert OID = 3990 ( cume_dist PGNSP PGUID 12 1 0 2276 0 t f f f f f i 1 0 701 "2276" "{2276}" "{v}" _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("cumulative distribution of hypothetical row");+DATA(insert OID = 3991 ( cume_dist_final PGNSP PGUID 12 1 0 2276 0 f f f f f f i 2 0 701 "2281 2276" "{2281,2276}" "{i,v}" _null_ _null_ _null_ hypothetical_cume_dist_final _null_ _null_ _null_ ));+DESCR("aggregate final function");+DATA(insert OID = 3992 ( dense_rank PGNSP PGUID 12 1 0 2276 0 t f f f f f i 1 0 20 "2276" "{2276}" "{v}" _null_ _null_ _null_ aggregate_dummy _null_ _null_ _null_ ));+DESCR("rank of hypothetical row without gaps");+DATA(insert OID = 3993 ( dense_rank_final PGNSP PGUID 12 1 0 2276 0 f f f f f f i 2 0 20 "2281 2276" "{2281,2276}" "{i,v}" _null_ _null_ _null_ hypothetical_dense_rank_final _null_ _null_ _null_ ));+DESCR("aggregate final function");++/* pg_upgrade support */+DATA(insert OID = 3582 ( binary_upgrade_set_next_pg_type_oid PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 2278 "26" _null_ _null_ _null_ _null_ _null_ binary_upgrade_set_next_pg_type_oid _null_ _null_ _null_ ));+DESCR("for use by pg_upgrade");+DATA(insert OID = 3584 ( binary_upgrade_set_next_array_pg_type_oid PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 2278 "26" _null_ _null_ _null_ _null_ _null_ binary_upgrade_set_next_array_pg_type_oid _null_ _null_ _null_ ));+DESCR("for use by pg_upgrade");+DATA(insert OID = 3585 ( binary_upgrade_set_next_toast_pg_type_oid PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 2278 "26" _null_ _null_ _null_ _null_ _null_ binary_upgrade_set_next_toast_pg_type_oid _null_ _null_ _null_ ));+DESCR("for use by pg_upgrade");+DATA(insert OID = 3586 ( binary_upgrade_set_next_heap_pg_class_oid PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 2278 "26" _null_ _null_ _null_ _null_ _null_ binary_upgrade_set_next_heap_pg_class_oid _null_ _null_ _null_ ));+DESCR("for use by pg_upgrade");+DATA(insert OID = 3587 ( binary_upgrade_set_next_index_pg_class_oid PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 2278 "26" _null_ _null_ _null_ _null_ _null_ binary_upgrade_set_next_index_pg_class_oid _null_ _null_ _null_ ));+DESCR("for use by pg_upgrade");+DATA(insert OID = 3588 ( binary_upgrade_set_next_toast_pg_class_oid PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 2278 "26" _null_ _null_ _null_ _null_ _null_ binary_upgrade_set_next_toast_pg_class_oid _null_ _null_ _null_ ));+DESCR("for use by pg_upgrade");+DATA(insert OID = 3589 ( binary_upgrade_set_next_pg_enum_oid PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 2278 "26" _null_ _null_ _null_ _null_ _null_ binary_upgrade_set_next_pg_enum_oid _null_ _null_ _null_ ));+DESCR("for use by pg_upgrade");+DATA(insert OID = 3590 ( binary_upgrade_set_next_pg_authid_oid PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 2278 "26" _null_ _null_ _null_ _null_ _null_ binary_upgrade_set_next_pg_authid_oid _null_ _null_ _null_ ));+DESCR("for use by pg_upgrade");+DATA(insert OID = 3591 ( binary_upgrade_create_empty_extension PGNSP PGUID 12 1 0 0 0 f f f f f f v 7 0 2278 "25 25 16 25 1028 1009 1009" _null_ _null_ _null_ _null_ _null_ binary_upgrade_create_empty_extension _null_ _null_ _null_ ));+DESCR("for use by pg_upgrade");++/* replication/origin.h */+DATA(insert OID = 6003 ( pg_replication_origin_create PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 26 "25" _null_ _null_ _null_ _null_ _null_ pg_replication_origin_create _null_ _null_ _null_ ));+DESCR("create a replication origin");++DATA(insert OID = 6004 ( pg_replication_origin_drop PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 2278 "25" _null_ _null_ _null_ _null_ _null_ pg_replication_origin_drop _null_ _null_ _null_ ));+DESCR("drop replication origin identified by its name");++DATA(insert OID = 6005 ( pg_replication_origin_oid PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 26 "25" _null_ _null_ _null_ _null_ _null_ pg_replication_origin_oid _null_ _null_ _null_ ));+DESCR("translate the replication origin's name to its id");++DATA(insert OID = 6006 ( pg_replication_origin_session_setup PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 2278 "25" _null_ _null_ _null_ _null_ _null_ pg_replication_origin_session_setup _null_ _null_ _null_ ));+DESCR("configure session to maintain replication progress tracking for the passed in origin");++DATA(insert OID = 6007 ( pg_replication_origin_session_reset PGNSP PGUID 12 1 0 0 0 f f f f t f v 0 0 2278 "" _null_ _null_ _null_ _null_ _null_ pg_replication_origin_session_reset _null_ _null_ _null_ ));+DESCR("teardown configured replication progress tracking");++DATA(insert OID = 6008 ( pg_replication_origin_session_is_setup PGNSP PGUID 12 1 0 0 0 f f f f t f v 0 0 16 "" _null_ _null_ _null_ _null_ _null_ pg_replication_origin_session_is_setup _null_ _null_ _null_ ));+DESCR("is a replication origin configured in this session");++DATA(insert OID = 6009 ( pg_replication_origin_session_progress PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 3220 "16" _null_ _null_ _null_ _null_ _null_ pg_replication_origin_session_progress _null_ _null_ _null_ ));+DESCR("get the replication progress of the current session");++DATA(insert OID = 6010 ( pg_replication_origin_xact_setup PGNSP PGUID 12 1 0 0 0 f f f f t f v 2 0 2278 "3220 1184" _null_ _null_ _null_ _null_ _null_ pg_replication_origin_xact_setup _null_ _null_ _null_ ));+DESCR("setup the transaction's origin lsn and timestamp");++DATA(insert OID = 6011 ( pg_replication_origin_xact_reset PGNSP PGUID 12 1 0 0 0 f f f f t f v 2 0 2278 "3220 1184" _null_ _null_ _null_ _null_ _null_ pg_replication_origin_xact_reset _null_ _null_ _null_ ));+DESCR("reset the transaction's origin lsn and timestamp");++DATA(insert OID = 6012 ( pg_replication_origin_advance PGNSP PGUID 12 1 0 0 0 f f f f t f v 2 0 2278 "25 3220" _null_ _null_ _null_ _null_ _null_ pg_replication_origin_advance _null_ _null_ _null_ ));+DESCR("advance replication itentifier to specific location");++DATA(insert OID = 6013 ( pg_replication_origin_progress PGNSP PGUID 12 1 0 0 0 f f f f t f v 2 0 3220 "25 16" _null_ _null_ _null_ _null_ _null_ pg_replication_origin_progress _null_ _null_ _null_ ));+DESCR("get an individual replication origin's replication progress");++DATA(insert OID = 6014 ( pg_show_replication_origin_status PGNSP PGUID 12 1 100 0 0 f f f f f t v 0 0 2249 "" "{26,25,3220,3220}" "{o,o,o,o}" "{local_id, external_id, remote_lsn, local_lsn}" _null_ _null_ pg_show_replication_origin_status _null_ _null_ _null_ ));+DESCR("get progress for all replication origins");++/* rls */+DATA(insert OID = 3298 ( row_security_active PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 16 "26" _null_ _null_ _null_ _null_ _null_ row_security_active _null_ _null_ _null_ ));+DESCR("row security for current context active on table by table oid");+DATA(insert OID = 3299 ( row_security_active PGNSP PGUID 12 1 0 0 0 f f f f t f s 1 0 16 "25" _null_ _null_ _null_ _null_ _null_ row_security_active_name _null_ _null_ _null_ ));+DESCR("row security for current context active on table by table name");++/*+ * Symbolic values for provolatile column: these indicate whether the result+ * of a function is dependent *only* on the values of its explicit arguments,+ * or can change due to outside factors (such as parameter variables or+ * table contents). NOTE: functions having side-effects, such as setval(),+ * must be labeled volatile to ensure they will not get optimized away,+ * even if the actual return value is not changeable.+ */+#define PROVOLATILE_IMMUTABLE 'i' /* never changes for given input */+#define PROVOLATILE_STABLE 's' /* does not change within a scan */+#define PROVOLATILE_VOLATILE 'v' /* can change even within a scan */++/*+ * Symbolic values for proargmodes column. Note that these must agree with+ * the FunctionParameterMode enum in parsenodes.h; we declare them here to+ * be accessible from either header.+ */+#define PROARGMODE_IN 'i'+#define PROARGMODE_OUT 'o'+#define PROARGMODE_INOUT 'b'+#define PROARGMODE_VARIADIC 'v'+#define PROARGMODE_TABLE 't'++#endif /* PG_PROC_H */
+ foreign/libpg_query/src/postgres/include/catalog/pg_proc_fn.h view
@@ -0,0 +1,50 @@+/*-------------------------------------------------------------------------+ *+ * pg_proc_fn.h+ * prototypes for functions in catalog/pg_proc.c+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/catalog/pg_proc_fn.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef PG_PROC_FN_H+#define PG_PROC_FN_H++#include "catalog/objectaddress.h"+#include "nodes/pg_list.h"++extern ObjectAddress ProcedureCreate(const char *procedureName,+ Oid procNamespace,+ bool replace,+ bool returnsSet,+ Oid returnType,+ Oid proowner,+ Oid languageObjectId,+ Oid languageValidator,+ const char *prosrc,+ const char *probin,+ bool isAgg,+ bool isWindowFunc,+ bool security_definer,+ bool isLeakProof,+ bool isStrict,+ char volatility,+ oidvector *parameterTypes,+ Datum allParameterTypes,+ Datum parameterModes,+ Datum parameterNames,+ List *parameterDefaults,+ Datum trftypes,+ Datum proconfig,+ float4 procost,+ float4 prorows);++extern bool function_parse_error_transpose(const char *prosrc);++extern List *oid_array_to_list(Datum datum);++#endif /* PG_PROC_FN_H */
+ foreign/libpg_query/src/postgres/include/catalog/pg_replication_origin.h view
@@ -0,0 +1,70 @@+/*-------------------------------------------------------------------------+ *+ * pg_replication_origin.h+ * Persistent replication origin registry+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/catalog/pg_replication_origin.h+ *+ * NOTES+ * the genbki.pl script reads this file and generates .bki+ * information from the DATA() statements.+ *+ *-------------------------------------------------------------------------+ */+#ifndef PG_REPLICATION_ORIGIN_H+#define PG_REPLICATION_ORIGIN_H++#include "catalog/genbki.h"+#include "access/xlogdefs.h"++/* ----------------+ * pg_replication_origin. cpp turns this into+ * typedef struct FormData_pg_replication_origin+ * ----------------+ */+#define ReplicationOriginRelationId 6000++CATALOG(pg_replication_origin,6000) BKI_SHARED_RELATION BKI_WITHOUT_OIDS+{+ /*+ * Locally known id that get included into WAL.+ *+ * This should never leave the system.+ *+ * Needs to fit into an uint16, so we don't waste too much space in WAL+ * records. For this reason we don't use a normal Oid column here, since+ * we need to handle allocation of new values manually.+ */+ Oid roident;++ /*+ * Variable-length fields start here, but we allow direct access to+ * roname.+ */++ /* external, free-format, name */+ text roname BKI_FORCE_NOT_NULL;++#ifdef CATALOG_VARLEN /* further variable-length fields */+#endif+} FormData_pg_replication_origin;++typedef FormData_pg_replication_origin *Form_pg_replication_origin;++/* ----------------+ * compiler constants for pg_replication_origin+ * ----------------+ */+#define Natts_pg_replication_origin 2+#define Anum_pg_replication_origin_roident 1+#define Anum_pg_replication_origin_roname 2++/* ----------------+ * pg_replication_origin has no initial contents+ * ----------------+ */++#endif /* PG_REPLICATION_ORIGIN_H */
+ foreign/libpg_query/src/postgres/include/catalog/pg_statistic.h view
@@ -0,0 +1,293 @@+/*-------------------------------------------------------------------------+ *+ * pg_statistic.h+ * definition of the system "statistic" relation (pg_statistic)+ * along with the relation's initial contents.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/catalog/pg_statistic.h+ *+ * NOTES+ * the genbki.pl script reads this file and generates .bki+ * information from the DATA() statements.+ *+ *-------------------------------------------------------------------------+ */+#ifndef PG_STATISTIC_H+#define PG_STATISTIC_H++#include "catalog/genbki.h"++/* ----------------+ * pg_statistic definition. cpp turns this into+ * typedef struct FormData_pg_statistic+ * ----------------+ */+#define StatisticRelationId 2619++CATALOG(pg_statistic,2619) BKI_WITHOUT_OIDS+{+ /* These fields form the unique key for the entry: */+ Oid starelid; /* relation containing attribute */+ int16 staattnum; /* attribute (column) stats are for */+ bool stainherit; /* true if inheritance children are included */++ /* the fraction of the column's entries that are NULL: */+ float4 stanullfrac;++ /*+ * stawidth is the average width in bytes of non-null entries. For+ * fixed-width datatypes this is of course the same as the typlen, but for+ * var-width types it is more useful. Note that this is the average width+ * of the data as actually stored, post-TOASTing (eg, for a+ * moved-out-of-line value, only the size of the pointer object is+ * counted). This is the appropriate definition for the primary use of+ * the statistic, which is to estimate sizes of in-memory hash tables of+ * tuples.+ */+ int32 stawidth;++ /* ----------------+ * stadistinct indicates the (approximate) number of distinct non-null+ * data values in the column. The interpretation is:+ * 0 unknown or not computed+ * > 0 actual number of distinct values+ * < 0 negative of multiplier for number of rows+ * The special negative case allows us to cope with columns that are+ * unique (stadistinct = -1) or nearly so (for example, a column in+ * which values appear about twice on the average could be represented+ * by stadistinct = -0.5). Because the number-of-rows statistic in+ * pg_class may be updated more frequently than pg_statistic is, it's+ * important to be able to describe such situations as a multiple of+ * the number of rows, rather than a fixed number of distinct values.+ * But in other cases a fixed number is correct (eg, a boolean column).+ * ----------------+ */+ float4 stadistinct;++ /* ----------------+ * To allow keeping statistics on different kinds of datatypes,+ * we do not hard-wire any particular meaning for the remaining+ * statistical fields. Instead, we provide several "slots" in which+ * statistical data can be placed. Each slot includes:+ * kind integer code identifying kind of data (see below)+ * op OID of associated operator, if needed+ * numbers float4 array (for statistical values)+ * values anyarray (for representations of data values)+ * The ID and operator fields are never NULL; they are zeroes in an+ * unused slot. The numbers and values fields are NULL in an unused+ * slot, and might also be NULL in a used slot if the slot kind has+ * no need for one or the other.+ * ----------------+ */++ int16 stakind1;+ int16 stakind2;+ int16 stakind3;+ int16 stakind4;+ int16 stakind5;++ Oid staop1;+ Oid staop2;+ Oid staop3;+ Oid staop4;+ Oid staop5;++#ifdef CATALOG_VARLEN /* variable-length fields start here */+ float4 stanumbers1[1];+ float4 stanumbers2[1];+ float4 stanumbers3[1];+ float4 stanumbers4[1];+ float4 stanumbers5[1];++ /*+ * Values in these arrays are values of the column's data type, or of some+ * related type such as an array element type. We presently have to cheat+ * quite a bit to allow polymorphic arrays of this kind, but perhaps+ * someday it'll be a less bogus facility.+ */+ anyarray stavalues1;+ anyarray stavalues2;+ anyarray stavalues3;+ anyarray stavalues4;+ anyarray stavalues5;+#endif+} FormData_pg_statistic;++#define STATISTIC_NUM_SLOTS 5+++/* ----------------+ * Form_pg_statistic corresponds to a pointer to a tuple with+ * the format of pg_statistic relation.+ * ----------------+ */+typedef FormData_pg_statistic *Form_pg_statistic;++/* ----------------+ * compiler constants for pg_statistic+ * ----------------+ */+#define Natts_pg_statistic 26+#define Anum_pg_statistic_starelid 1+#define Anum_pg_statistic_staattnum 2+#define Anum_pg_statistic_stainherit 3+#define Anum_pg_statistic_stanullfrac 4+#define Anum_pg_statistic_stawidth 5+#define Anum_pg_statistic_stadistinct 6+#define Anum_pg_statistic_stakind1 7+#define Anum_pg_statistic_stakind2 8+#define Anum_pg_statistic_stakind3 9+#define Anum_pg_statistic_stakind4 10+#define Anum_pg_statistic_stakind5 11+#define Anum_pg_statistic_staop1 12+#define Anum_pg_statistic_staop2 13+#define Anum_pg_statistic_staop3 14+#define Anum_pg_statistic_staop4 15+#define Anum_pg_statistic_staop5 16+#define Anum_pg_statistic_stanumbers1 17+#define Anum_pg_statistic_stanumbers2 18+#define Anum_pg_statistic_stanumbers3 19+#define Anum_pg_statistic_stanumbers4 20+#define Anum_pg_statistic_stanumbers5 21+#define Anum_pg_statistic_stavalues1 22+#define Anum_pg_statistic_stavalues2 23+#define Anum_pg_statistic_stavalues3 24+#define Anum_pg_statistic_stavalues4 25+#define Anum_pg_statistic_stavalues5 26++/*+ * Currently, five statistical slot "kinds" are defined by core PostgreSQL,+ * as documented below. Additional "kinds" will probably appear in+ * future to help cope with non-scalar datatypes. Also, custom data types+ * can define their own "kind" codes by mutual agreement between a custom+ * typanalyze routine and the selectivity estimation functions of the type's+ * operators.+ *+ * Code reading the pg_statistic relation should not assume that a particular+ * data "kind" will appear in any particular slot. Instead, search the+ * stakind fields to see if the desired data is available. (The standard+ * function get_attstatsslot() may be used for this.)+ */++/*+ * The present allocation of "kind" codes is:+ *+ * 1-99: reserved for assignment by the core PostgreSQL project+ * (values in this range will be documented in this file)+ * 100-199: reserved for assignment by the PostGIS project+ * (values to be documented in PostGIS documentation)+ * 200-299: reserved for assignment by the ESRI ST_Geometry project+ * (values to be documented in ESRI ST_Geometry documentation)+ * 300-9999: reserved for future public assignments+ *+ * For private use you may choose a "kind" code at random in the range+ * 10000-30000. However, for code that is to be widely disseminated it is+ * better to obtain a publicly defined "kind" code by request from the+ * PostgreSQL Global Development Group.+ */++/*+ * In a "most common values" slot, staop is the OID of the "=" operator+ * used to decide whether values are the same or not. stavalues contains+ * the K most common non-null values appearing in the column, and stanumbers+ * contains their frequencies (fractions of total row count). The values+ * shall be ordered in decreasing frequency. Note that since the arrays are+ * variable-size, K may be chosen by the statistics collector. Values should+ * not appear in MCV unless they have been observed to occur more than once;+ * a unique column will have no MCV slot.+ */+#define STATISTIC_KIND_MCV 1++/*+ * A "histogram" slot describes the distribution of scalar data. staop is+ * the OID of the "<" operator that describes the sort ordering. (In theory,+ * more than one histogram could appear, if a datatype has more than one+ * useful sort operator.) stavalues contains M (>=2) non-null values that+ * divide the non-null column data values into M-1 bins of approximately equal+ * population. The first stavalues item is the MIN and the last is the MAX.+ * stanumbers is not used and should be NULL. IMPORTANT POINT: if an MCV+ * slot is also provided, then the histogram describes the data distribution+ * *after removing the values listed in MCV* (thus, it's a "compressed+ * histogram" in the technical parlance). This allows a more accurate+ * representation of the distribution of a column with some very-common+ * values. In a column with only a few distinct values, it's possible that+ * the MCV list describes the entire data population; in this case the+ * histogram reduces to empty and should be omitted.+ */+#define STATISTIC_KIND_HISTOGRAM 2++/*+ * A "correlation" slot describes the correlation between the physical order+ * of table tuples and the ordering of data values of this column, as seen+ * by the "<" operator identified by staop. (As with the histogram, more+ * than one entry could theoretically appear.) stavalues is not used and+ * should be NULL. stanumbers contains a single entry, the correlation+ * coefficient between the sequence of data values and the sequence of+ * their actual tuple positions. The coefficient ranges from +1 to -1.+ */+#define STATISTIC_KIND_CORRELATION 3++/*+ * A "most common elements" slot is similar to a "most common values" slot,+ * except that it stores the most common non-null *elements* of the column+ * values. This is useful when the column datatype is an array or some other+ * type with identifiable elements (for instance, tsvector). staop contains+ * the equality operator appropriate to the element type. stavalues contains+ * the most common element values, and stanumbers their frequencies. Unlike+ * MCV slots, frequencies are measured as the fraction of non-null rows the+ * element value appears in, not the frequency of all rows. Also unlike+ * MCV slots, the values are sorted into the element type's default order+ * (to support binary search for a particular value). Since this puts the+ * minimum and maximum frequencies at unpredictable spots in stanumbers,+ * there are two extra members of stanumbers, holding copies of the minimum+ * and maximum frequencies. Optionally, there can be a third extra member,+ * which holds the frequency of null elements (expressed in the same terms:+ * the fraction of non-null rows that contain at least one null element). If+ * this member is omitted, the column is presumed to contain no null elements.+ *+ * Note: in current usage for tsvector columns, the stavalues elements are of+ * type text, even though their representation within tsvector is not+ * exactly text.+ */+#define STATISTIC_KIND_MCELEM 4++/*+ * A "distinct elements count histogram" slot describes the distribution of+ * the number of distinct element values present in each row of an array-type+ * column. Only non-null rows are considered, and only non-null elements.+ * staop contains the equality operator appropriate to the element type.+ * stavalues is not used and should be NULL. The last member of stanumbers is+ * the average count of distinct element values over all non-null rows. The+ * preceding M (>=2) members form a histogram that divides the population of+ * distinct-elements counts into M-1 bins of approximately equal population.+ * The first of these is the minimum observed count, and the last the maximum.+ */+#define STATISTIC_KIND_DECHIST 5++/*+ * A "length histogram" slot describes the distribution of range lengths in+ * rows of a range-type column. stanumbers contains a single entry, the+ * fraction of empty ranges. stavalues is a histogram of non-empty lengths, in+ * a format similar to STATISTIC_KIND_HISTOGRAM: it contains M (>=2) range+ * values that divide the column data values into M-1 bins of approximately+ * equal population. The lengths are stores as float8s, as measured by the+ * range type's subdiff function. Only non-null rows are considered.+ */+#define STATISTIC_KIND_RANGE_LENGTH_HISTOGRAM 6++/*+ * A "bounds histogram" slot is similar to STATISTIC_KIND_HISTOGRAM, but for+ * a range-type column. stavalues contains M (>=2) range values that divide+ * the column data values into M-1 bins of approximately equal population.+ * Unlike a regular scalar histogram, this is actually two histograms combined+ * into a single array, with the lower bounds of each value forming a+ * histogram of lower bounds, and the upper bounds a histogram of upper+ * bounds. Only non-NULL, non-empty ranges are included.+ */+#define STATISTIC_KIND_BOUNDS_HISTOGRAM 7++#endif /* PG_STATISTIC_H */
+ foreign/libpg_query/src/postgres/include/catalog/pg_transform.h view
@@ -0,0 +1,47 @@+/*-------------------------------------------------------------------------+ *+ * pg_transform.h+ *+ * Copyright (c) 2012-2015, PostgreSQL Global Development Group+ *+ * src/include/catalog/pg_transform.h+ *+ * NOTES+ * the genbki.pl script reads this file and generates .bki+ * information from the DATA() statements.+ *+ *-------------------------------------------------------------------------+ */+#ifndef PG_TRANSFORM_H+#define PG_TRANSFORM_H++#include "catalog/genbki.h"++/* ----------------+ * pg_transform definition. cpp turns this into+ * typedef struct FormData_pg_transform+ * ----------------+ */+#define TransformRelationId 3576++CATALOG(pg_transform,3576)+{+ Oid trftype;+ Oid trflang;+ regproc trffromsql;+ regproc trftosql;+} FormData_pg_transform;++typedef FormData_pg_transform *Form_pg_transform;++/* ----------------+ * compiler constants for pg_transform+ * ----------------+ */+#define Natts_pg_transform 4+#define Anum_pg_transform_trftype 1+#define Anum_pg_transform_trflang 2+#define Anum_pg_transform_trffromsql 3+#define Anum_pg_transform_trftosql 4++#endif /* PG_TRANSFORM_H */
+ foreign/libpg_query/src/postgres/include/catalog/pg_trigger.h view
@@ -0,0 +1,145 @@+/*-------------------------------------------------------------------------+ *+ * pg_trigger.h+ * definition of the system "trigger" relation (pg_trigger)+ * along with the relation's initial contents.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/catalog/pg_trigger.h+ *+ * NOTES+ * the genbki.pl script reads this file and generates .bki+ * information from the DATA() statements.+ *+ *-------------------------------------------------------------------------+ */+#ifndef PG_TRIGGER_H+#define PG_TRIGGER_H++#include "catalog/genbki.h"++/* ----------------+ * pg_trigger definition. cpp turns this into+ * typedef struct FormData_pg_trigger+ *+ * Note: when tgconstraint is nonzero, tgconstrrelid, tgconstrindid,+ * tgdeferrable, and tginitdeferred are largely redundant with the referenced+ * pg_constraint entry. However, it is possible for a non-deferrable trigger+ * to be associated with a deferrable constraint.+ * ----------------+ */+#define TriggerRelationId 2620++CATALOG(pg_trigger,2620)+{+ Oid tgrelid; /* relation trigger is attached to */+ NameData tgname; /* trigger's name */+ Oid tgfoid; /* OID of function to be called */+ int16 tgtype; /* BEFORE/AFTER/INSTEAD, UPDATE/DELETE/INSERT,+ * ROW/STATEMENT; see below */+ char tgenabled; /* trigger's firing configuration WRT+ * session_replication_role */+ bool tgisinternal; /* trigger is system-generated */+ Oid tgconstrrelid; /* constraint's FROM table, if any */+ Oid tgconstrindid; /* constraint's supporting index, if any */+ Oid tgconstraint; /* associated pg_constraint entry, if any */+ bool tgdeferrable; /* constraint trigger is deferrable */+ bool tginitdeferred; /* constraint trigger is deferred initially */+ int16 tgnargs; /* # of extra arguments in tgargs */++ /*+ * Variable-length fields start here, but we allow direct access to+ * tgattr. Note: tgattr and tgargs must not be null.+ */+ int2vector tgattr; /* column numbers, if trigger is on columns */++#ifdef CATALOG_VARLEN+ bytea tgargs BKI_FORCE_NOT_NULL; /* first\000second\000tgnargs\000 */+ pg_node_tree tgqual; /* WHEN expression, or NULL if none */+#endif+} FormData_pg_trigger;++/* ----------------+ * Form_pg_trigger corresponds to a pointer to a tuple with+ * the format of pg_trigger relation.+ * ----------------+ */+typedef FormData_pg_trigger *Form_pg_trigger;++/* ----------------+ * compiler constants for pg_trigger+ * ----------------+ */+#define Natts_pg_trigger 15+#define Anum_pg_trigger_tgrelid 1+#define Anum_pg_trigger_tgname 2+#define Anum_pg_trigger_tgfoid 3+#define Anum_pg_trigger_tgtype 4+#define Anum_pg_trigger_tgenabled 5+#define Anum_pg_trigger_tgisinternal 6+#define Anum_pg_trigger_tgconstrrelid 7+#define Anum_pg_trigger_tgconstrindid 8+#define Anum_pg_trigger_tgconstraint 9+#define Anum_pg_trigger_tgdeferrable 10+#define Anum_pg_trigger_tginitdeferred 11+#define Anum_pg_trigger_tgnargs 12+#define Anum_pg_trigger_tgattr 13+#define Anum_pg_trigger_tgargs 14+#define Anum_pg_trigger_tgqual 15++/* Bits within tgtype */+#define TRIGGER_TYPE_ROW (1 << 0)+#define TRIGGER_TYPE_BEFORE (1 << 1)+#define TRIGGER_TYPE_INSERT (1 << 2)+#define TRIGGER_TYPE_DELETE (1 << 3)+#define TRIGGER_TYPE_UPDATE (1 << 4)+#define TRIGGER_TYPE_TRUNCATE (1 << 5)+#define TRIGGER_TYPE_INSTEAD (1 << 6)++#define TRIGGER_TYPE_LEVEL_MASK (TRIGGER_TYPE_ROW)+#define TRIGGER_TYPE_STATEMENT 0++/* Note bits within TRIGGER_TYPE_TIMING_MASK aren't adjacent */+#define TRIGGER_TYPE_TIMING_MASK \+ (TRIGGER_TYPE_BEFORE | TRIGGER_TYPE_INSTEAD)+#define TRIGGER_TYPE_AFTER 0++#define TRIGGER_TYPE_EVENT_MASK \+ (TRIGGER_TYPE_INSERT | TRIGGER_TYPE_DELETE | TRIGGER_TYPE_UPDATE | TRIGGER_TYPE_TRUNCATE)++/* Macros for manipulating tgtype */+#define TRIGGER_CLEAR_TYPE(type) ((type) = 0)++#define TRIGGER_SETT_ROW(type) ((type) |= TRIGGER_TYPE_ROW)+#define TRIGGER_SETT_STATEMENT(type) ((type) |= TRIGGER_TYPE_STATEMENT)+#define TRIGGER_SETT_BEFORE(type) ((type) |= TRIGGER_TYPE_BEFORE)+#define TRIGGER_SETT_AFTER(type) ((type) |= TRIGGER_TYPE_AFTER)+#define TRIGGER_SETT_INSTEAD(type) ((type) |= TRIGGER_TYPE_INSTEAD)+#define TRIGGER_SETT_INSERT(type) ((type) |= TRIGGER_TYPE_INSERT)+#define TRIGGER_SETT_DELETE(type) ((type) |= TRIGGER_TYPE_DELETE)+#define TRIGGER_SETT_UPDATE(type) ((type) |= TRIGGER_TYPE_UPDATE)+#define TRIGGER_SETT_TRUNCATE(type) ((type) |= TRIGGER_TYPE_TRUNCATE)++#define TRIGGER_FOR_ROW(type) ((type) & TRIGGER_TYPE_ROW)+#define TRIGGER_FOR_BEFORE(type) (((type) & TRIGGER_TYPE_TIMING_MASK) == TRIGGER_TYPE_BEFORE)+#define TRIGGER_FOR_AFTER(type) (((type) & TRIGGER_TYPE_TIMING_MASK) == TRIGGER_TYPE_AFTER)+#define TRIGGER_FOR_INSTEAD(type) (((type) & TRIGGER_TYPE_TIMING_MASK) == TRIGGER_TYPE_INSTEAD)+#define TRIGGER_FOR_INSERT(type) ((type) & TRIGGER_TYPE_INSERT)+#define TRIGGER_FOR_DELETE(type) ((type) & TRIGGER_TYPE_DELETE)+#define TRIGGER_FOR_UPDATE(type) ((type) & TRIGGER_TYPE_UPDATE)+#define TRIGGER_FOR_TRUNCATE(type) ((type) & TRIGGER_TYPE_TRUNCATE)++/*+ * Efficient macro for checking if tgtype matches a particular level+ * (TRIGGER_TYPE_ROW or TRIGGER_TYPE_STATEMENT), timing (TRIGGER_TYPE_BEFORE,+ * TRIGGER_TYPE_AFTER or TRIGGER_TYPE_INSTEAD), and event (TRIGGER_TYPE_INSERT,+ * TRIGGER_TYPE_DELETE, TRIGGER_TYPE_UPDATE, or TRIGGER_TYPE_TRUNCATE). Note+ * that a tgtype can match more than one event, but only one level or timing.+ */+#define TRIGGER_TYPE_MATCHES(type, level, timing, event) \+ (((type) & (TRIGGER_TYPE_LEVEL_MASK | TRIGGER_TYPE_TIMING_MASK | (event))) == ((level) | (timing) | (event)))++#endif /* PG_TRIGGER_H */
+ foreign/libpg_query/src/postgres/include/catalog/pg_ts_config.h view
@@ -0,0 +1,60 @@+/*-------------------------------------------------------------------------+ *+ * pg_ts_config.h+ * definition of configuration of tsearch+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/catalog/pg_ts_config.h+ *+ * NOTES+ * the genbki.pl script reads this file and generates .bki+ * information from the DATA() statements.+ *+ * XXX do NOT break up DATA() statements into multiple lines!+ * the scripts are not as smart as you might think...+ *+ *-------------------------------------------------------------------------+ */+#ifndef PG_TS_CONFIG_H+#define PG_TS_CONFIG_H++#include "catalog/genbki.h"++/* ----------------+ * pg_ts_config definition. cpp turns this into+ * typedef struct FormData_pg_ts_config+ * ----------------+ */+#define TSConfigRelationId 3602++CATALOG(pg_ts_config,3602)+{+ NameData cfgname; /* name of configuration */+ Oid cfgnamespace; /* name space */+ Oid cfgowner; /* owner */+ Oid cfgparser; /* OID of parser (in pg_ts_parser) */+} FormData_pg_ts_config;++typedef FormData_pg_ts_config *Form_pg_ts_config;++/* ----------------+ * compiler constants for pg_ts_config+ * ----------------+ */+#define Natts_pg_ts_config 4+#define Anum_pg_ts_config_cfgname 1+#define Anum_pg_ts_config_cfgnamespace 2+#define Anum_pg_ts_config_cfgowner 3+#define Anum_pg_ts_config_cfgparser 4++/* ----------------+ * initial contents of pg_ts_config+ * ----------------+ */+DATA(insert OID = 3748 ( "simple" PGNSP PGUID 3722 ));+DESCR("simple configuration");++#endif /* PG_TS_CONFIG_H */
+ foreign/libpg_query/src/postgres/include/catalog/pg_ts_dict.h view
@@ -0,0 +1,66 @@+/*-------------------------------------------------------------------------+ *+ * pg_ts_dict.h+ * definition of dictionaries for tsearch+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/catalog/pg_ts_dict.h+ *+ * NOTES+ * the genbki.pl script reads this file and generates .bki+ * information from the DATA() statements.+ *+ * XXX do NOT break up DATA() statements into multiple lines!+ * the scripts are not as smart as you might think...+ *+ *-------------------------------------------------------------------------+ */+#ifndef PG_TS_DICT_H+#define PG_TS_DICT_H++#include "catalog/genbki.h"++/* ----------------+ * pg_ts_dict definition. cpp turns this into+ * typedef struct FormData_pg_ts_dict+ * ----------------+ */+#define TSDictionaryRelationId 3600++CATALOG(pg_ts_dict,3600)+{+ NameData dictname; /* dictionary name */+ Oid dictnamespace; /* name space */+ Oid dictowner; /* owner */+ Oid dicttemplate; /* dictionary's template */++#ifdef CATALOG_VARLEN /* variable-length fields start here */+ text dictinitoption; /* options passed to dict_init() */+#endif+} FormData_pg_ts_dict;++typedef FormData_pg_ts_dict *Form_pg_ts_dict;++/* ----------------+ * compiler constants for pg_ts_dict+ * ----------------+ */+#define Natts_pg_ts_dict 5+#define Anum_pg_ts_dict_dictname 1+#define Anum_pg_ts_dict_dictnamespace 2+#define Anum_pg_ts_dict_dictowner 3+#define Anum_pg_ts_dict_dicttemplate 4+#define Anum_pg_ts_dict_dictinitoption 5++/* ----------------+ * initial contents of pg_ts_dict+ * ----------------+ */++DATA(insert OID = 3765 ( "simple" PGNSP PGUID 3727 _null_));+DESCR("simple dictionary: just lower case and check for stopword");++#endif /* PG_TS_DICT_H */
+ foreign/libpg_query/src/postgres/include/catalog/pg_ts_parser.h view
@@ -0,0 +1,67 @@+/*-------------------------------------------------------------------------+ *+ * pg_ts_parser.h+ * definition of parsers for tsearch+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/catalog/pg_ts_parser.h+ *+ * NOTES+ * the genbki.pl script reads this file and generates .bki+ * information from the DATA() statements.+ *+ * XXX do NOT break up DATA() statements into multiple lines!+ * the scripts are not as smart as you might think...+ *+ *-------------------------------------------------------------------------+ */+#ifndef PG_TS_PARSER_H+#define PG_TS_PARSER_H++#include "catalog/genbki.h"++/* ----------------+ * pg_ts_parser definition. cpp turns this into+ * typedef struct FormData_pg_ts_parser+ * ----------------+ */+#define TSParserRelationId 3601++CATALOG(pg_ts_parser,3601)+{+ NameData prsname; /* parser's name */+ Oid prsnamespace; /* name space */+ regproc prsstart; /* init parsing session */+ regproc prstoken; /* return next token */+ regproc prsend; /* finalize parsing session */+ regproc prsheadline; /* return data for headline creation */+ regproc prslextype; /* return descriptions of lexeme's types */+} FormData_pg_ts_parser;++typedef FormData_pg_ts_parser *Form_pg_ts_parser;++/* ----------------+ * compiler constants for pg_ts_parser+ * ----------------+ */+#define Natts_pg_ts_parser 7+#define Anum_pg_ts_parser_prsname 1+#define Anum_pg_ts_parser_prsnamespace 2+#define Anum_pg_ts_parser_prsstart 3+#define Anum_pg_ts_parser_prstoken 4+#define Anum_pg_ts_parser_prsend 5+#define Anum_pg_ts_parser_prsheadline 6+#define Anum_pg_ts_parser_prslextype 7++/* ----------------+ * initial contents of pg_ts_parser+ * ----------------+ */++DATA(insert OID = 3722 ( "default" PGNSP prsd_start prsd_nexttoken prsd_end prsd_headline prsd_lextype ));+DESCR("default word parser");++#endif /* PG_TS_PARSER_H */
+ foreign/libpg_query/src/postgres/include/catalog/pg_ts_template.h view
@@ -0,0 +1,67 @@+/*-------------------------------------------------------------------------+ *+ * pg_ts_template.h+ * definition of dictionary templates for tsearch+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/catalog/pg_ts_template.h+ *+ * NOTES+ * the genbki.pl script reads this file and generates .bki+ * information from the DATA() statements.+ *+ * XXX do NOT break up DATA() statements into multiple lines!+ * the scripts are not as smart as you might think...+ *+ *-------------------------------------------------------------------------+ */+#ifndef PG_TS_TEMPLATE_H+#define PG_TS_TEMPLATE_H++#include "catalog/genbki.h"++/* ----------------+ * pg_ts_template definition. cpp turns this into+ * typedef struct FormData_pg_ts_template+ * ----------------+ */+#define TSTemplateRelationId 3764++CATALOG(pg_ts_template,3764)+{+ NameData tmplname; /* template name */+ Oid tmplnamespace; /* name space */+ regproc tmplinit; /* initialization method of dict (may be 0) */+ regproc tmpllexize; /* base method of dictionary */+} FormData_pg_ts_template;++typedef FormData_pg_ts_template *Form_pg_ts_template;++/* ----------------+ * compiler constants for pg_ts_template+ * ----------------+ */+#define Natts_pg_ts_template 4+#define Anum_pg_ts_template_tmplname 1+#define Anum_pg_ts_template_tmplnamespace 2+#define Anum_pg_ts_template_tmplinit 3+#define Anum_pg_ts_template_tmpllexize 4++/* ----------------+ * initial contents of pg_ts_template+ * ----------------+ */++DATA(insert OID = 3727 ( "simple" PGNSP dsimple_init dsimple_lexize ));+DESCR("simple dictionary: just lower case and check for stopword");+DATA(insert OID = 3730 ( "synonym" PGNSP dsynonym_init dsynonym_lexize ));+DESCR("synonym dictionary: replace word by its synonym");+DATA(insert OID = 3733 ( "ispell" PGNSP dispell_init dispell_lexize ));+DESCR("ispell dictionary");+DATA(insert OID = 3742 ( "thesaurus" PGNSP thesaurus_init thesaurus_lexize ));+DESCR("thesaurus dictionary: phrase by phrase substitution");++#endif /* PG_TS_TEMPLATE_H */
+ foreign/libpg_query/src/postgres/include/catalog/pg_type.h view
@@ -0,0 +1,738 @@+/*-------------------------------------------------------------------------+ *+ * pg_type.h+ * definition of the system "type" relation (pg_type)+ * along with the relation's initial contents.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/catalog/pg_type.h+ *+ * NOTES+ * the genbki.pl script reads this file and generates .bki+ * information from the DATA() statements.+ *+ *-------------------------------------------------------------------------+ */+#ifndef PG_TYPE_H+#define PG_TYPE_H++#include "catalog/genbki.h"++/* ----------------+ * pg_type definition. cpp turns this into+ * typedef struct FormData_pg_type+ *+ * Some of the values in a pg_type instance are copied into+ * pg_attribute instances. Some parts of Postgres use the pg_type copy,+ * while others use the pg_attribute copy, so they must match.+ * See struct FormData_pg_attribute for details.+ * ----------------+ */+#define TypeRelationId 1247+#define TypeRelation_Rowtype_Id 71++CATALOG(pg_type,1247) BKI_BOOTSTRAP BKI_ROWTYPE_OID(71) BKI_SCHEMA_MACRO+{+ NameData typname; /* type name */+ Oid typnamespace; /* OID of namespace containing this type */+ Oid typowner; /* type owner */++ /*+ * For a fixed-size type, typlen is the number of bytes we use to+ * represent a value of this type, e.g. 4 for an int4. But for a+ * variable-length type, typlen is negative. We use -1 to indicate a+ * "varlena" type (one that has a length word), -2 to indicate a+ * null-terminated C string.+ */+ int16 typlen;++ /*+ * typbyval determines whether internal Postgres routines pass a value of+ * this type by value or by reference. typbyval had better be FALSE if+ * the length is not 1, 2, or 4 (or 8 on 8-byte-Datum machines).+ * Variable-length types are always passed by reference. Note that+ * typbyval can be false even if the length would allow pass-by-value;+ * this is currently true for type float4, for example.+ */+ bool typbyval;++ /*+ * typtype is 'b' for a base type, 'c' for a composite type (e.g., a+ * table's rowtype), 'd' for a domain, 'e' for an enum type, 'p' for a+ * pseudo-type, or 'r' for a range type. (Use the TYPTYPE macros below.)+ *+ * If typtype is 'c', typrelid is the OID of the class' entry in pg_class.+ */+ char typtype;++ /*+ * typcategory and typispreferred help the parser distinguish preferred+ * and non-preferred coercions. The category can be any single ASCII+ * character (but not \0). The categories used for built-in types are+ * identified by the TYPCATEGORY macros below.+ */+ char typcategory; /* arbitrary type classification */++ bool typispreferred; /* is type "preferred" within its category? */++ /*+ * If typisdefined is false, the entry is only a placeholder (forward+ * reference). We know the type name, but not yet anything else about it.+ */+ bool typisdefined;++ char typdelim; /* delimiter for arrays of this type */++ Oid typrelid; /* 0 if not a composite type */++ /*+ * If typelem is not 0 then it identifies another row in pg_type. The+ * current type can then be subscripted like an array yielding values of+ * type typelem. A non-zero typelem does not guarantee this type to be a+ * "real" array type; some ordinary fixed-length types can also be+ * subscripted (e.g., name, point). Variable-length types can *not* be+ * turned into pseudo-arrays like that. Hence, the way to determine+ * whether a type is a "true" array type is if:+ *+ * typelem != 0 and typlen == -1.+ */+ Oid typelem;++ /*+ * If there is a "true" array type having this type as element type,+ * typarray links to it. Zero if no associated "true" array type.+ */+ Oid typarray;++ /*+ * I/O conversion procedures for the datatype.+ */+ regproc typinput; /* text format (required) */+ regproc typoutput;+ regproc typreceive; /* binary format (optional) */+ regproc typsend;++ /*+ * I/O functions for optional type modifiers.+ */+ regproc typmodin;+ regproc typmodout;++ /*+ * Custom ANALYZE procedure for the datatype (0 selects the default).+ */+ regproc typanalyze;++ /* ----------------+ * typalign is the alignment required when storing a value of this+ * type. It applies to storage on disk as well as most+ * representations of the value inside Postgres. When multiple values+ * are stored consecutively, such as in the representation of a+ * complete row on disk, padding is inserted before a datum of this+ * type so that it begins on the specified boundary. The alignment+ * reference is the beginning of the first datum in the sequence.+ *+ * 'c' = CHAR alignment, ie no alignment needed.+ * 's' = SHORT alignment (2 bytes on most machines).+ * 'i' = INT alignment (4 bytes on most machines).+ * 'd' = DOUBLE alignment (8 bytes on many machines, but by no means all).+ *+ * See include/access/tupmacs.h for the macros that compute these+ * alignment requirements. Note also that we allow the nominal alignment+ * to be violated when storing "packed" varlenas; the TOAST mechanism+ * takes care of hiding that from most code.+ *+ * NOTE: for types used in system tables, it is critical that the+ * size and alignment defined in pg_type agree with the way that the+ * compiler will lay out the field in a struct representing a table row.+ * ----------------+ */+ char typalign;++ /* ----------------+ * typstorage tells if the type is prepared for toasting and what+ * the default strategy for attributes of this type should be.+ *+ * 'p' PLAIN type not prepared for toasting+ * 'e' EXTERNAL external storage possible, don't try to compress+ * 'x' EXTENDED try to compress and store external if required+ * 'm' MAIN like 'x' but try to keep in main tuple+ * ----------------+ */+ char typstorage;++ /*+ * This flag represents a "NOT NULL" constraint against this datatype.+ *+ * If true, the attnotnull column for a corresponding table column using+ * this datatype will always enforce the NOT NULL constraint.+ *+ * Used primarily for domain types.+ */+ bool typnotnull;++ /*+ * Domains use typbasetype to show the base (or domain) type that the+ * domain is based on. Zero if the type is not a domain.+ */+ Oid typbasetype;++ /*+ * Domains use typtypmod to record the typmod to be applied to their base+ * type (-1 if base type does not use a typmod). -1 if this type is not a+ * domain.+ */+ int32 typtypmod;++ /*+ * typndims is the declared number of dimensions for an array domain type+ * (i.e., typbasetype is an array type). Otherwise zero.+ */+ int32 typndims;++ /*+ * Collation: 0 if type cannot use collations, DEFAULT_COLLATION_OID for+ * collatable base types, possibly other OID for domains+ */+ Oid typcollation;++#ifdef CATALOG_VARLEN /* variable-length fields start here */++ /*+ * If typdefaultbin is not NULL, it is the nodeToString representation of+ * a default expression for the type. Currently this is only used for+ * domains.+ */+ pg_node_tree typdefaultbin;++ /*+ * typdefault is NULL if the type has no associated default value. If+ * typdefaultbin is not NULL, typdefault must contain a human-readable+ * version of the default expression represented by typdefaultbin. If+ * typdefaultbin is NULL and typdefault is not, then typdefault is the+ * external representation of the type's default value, which may be fed+ * to the type's input converter to produce a constant.+ */+ text typdefault;++ /*+ * Access permissions+ */+ aclitem typacl[1];+#endif+} FormData_pg_type;++/* ----------------+ * Form_pg_type corresponds to a pointer to a row with+ * the format of pg_type relation.+ * ----------------+ */+typedef FormData_pg_type *Form_pg_type;++/* ----------------+ * compiler constants for pg_type+ * ----------------+ */+#define Natts_pg_type 30+#define Anum_pg_type_typname 1+#define Anum_pg_type_typnamespace 2+#define Anum_pg_type_typowner 3+#define Anum_pg_type_typlen 4+#define Anum_pg_type_typbyval 5+#define Anum_pg_type_typtype 6+#define Anum_pg_type_typcategory 7+#define Anum_pg_type_typispreferred 8+#define Anum_pg_type_typisdefined 9+#define Anum_pg_type_typdelim 10+#define Anum_pg_type_typrelid 11+#define Anum_pg_type_typelem 12+#define Anum_pg_type_typarray 13+#define Anum_pg_type_typinput 14+#define Anum_pg_type_typoutput 15+#define Anum_pg_type_typreceive 16+#define Anum_pg_type_typsend 17+#define Anum_pg_type_typmodin 18+#define Anum_pg_type_typmodout 19+#define Anum_pg_type_typanalyze 20+#define Anum_pg_type_typalign 21+#define Anum_pg_type_typstorage 22+#define Anum_pg_type_typnotnull 23+#define Anum_pg_type_typbasetype 24+#define Anum_pg_type_typtypmod 25+#define Anum_pg_type_typndims 26+#define Anum_pg_type_typcollation 27+#define Anum_pg_type_typdefaultbin 28+#define Anum_pg_type_typdefault 29+#define Anum_pg_type_typacl 30+++/* ----------------+ * initial contents of pg_type+ * ----------------+ */++/*+ * Keep the following ordered by OID so that later changes can be made more+ * easily.+ *+ * For types used in the system catalogs, make sure the values here match+ * TypInfo[] in bootstrap.c.+ */++/* OIDS 1 - 99 */+DATA(insert OID = 16 ( bool PGNSP PGUID 1 t b B t t \054 0 0 1000 boolin boolout boolrecv boolsend - - - c p f 0 -1 0 0 _null_ _null_ _null_ ));+DESCR("boolean, 'true'/'false'");+#define BOOLOID 16++DATA(insert OID = 17 ( bytea PGNSP PGUID -1 f b U f t \054 0 0 1001 byteain byteaout bytearecv byteasend - - - i x f 0 -1 0 0 _null_ _null_ _null_ ));+DESCR("variable-length string, binary values escaped");+#define BYTEAOID 17++DATA(insert OID = 18 ( char PGNSP PGUID 1 t b S f t \054 0 0 1002 charin charout charrecv charsend - - - c p f 0 -1 0 0 _null_ _null_ _null_ ));+DESCR("single character");+#define CHAROID 18++DATA(insert OID = 19 ( name PGNSP PGUID NAMEDATALEN f b S f t \054 0 18 1003 namein nameout namerecv namesend - - - c p f 0 -1 0 0 _null_ _null_ _null_ ));+DESCR("63-byte type for storing system identifiers");+#define NAMEOID 19++DATA(insert OID = 20 ( int8 PGNSP PGUID 8 FLOAT8PASSBYVAL b N f t \054 0 0 1016 int8in int8out int8recv int8send - - - d p f 0 -1 0 0 _null_ _null_ _null_ ));+DESCR("~18 digit integer, 8-byte storage");+#define INT8OID 20++DATA(insert OID = 21 ( int2 PGNSP PGUID 2 t b N f t \054 0 0 1005 int2in int2out int2recv int2send - - - s p f 0 -1 0 0 _null_ _null_ _null_ ));+DESCR("-32 thousand to 32 thousand, 2-byte storage");+#define INT2OID 21++DATA(insert OID = 22 ( int2vector PGNSP PGUID -1 f b A f t \054 0 21 1006 int2vectorin int2vectorout int2vectorrecv int2vectorsend - - - i p f 0 -1 0 0 _null_ _null_ _null_ ));+DESCR("array of int2, used in system tables");+#define INT2VECTOROID 22++DATA(insert OID = 23 ( int4 PGNSP PGUID 4 t b N f t \054 0 0 1007 int4in int4out int4recv int4send - - - i p f 0 -1 0 0 _null_ _null_ _null_ ));+DESCR("-2 billion to 2 billion integer, 4-byte storage");+#define INT4OID 23++DATA(insert OID = 24 ( regproc PGNSP PGUID 4 t b N f t \054 0 0 1008 regprocin regprocout regprocrecv regprocsend - - - i p f 0 -1 0 0 _null_ _null_ _null_ ));+DESCR("registered procedure");+#define REGPROCOID 24++DATA(insert OID = 25 ( text PGNSP PGUID -1 f b S t t \054 0 0 1009 textin textout textrecv textsend - - - i x f 0 -1 0 100 _null_ _null_ _null_ ));+DESCR("variable-length string, no limit specified");+#define TEXTOID 25++DATA(insert OID = 26 ( oid PGNSP PGUID 4 t b N t t \054 0 0 1028 oidin oidout oidrecv oidsend - - - i p f 0 -1 0 0 _null_ _null_ _null_ ));+DESCR("object identifier(oid), maximum 4 billion");+#define OIDOID 26++DATA(insert OID = 27 ( tid PGNSP PGUID 6 f b U f t \054 0 0 1010 tidin tidout tidrecv tidsend - - - s p f 0 -1 0 0 _null_ _null_ _null_ ));+DESCR("(block, offset), physical location of tuple");+#define TIDOID 27++DATA(insert OID = 28 ( xid PGNSP PGUID 4 t b U f t \054 0 0 1011 xidin xidout xidrecv xidsend - - - i p f 0 -1 0 0 _null_ _null_ _null_ ));+DESCR("transaction id");+#define XIDOID 28++DATA(insert OID = 29 ( cid PGNSP PGUID 4 t b U f t \054 0 0 1012 cidin cidout cidrecv cidsend - - - i p f 0 -1 0 0 _null_ _null_ _null_ ));+DESCR("command identifier type, sequence in transaction id");+#define CIDOID 29++DATA(insert OID = 30 ( oidvector PGNSP PGUID -1 f b A f t \054 0 26 1013 oidvectorin oidvectorout oidvectorrecv oidvectorsend - - - i p f 0 -1 0 0 _null_ _null_ _null_ ));+DESCR("array of oids, used in system tables");+#define OIDVECTOROID 30++/* hand-built rowtype entries for bootstrapped catalogs */+/* NB: OIDs assigned here must match the BKI_ROWTYPE_OID declarations */++DATA(insert OID = 71 ( pg_type PGNSP PGUID -1 f c C f t \054 1247 0 0 record_in record_out record_recv record_send - - - d x f 0 -1 0 0 _null_ _null_ _null_ ));+DATA(insert OID = 75 ( pg_attribute PGNSP PGUID -1 f c C f t \054 1249 0 0 record_in record_out record_recv record_send - - - d x f 0 -1 0 0 _null_ _null_ _null_ ));+DATA(insert OID = 81 ( pg_proc PGNSP PGUID -1 f c C f t \054 1255 0 0 record_in record_out record_recv record_send - - - d x f 0 -1 0 0 _null_ _null_ _null_ ));+DATA(insert OID = 83 ( pg_class PGNSP PGUID -1 f c C f t \054 1259 0 0 record_in record_out record_recv record_send - - - d x f 0 -1 0 0 _null_ _null_ _null_ ));++/* OIDS 100 - 199 */+DATA(insert OID = 114 ( json PGNSP PGUID -1 f b U f t \054 0 0 199 json_in json_out json_recv json_send - - - i x f 0 -1 0 0 _null_ _null_ _null_ ));+#define JSONOID 114+DATA(insert OID = 142 ( xml PGNSP PGUID -1 f b U f t \054 0 0 143 xml_in xml_out xml_recv xml_send - - - i x f 0 -1 0 0 _null_ _null_ _null_ ));+DESCR("XML content");+#define XMLOID 142+DATA(insert OID = 143 ( _xml PGNSP PGUID -1 f b A f t \054 0 142 0 array_in array_out array_recv array_send - - array_typanalyze i x f 0 -1 0 0 _null_ _null_ _null_ ));+DATA(insert OID = 199 ( _json PGNSP PGUID -1 f b A f t \054 0 114 0 array_in array_out array_recv array_send - - array_typanalyze i x f 0 -1 0 0 _null_ _null_ _null_ ));++DATA(insert OID = 194 ( pg_node_tree PGNSP PGUID -1 f b S f t \054 0 0 0 pg_node_tree_in pg_node_tree_out pg_node_tree_recv pg_node_tree_send - - - i x f 0 -1 0 100 _null_ _null_ _null_ ));+DESCR("string representing an internal node tree");+#define PGNODETREEOID 194++DATA(insert OID = 32 ( pg_ddl_command PGNSP PGUID SIZEOF_POINTER t p P f t \054 0 0 0 pg_ddl_command_in pg_ddl_command_out pg_ddl_command_recv pg_ddl_command_send - - - ALIGNOF_POINTER p f 0 -1 0 0 _null_ _null_ _null_ ));+DESCR("internal type for passing CollectedCommand");+#define PGDDLCOMMANDOID 32++/* OIDS 200 - 299 */++DATA(insert OID = 210 ( smgr PGNSP PGUID 2 t b U f t \054 0 0 0 smgrin smgrout - - - - - s p f 0 -1 0 0 _null_ _null_ _null_ ));+DESCR("storage manager");++/* OIDS 300 - 399 */++/* OIDS 400 - 499 */++/* OIDS 500 - 599 */++/* OIDS 600 - 699 */+DATA(insert OID = 600 ( point PGNSP PGUID 16 f b G f t \054 0 701 1017 point_in point_out point_recv point_send - - - d p f 0 -1 0 0 _null_ _null_ _null_ ));+DESCR("geometric point '(x, y)'");+#define POINTOID 600+DATA(insert OID = 601 ( lseg PGNSP PGUID 32 f b G f t \054 0 600 1018 lseg_in lseg_out lseg_recv lseg_send - - - d p f 0 -1 0 0 _null_ _null_ _null_ ));+DESCR("geometric line segment '(pt1,pt2)'");+#define LSEGOID 601+DATA(insert OID = 602 ( path PGNSP PGUID -1 f b G f t \054 0 0 1019 path_in path_out path_recv path_send - - - d x f 0 -1 0 0 _null_ _null_ _null_ ));+DESCR("geometric path '(pt1,...)'");+#define PATHOID 602+DATA(insert OID = 603 ( box PGNSP PGUID 32 f b G f t \073 0 600 1020 box_in box_out box_recv box_send - - - d p f 0 -1 0 0 _null_ _null_ _null_ ));+DESCR("geometric box '(lower left,upper right)'");+#define BOXOID 603+DATA(insert OID = 604 ( polygon PGNSP PGUID -1 f b G f t \054 0 0 1027 poly_in poly_out poly_recv poly_send - - - d x f 0 -1 0 0 _null_ _null_ _null_ ));+DESCR("geometric polygon '(pt1,...)'");+#define POLYGONOID 604++DATA(insert OID = 628 ( line PGNSP PGUID 24 f b G f t \054 0 701 629 line_in line_out line_recv line_send - - - d p f 0 -1 0 0 _null_ _null_ _null_ ));+DESCR("geometric line");+#define LINEOID 628+DATA(insert OID = 629 ( _line PGNSP PGUID -1 f b A f t \054 0 628 0 array_in array_out array_recv array_send - - array_typanalyze d x f 0 -1 0 0 _null_ _null_ _null_ ));++/* OIDS 700 - 799 */++DATA(insert OID = 700 ( float4 PGNSP PGUID 4 FLOAT4PASSBYVAL b N f t \054 0 0 1021 float4in float4out float4recv float4send - - - i p f 0 -1 0 0 _null_ _null_ _null_ ));+DESCR("single-precision floating point number, 4-byte storage");+#define FLOAT4OID 700+DATA(insert OID = 701 ( float8 PGNSP PGUID 8 FLOAT8PASSBYVAL b N t t \054 0 0 1022 float8in float8out float8recv float8send - - - d p f 0 -1 0 0 _null_ _null_ _null_ ));+DESCR("double-precision floating point number, 8-byte storage");+#define FLOAT8OID 701+DATA(insert OID = 702 ( abstime PGNSP PGUID 4 t b D f t \054 0 0 1023 abstimein abstimeout abstimerecv abstimesend - - - i p f 0 -1 0 0 _null_ _null_ _null_ ));+DESCR("absolute, limited-range date and time (Unix system time)");+#define ABSTIMEOID 702+DATA(insert OID = 703 ( reltime PGNSP PGUID 4 t b T f t \054 0 0 1024 reltimein reltimeout reltimerecv reltimesend - - - i p f 0 -1 0 0 _null_ _null_ _null_ ));+DESCR("relative, limited-range time interval (Unix delta time)");+#define RELTIMEOID 703+DATA(insert OID = 704 ( tinterval PGNSP PGUID 12 f b T f t \054 0 0 1025 tintervalin tintervalout tintervalrecv tintervalsend - - - i p f 0 -1 0 0 _null_ _null_ _null_ ));+DESCR("(abstime,abstime), time interval");+#define TINTERVALOID 704+DATA(insert OID = 705 ( unknown PGNSP PGUID -2 f b X f t \054 0 0 0 unknownin unknownout unknownrecv unknownsend - - - c p f 0 -1 0 0 _null_ _null_ _null_ ));+DESCR("");+#define UNKNOWNOID 705++DATA(insert OID = 718 ( circle PGNSP PGUID 24 f b G f t \054 0 0 719 circle_in circle_out circle_recv circle_send - - - d p f 0 -1 0 0 _null_ _null_ _null_ ));+DESCR("geometric circle '(center,radius)'");+#define CIRCLEOID 718+DATA(insert OID = 719 ( _circle PGNSP PGUID -1 f b A f t \054 0 718 0 array_in array_out array_recv array_send - - array_typanalyze d x f 0 -1 0 0 _null_ _null_ _null_ ));+DATA(insert OID = 790 ( money PGNSP PGUID 8 FLOAT8PASSBYVAL b N f t \054 0 0 791 cash_in cash_out cash_recv cash_send - - - d p f 0 -1 0 0 _null_ _null_ _null_ ));+DESCR("monetary amounts, $d,ddd.cc");+#define CASHOID 790+DATA(insert OID = 791 ( _money PGNSP PGUID -1 f b A f t \054 0 790 0 array_in array_out array_recv array_send - - array_typanalyze d x f 0 -1 0 0 _null_ _null_ _null_ ));++/* OIDS 800 - 899 */+DATA(insert OID = 829 ( macaddr PGNSP PGUID 6 f b U f t \054 0 0 1040 macaddr_in macaddr_out macaddr_recv macaddr_send - - - i p f 0 -1 0 0 _null_ _null_ _null_ ));+DESCR("XX:XX:XX:XX:XX:XX, MAC address");+#define MACADDROID 829+DATA(insert OID = 869 ( inet PGNSP PGUID -1 f b I t t \054 0 0 1041 inet_in inet_out inet_recv inet_send - - - i m f 0 -1 0 0 _null_ _null_ _null_ ));+DESCR("IP address/netmask, host address, netmask optional");+#define INETOID 869+DATA(insert OID = 650 ( cidr PGNSP PGUID -1 f b I f t \054 0 0 651 cidr_in cidr_out cidr_recv cidr_send - - - i m f 0 -1 0 0 _null_ _null_ _null_ ));+DESCR("network IP address/netmask, network address");+#define CIDROID 650++/* OIDS 900 - 999 */++/* OIDS 1000 - 1099 */+DATA(insert OID = 1000 ( _bool PGNSP PGUID -1 f b A f t \054 0 16 0 array_in array_out array_recv array_send - - array_typanalyze i x f 0 -1 0 0 _null_ _null_ _null_ ));+DATA(insert OID = 1001 ( _bytea PGNSP PGUID -1 f b A f t \054 0 17 0 array_in array_out array_recv array_send - - array_typanalyze i x f 0 -1 0 0 _null_ _null_ _null_ ));+DATA(insert OID = 1002 ( _char PGNSP PGUID -1 f b A f t \054 0 18 0 array_in array_out array_recv array_send - - array_typanalyze i x f 0 -1 0 0 _null_ _null_ _null_ ));+DATA(insert OID = 1003 ( _name PGNSP PGUID -1 f b A f t \054 0 19 0 array_in array_out array_recv array_send - - array_typanalyze i x f 0 -1 0 0 _null_ _null_ _null_ ));+DATA(insert OID = 1005 ( _int2 PGNSP PGUID -1 f b A f t \054 0 21 0 array_in array_out array_recv array_send - - array_typanalyze i x f 0 -1 0 0 _null_ _null_ _null_ ));+#define INT2ARRAYOID 1005+DATA(insert OID = 1006 ( _int2vector PGNSP PGUID -1 f b A f t \054 0 22 0 array_in array_out array_recv array_send - - array_typanalyze i x f 0 -1 0 0 _null_ _null_ _null_ ));+DATA(insert OID = 1007 ( _int4 PGNSP PGUID -1 f b A f t \054 0 23 0 array_in array_out array_recv array_send - - array_typanalyze i x f 0 -1 0 0 _null_ _null_ _null_ ));+#define INT4ARRAYOID 1007+DATA(insert OID = 1008 ( _regproc PGNSP PGUID -1 f b A f t \054 0 24 0 array_in array_out array_recv array_send - - array_typanalyze i x f 0 -1 0 0 _null_ _null_ _null_ ));+DATA(insert OID = 1009 ( _text PGNSP PGUID -1 f b A f t \054 0 25 0 array_in array_out array_recv array_send - - array_typanalyze i x f 0 -1 0 100 _null_ _null_ _null_ ));+#define TEXTARRAYOID 1009+DATA(insert OID = 1028 ( _oid PGNSP PGUID -1 f b A f t \054 0 26 0 array_in array_out array_recv array_send - - array_typanalyze i x f 0 -1 0 0 _null_ _null_ _null_ ));+#define OIDARRAYOID 1028+DATA(insert OID = 1010 ( _tid PGNSP PGUID -1 f b A f t \054 0 27 0 array_in array_out array_recv array_send - - array_typanalyze i x f 0 -1 0 0 _null_ _null_ _null_ ));+DATA(insert OID = 1011 ( _xid PGNSP PGUID -1 f b A f t \054 0 28 0 array_in array_out array_recv array_send - - array_typanalyze i x f 0 -1 0 0 _null_ _null_ _null_ ));+DATA(insert OID = 1012 ( _cid PGNSP PGUID -1 f b A f t \054 0 29 0 array_in array_out array_recv array_send - - array_typanalyze i x f 0 -1 0 0 _null_ _null_ _null_ ));+DATA(insert OID = 1013 ( _oidvector PGNSP PGUID -1 f b A f t \054 0 30 0 array_in array_out array_recv array_send - - array_typanalyze i x f 0 -1 0 0 _null_ _null_ _null_ ));+DATA(insert OID = 1014 ( _bpchar PGNSP PGUID -1 f b A f t \054 0 1042 0 array_in array_out array_recv array_send bpchartypmodin bpchartypmodout array_typanalyze i x f 0 -1 0 100 _null_ _null_ _null_ ));+DATA(insert OID = 1015 ( _varchar PGNSP PGUID -1 f b A f t \054 0 1043 0 array_in array_out array_recv array_send varchartypmodin varchartypmodout array_typanalyze i x f 0 -1 0 100 _null_ _null_ _null_ ));+DATA(insert OID = 1016 ( _int8 PGNSP PGUID -1 f b A f t \054 0 20 0 array_in array_out array_recv array_send - - array_typanalyze d x f 0 -1 0 0 _null_ _null_ _null_ ));+DATA(insert OID = 1017 ( _point PGNSP PGUID -1 f b A f t \054 0 600 0 array_in array_out array_recv array_send - - array_typanalyze d x f 0 -1 0 0 _null_ _null_ _null_ ));+DATA(insert OID = 1018 ( _lseg PGNSP PGUID -1 f b A f t \054 0 601 0 array_in array_out array_recv array_send - - array_typanalyze d x f 0 -1 0 0 _null_ _null_ _null_ ));+DATA(insert OID = 1019 ( _path PGNSP PGUID -1 f b A f t \054 0 602 0 array_in array_out array_recv array_send - - array_typanalyze d x f 0 -1 0 0 _null_ _null_ _null_ ));+DATA(insert OID = 1020 ( _box PGNSP PGUID -1 f b A f t \073 0 603 0 array_in array_out array_recv array_send - - array_typanalyze d x f 0 -1 0 0 _null_ _null_ _null_ ));+DATA(insert OID = 1021 ( _float4 PGNSP PGUID -1 f b A f t \054 0 700 0 array_in array_out array_recv array_send - - array_typanalyze i x f 0 -1 0 0 _null_ _null_ _null_ ));+#define FLOAT4ARRAYOID 1021+DATA(insert OID = 1022 ( _float8 PGNSP PGUID -1 f b A f t \054 0 701 0 array_in array_out array_recv array_send - - array_typanalyze d x f 0 -1 0 0 _null_ _null_ _null_ ));+DATA(insert OID = 1023 ( _abstime PGNSP PGUID -1 f b A f t \054 0 702 0 array_in array_out array_recv array_send - - array_typanalyze i x f 0 -1 0 0 _null_ _null_ _null_ ));+DATA(insert OID = 1024 ( _reltime PGNSP PGUID -1 f b A f t \054 0 703 0 array_in array_out array_recv array_send - - array_typanalyze i x f 0 -1 0 0 _null_ _null_ _null_ ));+DATA(insert OID = 1025 ( _tinterval PGNSP PGUID -1 f b A f t \054 0 704 0 array_in array_out array_recv array_send - - array_typanalyze i x f 0 -1 0 0 _null_ _null_ _null_ ));+DATA(insert OID = 1027 ( _polygon PGNSP PGUID -1 f b A f t \054 0 604 0 array_in array_out array_recv array_send - - array_typanalyze d x f 0 -1 0 0 _null_ _null_ _null_ ));+DATA(insert OID = 1033 ( aclitem PGNSP PGUID 12 f b U f t \054 0 0 1034 aclitemin aclitemout - - - - - i p f 0 -1 0 0 _null_ _null_ _null_ ));+DESCR("access control list");+#define ACLITEMOID 1033+DATA(insert OID = 1034 ( _aclitem PGNSP PGUID -1 f b A f t \054 0 1033 0 array_in array_out array_recv array_send - - array_typanalyze i x f 0 -1 0 0 _null_ _null_ _null_ ));+DATA(insert OID = 1040 ( _macaddr PGNSP PGUID -1 f b A f t \054 0 829 0 array_in array_out array_recv array_send - - array_typanalyze i x f 0 -1 0 0 _null_ _null_ _null_ ));+DATA(insert OID = 1041 ( _inet PGNSP PGUID -1 f b A f t \054 0 869 0 array_in array_out array_recv array_send - - array_typanalyze i x f 0 -1 0 0 _null_ _null_ _null_ ));+DATA(insert OID = 651 ( _cidr PGNSP PGUID -1 f b A f t \054 0 650 0 array_in array_out array_recv array_send - - array_typanalyze i x f 0 -1 0 0 _null_ _null_ _null_ ));+DATA(insert OID = 1263 ( _cstring PGNSP PGUID -1 f b A f t \054 0 2275 0 array_in array_out array_recv array_send - - array_typanalyze i x f 0 -1 0 0 _null_ _null_ _null_ ));+#define CSTRINGARRAYOID 1263++DATA(insert OID = 1042 ( bpchar PGNSP PGUID -1 f b S f t \054 0 0 1014 bpcharin bpcharout bpcharrecv bpcharsend bpchartypmodin bpchartypmodout - i x f 0 -1 0 100 _null_ _null_ _null_ ));+DESCR("char(length), blank-padded string, fixed storage length");+#define BPCHAROID 1042+DATA(insert OID = 1043 ( varchar PGNSP PGUID -1 f b S f t \054 0 0 1015 varcharin varcharout varcharrecv varcharsend varchartypmodin varchartypmodout - i x f 0 -1 0 100 _null_ _null_ _null_ ));+DESCR("varchar(length), non-blank-padded string, variable storage length");+#define VARCHAROID 1043++DATA(insert OID = 1082 ( date PGNSP PGUID 4 t b D f t \054 0 0 1182 date_in date_out date_recv date_send - - - i p f 0 -1 0 0 _null_ _null_ _null_ ));+DESCR("date");+#define DATEOID 1082+DATA(insert OID = 1083 ( time PGNSP PGUID 8 FLOAT8PASSBYVAL b D f t \054 0 0 1183 time_in time_out time_recv time_send timetypmodin timetypmodout - d p f 0 -1 0 0 _null_ _null_ _null_ ));+DESCR("time of day");+#define TIMEOID 1083++/* OIDS 1100 - 1199 */+DATA(insert OID = 1114 ( timestamp PGNSP PGUID 8 FLOAT8PASSBYVAL b D f t \054 0 0 1115 timestamp_in timestamp_out timestamp_recv timestamp_send timestamptypmodin timestamptypmodout - d p f 0 -1 0 0 _null_ _null_ _null_ ));+DESCR("date and time");+#define TIMESTAMPOID 1114+DATA(insert OID = 1115 ( _timestamp PGNSP PGUID -1 f b A f t \054 0 1114 0 array_in array_out array_recv array_send timestamptypmodin timestamptypmodout array_typanalyze d x f 0 -1 0 0 _null_ _null_ _null_ ));+DATA(insert OID = 1182 ( _date PGNSP PGUID -1 f b A f t \054 0 1082 0 array_in array_out array_recv array_send - - array_typanalyze i x f 0 -1 0 0 _null_ _null_ _null_ ));+DATA(insert OID = 1183 ( _time PGNSP PGUID -1 f b A f t \054 0 1083 0 array_in array_out array_recv array_send timetypmodin timetypmodout array_typanalyze d x f 0 -1 0 0 _null_ _null_ _null_ ));+DATA(insert OID = 1184 ( timestamptz PGNSP PGUID 8 FLOAT8PASSBYVAL b D t t \054 0 0 1185 timestamptz_in timestamptz_out timestamptz_recv timestamptz_send timestamptztypmodin timestamptztypmodout - d p f 0 -1 0 0 _null_ _null_ _null_ ));+DESCR("date and time with time zone");+#define TIMESTAMPTZOID 1184+DATA(insert OID = 1185 ( _timestamptz PGNSP PGUID -1 f b A f t \054 0 1184 0 array_in array_out array_recv array_send timestamptztypmodin timestamptztypmodout array_typanalyze d x f 0 -1 0 0 _null_ _null_ _null_ ));+DATA(insert OID = 1186 ( interval PGNSP PGUID 16 f b T t t \054 0 0 1187 interval_in interval_out interval_recv interval_send intervaltypmodin intervaltypmodout - d p f 0 -1 0 0 _null_ _null_ _null_ ));+DESCR("@ <number> <units>, time interval");+#define INTERVALOID 1186+DATA(insert OID = 1187 ( _interval PGNSP PGUID -1 f b A f t \054 0 1186 0 array_in array_out array_recv array_send intervaltypmodin intervaltypmodout array_typanalyze d x f 0 -1 0 0 _null_ _null_ _null_ ));++/* OIDS 1200 - 1299 */+DATA(insert OID = 1231 ( _numeric PGNSP PGUID -1 f b A f t \054 0 1700 0 array_in array_out array_recv array_send numerictypmodin numerictypmodout array_typanalyze i x f 0 -1 0 0 _null_ _null_ _null_ ));+DATA(insert OID = 1266 ( timetz PGNSP PGUID 12 f b D f t \054 0 0 1270 timetz_in timetz_out timetz_recv timetz_send timetztypmodin timetztypmodout - d p f 0 -1 0 0 _null_ _null_ _null_ ));+DESCR("time of day with time zone");+#define TIMETZOID 1266+DATA(insert OID = 1270 ( _timetz PGNSP PGUID -1 f b A f t \054 0 1266 0 array_in array_out array_recv array_send timetztypmodin timetztypmodout array_typanalyze d x f 0 -1 0 0 _null_ _null_ _null_ ));++/* OIDS 1500 - 1599 */+DATA(insert OID = 1560 ( bit PGNSP PGUID -1 f b V f t \054 0 0 1561 bit_in bit_out bit_recv bit_send bittypmodin bittypmodout - i x f 0 -1 0 0 _null_ _null_ _null_ ));+DESCR("fixed-length bit string");+#define BITOID 1560+DATA(insert OID = 1561 ( _bit PGNSP PGUID -1 f b A f t \054 0 1560 0 array_in array_out array_recv array_send bittypmodin bittypmodout array_typanalyze i x f 0 -1 0 0 _null_ _null_ _null_ ));+DATA(insert OID = 1562 ( varbit PGNSP PGUID -1 f b V t t \054 0 0 1563 varbit_in varbit_out varbit_recv varbit_send varbittypmodin varbittypmodout - i x f 0 -1 0 0 _null_ _null_ _null_ ));+DESCR("variable-length bit string");+#define VARBITOID 1562+DATA(insert OID = 1563 ( _varbit PGNSP PGUID -1 f b A f t \054 0 1562 0 array_in array_out array_recv array_send varbittypmodin varbittypmodout array_typanalyze i x f 0 -1 0 0 _null_ _null_ _null_ ));++/* OIDS 1600 - 1699 */++/* OIDS 1700 - 1799 */+DATA(insert OID = 1700 ( numeric PGNSP PGUID -1 f b N f t \054 0 0 1231 numeric_in numeric_out numeric_recv numeric_send numerictypmodin numerictypmodout - i m f 0 -1 0 0 _null_ _null_ _null_ ));+DESCR("numeric(precision, decimal), arbitrary precision number");+#define NUMERICOID 1700++DATA(insert OID = 1790 ( refcursor PGNSP PGUID -1 f b U f t \054 0 0 2201 textin textout textrecv textsend - - - i x f 0 -1 0 0 _null_ _null_ _null_ ));+DESCR("reference to cursor (portal name)");+#define REFCURSOROID 1790++/* OIDS 2200 - 2299 */+DATA(insert OID = 2201 ( _refcursor PGNSP PGUID -1 f b A f t \054 0 1790 0 array_in array_out array_recv array_send - - array_typanalyze i x f 0 -1 0 0 _null_ _null_ _null_ ));++DATA(insert OID = 2202 ( regprocedure PGNSP PGUID 4 t b N f t \054 0 0 2207 regprocedurein regprocedureout regprocedurerecv regproceduresend - - - i p f 0 -1 0 0 _null_ _null_ _null_ ));+DESCR("registered procedure (with args)");+#define REGPROCEDUREOID 2202++DATA(insert OID = 2203 ( regoper PGNSP PGUID 4 t b N f t \054 0 0 2208 regoperin regoperout regoperrecv regopersend - - - i p f 0 -1 0 0 _null_ _null_ _null_ ));+DESCR("registered operator");+#define REGOPEROID 2203++DATA(insert OID = 2204 ( regoperator PGNSP PGUID 4 t b N f t \054 0 0 2209 regoperatorin regoperatorout regoperatorrecv regoperatorsend - - - i p f 0 -1 0 0 _null_ _null_ _null_ ));+DESCR("registered operator (with args)");+#define REGOPERATOROID 2204++DATA(insert OID = 2205 ( regclass PGNSP PGUID 4 t b N f t \054 0 0 2210 regclassin regclassout regclassrecv regclasssend - - - i p f 0 -1 0 0 _null_ _null_ _null_ ));+DESCR("registered class");+#define REGCLASSOID 2205++DATA(insert OID = 2206 ( regtype PGNSP PGUID 4 t b N f t \054 0 0 2211 regtypein regtypeout regtyperecv regtypesend - - - i p f 0 -1 0 0 _null_ _null_ _null_ ));+DESCR("registered type");+#define REGTYPEOID 2206++DATA(insert OID = 4096 ( regrole PGNSP PGUID 4 t b N f t \054 0 0 4097 regrolein regroleout regrolerecv regrolesend - - - i p f 0 -1 0 0 _null_ _null_ _null_ ));+DESCR("registered role");+#define REGROLEOID 4096++DATA(insert OID = 4089 ( regnamespace PGNSP PGUID 4 t b N f t \054 0 0 4090 regnamespacein regnamespaceout regnamespacerecv regnamespacesend - - - i p f 0 -1 0 0 _null_ _null_ _null_ ));+DESCR("registered namespace");+#define REGNAMESPACEOID 4089++DATA(insert OID = 2207 ( _regprocedure PGNSP PGUID -1 f b A f t \054 0 2202 0 array_in array_out array_recv array_send - - array_typanalyze i x f 0 -1 0 0 _null_ _null_ _null_ ));+DATA(insert OID = 2208 ( _regoper PGNSP PGUID -1 f b A f t \054 0 2203 0 array_in array_out array_recv array_send - - array_typanalyze i x f 0 -1 0 0 _null_ _null_ _null_ ));+DATA(insert OID = 2209 ( _regoperator PGNSP PGUID -1 f b A f t \054 0 2204 0 array_in array_out array_recv array_send - - array_typanalyze i x f 0 -1 0 0 _null_ _null_ _null_ ));+DATA(insert OID = 2210 ( _regclass PGNSP PGUID -1 f b A f t \054 0 2205 0 array_in array_out array_recv array_send - - array_typanalyze i x f 0 -1 0 0 _null_ _null_ _null_ ));+DATA(insert OID = 2211 ( _regtype PGNSP PGUID -1 f b A f t \054 0 2206 0 array_in array_out array_recv array_send - - array_typanalyze i x f 0 -1 0 0 _null_ _null_ _null_ ));+#define REGTYPEARRAYOID 2211+DATA(insert OID = 4097 ( _regrole PGNSP PGUID -1 f b A f t \054 0 4096 0 array_in array_out array_recv array_send - - array_typanalyze i x f 0 -1 0 0 _null_ _null_ _null_ ));+DATA(insert OID = 4090 ( _regnamespace PGNSP PGUID -1 f b A f t \054 0 4089 0 array_in array_out array_recv array_send - - array_typanalyze i x f 0 -1 0 0 _null_ _null_ _null_ ));++/* uuid */+DATA(insert OID = 2950 ( uuid PGNSP PGUID 16 f b U f t \054 0 0 2951 uuid_in uuid_out uuid_recv uuid_send - - - c p f 0 -1 0 0 _null_ _null_ _null_ ));+DESCR("UUID datatype");+#define UUIDOID 2950+DATA(insert OID = 2951 ( _uuid PGNSP PGUID -1 f b A f t \054 0 2950 0 array_in array_out array_recv array_send - - array_typanalyze i x f 0 -1 0 0 _null_ _null_ _null_ ));++/* pg_lsn */+DATA(insert OID = 3220 ( pg_lsn PGNSP PGUID 8 FLOAT8PASSBYVAL b U f t \054 0 0 3221 pg_lsn_in pg_lsn_out pg_lsn_recv pg_lsn_send - - - d p f 0 -1 0 0 _null_ _null_ _null_ ));+DESCR("PostgreSQL LSN datatype");+#define LSNOID 3220+DATA(insert OID = 3221 ( _pg_lsn PGNSP PGUID -1 f b A f t \054 0 3220 0 array_in array_out array_recv array_send - - array_typanalyze d x f 0 -1 0 0 _null_ _null_ _null_ ));++/* text search */+DATA(insert OID = 3614 ( tsvector PGNSP PGUID -1 f b U f t \054 0 0 3643 tsvectorin tsvectorout tsvectorrecv tsvectorsend - - ts_typanalyze i x f 0 -1 0 0 _null_ _null_ _null_ ));+DESCR("text representation for text search");+#define TSVECTOROID 3614+DATA(insert OID = 3642 ( gtsvector PGNSP PGUID -1 f b U f t \054 0 0 3644 gtsvectorin gtsvectorout - - - - - i p f 0 -1 0 0 _null_ _null_ _null_ ));+DESCR("GiST index internal text representation for text search");+#define GTSVECTOROID 3642+DATA(insert OID = 3615 ( tsquery PGNSP PGUID -1 f b U f t \054 0 0 3645 tsqueryin tsqueryout tsqueryrecv tsquerysend - - - i p f 0 -1 0 0 _null_ _null_ _null_ ));+DESCR("query representation for text search");+#define TSQUERYOID 3615+DATA(insert OID = 3734 ( regconfig PGNSP PGUID 4 t b N f t \054 0 0 3735 regconfigin regconfigout regconfigrecv regconfigsend - - - i p f 0 -1 0 0 _null_ _null_ _null_ ));+DESCR("registered text search configuration");+#define REGCONFIGOID 3734+DATA(insert OID = 3769 ( regdictionary PGNSP PGUID 4 t b N f t \054 0 0 3770 regdictionaryin regdictionaryout regdictionaryrecv regdictionarysend - - - i p f 0 -1 0 0 _null_ _null_ _null_ ));+DESCR("registered text search dictionary");+#define REGDICTIONARYOID 3769++DATA(insert OID = 3643 ( _tsvector PGNSP PGUID -1 f b A f t \054 0 3614 0 array_in array_out array_recv array_send - - array_typanalyze i x f 0 -1 0 0 _null_ _null_ _null_ ));+DATA(insert OID = 3644 ( _gtsvector PGNSP PGUID -1 f b A f t \054 0 3642 0 array_in array_out array_recv array_send - - array_typanalyze i x f 0 -1 0 0 _null_ _null_ _null_ ));+DATA(insert OID = 3645 ( _tsquery PGNSP PGUID -1 f b A f t \054 0 3615 0 array_in array_out array_recv array_send - - array_typanalyze i x f 0 -1 0 0 _null_ _null_ _null_ ));+DATA(insert OID = 3735 ( _regconfig PGNSP PGUID -1 f b A f t \054 0 3734 0 array_in array_out array_recv array_send - - array_typanalyze i x f 0 -1 0 0 _null_ _null_ _null_ ));+DATA(insert OID = 3770 ( _regdictionary PGNSP PGUID -1 f b A f t \054 0 3769 0 array_in array_out array_recv array_send - - array_typanalyze i x f 0 -1 0 0 _null_ _null_ _null_ ));++/* jsonb */+DATA(insert OID = 3802 ( jsonb PGNSP PGUID -1 f b U f t \054 0 0 3807 jsonb_in jsonb_out jsonb_recv jsonb_send - - - i x f 0 -1 0 0 _null_ _null_ _null_ ));+DESCR("Binary JSON");+#define JSONBOID 3802+DATA(insert OID = 3807 ( _jsonb PGNSP PGUID -1 f b A f t \054 0 3802 0 array_in array_out array_recv array_send - - array_typanalyze i x f 0 -1 0 0 _null_ _null_ _null_ ));++DATA(insert OID = 2970 ( txid_snapshot PGNSP PGUID -1 f b U f t \054 0 0 2949 txid_snapshot_in txid_snapshot_out txid_snapshot_recv txid_snapshot_send - - - d x f 0 -1 0 0 _null_ _null_ _null_ ));+DESCR("txid snapshot");+DATA(insert OID = 2949 ( _txid_snapshot PGNSP PGUID -1 f b A f t \054 0 2970 0 array_in array_out array_recv array_send - - array_typanalyze d x f 0 -1 0 0 _null_ _null_ _null_ ));++/* range types */+DATA(insert OID = 3904 ( int4range PGNSP PGUID -1 f r R f t \054 0 0 3905 range_in range_out range_recv range_send - - range_typanalyze i x f 0 -1 0 0 _null_ _null_ _null_ ));+DESCR("range of integers");+#define INT4RANGEOID 3904+DATA(insert OID = 3905 ( _int4range PGNSP PGUID -1 f b A f t \054 0 3904 0 array_in array_out array_recv array_send - - array_typanalyze i x f 0 -1 0 0 _null_ _null_ _null_ ));+DATA(insert OID = 3906 ( numrange PGNSP PGUID -1 f r R f t \054 0 0 3907 range_in range_out range_recv range_send - - range_typanalyze i x f 0 -1 0 0 _null_ _null_ _null_ ));+DESCR("range of numerics");+DATA(insert OID = 3907 ( _numrange PGNSP PGUID -1 f b A f t \054 0 3906 0 array_in array_out array_recv array_send - - array_typanalyze i x f 0 -1 0 0 _null_ _null_ _null_ ));+DATA(insert OID = 3908 ( tsrange PGNSP PGUID -1 f r R f t \054 0 0 3909 range_in range_out range_recv range_send - - range_typanalyze d x f 0 -1 0 0 _null_ _null_ _null_ ));+DESCR("range of timestamps without time zone");+DATA(insert OID = 3909 ( _tsrange PGNSP PGUID -1 f b A f t \054 0 3908 0 array_in array_out array_recv array_send - - array_typanalyze d x f 0 -1 0 0 _null_ _null_ _null_ ));+DATA(insert OID = 3910 ( tstzrange PGNSP PGUID -1 f r R f t \054 0 0 3911 range_in range_out range_recv range_send - - range_typanalyze d x f 0 -1 0 0 _null_ _null_ _null_ ));+DESCR("range of timestamps with time zone");+DATA(insert OID = 3911 ( _tstzrange PGNSP PGUID -1 f b A f t \054 0 3910 0 array_in array_out array_recv array_send - - array_typanalyze d x f 0 -1 0 0 _null_ _null_ _null_ ));+DATA(insert OID = 3912 ( daterange PGNSP PGUID -1 f r R f t \054 0 0 3913 range_in range_out range_recv range_send - - range_typanalyze i x f 0 -1 0 0 _null_ _null_ _null_ ));+DESCR("range of dates");+DATA(insert OID = 3913 ( _daterange PGNSP PGUID -1 f b A f t \054 0 3912 0 array_in array_out array_recv array_send - - array_typanalyze i x f 0 -1 0 0 _null_ _null_ _null_ ));+DATA(insert OID = 3926 ( int8range PGNSP PGUID -1 f r R f t \054 0 0 3927 range_in range_out range_recv range_send - - range_typanalyze d x f 0 -1 0 0 _null_ _null_ _null_ ));+DESCR("range of bigints");+DATA(insert OID = 3927 ( _int8range PGNSP PGUID -1 f b A f t \054 0 3926 0 array_in array_out array_recv array_send - - array_typanalyze d x f 0 -1 0 0 _null_ _null_ _null_ ));++/*+ * pseudo-types+ *+ * types with typtype='p' represent various special cases in the type system.+ *+ * These cannot be used to define table columns, but are valid as function+ * argument and result types (if supported by the function's implementation+ * language).+ *+ * Note: cstring is a borderline case; it is still considered a pseudo-type,+ * but there is now support for it in records and arrays. Perhaps we should+ * just treat it as a regular base type?+ */+DATA(insert OID = 2249 ( record PGNSP PGUID -1 f p P f t \054 0 0 2287 record_in record_out record_recv record_send - - - d x f 0 -1 0 0 _null_ _null_ _null_ ));+#define RECORDOID 2249+DATA(insert OID = 2287 ( _record PGNSP PGUID -1 f p P f t \054 0 2249 0 array_in array_out array_recv array_send - - array_typanalyze d x f 0 -1 0 0 _null_ _null_ _null_ ));+#define RECORDARRAYOID 2287+DATA(insert OID = 2275 ( cstring PGNSP PGUID -2 f p P f t \054 0 0 1263 cstring_in cstring_out cstring_recv cstring_send - - - c p f 0 -1 0 0 _null_ _null_ _null_ ));+#define CSTRINGOID 2275+DATA(insert OID = 2276 ( any PGNSP PGUID 4 t p P f t \054 0 0 0 any_in any_out - - - - - i p f 0 -1 0 0 _null_ _null_ _null_ ));+#define ANYOID 2276+DATA(insert OID = 2277 ( anyarray PGNSP PGUID -1 f p P f t \054 0 0 0 anyarray_in anyarray_out anyarray_recv anyarray_send - - - d x f 0 -1 0 0 _null_ _null_ _null_ ));+#define ANYARRAYOID 2277+DATA(insert OID = 2278 ( void PGNSP PGUID 4 t p P f t \054 0 0 0 void_in void_out void_recv void_send - - - i p f 0 -1 0 0 _null_ _null_ _null_ ));+#define VOIDOID 2278+DATA(insert OID = 2279 ( trigger PGNSP PGUID 4 t p P f t \054 0 0 0 trigger_in trigger_out - - - - - i p f 0 -1 0 0 _null_ _null_ _null_ ));+#define TRIGGEROID 2279+DATA(insert OID = 3838 ( event_trigger PGNSP PGUID 4 t p P f t \054 0 0 0 event_trigger_in event_trigger_out - - - - - i p f 0 -1 0 0 _null_ _null_ _null_ ));+#define EVTTRIGGEROID 3838+DATA(insert OID = 2280 ( language_handler PGNSP PGUID 4 t p P f t \054 0 0 0 language_handler_in language_handler_out - - - - - i p f 0 -1 0 0 _null_ _null_ _null_ ));+#define LANGUAGE_HANDLEROID 2280+DATA(insert OID = 2281 ( internal PGNSP PGUID SIZEOF_POINTER t p P f t \054 0 0 0 internal_in internal_out - - - - - ALIGNOF_POINTER p f 0 -1 0 0 _null_ _null_ _null_ ));+#define INTERNALOID 2281+DATA(insert OID = 2282 ( opaque PGNSP PGUID 4 t p P f t \054 0 0 0 opaque_in opaque_out - - - - - i p f 0 -1 0 0 _null_ _null_ _null_ ));+#define OPAQUEOID 2282+DATA(insert OID = 2283 ( anyelement PGNSP PGUID 4 t p P f t \054 0 0 0 anyelement_in anyelement_out - - - - - i p f 0 -1 0 0 _null_ _null_ _null_ ));+#define ANYELEMENTOID 2283+DATA(insert OID = 2776 ( anynonarray PGNSP PGUID 4 t p P f t \054 0 0 0 anynonarray_in anynonarray_out - - - - - i p f 0 -1 0 0 _null_ _null_ _null_ ));+#define ANYNONARRAYOID 2776+DATA(insert OID = 3500 ( anyenum PGNSP PGUID 4 t p P f t \054 0 0 0 anyenum_in anyenum_out - - - - - i p f 0 -1 0 0 _null_ _null_ _null_ ));+#define ANYENUMOID 3500+DATA(insert OID = 3115 ( fdw_handler PGNSP PGUID 4 t p P f t \054 0 0 0 fdw_handler_in fdw_handler_out - - - - - i p f 0 -1 0 0 _null_ _null_ _null_ ));+#define FDW_HANDLEROID 3115+DATA(insert OID = 3310 ( tsm_handler PGNSP PGUID 4 t p P f t \054 0 0 0 tsm_handler_in tsm_handler_out - - - - - i p f 0 -1 0 0 _null_ _null_ _null_ ));+#define TSM_HANDLEROID 3310+DATA(insert OID = 3831 ( anyrange PGNSP PGUID -1 f p P f t \054 0 0 0 anyrange_in anyrange_out - - - - - d x f 0 -1 0 0 _null_ _null_ _null_ ));+#define ANYRANGEOID 3831+++/*+ * macros+ */+#define TYPTYPE_BASE 'b' /* base type (ordinary scalar type) */+#define TYPTYPE_COMPOSITE 'c' /* composite (e.g., table's rowtype) */+#define TYPTYPE_DOMAIN 'd' /* domain over another type */+#define TYPTYPE_ENUM 'e' /* enumerated type */+#define TYPTYPE_PSEUDO 'p' /* pseudo-type */+#define TYPTYPE_RANGE 'r' /* range type */++#define TYPCATEGORY_INVALID '\0' /* not an allowed category */+#define TYPCATEGORY_ARRAY 'A'+#define TYPCATEGORY_BOOLEAN 'B'+#define TYPCATEGORY_COMPOSITE 'C'+#define TYPCATEGORY_DATETIME 'D'+#define TYPCATEGORY_ENUM 'E'+#define TYPCATEGORY_GEOMETRIC 'G'+#define TYPCATEGORY_NETWORK 'I' /* think INET */+#define TYPCATEGORY_NUMERIC 'N'+#define TYPCATEGORY_PSEUDOTYPE 'P'+#define TYPCATEGORY_RANGE 'R'+#define TYPCATEGORY_STRING 'S'+#define TYPCATEGORY_TIMESPAN 'T'+#define TYPCATEGORY_USER 'U'+#define TYPCATEGORY_BITSTRING 'V' /* er ... "varbit"? */+#define TYPCATEGORY_UNKNOWN 'X'++/* Is a type OID a polymorphic pseudotype? (Beware of multiple evaluation) */+#define IsPolymorphicType(typid) \+ ((typid) == ANYELEMENTOID || \+ (typid) == ANYARRAYOID || \+ (typid) == ANYNONARRAYOID || \+ (typid) == ANYENUMOID || \+ (typid) == ANYRANGEOID)++#endif /* PG_TYPE_H */
+ foreign/libpg_query/src/postgres/include/commands/async.h view
@@ -0,0 +1,57 @@+/*-------------------------------------------------------------------------+ *+ * async.h+ * Asynchronous notification: NOTIFY, LISTEN, UNLISTEN+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/commands/async.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef ASYNC_H+#define ASYNC_H++#include <signal.h>++#include "fmgr.h"++/*+ * The number of SLRU page buffers we use for the notification queue.+ */+#define NUM_ASYNC_BUFFERS 8++extern bool Trace_notify;+extern volatile sig_atomic_t notifyInterruptPending;++extern Size AsyncShmemSize(void);+extern void AsyncShmemInit(void);++/* notify-related SQL statements */+extern void Async_Notify(const char *channel, const char *payload);+extern void Async_Listen(const char *channel);+extern void Async_Unlisten(const char *channel);+extern void Async_UnlistenAll(void);++/* notify-related SQL functions */+extern Datum pg_listening_channels(PG_FUNCTION_ARGS);+extern Datum pg_notify(PG_FUNCTION_ARGS);++/* perform (or cancel) outbound notify processing at transaction commit */+extern void PreCommit_Notify(void);+extern void AtCommit_Notify(void);+extern void AtAbort_Notify(void);+extern void AtSubStart_Notify(void);+extern void AtSubCommit_Notify(void);+extern void AtSubAbort_Notify(void);+extern void AtPrepare_Notify(void);+extern void ProcessCompletedNotifies(void);++/* signal handler for inbound notifies (PROCSIG_NOTIFY_INTERRUPT) */+extern void HandleNotifyInterrupt(void);++/* process interrupts */+extern void ProcessNotifyInterrupt(void);++#endif /* ASYNC_H */
+ foreign/libpg_query/src/postgres/include/commands/dbcommands.h view
@@ -0,0 +1,34 @@+/*-------------------------------------------------------------------------+ *+ * dbcommands.h+ * Database management commands (create/drop database).+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/commands/dbcommands.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef DBCOMMANDS_H+#define DBCOMMANDS_H++#include "access/xlogreader.h"+#include "catalog/objectaddress.h"+#include "lib/stringinfo.h"+#include "nodes/parsenodes.h"++extern Oid createdb(const CreatedbStmt *stmt);+extern void dropdb(const char *dbname, bool missing_ok);+extern ObjectAddress RenameDatabase(const char *oldname, const char *newname);+extern Oid AlterDatabase(AlterDatabaseStmt *stmt, bool isTopLevel);+extern Oid AlterDatabaseSet(AlterDatabaseSetStmt *stmt);+extern ObjectAddress AlterDatabaseOwner(const char *dbname, Oid newOwnerId);++extern Oid get_database_oid(const char *dbname, bool missingok);+extern char *get_database_name(Oid dbid);++extern void check_encoding_locale_matches(int encoding, const char *collate, const char *ctype);++#endif /* DBCOMMANDS_H */
+ foreign/libpg_query/src/postgres/include/commands/defrem.h view
@@ -0,0 +1,151 @@+/*-------------------------------------------------------------------------+ *+ * defrem.h+ * POSTGRES define and remove utility definitions.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/commands/defrem.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef DEFREM_H+#define DEFREM_H++#include "catalog/objectaddress.h"+#include "nodes/parsenodes.h"+#include "utils/array.h"++/* commands/dropcmds.c */+extern void RemoveObjects(DropStmt *stmt);++/* commands/indexcmds.c */+extern ObjectAddress DefineIndex(Oid relationId,+ IndexStmt *stmt,+ Oid indexRelationId,+ bool is_alter_table,+ bool check_rights,+ bool skip_build,+ bool quiet);+extern Oid ReindexIndex(RangeVar *indexRelation, int options);+extern Oid ReindexTable(RangeVar *relation, int options);+extern void ReindexMultipleTables(const char *objectName, ReindexObjectType objectKind,+ int options);+extern char *makeObjectName(const char *name1, const char *name2,+ const char *label);+extern char *ChooseRelationName(const char *name1, const char *name2,+ const char *label, Oid namespaceid);+extern bool CheckIndexCompatible(Oid oldId,+ char *accessMethodName,+ List *attributeList,+ List *exclusionOpNames);+extern Oid GetDefaultOpClass(Oid type_id, Oid am_id);++/* commands/functioncmds.c */+extern ObjectAddress CreateFunction(CreateFunctionStmt *stmt, const char *queryString);+extern void RemoveFunctionById(Oid funcOid);+extern void SetFunctionReturnType(Oid funcOid, Oid newRetType);+extern void SetFunctionArgType(Oid funcOid, int argIndex, Oid newArgType);+extern ObjectAddress AlterFunction(AlterFunctionStmt *stmt);+extern ObjectAddress CreateCast(CreateCastStmt *stmt);+extern void DropCastById(Oid castOid);+extern ObjectAddress CreateTransform(CreateTransformStmt *stmt);+extern void DropTransformById(Oid transformOid);+extern void IsThereFunctionInNamespace(const char *proname, int pronargs,+ oidvector *proargtypes, Oid nspOid);+extern void ExecuteDoStmt(DoStmt *stmt);+extern Oid get_cast_oid(Oid sourcetypeid, Oid targettypeid, bool missing_ok);+extern Oid get_transform_oid(Oid type_id, Oid lang_id, bool missing_ok);+extern void interpret_function_parameter_list(List *parameters,+ Oid languageOid,+ bool is_aggregate,+ const char *queryString,+ oidvector **parameterTypes,+ ArrayType **allParameterTypes,+ ArrayType **parameterModes,+ ArrayType **parameterNames,+ List **parameterDefaults,+ Oid *variadicArgType,+ Oid *requiredResultType);++/* commands/operatorcmds.c */+extern ObjectAddress DefineOperator(List *names, List *parameters);+extern void RemoveOperatorById(Oid operOid);++/* commands/aggregatecmds.c */+extern ObjectAddress DefineAggregate(List *name, List *args, bool oldstyle,+ List *parameters, const char *queryString);++/* commands/opclasscmds.c */+extern ObjectAddress DefineOpClass(CreateOpClassStmt *stmt);+extern ObjectAddress DefineOpFamily(CreateOpFamilyStmt *stmt);+extern Oid AlterOpFamily(AlterOpFamilyStmt *stmt);+extern void RemoveOpClassById(Oid opclassOid);+extern void RemoveOpFamilyById(Oid opfamilyOid);+extern void RemoveAmOpEntryById(Oid entryOid);+extern void RemoveAmProcEntryById(Oid entryOid);+extern void IsThereOpClassInNamespace(const char *opcname, Oid opcmethod,+ Oid opcnamespace);+extern void IsThereOpFamilyInNamespace(const char *opfname, Oid opfmethod,+ Oid opfnamespace);+extern Oid get_am_oid(const char *amname, bool missing_ok);+extern char *get_am_name(Oid amOid);+extern Oid get_opclass_oid(Oid amID, List *opclassname, bool missing_ok);+extern Oid get_opfamily_oid(Oid amID, List *opfamilyname, bool missing_ok);++/* commands/tsearchcmds.c */+extern ObjectAddress DefineTSParser(List *names, List *parameters);+extern void RemoveTSParserById(Oid prsId);++extern ObjectAddress DefineTSDictionary(List *names, List *parameters);+extern void RemoveTSDictionaryById(Oid dictId);+extern ObjectAddress AlterTSDictionary(AlterTSDictionaryStmt *stmt);++extern ObjectAddress DefineTSTemplate(List *names, List *parameters);+extern void RemoveTSTemplateById(Oid tmplId);++extern ObjectAddress DefineTSConfiguration(List *names, List *parameters,+ ObjectAddress *copied);+extern void RemoveTSConfigurationById(Oid cfgId);+extern ObjectAddress AlterTSConfiguration(AlterTSConfigurationStmt *stmt);++extern text *serialize_deflist(List *deflist);+extern List *deserialize_deflist(Datum txt);++/* commands/foreigncmds.c */+extern ObjectAddress AlterForeignServerOwner(const char *name, Oid newOwnerId);+extern void AlterForeignServerOwner_oid(Oid, Oid newOwnerId);+extern ObjectAddress AlterForeignDataWrapperOwner(const char *name, Oid newOwnerId);+extern void AlterForeignDataWrapperOwner_oid(Oid fwdId, Oid newOwnerId);+extern ObjectAddress CreateForeignDataWrapper(CreateFdwStmt *stmt);+extern ObjectAddress AlterForeignDataWrapper(AlterFdwStmt *stmt);+extern void RemoveForeignDataWrapperById(Oid fdwId);+extern ObjectAddress CreateForeignServer(CreateForeignServerStmt *stmt);+extern ObjectAddress AlterForeignServer(AlterForeignServerStmt *stmt);+extern void RemoveForeignServerById(Oid srvId);+extern ObjectAddress CreateUserMapping(CreateUserMappingStmt *stmt);+extern ObjectAddress AlterUserMapping(AlterUserMappingStmt *stmt);+extern Oid RemoveUserMapping(DropUserMappingStmt *stmt);+extern void RemoveUserMappingById(Oid umId);+extern void CreateForeignTable(CreateForeignTableStmt *stmt, Oid relid);+extern void ImportForeignSchema(ImportForeignSchemaStmt *stmt);+extern Datum transformGenericOptions(Oid catalogId,+ Datum oldOptions,+ List *options,+ Oid fdwvalidator);++/* support routines in commands/define.c */++extern char *defGetString(DefElem *def);+extern double defGetNumeric(DefElem *def);+extern bool defGetBoolean(DefElem *def);+extern int32 defGetInt32(DefElem *def);+extern int64 defGetInt64(DefElem *def);+extern List *defGetQualifiedName(DefElem *def);+extern TypeName *defGetTypeName(DefElem *def);+extern int defGetTypeLength(DefElem *def);+extern DefElem *defWithOids(bool value);++#endif /* DEFREM_H */
+ foreign/libpg_query/src/postgres/include/commands/event_trigger.h view
@@ -0,0 +1,89 @@+/*-------------------------------------------------------------------------+ *+ * event_trigger.h+ * Declarations for command trigger handling.+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/commands/event_trigger.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef EVENT_TRIGGER_H+#define EVENT_TRIGGER_H++#include "catalog/dependency.h"+#include "catalog/objectaddress.h"+#include "catalog/pg_event_trigger.h"+#include "nodes/parsenodes.h"+#include "utils/aclchk_internal.h"+#include "tcop/deparse_utility.h"++typedef struct EventTriggerData+{+ NodeTag type;+ const char *event; /* event name */+ Node *parsetree; /* parse tree */+ const char *tag; /* command tag */+} EventTriggerData;++#define AT_REWRITE_ALTER_PERSISTENCE 0x01+#define AT_REWRITE_DEFAULT_VAL 0x02+#define AT_REWRITE_COLUMN_REWRITE 0x04+#define AT_REWRITE_ALTER_OID 0x08++/*+ * EventTriggerData is the node type that is passed as fmgr "context" info+ * when a function is called by the event trigger manager.+ */+#define CALLED_AS_EVENT_TRIGGER(fcinfo) \+ ((fcinfo)->context != NULL && IsA((fcinfo)->context, EventTriggerData))++extern Oid CreateEventTrigger(CreateEventTrigStmt *stmt);+extern void RemoveEventTriggerById(Oid ctrigOid);+extern Oid get_event_trigger_oid(const char *trigname, bool missing_ok);++extern Oid AlterEventTrigger(AlterEventTrigStmt *stmt);+extern ObjectAddress AlterEventTriggerOwner(const char *name, Oid newOwnerId);+extern void AlterEventTriggerOwner_oid(Oid, Oid newOwnerId);++extern bool EventTriggerSupportsObjectType(ObjectType obtype);+extern bool EventTriggerSupportsObjectClass(ObjectClass objclass);+extern bool EventTriggerSupportsGrantObjectType(GrantObjectType objtype);+extern void EventTriggerDDLCommandStart(Node *parsetree);+extern void EventTriggerDDLCommandEnd(Node *parsetree);+extern void EventTriggerSQLDrop(Node *parsetree);+extern void EventTriggerTableRewrite(Node *parsetree, Oid tableOid, int reason);++extern bool EventTriggerBeginCompleteQuery(void);+extern void EventTriggerEndCompleteQuery(void);+extern bool trackDroppedObjectsNeeded(void);+extern void EventTriggerSQLDropAddObject(const ObjectAddress *object,+ bool original, bool normal);++extern void EventTriggerInhibitCommandCollection(void);+extern void EventTriggerUndoInhibitCommandCollection(void);++extern void EventTriggerCollectSimpleCommand(ObjectAddress address,+ ObjectAddress secondaryObject,+ Node *parsetree);++extern void EventTriggerAlterTableStart(Node *parsetree);+extern void EventTriggerAlterTableRelid(Oid objectId);+extern void EventTriggerCollectAlterTableSubcmd(Node *subcmd,+ ObjectAddress address);+extern void EventTriggerAlterTableEnd(void);++extern void EventTriggerCollectGrant(InternalGrant *istmt);+extern void EventTriggerCollectAlterOpFam(AlterOpFamilyStmt *stmt,+ Oid opfamoid, List *operators,+ List *procedures);+extern void EventTriggerCollectCreateOpClass(CreateOpClassStmt *stmt,+ Oid opcoid, List *operators,+ List *procedures);+extern void EventTriggerCollectAlterTSConfig(AlterTSConfigurationStmt *stmt,+ Oid cfgId, Oid *dictIds, int ndicts);+extern void EventTriggerCollectAlterDefPrivs(AlterDefaultPrivilegesStmt *stmt);++#endif /* EVENT_TRIGGER_H */
+ foreign/libpg_query/src/postgres/include/commands/explain.h view
@@ -0,0 +1,97 @@+/*-------------------------------------------------------------------------+ *+ * explain.h+ * prototypes for explain.c+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994-5, Regents of the University of California+ *+ * src/include/commands/explain.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef EXPLAIN_H+#define EXPLAIN_H++#include "executor/executor.h"+#include "lib/stringinfo.h"++typedef enum ExplainFormat+{+ EXPLAIN_FORMAT_TEXT,+ EXPLAIN_FORMAT_XML,+ EXPLAIN_FORMAT_JSON,+ EXPLAIN_FORMAT_YAML+} ExplainFormat;++typedef struct ExplainState+{+ StringInfo str; /* output buffer */+ /* options */+ bool verbose; /* be verbose */+ bool analyze; /* print actual times */+ bool costs; /* print estimated costs */+ bool buffers; /* print buffer usage */+ bool timing; /* print detailed node timing */+ bool summary; /* print total planning and execution timing */+ ExplainFormat format; /* output format */+ /* other states */+ PlannedStmt *pstmt; /* top of plan */+ List *rtable; /* range table */+ List *rtable_names; /* alias names for RTEs */+ int indent; /* current indentation level */+ List *grouping_stack; /* format-specific grouping state */+ List *deparse_cxt; /* context list for deparsing expressions */+} ExplainState;++/* Hook for plugins to get control in ExplainOneQuery() */+typedef void (*ExplainOneQuery_hook_type) (Query *query,+ IntoClause *into,+ ExplainState *es,+ const char *queryString,+ ParamListInfo params);+extern PGDLLIMPORT ExplainOneQuery_hook_type ExplainOneQuery_hook;++/* Hook for plugins to get control in explain_get_index_name() */+typedef const char *(*explain_get_index_name_hook_type) (Oid indexId);+extern PGDLLIMPORT explain_get_index_name_hook_type explain_get_index_name_hook;+++extern void ExplainQuery(ExplainStmt *stmt, const char *queryString,+ ParamListInfo params, DestReceiver *dest);++extern ExplainState *NewExplainState(void);++extern TupleDesc ExplainResultDesc(ExplainStmt *stmt);++extern void ExplainOneUtility(Node *utilityStmt, IntoClause *into,+ ExplainState *es,+ const char *queryString, ParamListInfo params);++extern void ExplainOnePlan(PlannedStmt *plannedstmt, IntoClause *into,+ ExplainState *es, const char *queryString,+ ParamListInfo params, const instr_time *planduration);++extern void ExplainPrintPlan(ExplainState *es, QueryDesc *queryDesc);+extern void ExplainPrintTriggers(ExplainState *es, QueryDesc *queryDesc);++extern void ExplainQueryText(ExplainState *es, QueryDesc *queryDesc);++extern void ExplainBeginOutput(ExplainState *es);+extern void ExplainEndOutput(ExplainState *es);+extern void ExplainSeparatePlans(ExplainState *es);++extern void ExplainPropertyList(const char *qlabel, List *data,+ ExplainState *es);+extern void ExplainPropertyListNested(const char *qlabel, List *data,+ ExplainState *es);+extern void ExplainPropertyText(const char *qlabel, const char *value,+ ExplainState *es);+extern void ExplainPropertyInteger(const char *qlabel, int value,+ ExplainState *es);+extern void ExplainPropertyLong(const char *qlabel, long value,+ ExplainState *es);+extern void ExplainPropertyFloat(const char *qlabel, double value, int ndigits,+ ExplainState *es);++#endif /* EXPLAIN_H */
+ foreign/libpg_query/src/postgres/include/commands/prepare.h view
@@ -0,0 +1,59 @@+/*-------------------------------------------------------------------------+ *+ * prepare.h+ * PREPARE, EXECUTE and DEALLOCATE commands, and prepared-stmt storage+ *+ *+ * Copyright (c) 2002-2015, PostgreSQL Global Development Group+ *+ * src/include/commands/prepare.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef PREPARE_H+#define PREPARE_H++#include "commands/explain.h"+#include "datatype/timestamp.h"+#include "utils/plancache.h"++/*+ * The data structure representing a prepared statement. This is now just+ * a thin veneer over a plancache entry --- the main addition is that of+ * a name.+ *+ * Note: all subsidiary storage lives in the referenced plancache entry.+ */+typedef struct+{+ /* dynahash.c requires key to be first field */+ char stmt_name[NAMEDATALEN];+ CachedPlanSource *plansource; /* the actual cached plan */+ bool from_sql; /* prepared via SQL, not FE/BE protocol? */+ TimestampTz prepare_time; /* the time when the stmt was prepared */+} PreparedStatement;+++/* Utility statements PREPARE, EXECUTE, DEALLOCATE, EXPLAIN EXECUTE */+extern void PrepareQuery(PrepareStmt *stmt, const char *queryString);+extern void ExecuteQuery(ExecuteStmt *stmt, IntoClause *intoClause,+ const char *queryString, ParamListInfo params,+ DestReceiver *dest, char *completionTag);+extern void DeallocateQuery(DeallocateStmt *stmt);+extern void ExplainExecuteQuery(ExecuteStmt *execstmt, IntoClause *into,+ ExplainState *es,+ const char *queryString, ParamListInfo params);++/* Low-level access to stored prepared statements */+extern void StorePreparedStatement(const char *stmt_name,+ CachedPlanSource *plansource,+ bool from_sql);+extern PreparedStatement *FetchPreparedStatement(const char *stmt_name,+ bool throwError);+extern void DropPreparedStatement(const char *stmt_name, bool showError);+extern TupleDesc FetchPreparedStatementResultDesc(PreparedStatement *stmt);+extern List *FetchPreparedStatementTargetList(PreparedStatement *stmt);++extern void DropAllPreparedStatements(void);++#endif /* PREPARE_H */
+ foreign/libpg_query/src/postgres/include/commands/tablespace.h view
@@ -0,0 +1,65 @@+/*-------------------------------------------------------------------------+ *+ * tablespace.h+ * Tablespace management commands (create/drop tablespace).+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/commands/tablespace.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef TABLESPACE_H+#define TABLESPACE_H++#include "access/xlogreader.h"+#include "catalog/objectaddress.h"+#include "lib/stringinfo.h"+#include "nodes/parsenodes.h"++/* XLOG stuff */+#define XLOG_TBLSPC_CREATE 0x00+#define XLOG_TBLSPC_DROP 0x10++typedef struct xl_tblspc_create_rec+{+ Oid ts_id;+ char ts_path[FLEXIBLE_ARRAY_MEMBER]; /* null-terminated string */+} xl_tblspc_create_rec;++typedef struct xl_tblspc_drop_rec+{+ Oid ts_id;+} xl_tblspc_drop_rec;++typedef struct TableSpaceOpts+{+ int32 vl_len_; /* varlena header (do not touch directly!) */+ float8 random_page_cost;+ float8 seq_page_cost;+} TableSpaceOpts;++extern Oid CreateTableSpace(CreateTableSpaceStmt *stmt);+extern void DropTableSpace(DropTableSpaceStmt *stmt);+extern ObjectAddress RenameTableSpace(const char *oldname, const char *newname);+extern Oid AlterTableSpaceOptions(AlterTableSpaceOptionsStmt *stmt);++extern void TablespaceCreateDbspace(Oid spcNode, Oid dbNode, bool isRedo);++extern Oid GetDefaultTablespace(char relpersistence);++extern void PrepareTempTablespaces(void);++extern Oid get_tablespace_oid(const char *tablespacename, bool missing_ok);+extern char *get_tablespace_name(Oid spc_oid);++extern bool directory_is_empty(const char *path);+extern void remove_tablespace_symlink(const char *linkloc);++extern void tblspc_redo(XLogReaderState *rptr);+extern void tblspc_desc(StringInfo buf, XLogReaderState *rptr);+extern const char *tblspc_identify(uint8 info);++#endif /* TABLESPACE_H */
+ foreign/libpg_query/src/postgres/include/commands/trigger.h view
@@ -0,0 +1,215 @@+/*-------------------------------------------------------------------------+ *+ * trigger.h+ * Declarations for trigger handling.+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/commands/trigger.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef TRIGGER_H+#define TRIGGER_H++#include "catalog/objectaddress.h"+#include "nodes/execnodes.h"+#include "nodes/parsenodes.h"++/*+ * TriggerData is the node type that is passed as fmgr "context" info+ * when a function is called by the trigger manager.+ */++#define CALLED_AS_TRIGGER(fcinfo) \+ ((fcinfo)->context != NULL && IsA((fcinfo)->context, TriggerData))++typedef uint32 TriggerEvent;++typedef struct TriggerData+{+ NodeTag type;+ TriggerEvent tg_event;+ Relation tg_relation;+ HeapTuple tg_trigtuple;+ HeapTuple tg_newtuple;+ Trigger *tg_trigger;+ Buffer tg_trigtuplebuf;+ Buffer tg_newtuplebuf;+} TriggerData;++/*+ * TriggerEvent bit flags+ *+ * Note that we assume different event types (INSERT/DELETE/UPDATE/TRUNCATE)+ * can't be OR'd together in a single TriggerEvent. This is unlike the+ * situation for pg_trigger rows, so pg_trigger.tgtype uses a different+ * representation!+ */+#define TRIGGER_EVENT_INSERT 0x00000000+#define TRIGGER_EVENT_DELETE 0x00000001+#define TRIGGER_EVENT_UPDATE 0x00000002+#define TRIGGER_EVENT_TRUNCATE 0x00000003+#define TRIGGER_EVENT_OPMASK 0x00000003++#define TRIGGER_EVENT_ROW 0x00000004++#define TRIGGER_EVENT_BEFORE 0x00000008+#define TRIGGER_EVENT_AFTER 0x00000000+#define TRIGGER_EVENT_INSTEAD 0x00000010+#define TRIGGER_EVENT_TIMINGMASK 0x00000018++/* More TriggerEvent flags, used only within trigger.c */++#define AFTER_TRIGGER_DEFERRABLE 0x00000020+#define AFTER_TRIGGER_INITDEFERRED 0x00000040++#define TRIGGER_FIRED_BY_INSERT(event) \+ (((event) & TRIGGER_EVENT_OPMASK) == TRIGGER_EVENT_INSERT)++#define TRIGGER_FIRED_BY_DELETE(event) \+ (((event) & TRIGGER_EVENT_OPMASK) == TRIGGER_EVENT_DELETE)++#define TRIGGER_FIRED_BY_UPDATE(event) \+ (((event) & TRIGGER_EVENT_OPMASK) == TRIGGER_EVENT_UPDATE)++#define TRIGGER_FIRED_BY_TRUNCATE(event) \+ (((event) & TRIGGER_EVENT_OPMASK) == TRIGGER_EVENT_TRUNCATE)++#define TRIGGER_FIRED_FOR_ROW(event) \+ ((event) & TRIGGER_EVENT_ROW)++#define TRIGGER_FIRED_FOR_STATEMENT(event) \+ (!TRIGGER_FIRED_FOR_ROW(event))++#define TRIGGER_FIRED_BEFORE(event) \+ (((event) & TRIGGER_EVENT_TIMINGMASK) == TRIGGER_EVENT_BEFORE)++#define TRIGGER_FIRED_AFTER(event) \+ (((event) & TRIGGER_EVENT_TIMINGMASK) == TRIGGER_EVENT_AFTER)++#define TRIGGER_FIRED_INSTEAD(event) \+ (((event) & TRIGGER_EVENT_TIMINGMASK) == TRIGGER_EVENT_INSTEAD)++/*+ * Definitions for replication role based firing.+ */+#define SESSION_REPLICATION_ROLE_ORIGIN 0+#define SESSION_REPLICATION_ROLE_REPLICA 1+#define SESSION_REPLICATION_ROLE_LOCAL 2+extern PGDLLIMPORT int SessionReplicationRole;++/*+ * States at which a trigger can be fired. These are the+ * possible values for pg_trigger.tgenabled.+ */+#define TRIGGER_FIRES_ON_ORIGIN 'O'+#define TRIGGER_FIRES_ALWAYS 'A'+#define TRIGGER_FIRES_ON_REPLICA 'R'+#define TRIGGER_DISABLED 'D'++extern ObjectAddress CreateTrigger(CreateTrigStmt *stmt, const char *queryString,+ Oid relOid, Oid refRelOid, Oid constraintOid, Oid indexOid,+ bool isInternal);++extern void RemoveTriggerById(Oid trigOid);+extern Oid get_trigger_oid(Oid relid, const char *name, bool missing_ok);++extern ObjectAddress renametrig(RenameStmt *stmt);++extern void EnableDisableTrigger(Relation rel, const char *tgname,+ char fires_when, bool skip_system);++extern void RelationBuildTriggers(Relation relation);++extern TriggerDesc *CopyTriggerDesc(TriggerDesc *trigdesc);++extern void FreeTriggerDesc(TriggerDesc *trigdesc);++extern void ExecBSInsertTriggers(EState *estate,+ ResultRelInfo *relinfo);+extern void ExecASInsertTriggers(EState *estate,+ ResultRelInfo *relinfo);+extern TupleTableSlot *ExecBRInsertTriggers(EState *estate,+ ResultRelInfo *relinfo,+ TupleTableSlot *slot);+extern void ExecARInsertTriggers(EState *estate,+ ResultRelInfo *relinfo,+ HeapTuple trigtuple,+ List *recheckIndexes);+extern TupleTableSlot *ExecIRInsertTriggers(EState *estate,+ ResultRelInfo *relinfo,+ TupleTableSlot *slot);+extern void ExecBSDeleteTriggers(EState *estate,+ ResultRelInfo *relinfo);+extern void ExecASDeleteTriggers(EState *estate,+ ResultRelInfo *relinfo);+extern bool ExecBRDeleteTriggers(EState *estate,+ EPQState *epqstate,+ ResultRelInfo *relinfo,+ ItemPointer tupleid,+ HeapTuple fdw_trigtuple);+extern void ExecARDeleteTriggers(EState *estate,+ ResultRelInfo *relinfo,+ ItemPointer tupleid,+ HeapTuple fdw_trigtuple);+extern bool ExecIRDeleteTriggers(EState *estate,+ ResultRelInfo *relinfo,+ HeapTuple trigtuple);+extern void ExecBSUpdateTriggers(EState *estate,+ ResultRelInfo *relinfo);+extern void ExecASUpdateTriggers(EState *estate,+ ResultRelInfo *relinfo);+extern TupleTableSlot *ExecBRUpdateTriggers(EState *estate,+ EPQState *epqstate,+ ResultRelInfo *relinfo,+ ItemPointer tupleid,+ HeapTuple fdw_trigtuple,+ TupleTableSlot *slot);+extern void ExecARUpdateTriggers(EState *estate,+ ResultRelInfo *relinfo,+ ItemPointer tupleid,+ HeapTuple fdw_trigtuple,+ HeapTuple newtuple,+ List *recheckIndexes);+extern TupleTableSlot *ExecIRUpdateTriggers(EState *estate,+ ResultRelInfo *relinfo,+ HeapTuple trigtuple,+ TupleTableSlot *slot);+extern void ExecBSTruncateTriggers(EState *estate,+ ResultRelInfo *relinfo);+extern void ExecASTruncateTriggers(EState *estate,+ ResultRelInfo *relinfo);++extern void AfterTriggerBeginXact(void);+extern void AfterTriggerBeginQuery(void);+extern void AfterTriggerEndQuery(EState *estate);+extern void AfterTriggerFireDeferred(void);+extern void AfterTriggerEndXact(bool isCommit);+extern void AfterTriggerBeginSubXact(void);+extern void AfterTriggerEndSubXact(bool isCommit);+extern void AfterTriggerSetState(ConstraintsSetStmt *stmt);+extern bool AfterTriggerPendingOnRel(Oid relid);+++/*+ * in utils/adt/ri_triggers.c+ */+extern bool RI_FKey_pk_upd_check_required(Trigger *trigger, Relation pk_rel,+ HeapTuple old_row, HeapTuple new_row);+extern bool RI_FKey_fk_upd_check_required(Trigger *trigger, Relation fk_rel,+ HeapTuple old_row, HeapTuple new_row);+extern bool RI_Initial_Check(Trigger *trigger,+ Relation fk_rel, Relation pk_rel);++/* result values for RI_FKey_trigger_type: */+#define RI_TRIGGER_PK 1 /* is a trigger on the PK relation */+#define RI_TRIGGER_FK 2 /* is a trigger on the FK relation */+#define RI_TRIGGER_NONE 0 /* is not an RI trigger function */++extern int RI_FKey_trigger_type(Oid tgfoid);++extern Datum pg_trigger_depth(PG_FUNCTION_ARGS);++#endif /* TRIGGER_H */
+ foreign/libpg_query/src/postgres/include/commands/vacuum.h view
@@ -0,0 +1,206 @@+/*-------------------------------------------------------------------------+ *+ * vacuum.h+ * header file for postgres vacuum cleaner and statistics analyzer+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/commands/vacuum.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef VACUUM_H+#define VACUUM_H++#include "access/htup.h"+#include "catalog/pg_statistic.h"+#include "catalog/pg_type.h"+#include "nodes/parsenodes.h"+#include "storage/buf.h"+#include "storage/lock.h"+#include "utils/relcache.h"+++/*----------+ * ANALYZE builds one of these structs for each attribute (column) that is+ * to be analyzed. The struct and subsidiary data are in anl_context,+ * so they live until the end of the ANALYZE operation.+ *+ * The type-specific typanalyze function is passed a pointer to this struct+ * and must return TRUE to continue analysis, FALSE to skip analysis of this+ * column. In the TRUE case it must set the compute_stats and minrows fields,+ * and can optionally set extra_data to pass additional info to compute_stats.+ * minrows is its request for the minimum number of sample rows to be gathered+ * (but note this request might not be honored, eg if there are fewer rows+ * than that in the table).+ *+ * The compute_stats routine will be called after sample rows have been+ * gathered. Aside from this struct, it is passed:+ * fetchfunc: a function for accessing the column values from the+ * sample rows+ * samplerows: the number of sample tuples+ * totalrows: estimated total number of rows in relation+ * The fetchfunc may be called with rownum running from 0 to samplerows-1.+ * It returns a Datum and an isNull flag.+ *+ * compute_stats should set stats_valid TRUE if it is able to compute+ * any useful statistics. If it does, the remainder of the struct holds+ * the information to be stored in a pg_statistic row for the column. Be+ * careful to allocate any pointed-to data in anl_context, which will NOT+ * be CurrentMemoryContext when compute_stats is called.+ *+ * Note: for the moment, all comparisons done for statistical purposes+ * should use the database's default collation (DEFAULT_COLLATION_OID).+ * This might change in some future release.+ *----------+ */+typedef struct VacAttrStats *VacAttrStatsP;++typedef Datum (*AnalyzeAttrFetchFunc) (VacAttrStatsP stats, int rownum,+ bool *isNull);++typedef void (*AnalyzeAttrComputeStatsFunc) (VacAttrStatsP stats,+ AnalyzeAttrFetchFunc fetchfunc,+ int samplerows,+ double totalrows);++typedef struct VacAttrStats+{+ /*+ * These fields are set up by the main ANALYZE code before invoking the+ * type-specific typanalyze function.+ *+ * Note: do not assume that the data being analyzed has the same datatype+ * shown in attr, ie do not trust attr->atttypid, attlen, etc. This is+ * because some index opclasses store a different type than the underlying+ * column/expression. Instead use attrtypid, attrtypmod, and attrtype for+ * information about the datatype being fed to the typanalyze function.+ */+ Form_pg_attribute attr; /* copy of pg_attribute row for column */+ Oid attrtypid; /* type of data being analyzed */+ int32 attrtypmod; /* typmod of data being analyzed */+ Form_pg_type attrtype; /* copy of pg_type row for attrtypid */+ MemoryContext anl_context; /* where to save long-lived data */++ /*+ * These fields must be filled in by the typanalyze routine, unless it+ * returns FALSE.+ */+ AnalyzeAttrComputeStatsFunc compute_stats; /* function pointer */+ int minrows; /* Minimum # of rows wanted for stats */+ void *extra_data; /* for extra type-specific data */++ /*+ * These fields are to be filled in by the compute_stats routine. (They+ * are initialized to zero when the struct is created.)+ */+ bool stats_valid;+ float4 stanullfrac; /* fraction of entries that are NULL */+ int32 stawidth; /* average width of column values */+ float4 stadistinct; /* # distinct values */+ int16 stakind[STATISTIC_NUM_SLOTS];+ Oid staop[STATISTIC_NUM_SLOTS];+ int numnumbers[STATISTIC_NUM_SLOTS];+ float4 *stanumbers[STATISTIC_NUM_SLOTS];+ int numvalues[STATISTIC_NUM_SLOTS];+ Datum *stavalues[STATISTIC_NUM_SLOTS];++ /*+ * These fields describe the stavalues[n] element types. They will be+ * initialized to match attrtypid, but a custom typanalyze function might+ * want to store an array of something other than the analyzed column's+ * elements. It should then overwrite these fields.+ */+ Oid statypid[STATISTIC_NUM_SLOTS];+ int16 statyplen[STATISTIC_NUM_SLOTS];+ bool statypbyval[STATISTIC_NUM_SLOTS];+ char statypalign[STATISTIC_NUM_SLOTS];++ /*+ * These fields are private to the main ANALYZE code and should not be+ * looked at by type-specific functions.+ */+ int tupattnum; /* attribute number within tuples */+ HeapTuple *rows; /* access info for std fetch function */+ TupleDesc tupDesc;+ Datum *exprvals; /* access info for index fetch function */+ bool *exprnulls;+ int rowstride;+} VacAttrStats;++/*+ * Parameters customizing behavior of VACUUM and ANALYZE.+ */+typedef struct VacuumParams+{+ int freeze_min_age; /* min freeze age, -1 to use default */+ int freeze_table_age; /* age at which to scan whole table */+ int multixact_freeze_min_age; /* min multixact freeze age,+ * -1 to use default */+ int multixact_freeze_table_age; /* multixact age at which to+ * scan whole table */+ bool is_wraparound; /* force a for-wraparound vacuum */+ int log_min_duration; /* minimum execution threshold in ms+ * at which verbose logs are+ * activated, -1 to use default */+} VacuumParams;++/* GUC parameters */+extern PGDLLIMPORT int default_statistics_target; /* PGDLLIMPORT for+ * PostGIS */+extern int vacuum_freeze_min_age;+extern int vacuum_freeze_table_age;+extern int vacuum_multixact_freeze_min_age;+extern int vacuum_multixact_freeze_table_age;+++/* in commands/vacuum.c */+extern void ExecVacuum(VacuumStmt *vacstmt, bool isTopLevel);+extern void vacuum(int options, RangeVar *relation, Oid relid,+ VacuumParams *params, List *va_cols,+ BufferAccessStrategy bstrategy, bool isTopLevel);+extern void vac_open_indexes(Relation relation, LOCKMODE lockmode,+ int *nindexes, Relation **Irel);+extern void vac_close_indexes(int nindexes, Relation *Irel, LOCKMODE lockmode);+extern double vac_estimate_reltuples(Relation relation, bool is_analyze,+ BlockNumber total_pages,+ BlockNumber scanned_pages,+ double scanned_tuples);+extern void vac_update_relstats(Relation relation,+ BlockNumber num_pages,+ double num_tuples,+ BlockNumber num_all_visible_pages,+ bool hasindex,+ TransactionId frozenxid,+ MultiXactId minmulti,+ bool in_outer_xact);+extern void vacuum_set_xid_limits(Relation rel,+ int freeze_min_age, int freeze_table_age,+ int multixact_freeze_min_age,+ int multixact_freeze_table_age,+ TransactionId *oldestXmin,+ TransactionId *freezeLimit,+ TransactionId *xidFullScanLimit,+ MultiXactId *multiXactCutoff,+ MultiXactId *mxactFullScanLimit);+extern void vac_update_datfrozenxid(void);+extern void vacuum_delay_point(void);++/* in commands/vacuumlazy.c */+extern void lazy_vacuum_rel(Relation onerel, int options,+ VacuumParams *params, BufferAccessStrategy bstrategy);++/* in commands/analyze.c */+extern void analyze_rel(Oid relid, RangeVar *relation, int options,+ VacuumParams *params, List *va_cols, bool in_outer_xact,+ BufferAccessStrategy bstrategy);+extern bool std_typanalyze(VacAttrStats *stats);++/* in utils/misc/sampling.c --- duplicate of declarations in utils/sampling.h */+extern double anl_random_fract(void);+extern double anl_init_selection_state(int n);+extern double anl_get_next_S(double t, int n, double *stateptr);++#endif /* VACUUM_H */
+ foreign/libpg_query/src/postgres/include/commands/variable.h view
@@ -0,0 +1,40 @@+/*+ * variable.h+ * Routines for handling specialized SET variables.+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/commands/variable.h+ */+#ifndef VARIABLE_H+#define VARIABLE_H++#include "utils/guc.h"+++extern bool check_datestyle(char **newval, void **extra, GucSource source);+extern void assign_datestyle(const char *newval, void *extra);+extern bool check_timezone(char **newval, void **extra, GucSource source);+extern void assign_timezone(const char *newval, void *extra);+extern const char *show_timezone(void);+extern bool check_log_timezone(char **newval, void **extra, GucSource source);+extern void assign_log_timezone(const char *newval, void *extra);+extern const char *show_log_timezone(void);+extern bool check_transaction_read_only(bool *newval, void **extra, GucSource source);+extern bool check_XactIsoLevel(char **newval, void **extra, GucSource source);+extern void assign_XactIsoLevel(const char *newval, void *extra);+extern const char *show_XactIsoLevel(void);+extern bool check_transaction_deferrable(bool *newval, void **extra, GucSource source);+extern bool check_random_seed(double *newval, void **extra, GucSource source);+extern void assign_random_seed(double newval, void *extra);+extern const char *show_random_seed(void);+extern bool check_client_encoding(char **newval, void **extra, GucSource source);+extern void assign_client_encoding(const char *newval, void *extra);+extern bool check_session_authorization(char **newval, void **extra, GucSource source);+extern void assign_session_authorization(const char *newval, void *extra);+extern bool check_role(char **newval, void **extra, GucSource source);+extern void assign_role(const char *newval, void *extra);+extern const char *show_role(void);++#endif /* VARIABLE_H */
+ foreign/libpg_query/src/postgres/include/common/relpath.h view
@@ -0,0 +1,74 @@+/*-------------------------------------------------------------------------+ *+ * relpath.h+ * Declarations for GetRelationPath() and friends+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/common/relpath.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef RELPATH_H+#define RELPATH_H++/*+ * Stuff for fork names.+ *+ * The physical storage of a relation consists of one or more forks.+ * The main fork is always created, but in addition to that there can be+ * additional forks for storing various metadata. ForkNumber is used when+ * we need to refer to a specific fork in a relation.+ */+typedef enum ForkNumber+{+ InvalidForkNumber = -1,+ MAIN_FORKNUM = 0,+ FSM_FORKNUM,+ VISIBILITYMAP_FORKNUM,+ INIT_FORKNUM++ /*+ * NOTE: if you add a new fork, change MAX_FORKNUM and possibly+ * FORKNAMECHARS below, and update the forkNames array in+ * src/common/relpath.c+ */+} ForkNumber;++#define MAX_FORKNUM INIT_FORKNUM++#define FORKNAMECHARS 4 /* max chars for a fork name */++extern const char *const forkNames[];++extern ForkNumber forkname_to_number(const char *forkName);+extern int forkname_chars(const char *str, ForkNumber *fork);++/*+ * Stuff for computing filesystem pathnames for relations.+ */+extern char *GetDatabasePath(Oid dbNode, Oid spcNode);++extern char *GetRelationPath(Oid dbNode, Oid spcNode, Oid relNode,+ int backendId, ForkNumber forkNumber);++/*+ * Wrapper macros for GetRelationPath. Beware of multiple+ * evaluation of the RelFileNode or RelFileNodeBackend argument!+ */++/* First argument is a RelFileNode */+#define relpathbackend(rnode, backend, forknum) \+ GetRelationPath((rnode).dbNode, (rnode).spcNode, (rnode).relNode, \+ backend, forknum)++/* First argument is a RelFileNode */+#define relpathperm(rnode, forknum) \+ relpathbackend(rnode, InvalidBackendId, forknum)++/* First argument is a RelFileNodeBackend */+#define relpath(rnode, forknum) \+ relpathbackend((rnode).node, (rnode).backend, forknum)++#endif /* RELPATH_H */
+ foreign/libpg_query/src/postgres/include/datatype/timestamp.h view
@@ -0,0 +1,173 @@+/*-------------------------------------------------------------------------+ *+ * timestamp.h+ * Timestamp and Interval typedefs and related macros.+ *+ * Note: this file must be includable in both frontend and backend contexts.+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/datatype/timestamp.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef DATATYPE_TIMESTAMP_H+#define DATATYPE_TIMESTAMP_H++#include <math.h>+#include <limits.h>+#include <float.h>++/*+ * Timestamp represents absolute time.+ *+ * Interval represents delta time. Keep track of months (and years), days,+ * and hours/minutes/seconds separately since the elapsed time spanned is+ * unknown until instantiated relative to an absolute time.+ *+ * Note that Postgres uses "time interval" to mean a bounded interval,+ * consisting of a beginning and ending time, not a time span - thomas 97/03/20+ *+ * We have two implementations, one that uses int64 values with units of+ * microseconds, and one that uses double values with units of seconds.+ *+ * TimeOffset and fsec_t are convenience typedefs for temporary variables+ * that are of different types in the two cases. Do not use fsec_t in values+ * stored on-disk, since it is not the same size in both implementations.+ * Also, fsec_t is only meant for *fractional* seconds; beware of overflow+ * if the value you need to store could be many seconds.+ */++#ifdef HAVE_INT64_TIMESTAMP++typedef int64 Timestamp;+typedef int64 TimestampTz;+typedef int64 TimeOffset;+typedef int32 fsec_t; /* fractional seconds (in microseconds) */+#else++typedef double Timestamp;+typedef double TimestampTz;+typedef double TimeOffset;+typedef double fsec_t; /* fractional seconds (in seconds) */+#endif++typedef struct+{+ TimeOffset time; /* all time units other than days, months and+ * years */+ int32 day; /* days, after time for alignment */+ int32 month; /* months and years, after time for alignment */+} Interval;+++#define MAX_TIMESTAMP_PRECISION 6+#define MAX_INTERVAL_PRECISION 6++/*+ * Round off to MAX_TIMESTAMP_PRECISION decimal places.+ * Note: this is also used for rounding off intervals.+ */+#define TS_PREC_INV 1000000.0+#define TSROUND(j) (rint(((double) (j)) * TS_PREC_INV) / TS_PREC_INV)+++/*+ * Assorted constants for datetime-related calculations+ */++#define DAYS_PER_YEAR 365.25 /* assumes leap year every four years */+#define MONTHS_PER_YEAR 12+/*+ * DAYS_PER_MONTH is very imprecise. The more accurate value is+ * 365.2425/12 = 30.436875, or '30 days 10:29:06'. Right now we only+ * return an integral number of days, but someday perhaps we should+ * also return a 'time' value to be used as well. ISO 8601 suggests+ * 30 days.+ */+#define DAYS_PER_MONTH 30 /* assumes exactly 30 days per month */+#define HOURS_PER_DAY 24 /* assume no daylight savings time changes */++/*+ * This doesn't adjust for uneven daylight savings time intervals or leap+ * seconds, and it crudely estimates leap years. A more accurate value+ * for days per years is 365.2422.+ */+#define SECS_PER_YEAR (36525 * 864) /* avoid floating-point computation */+#define SECS_PER_DAY 86400+#define SECS_PER_HOUR 3600+#define SECS_PER_MINUTE 60+#define MINS_PER_HOUR 60++#define USECS_PER_DAY INT64CONST(86400000000)+#define USECS_PER_HOUR INT64CONST(3600000000)+#define USECS_PER_MINUTE INT64CONST(60000000)+#define USECS_PER_SEC INT64CONST(1000000)++/*+ * We allow numeric timezone offsets up to 15:59:59 either way from Greenwich.+ * Currently, the record holders for wackiest offsets in actual use are zones+ * Asia/Manila, at -15:56:00 until 1844, and America/Metlakatla, at +15:13:42+ * until 1867. If we were to reject such values we would fail to dump and+ * restore old timestamptz values with these zone settings.+ */+#define MAX_TZDISP_HOUR 15 /* maximum allowed hour part */+#define TZDISP_LIMIT ((MAX_TZDISP_HOUR + 1) * SECS_PER_HOUR)++/*+ * DT_NOBEGIN represents timestamp -infinity; DT_NOEND represents +infinity+ */+#ifdef HAVE_INT64_TIMESTAMP+#define DT_NOBEGIN PG_INT64_MIN+#define DT_NOEND PG_INT64_MAX+#else /* !HAVE_INT64_TIMESTAMP */+#ifdef HUGE_VAL+#define DT_NOBEGIN (-HUGE_VAL)+#define DT_NOEND (HUGE_VAL)+#else+#define DT_NOBEGIN (-DBL_MAX)+#define DT_NOEND (DBL_MAX)+#endif+#endif /* HAVE_INT64_TIMESTAMP */++#define TIMESTAMP_NOBEGIN(j) \+ do {(j) = DT_NOBEGIN;} while (0)++#define TIMESTAMP_IS_NOBEGIN(j) ((j) == DT_NOBEGIN)++#define TIMESTAMP_NOEND(j) \+ do {(j) = DT_NOEND;} while (0)++#define TIMESTAMP_IS_NOEND(j) ((j) == DT_NOEND)++#define TIMESTAMP_NOT_FINITE(j) (TIMESTAMP_IS_NOBEGIN(j) || TIMESTAMP_IS_NOEND(j))+++/*+ * Julian date support.+ *+ * IS_VALID_JULIAN checks the minimum date exactly, but is a bit sloppy+ * about the maximum, since it's far enough out to not be especially+ * interesting.+ */++#define JULIAN_MINYEAR (-4713)+#define JULIAN_MINMONTH (11)+#define JULIAN_MINDAY (24)+#define JULIAN_MAXYEAR (5874898)++#define IS_VALID_JULIAN(y,m,d) \+ (((y) > JULIAN_MINYEAR \+ || ((y) == JULIAN_MINYEAR && \+ ((m) > JULIAN_MINMONTH \+ || ((m) == JULIAN_MINMONTH && (d) >= JULIAN_MINDAY)))) \+ && (y) < JULIAN_MAXYEAR)++#define JULIAN_MAX (2147483494) /* == date2j(JULIAN_MAXYEAR, 1, 1) */++/* Julian-date equivalents of Day 0 in Unix and Postgres reckoning */+#define UNIX_EPOCH_JDATE 2440588 /* == date2j(1970, 1, 1) */+#define POSTGRES_EPOCH_JDATE 2451545 /* == date2j(2000, 1, 1) */++#endif /* DATATYPE_TIMESTAMP_H */
+ foreign/libpg_query/src/postgres/include/executor/execdesc.h view
@@ -0,0 +1,72 @@+/*-------------------------------------------------------------------------+ *+ * execdesc.h+ * plan and query descriptor accessor macros used by the executor+ * and related modules.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/executor/execdesc.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef EXECDESC_H+#define EXECDESC_H++#include "nodes/execnodes.h"+#include "tcop/dest.h"+++/* ----------------+ * query descriptor:+ *+ * a QueryDesc encapsulates everything that the executor+ * needs to execute the query.+ *+ * For the convenience of SQL-language functions, we also support QueryDescs+ * containing utility statements; these must not be passed to the executor+ * however.+ * ---------------------+ */+typedef struct QueryDesc+{+ /* These fields are provided by CreateQueryDesc */+ CmdType operation; /* CMD_SELECT, CMD_UPDATE, etc. */+ PlannedStmt *plannedstmt; /* planner's output, or null if utility */+ Node *utilitystmt; /* utility statement, or null */+ const char *sourceText; /* source text of the query */+ Snapshot snapshot; /* snapshot to use for query */+ Snapshot crosscheck_snapshot; /* crosscheck for RI update/delete */+ DestReceiver *dest; /* the destination for tuple output */+ ParamListInfo params; /* param values being passed in */+ int instrument_options; /* OR of InstrumentOption flags */++ /* These fields are set by ExecutorStart */+ TupleDesc tupDesc; /* descriptor for result tuples */+ EState *estate; /* executor's query-wide state */+ PlanState *planstate; /* tree of per-plan-node state */++ /* This is always set NULL by the core system, but plugins can change it */+ struct Instrumentation *totaltime; /* total time spent in ExecutorRun */+} QueryDesc;++/* in pquery.c */+extern QueryDesc *CreateQueryDesc(PlannedStmt *plannedstmt,+ const char *sourceText,+ Snapshot snapshot,+ Snapshot crosscheck_snapshot,+ DestReceiver *dest,+ ParamListInfo params,+ int instrument_options);++extern QueryDesc *CreateUtilityQueryDesc(Node *utilitystmt,+ const char *sourceText,+ Snapshot snapshot,+ DestReceiver *dest,+ ParamListInfo params);++extern void FreeQueryDesc(QueryDesc *qdesc);++#endif /* EXECDESC_H */
+ foreign/libpg_query/src/postgres/include/executor/executor.h view
@@ -0,0 +1,380 @@+/*-------------------------------------------------------------------------+ *+ * executor.h+ * support for the POSTGRES executor module+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/executor/executor.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef EXECUTOR_H+#define EXECUTOR_H++#include "executor/execdesc.h"+#include "nodes/parsenodes.h"+++/*+ * The "eflags" argument to ExecutorStart and the various ExecInitNode+ * routines is a bitwise OR of the following flag bits, which tell the+ * called plan node what to expect. Note that the flags will get modified+ * as they are passed down the plan tree, since an upper node may require+ * functionality in its subnode not demanded of the plan as a whole+ * (example: MergeJoin requires mark/restore capability in its inner input),+ * or an upper node may shield its input from some functionality requirement+ * (example: Materialize shields its input from needing to do backward scan).+ *+ * EXPLAIN_ONLY indicates that the plan tree is being initialized just so+ * EXPLAIN can print it out; it will not be run. Hence, no side-effects+ * of startup should occur. However, error checks (such as permission checks)+ * should be performed.+ *+ * REWIND indicates that the plan node should try to efficiently support+ * rescans without parameter changes. (Nodes must support ExecReScan calls+ * in any case, but if this flag was not given, they are at liberty to do it+ * through complete recalculation. Note that a parameter change forces a+ * full recalculation in any case.)+ *+ * BACKWARD indicates that the plan node must respect the es_direction flag.+ * When this is not passed, the plan node will only be run forwards.+ *+ * MARK indicates that the plan node must support Mark/Restore calls.+ * When this is not passed, no Mark/Restore will occur.+ *+ * SKIP_TRIGGERS tells ExecutorStart/ExecutorFinish to skip calling+ * AfterTriggerBeginQuery/AfterTriggerEndQuery. This does not necessarily+ * mean that the plan can't queue any AFTER triggers; just that the caller+ * is responsible for there being a trigger context for them to be queued in.+ *+ * WITH/WITHOUT_OIDS tell the executor to emit tuples with or without space+ * for OIDs, respectively. These are currently used only for CREATE TABLE AS.+ * If neither is set, the plan may or may not produce tuples including OIDs.+ */+#define EXEC_FLAG_EXPLAIN_ONLY 0x0001 /* EXPLAIN, no ANALYZE */+#define EXEC_FLAG_REWIND 0x0002 /* need efficient rescan */+#define EXEC_FLAG_BACKWARD 0x0004 /* need backward scan */+#define EXEC_FLAG_MARK 0x0008 /* need mark/restore */+#define EXEC_FLAG_SKIP_TRIGGERS 0x0010 /* skip AfterTrigger calls */+#define EXEC_FLAG_WITH_OIDS 0x0020 /* force OIDs in returned tuples */+#define EXEC_FLAG_WITHOUT_OIDS 0x0040 /* force no OIDs in returned tuples */+#define EXEC_FLAG_WITH_NO_DATA 0x0080 /* rel scannability doesn't matter */+++/*+ * ExecEvalExpr was formerly a function containing a switch statement;+ * now it's just a macro invoking the function pointed to by an ExprState+ * node. Beware of double evaluation of the ExprState argument!+ */+#define ExecEvalExpr(expr, econtext, isNull, isDone) \+ ((*(expr)->evalfunc) (expr, econtext, isNull, isDone))+++/* Hook for plugins to get control in ExecutorStart() */+typedef void (*ExecutorStart_hook_type) (QueryDesc *queryDesc, int eflags);+extern PGDLLIMPORT ExecutorStart_hook_type ExecutorStart_hook;++/* Hook for plugins to get control in ExecutorRun() */+typedef void (*ExecutorRun_hook_type) (QueryDesc *queryDesc,+ ScanDirection direction,+ long count);+extern PGDLLIMPORT ExecutorRun_hook_type ExecutorRun_hook;++/* Hook for plugins to get control in ExecutorFinish() */+typedef void (*ExecutorFinish_hook_type) (QueryDesc *queryDesc);+extern PGDLLIMPORT ExecutorFinish_hook_type ExecutorFinish_hook;++/* Hook for plugins to get control in ExecutorEnd() */+typedef void (*ExecutorEnd_hook_type) (QueryDesc *queryDesc);+extern PGDLLIMPORT ExecutorEnd_hook_type ExecutorEnd_hook;++/* Hook for plugins to get control in ExecCheckRTPerms() */+typedef bool (*ExecutorCheckPerms_hook_type) (List *, bool);+extern PGDLLIMPORT ExecutorCheckPerms_hook_type ExecutorCheckPerms_hook;+++/*+ * prototypes from functions in execAmi.c+ */+struct Path; /* avoid including relation.h here */++extern void ExecReScan(PlanState *node);+extern void ExecMarkPos(PlanState *node);+extern void ExecRestrPos(PlanState *node);+extern bool ExecSupportsMarkRestore(struct Path *pathnode);+extern bool ExecSupportsBackwardScan(Plan *node);+extern bool ExecMaterializesOutput(NodeTag plantype);++/*+ * prototypes from functions in execCurrent.c+ */+extern bool execCurrentOf(CurrentOfExpr *cexpr,+ ExprContext *econtext,+ Oid table_oid,+ ItemPointer current_tid);++/*+ * prototypes from functions in execGrouping.c+ */+extern bool execTuplesMatch(TupleTableSlot *slot1,+ TupleTableSlot *slot2,+ int numCols,+ AttrNumber *matchColIdx,+ FmgrInfo *eqfunctions,+ MemoryContext evalContext);+extern bool execTuplesUnequal(TupleTableSlot *slot1,+ TupleTableSlot *slot2,+ int numCols,+ AttrNumber *matchColIdx,+ FmgrInfo *eqfunctions,+ MemoryContext evalContext);+extern FmgrInfo *execTuplesMatchPrepare(int numCols,+ Oid *eqOperators);+extern void execTuplesHashPrepare(int numCols,+ Oid *eqOperators,+ FmgrInfo **eqFunctions,+ FmgrInfo **hashFunctions);+extern TupleHashTable BuildTupleHashTable(int numCols, AttrNumber *keyColIdx,+ FmgrInfo *eqfunctions,+ FmgrInfo *hashfunctions,+ long nbuckets, Size entrysize,+ MemoryContext tablecxt,+ MemoryContext tempcxt);+extern TupleHashEntry LookupTupleHashEntry(TupleHashTable hashtable,+ TupleTableSlot *slot,+ bool *isnew);+extern TupleHashEntry FindTupleHashEntry(TupleHashTable hashtable,+ TupleTableSlot *slot,+ FmgrInfo *eqfunctions,+ FmgrInfo *hashfunctions);++/*+ * prototypes from functions in execJunk.c+ */+extern JunkFilter *ExecInitJunkFilter(List *targetList, bool hasoid,+ TupleTableSlot *slot);+extern JunkFilter *ExecInitJunkFilterConversion(List *targetList,+ TupleDesc cleanTupType,+ TupleTableSlot *slot);+extern AttrNumber ExecFindJunkAttribute(JunkFilter *junkfilter,+ const char *attrName);+extern AttrNumber ExecFindJunkAttributeInTlist(List *targetlist,+ const char *attrName);+extern Datum ExecGetJunkAttribute(TupleTableSlot *slot, AttrNumber attno,+ bool *isNull);+extern TupleTableSlot *ExecFilterJunk(JunkFilter *junkfilter,+ TupleTableSlot *slot);+++/*+ * prototypes from functions in execMain.c+ */+extern void ExecutorStart(QueryDesc *queryDesc, int eflags);+extern void standard_ExecutorStart(QueryDesc *queryDesc, int eflags);+extern void ExecutorRun(QueryDesc *queryDesc,+ ScanDirection direction, long count);+extern void standard_ExecutorRun(QueryDesc *queryDesc,+ ScanDirection direction, long count);+extern void ExecutorFinish(QueryDesc *queryDesc);+extern void standard_ExecutorFinish(QueryDesc *queryDesc);+extern void ExecutorEnd(QueryDesc *queryDesc);+extern void standard_ExecutorEnd(QueryDesc *queryDesc);+extern void ExecutorRewind(QueryDesc *queryDesc);+extern bool ExecCheckRTPerms(List *rangeTable, bool ereport_on_violation);+extern void CheckValidResultRel(Relation resultRel, CmdType operation);+extern void InitResultRelInfo(ResultRelInfo *resultRelInfo,+ Relation resultRelationDesc,+ Index resultRelationIndex,+ int instrument_options);+extern ResultRelInfo *ExecGetTriggerResultRel(EState *estate, Oid relid);+extern bool ExecContextForcesOids(PlanState *planstate, bool *hasoids);+extern void ExecConstraints(ResultRelInfo *resultRelInfo,+ TupleTableSlot *slot, EState *estate);+extern void ExecWithCheckOptions(WCOKind kind, ResultRelInfo *resultRelInfo,+ TupleTableSlot *slot, EState *estate);+extern LockTupleMode ExecUpdateLockMode(EState *estate, ResultRelInfo *relinfo);+extern ExecRowMark *ExecFindRowMark(EState *estate, Index rti, bool missing_ok);+extern ExecAuxRowMark *ExecBuildAuxRowMark(ExecRowMark *erm, List *targetlist);+extern TupleTableSlot *EvalPlanQual(EState *estate, EPQState *epqstate,+ Relation relation, Index rti, int lockmode,+ ItemPointer tid, TransactionId priorXmax);+extern HeapTuple EvalPlanQualFetch(EState *estate, Relation relation,+ int lockmode, LockWaitPolicy wait_policy, ItemPointer tid,+ TransactionId priorXmax);+extern void EvalPlanQualInit(EPQState *epqstate, EState *estate,+ Plan *subplan, List *auxrowmarks, int epqParam);+extern void EvalPlanQualSetPlan(EPQState *epqstate,+ Plan *subplan, List *auxrowmarks);+extern void EvalPlanQualSetTuple(EPQState *epqstate, Index rti,+ HeapTuple tuple);+extern HeapTuple EvalPlanQualGetTuple(EPQState *epqstate, Index rti);++#define EvalPlanQualSetSlot(epqstate, slot) ((epqstate)->origslot = (slot))+extern void EvalPlanQualFetchRowMarks(EPQState *epqstate);+extern TupleTableSlot *EvalPlanQualNext(EPQState *epqstate);+extern void EvalPlanQualBegin(EPQState *epqstate, EState *parentestate);+extern void EvalPlanQualEnd(EPQState *epqstate);++/*+ * prototypes from functions in execProcnode.c+ */+extern PlanState *ExecInitNode(Plan *node, EState *estate, int eflags);+extern TupleTableSlot *ExecProcNode(PlanState *node);+extern Node *MultiExecProcNode(PlanState *node);+extern void ExecEndNode(PlanState *node);++/*+ * prototypes from functions in execQual.c+ */+extern Datum GetAttributeByNum(HeapTupleHeader tuple, AttrNumber attrno,+ bool *isNull);+extern Datum GetAttributeByName(HeapTupleHeader tuple, const char *attname,+ bool *isNull);+extern Tuplestorestate *ExecMakeTableFunctionResult(ExprState *funcexpr,+ ExprContext *econtext,+ MemoryContext argContext,+ TupleDesc expectedDesc,+ bool randomAccess);+extern Datum ExecEvalExprSwitchContext(ExprState *expression, ExprContext *econtext,+ bool *isNull, ExprDoneCond *isDone);+extern ExprState *ExecInitExpr(Expr *node, PlanState *parent);+extern ExprState *ExecPrepareExpr(Expr *node, EState *estate);+extern bool ExecQual(List *qual, ExprContext *econtext, bool resultForNull);+extern int ExecTargetListLength(List *targetlist);+extern int ExecCleanTargetListLength(List *targetlist);+extern TupleTableSlot *ExecProject(ProjectionInfo *projInfo,+ ExprDoneCond *isDone);++/*+ * prototypes from functions in execScan.c+ */+typedef TupleTableSlot *(*ExecScanAccessMtd) (ScanState *node);+typedef bool (*ExecScanRecheckMtd) (ScanState *node, TupleTableSlot *slot);++extern TupleTableSlot *ExecScan(ScanState *node, ExecScanAccessMtd accessMtd,+ ExecScanRecheckMtd recheckMtd);+extern void ExecAssignScanProjectionInfo(ScanState *node);+extern void ExecAssignScanProjectionInfoWithVarno(ScanState *node, Index varno);+extern void ExecScanReScan(ScanState *node);++/*+ * prototypes from functions in execTuples.c+ */+extern void ExecInitResultTupleSlot(EState *estate, PlanState *planstate);+extern void ExecInitScanTupleSlot(EState *estate, ScanState *scanstate);+extern TupleTableSlot *ExecInitExtraTupleSlot(EState *estate);+extern TupleTableSlot *ExecInitNullTupleSlot(EState *estate,+ TupleDesc tupType);+extern TupleDesc ExecTypeFromTL(List *targetList, bool hasoid);+extern TupleDesc ExecCleanTypeFromTL(List *targetList, bool hasoid);+extern TupleDesc ExecTypeFromExprList(List *exprList);+extern void ExecTypeSetColNames(TupleDesc typeInfo, List *namesList);+extern void UpdateChangedParamSet(PlanState *node, Bitmapset *newchg);++typedef struct TupOutputState+{+ TupleTableSlot *slot;+ DestReceiver *dest;+} TupOutputState;++extern TupOutputState *begin_tup_output_tupdesc(DestReceiver *dest,+ TupleDesc tupdesc);+extern void do_tup_output(TupOutputState *tstate, Datum *values, bool *isnull);+extern void do_text_output_multiline(TupOutputState *tstate, char *text);+extern void end_tup_output(TupOutputState *tstate);++/*+ * Write a single line of text given as a C string.+ *+ * Should only be used with a single-TEXT-attribute tupdesc.+ */+#define do_text_output_oneline(tstate, str_to_emit) \+ do { \+ Datum values_[1]; \+ bool isnull_[1]; \+ values_[0] = PointerGetDatum(cstring_to_text(str_to_emit)); \+ isnull_[0] = false; \+ do_tup_output(tstate, values_, isnull_); \+ pfree(DatumGetPointer(values_[0])); \+ } while (0)+++/*+ * prototypes from functions in execUtils.c+ */+extern EState *CreateExecutorState(void);+extern void FreeExecutorState(EState *estate);+extern ExprContext *CreateExprContext(EState *estate);+extern ExprContext *CreateStandaloneExprContext(void);+extern void FreeExprContext(ExprContext *econtext, bool isCommit);+extern void ReScanExprContext(ExprContext *econtext);++#define ResetExprContext(econtext) \+ MemoryContextReset((econtext)->ecxt_per_tuple_memory)++extern ExprContext *MakePerTupleExprContext(EState *estate);++/* Get an EState's per-output-tuple exprcontext, making it if first use */+#define GetPerTupleExprContext(estate) \+ ((estate)->es_per_tuple_exprcontext ? \+ (estate)->es_per_tuple_exprcontext : \+ MakePerTupleExprContext(estate))++#define GetPerTupleMemoryContext(estate) \+ (GetPerTupleExprContext(estate)->ecxt_per_tuple_memory)++/* Reset an EState's per-output-tuple exprcontext, if one's been created */+#define ResetPerTupleExprContext(estate) \+ do { \+ if ((estate)->es_per_tuple_exprcontext) \+ ResetExprContext((estate)->es_per_tuple_exprcontext); \+ } while (0)++extern void ExecAssignExprContext(EState *estate, PlanState *planstate);+extern void ExecAssignResultType(PlanState *planstate, TupleDesc tupDesc);+extern void ExecAssignResultTypeFromTL(PlanState *planstate);+extern TupleDesc ExecGetResultType(PlanState *planstate);+extern ProjectionInfo *ExecBuildProjectionInfo(List *targetList,+ ExprContext *econtext,+ TupleTableSlot *slot,+ TupleDesc inputDesc);+extern void ExecAssignProjectionInfo(PlanState *planstate,+ TupleDesc inputDesc);+extern void ExecFreeExprContext(PlanState *planstate);+extern TupleDesc ExecGetScanType(ScanState *scanstate);+extern void ExecAssignScanType(ScanState *scanstate, TupleDesc tupDesc);+extern void ExecAssignScanTypeFromOuterPlan(ScanState *scanstate);++extern bool ExecRelationIsTargetRelation(EState *estate, Index scanrelid);++extern Relation ExecOpenScanRelation(EState *estate, Index scanrelid, int eflags);+extern void ExecCloseScanRelation(Relation scanrel);++extern void RegisterExprContextCallback(ExprContext *econtext,+ ExprContextCallbackFunction function,+ Datum arg);+extern void UnregisterExprContextCallback(ExprContext *econtext,+ ExprContextCallbackFunction function,+ Datum arg);++/*+ * prototypes from functions in execIndexing.c+ */+extern void ExecOpenIndices(ResultRelInfo *resultRelInfo, bool speculative);+extern void ExecCloseIndices(ResultRelInfo *resultRelInfo);+extern List *ExecInsertIndexTuples(TupleTableSlot *slot, ItemPointer tupleid,+ EState *estate, bool noDupErr, bool *specConflict,+ List *arbiterIndexes);+extern bool ExecCheckIndexConstraints(TupleTableSlot *slot, EState *estate,+ ItemPointer conflictTid, List *arbiterIndexes);+extern void check_exclusion_constraint(Relation heap, Relation index,+ IndexInfo *indexInfo,+ ItemPointer tupleid,+ Datum *values, bool *isnull,+ EState *estate, bool newIndex);+++#endif /* EXECUTOR_H */
+ foreign/libpg_query/src/postgres/include/executor/functions.h view
@@ -0,0 +1,39 @@+/*-------------------------------------------------------------------------+ *+ * functions.h+ * Declarations for execution of SQL-language functions.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/executor/functions.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef FUNCTIONS_H+#define FUNCTIONS_H++#include "nodes/execnodes.h"+#include "tcop/dest.h"++/* This struct is known only within executor/functions.c */+typedef struct SQLFunctionParseInfo *SQLFunctionParseInfoPtr;++extern Datum fmgr_sql(PG_FUNCTION_ARGS);++extern SQLFunctionParseInfoPtr prepare_sql_fn_parse_info(HeapTuple procedureTuple,+ Node *call_expr,+ Oid inputCollation);++extern void sql_fn_parser_setup(struct ParseState *pstate,+ SQLFunctionParseInfoPtr pinfo);++extern bool check_sql_fn_retval(Oid func_id, Oid rettype,+ List *queryTreeList,+ bool *modifyTargetList,+ JunkFilter **junkFilter);++extern DestReceiver *CreateSQLFunctionDestReceiver(void);++#endif /* FUNCTIONS_H */
+ foreign/libpg_query/src/postgres/include/executor/instrument.h view
@@ -0,0 +1,73 @@+/*-------------------------------------------------------------------------+ *+ * instrument.h+ * definitions for run-time statistics collection+ *+ *+ * Copyright (c) 2001-2015, PostgreSQL Global Development Group+ *+ * src/include/executor/instrument.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef INSTRUMENT_H+#define INSTRUMENT_H++#include "portability/instr_time.h"+++typedef struct BufferUsage+{+ long shared_blks_hit; /* # of shared buffer hits */+ long shared_blks_read; /* # of shared disk blocks read */+ long shared_blks_dirtied; /* # of shared blocks dirtied */+ long shared_blks_written; /* # of shared disk blocks written */+ long local_blks_hit; /* # of local buffer hits */+ long local_blks_read; /* # of local disk blocks read */+ long local_blks_dirtied; /* # of shared blocks dirtied */+ long local_blks_written; /* # of local disk blocks written */+ long temp_blks_read; /* # of temp blocks read */+ long temp_blks_written; /* # of temp blocks written */+ instr_time blk_read_time; /* time spent reading */+ instr_time blk_write_time; /* time spent writing */+} BufferUsage;++/* Flag bits included in InstrAlloc's instrument_options bitmask */+typedef enum InstrumentOption+{+ INSTRUMENT_TIMER = 1 << 0, /* needs timer (and row counts) */+ INSTRUMENT_BUFFERS = 1 << 1, /* needs buffer usage */+ INSTRUMENT_ROWS = 1 << 2, /* needs row count */+ INSTRUMENT_ALL = PG_INT32_MAX+} InstrumentOption;++typedef struct Instrumentation+{+ /* Parameters set at node creation: */+ bool need_timer; /* TRUE if we need timer data */+ bool need_bufusage; /* TRUE if we need buffer usage data */+ /* Info about current plan cycle: */+ bool running; /* TRUE if we've completed first tuple */+ instr_time starttime; /* Start time of current iteration of node */+ instr_time counter; /* Accumulated runtime for this node */+ double firsttuple; /* Time for first tuple of this cycle */+ double tuplecount; /* Tuples emitted so far this cycle */+ BufferUsage bufusage_start; /* Buffer usage at start */+ /* Accumulated statistics across all completed cycles: */+ double startup; /* Total startup time (in seconds) */+ double total; /* Total total time (in seconds) */+ double ntuples; /* Total tuples produced */+ double nloops; /* # of run cycles for this node */+ double nfiltered1; /* # tuples removed by scanqual or joinqual */+ double nfiltered2; /* # tuples removed by "other" quals */+ BufferUsage bufusage; /* Total buffer usage */+} Instrumentation;++extern PGDLLIMPORT BufferUsage pgBufferUsage;++extern Instrumentation *InstrAlloc(int n, int instrument_options);+extern void InstrStartNode(Instrumentation *instr);+extern void InstrStopNode(Instrumentation *instr, double nTuples);+extern void InstrEndLoop(Instrumentation *instr);++#endif /* INSTRUMENT_H */
+ foreign/libpg_query/src/postgres/include/executor/spi.h view
@@ -0,0 +1,150 @@+/*-------------------------------------------------------------------------+ *+ * spi.h+ * Server Programming Interface public declarations+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/executor/spi.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef SPI_H+#define SPI_H++#include "lib/ilist.h"+#include "nodes/parsenodes.h"+#include "utils/portal.h"+++typedef struct SPITupleTable+{+ MemoryContext tuptabcxt; /* memory context of result table */+ uint32 alloced; /* # of alloced vals */+ uint32 free; /* # of free vals */+ TupleDesc tupdesc; /* tuple descriptor */+ HeapTuple *vals; /* tuples */+ slist_node next; /* link for internal bookkeeping */+ SubTransactionId subid; /* subxact in which tuptable was created */+} SPITupleTable;++/* Plans are opaque structs for standard users of SPI */+typedef struct _SPI_plan *SPIPlanPtr;++#define SPI_ERROR_CONNECT (-1)+#define SPI_ERROR_COPY (-2)+#define SPI_ERROR_OPUNKNOWN (-3)+#define SPI_ERROR_UNCONNECTED (-4)+#define SPI_ERROR_CURSOR (-5) /* not used anymore */+#define SPI_ERROR_ARGUMENT (-6)+#define SPI_ERROR_PARAM (-7)+#define SPI_ERROR_TRANSACTION (-8)+#define SPI_ERROR_NOATTRIBUTE (-9)+#define SPI_ERROR_NOOUTFUNC (-10)+#define SPI_ERROR_TYPUNKNOWN (-11)++#define SPI_OK_CONNECT 1+#define SPI_OK_FINISH 2+#define SPI_OK_FETCH 3+#define SPI_OK_UTILITY 4+#define SPI_OK_SELECT 5+#define SPI_OK_SELINTO 6+#define SPI_OK_INSERT 7+#define SPI_OK_DELETE 8+#define SPI_OK_UPDATE 9+#define SPI_OK_CURSOR 10+#define SPI_OK_INSERT_RETURNING 11+#define SPI_OK_DELETE_RETURNING 12+#define SPI_OK_UPDATE_RETURNING 13+#define SPI_OK_REWRITTEN 14++extern PGDLLIMPORT uint32 SPI_processed;+extern PGDLLIMPORT Oid SPI_lastoid;+extern PGDLLIMPORT SPITupleTable *SPI_tuptable;+extern PGDLLIMPORT int SPI_result;++extern int SPI_connect(void);+extern int SPI_finish(void);+extern void SPI_push(void);+extern void SPI_pop(void);+extern bool SPI_push_conditional(void);+extern void SPI_pop_conditional(bool pushed);+extern void SPI_restore_connection(void);+extern int SPI_execute(const char *src, bool read_only, long tcount);+extern int SPI_execute_plan(SPIPlanPtr plan, Datum *Values, const char *Nulls,+ bool read_only, long tcount);+extern int SPI_execute_plan_with_paramlist(SPIPlanPtr plan,+ ParamListInfo params,+ bool read_only, long tcount);+extern int SPI_exec(const char *src, long tcount);+extern int SPI_execp(SPIPlanPtr plan, Datum *Values, const char *Nulls,+ long tcount);+extern int SPI_execute_snapshot(SPIPlanPtr plan,+ Datum *Values, const char *Nulls,+ Snapshot snapshot,+ Snapshot crosscheck_snapshot,+ bool read_only, bool fire_triggers, long tcount);+extern int SPI_execute_with_args(const char *src,+ int nargs, Oid *argtypes,+ Datum *Values, const char *Nulls,+ bool read_only, long tcount);+extern SPIPlanPtr SPI_prepare(const char *src, int nargs, Oid *argtypes);+extern SPIPlanPtr SPI_prepare_cursor(const char *src, int nargs, Oid *argtypes,+ int cursorOptions);+extern SPIPlanPtr SPI_prepare_params(const char *src,+ ParserSetupHook parserSetup,+ void *parserSetupArg,+ int cursorOptions);+extern int SPI_keepplan(SPIPlanPtr plan);+extern SPIPlanPtr SPI_saveplan(SPIPlanPtr plan);+extern int SPI_freeplan(SPIPlanPtr plan);++extern Oid SPI_getargtypeid(SPIPlanPtr plan, int argIndex);+extern int SPI_getargcount(SPIPlanPtr plan);+extern bool SPI_is_cursor_plan(SPIPlanPtr plan);+extern bool SPI_plan_is_valid(SPIPlanPtr plan);+extern const char *SPI_result_code_string(int code);++extern List *SPI_plan_get_plan_sources(SPIPlanPtr plan);+extern CachedPlan *SPI_plan_get_cached_plan(SPIPlanPtr plan);++extern HeapTuple SPI_copytuple(HeapTuple tuple);+extern HeapTupleHeader SPI_returntuple(HeapTuple tuple, TupleDesc tupdesc);+extern HeapTuple SPI_modifytuple(Relation rel, HeapTuple tuple, int natts,+ int *attnum, Datum *Values, const char *Nulls);+extern int SPI_fnumber(TupleDesc tupdesc, const char *fname);+extern char *SPI_fname(TupleDesc tupdesc, int fnumber);+extern char *SPI_getvalue(HeapTuple tuple, TupleDesc tupdesc, int fnumber);+extern Datum SPI_getbinval(HeapTuple tuple, TupleDesc tupdesc, int fnumber, bool *isnull);+extern char *SPI_gettype(TupleDesc tupdesc, int fnumber);+extern Oid SPI_gettypeid(TupleDesc tupdesc, int fnumber);+extern char *SPI_getrelname(Relation rel);+extern char *SPI_getnspname(Relation rel);+extern void *SPI_palloc(Size size);+extern void *SPI_repalloc(void *pointer, Size size);+extern void SPI_pfree(void *pointer);+extern Datum SPI_datumTransfer(Datum value, bool typByVal, int typLen);+extern void SPI_freetuple(HeapTuple pointer);+extern void SPI_freetuptable(SPITupleTable *tuptable);++extern Portal SPI_cursor_open(const char *name, SPIPlanPtr plan,+ Datum *Values, const char *Nulls, bool read_only);+extern Portal SPI_cursor_open_with_args(const char *name,+ const char *src,+ int nargs, Oid *argtypes,+ Datum *Values, const char *Nulls,+ bool read_only, int cursorOptions);+extern Portal SPI_cursor_open_with_paramlist(const char *name, SPIPlanPtr plan,+ ParamListInfo params, bool read_only);+extern Portal SPI_cursor_find(const char *name);+extern void SPI_cursor_fetch(Portal portal, bool forward, long count);+extern void SPI_cursor_move(Portal portal, bool forward, long count);+extern void SPI_scroll_cursor_fetch(Portal, FetchDirection direction, long count);+extern void SPI_scroll_cursor_move(Portal, FetchDirection direction, long count);+extern void SPI_cursor_close(Portal portal);++extern void AtEOXact_SPI(bool isCommit);+extern void AtEOSubXact_SPI(bool isCommit, SubTransactionId mySubid);++#endif /* SPI_H */
+ foreign/libpg_query/src/postgres/include/executor/tuptable.h view
@@ -0,0 +1,174 @@+/*-------------------------------------------------------------------------+ *+ * tuptable.h+ * tuple table support stuff+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/executor/tuptable.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef TUPTABLE_H+#define TUPTABLE_H++#include "access/htup.h"+#include "access/tupdesc.h"+#include "storage/buf.h"++/*----------+ * The executor stores tuples in a "tuple table" which is a List of+ * independent TupleTableSlots. There are several cases we need to handle:+ * 1. physical tuple in a disk buffer page+ * 2. physical tuple constructed in palloc'ed memory+ * 3. "minimal" physical tuple constructed in palloc'ed memory+ * 4. "virtual" tuple consisting of Datum/isnull arrays+ *+ * The first two cases are similar in that they both deal with "materialized"+ * tuples, but resource management is different. For a tuple in a disk page+ * we need to hold a pin on the buffer until the TupleTableSlot's reference+ * to the tuple is dropped; while for a palloc'd tuple we usually want the+ * tuple pfree'd when the TupleTableSlot's reference is dropped.+ *+ * A "minimal" tuple is handled similarly to a palloc'd regular tuple.+ * At present, minimal tuples never are stored in buffers, so there is no+ * parallel to case 1. Note that a minimal tuple has no "system columns".+ * (Actually, it could have an OID, but we have no need to access the OID.)+ *+ * A "virtual" tuple is an optimization used to minimize physical data+ * copying in a nest of plan nodes. Any pass-by-reference Datums in the+ * tuple point to storage that is not directly associated with the+ * TupleTableSlot; generally they will point to part of a tuple stored in+ * a lower plan node's output TupleTableSlot, or to a function result+ * constructed in a plan node's per-tuple econtext. It is the responsibility+ * of the generating plan node to be sure these resources are not released+ * for as long as the virtual tuple needs to be valid. We only use virtual+ * tuples in the result slots of plan nodes --- tuples to be copied anywhere+ * else need to be "materialized" into physical tuples. Note also that a+ * virtual tuple does not have any "system columns".+ *+ * It is also possible for a TupleTableSlot to hold both physical and minimal+ * copies of a tuple. This is done when the slot is requested to provide+ * the format other than the one it currently holds. (Originally we attempted+ * to handle such requests by replacing one format with the other, but that+ * had the fatal defect of invalidating any pass-by-reference Datums pointing+ * into the existing slot contents.) Both copies must contain identical data+ * payloads when this is the case.+ *+ * The Datum/isnull arrays of a TupleTableSlot serve double duty. When the+ * slot contains a virtual tuple, they are the authoritative data. When the+ * slot contains a physical tuple, the arrays contain data extracted from+ * the tuple. (In this state, any pass-by-reference Datums point into+ * the physical tuple.) The extracted information is built "lazily",+ * ie, only as needed. This serves to avoid repeated extraction of data+ * from the physical tuple.+ *+ * A TupleTableSlot can also be "empty", holding no valid data. This is+ * the only valid state for a freshly-created slot that has not yet had a+ * tuple descriptor assigned to it. In this state, tts_isempty must be+ * TRUE, tts_shouldFree FALSE, tts_tuple NULL, tts_buffer InvalidBuffer,+ * and tts_nvalid zero.+ *+ * The tupleDescriptor is simply referenced, not copied, by the TupleTableSlot+ * code. The caller of ExecSetSlotDescriptor() is responsible for providing+ * a descriptor that will live as long as the slot does. (Typically, both+ * slots and descriptors are in per-query memory and are freed by memory+ * context deallocation at query end; so it's not worth providing any extra+ * mechanism to do more. However, the slot will increment the tupdesc+ * reference count if a reference-counted tupdesc is supplied.)+ *+ * When tts_shouldFree is true, the physical tuple is "owned" by the slot+ * and should be freed when the slot's reference to the tuple is dropped.+ *+ * If tts_buffer is not InvalidBuffer, then the slot is holding a pin+ * on the indicated buffer page; drop the pin when we release the+ * slot's reference to that buffer. (tts_shouldFree should always be+ * false in such a case, since presumably tts_tuple is pointing at the+ * buffer page.)+ *+ * tts_nvalid indicates the number of valid columns in the tts_values/isnull+ * arrays. When the slot is holding a "virtual" tuple this must be equal+ * to the descriptor's natts. When the slot is holding a physical tuple+ * this is equal to the number of columns we have extracted (we always+ * extract columns from left to right, so there are no holes).+ *+ * tts_values/tts_isnull are allocated when a descriptor is assigned to the+ * slot; they are of length equal to the descriptor's natts.+ *+ * tts_mintuple must always be NULL if the slot does not hold a "minimal"+ * tuple. When it does, tts_mintuple points to the actual MinimalTupleData+ * object (the thing to be pfree'd if tts_shouldFreeMin is true). If the slot+ * has only a minimal and not also a regular physical tuple, then tts_tuple+ * points at tts_minhdr and the fields of that struct are set correctly+ * for access to the minimal tuple; in particular, tts_minhdr.t_data points+ * MINIMAL_TUPLE_OFFSET bytes before tts_mintuple. This allows column+ * extraction to treat the case identically to regular physical tuples.+ *+ * tts_slow/tts_off are saved state for slot_deform_tuple, and should not+ * be touched by any other code.+ *----------+ */+typedef struct TupleTableSlot+{+ NodeTag type;+ bool tts_isempty; /* true = slot is empty */+ bool tts_shouldFree; /* should pfree tts_tuple? */+ bool tts_shouldFreeMin; /* should pfree tts_mintuple? */+ bool tts_slow; /* saved state for slot_deform_tuple */+ HeapTuple tts_tuple; /* physical tuple, or NULL if virtual */+ TupleDesc tts_tupleDescriptor; /* slot's tuple descriptor */+ MemoryContext tts_mcxt; /* slot itself is in this context */+ Buffer tts_buffer; /* tuple's buffer, or InvalidBuffer */+ int tts_nvalid; /* # of valid values in tts_values */+ Datum *tts_values; /* current per-attribute values */+ bool *tts_isnull; /* current per-attribute isnull flags */+ MinimalTuple tts_mintuple; /* minimal tuple, or NULL if none */+ HeapTupleData tts_minhdr; /* workspace for minimal-tuple-only case */+ long tts_off; /* saved state for slot_deform_tuple */+} TupleTableSlot;++#define TTS_HAS_PHYSICAL_TUPLE(slot) \+ ((slot)->tts_tuple != NULL && (slot)->tts_tuple != &((slot)->tts_minhdr))++/*+ * TupIsNull -- is a TupleTableSlot empty?+ */+#define TupIsNull(slot) \+ ((slot) == NULL || (slot)->tts_isempty)++/* in executor/execTuples.c */+extern TupleTableSlot *MakeTupleTableSlot(void);+extern TupleTableSlot *ExecAllocTableSlot(List **tupleTable);+extern void ExecResetTupleTable(List *tupleTable, bool shouldFree);+extern TupleTableSlot *MakeSingleTupleTableSlot(TupleDesc tupdesc);+extern void ExecDropSingleTupleTableSlot(TupleTableSlot *slot);+extern void ExecSetSlotDescriptor(TupleTableSlot *slot, TupleDesc tupdesc);+extern TupleTableSlot *ExecStoreTuple(HeapTuple tuple,+ TupleTableSlot *slot,+ Buffer buffer,+ bool shouldFree);+extern TupleTableSlot *ExecStoreMinimalTuple(MinimalTuple mtup,+ TupleTableSlot *slot,+ bool shouldFree);+extern TupleTableSlot *ExecClearTuple(TupleTableSlot *slot);+extern TupleTableSlot *ExecStoreVirtualTuple(TupleTableSlot *slot);+extern TupleTableSlot *ExecStoreAllNullTuple(TupleTableSlot *slot);+extern HeapTuple ExecCopySlotTuple(TupleTableSlot *slot);+extern MinimalTuple ExecCopySlotMinimalTuple(TupleTableSlot *slot);+extern HeapTuple ExecFetchSlotTuple(TupleTableSlot *slot);+extern MinimalTuple ExecFetchSlotMinimalTuple(TupleTableSlot *slot);+extern Datum ExecFetchSlotTupleDatum(TupleTableSlot *slot);+extern HeapTuple ExecMaterializeSlot(TupleTableSlot *slot);+extern TupleTableSlot *ExecCopySlot(TupleTableSlot *dstslot,+ TupleTableSlot *srcslot);+extern TupleTableSlot *ExecMakeSlotContentsReadOnly(TupleTableSlot *slot);++/* in access/common/heaptuple.c */+extern Datum slot_getattr(TupleTableSlot *slot, int attnum, bool *isnull);+extern void slot_getallattrs(TupleTableSlot *slot);+extern void slot_getsomeattrs(TupleTableSlot *slot, int attnum);+extern bool slot_attisnull(TupleTableSlot *slot, int attnum);++#endif /* TUPTABLE_H */
+ foreign/libpg_query/src/postgres/include/fmgr.h view
@@ -0,0 +1,710 @@+/*-------------------------------------------------------------------------+ *+ * fmgr.h+ * Definitions for the Postgres function manager and function-call+ * interface.+ *+ * This file must be included by all Postgres modules that either define+ * or call fmgr-callable functions.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/fmgr.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef FMGR_H+#define FMGR_H++/* We don't want to include primnodes.h here, so make some stub references */+typedef struct Node *fmNodePtr;+typedef struct Aggref *fmAggrefPtr;++/* Likewise, avoid including execnodes.h here */+typedef void (*fmExprContextCallbackFunction) (Datum arg);++/* Likewise, avoid including stringinfo.h here */+typedef struct StringInfoData *fmStringInfo;+++/*+ * All functions that can be called directly by fmgr must have this signature.+ * (Other functions can be called by using a handler that does have this+ * signature.)+ */++typedef struct FunctionCallInfoData *FunctionCallInfo;++typedef Datum (*PGFunction) (FunctionCallInfo fcinfo);++/*+ * This struct holds the system-catalog information that must be looked up+ * before a function can be called through fmgr. If the same function is+ * to be called multiple times, the lookup need be done only once and the+ * info struct saved for re-use.+ *+ * Note that fn_expr really is parse-time-determined information about the+ * arguments, rather than about the function itself. But it's convenient+ * to store it here rather than in FunctionCallInfoData, where it might more+ * logically belong.+ */+typedef struct FmgrInfo+{+ PGFunction fn_addr; /* pointer to function or handler to be called */+ Oid fn_oid; /* OID of function (NOT of handler, if any) */+ short fn_nargs; /* number of input args (0..FUNC_MAX_ARGS) */+ bool fn_strict; /* function is "strict" (NULL in => NULL out) */+ bool fn_retset; /* function returns a set */+ unsigned char fn_stats; /* collect stats if track_functions > this */+ void *fn_extra; /* extra space for use by handler */+ MemoryContext fn_mcxt; /* memory context to store fn_extra in */+ fmNodePtr fn_expr; /* expression parse tree for call, or NULL */+} FmgrInfo;++/*+ * This struct is the data actually passed to an fmgr-called function.+ */+typedef struct FunctionCallInfoData+{+ FmgrInfo *flinfo; /* ptr to lookup info used for this call */+ fmNodePtr context; /* pass info about context of call */+ fmNodePtr resultinfo; /* pass or return extra info about result */+ Oid fncollation; /* collation for function to use */+ bool isnull; /* function must set true if result is NULL */+ short nargs; /* # arguments actually passed */+ Datum arg[FUNC_MAX_ARGS]; /* Arguments passed to function */+ bool argnull[FUNC_MAX_ARGS]; /* T if arg[i] is actually NULL */+} FunctionCallInfoData;++/*+ * This routine fills a FmgrInfo struct, given the OID+ * of the function to be called.+ */+extern void fmgr_info(Oid functionId, FmgrInfo *finfo);++/*+ * Same, when the FmgrInfo struct is in a memory context longer-lived than+ * CurrentMemoryContext. The specified context will be set as fn_mcxt+ * and used to hold all subsidiary data of finfo.+ */+extern void fmgr_info_cxt(Oid functionId, FmgrInfo *finfo,+ MemoryContext mcxt);++/* Convenience macro for setting the fn_expr field */+#define fmgr_info_set_expr(expr, finfo) \+ ((finfo)->fn_expr = (expr))++/*+ * Copy an FmgrInfo struct+ */+extern void fmgr_info_copy(FmgrInfo *dstinfo, FmgrInfo *srcinfo,+ MemoryContext destcxt);++/*+ * This macro initializes all the fields of a FunctionCallInfoData except+ * for the arg[] and argnull[] arrays. Performance testing has shown that+ * the fastest way to set up argnull[] for small numbers of arguments is to+ * explicitly set each required element to false, so we don't try to zero+ * out the argnull[] array in the macro.+ */+#define InitFunctionCallInfoData(Fcinfo, Flinfo, Nargs, Collation, Context, Resultinfo) \+ do { \+ (Fcinfo).flinfo = (Flinfo); \+ (Fcinfo).context = (Context); \+ (Fcinfo).resultinfo = (Resultinfo); \+ (Fcinfo).fncollation = (Collation); \+ (Fcinfo).isnull = false; \+ (Fcinfo).nargs = (Nargs); \+ } while (0)++/*+ * This macro invokes a function given a filled-in FunctionCallInfoData+ * struct. The macro result is the returned Datum --- but note that+ * caller must still check fcinfo->isnull! Also, if function is strict,+ * it is caller's responsibility to verify that no null arguments are present+ * before calling.+ */+#define FunctionCallInvoke(fcinfo) ((* (fcinfo)->flinfo->fn_addr) (fcinfo))+++/*-------------------------------------------------------------------------+ * Support macros to ease writing fmgr-compatible functions+ *+ * A C-coded fmgr-compatible function should be declared as+ *+ * Datum+ * function_name(PG_FUNCTION_ARGS)+ * {+ * ...+ * }+ *+ * It should access its arguments using appropriate PG_GETARG_xxx macros+ * and should return its result using PG_RETURN_xxx.+ *+ *-------------------------------------------------------------------------+ */++/* Standard parameter list for fmgr-compatible functions */+#define PG_FUNCTION_ARGS FunctionCallInfo fcinfo++/*+ * Get collation function should use.+ */+#define PG_GET_COLLATION() (fcinfo->fncollation)++/*+ * Get number of arguments passed to function.+ */+#define PG_NARGS() (fcinfo->nargs)++/*+ * If function is not marked "proisstrict" in pg_proc, it must check for+ * null arguments using this macro. Do not try to GETARG a null argument!+ */+#define PG_ARGISNULL(n) (fcinfo->argnull[n])++/*+ * Support for fetching detoasted copies of toastable datatypes (all of+ * which are varlena types). pg_detoast_datum() gives you either the input+ * datum (if not toasted) or a detoasted copy allocated with palloc().+ * pg_detoast_datum_copy() always gives you a palloc'd copy --- use it+ * if you need a modifiable copy of the input. Caller is expected to have+ * checked for null inputs first, if necessary.+ *+ * pg_detoast_datum_packed() will return packed (1-byte header) datums+ * unmodified. It will still expand an externally toasted or compressed datum.+ * The resulting datum can be accessed using VARSIZE_ANY() and VARDATA_ANY()+ * (beware of multiple evaluations in those macros!)+ *+ * WARNING: It is only safe to use pg_detoast_datum_packed() and+ * VARDATA_ANY() if you really don't care about the alignment. Either because+ * you're working with something like text where the alignment doesn't matter+ * or because you're not going to access its constituent parts and just use+ * things like memcpy on it anyways.+ *+ * Note: it'd be nice if these could be macros, but I see no way to do that+ * without evaluating the arguments multiple times, which is NOT acceptable.+ */+extern struct varlena *pg_detoast_datum(struct varlena * datum);+extern struct varlena *pg_detoast_datum_copy(struct varlena * datum);+extern struct varlena *pg_detoast_datum_slice(struct varlena * datum,+ int32 first, int32 count);+extern struct varlena *pg_detoast_datum_packed(struct varlena * datum);++#define PG_DETOAST_DATUM(datum) \+ pg_detoast_datum((struct varlena *) DatumGetPointer(datum))+#define PG_DETOAST_DATUM_COPY(datum) \+ pg_detoast_datum_copy((struct varlena *) DatumGetPointer(datum))+#define PG_DETOAST_DATUM_SLICE(datum,f,c) \+ pg_detoast_datum_slice((struct varlena *) DatumGetPointer(datum), \+ (int32) (f), (int32) (c))+/* WARNING -- unaligned pointer */+#define PG_DETOAST_DATUM_PACKED(datum) \+ pg_detoast_datum_packed((struct varlena *) DatumGetPointer(datum))++/*+ * Support for cleaning up detoasted copies of inputs. This must only+ * be used for pass-by-ref datatypes, and normally would only be used+ * for toastable types. If the given pointer is different from the+ * original argument, assume it's a palloc'd detoasted copy, and pfree it.+ * NOTE: most functions on toastable types do not have to worry about this,+ * but we currently require that support functions for indexes not leak+ * memory.+ */+#define PG_FREE_IF_COPY(ptr,n) \+ do { \+ if ((Pointer) (ptr) != PG_GETARG_POINTER(n)) \+ pfree(ptr); \+ } while (0)++/* Macros for fetching arguments of standard types */++#define PG_GETARG_DATUM(n) (fcinfo->arg[n])+#define PG_GETARG_INT32(n) DatumGetInt32(PG_GETARG_DATUM(n))+#define PG_GETARG_UINT32(n) DatumGetUInt32(PG_GETARG_DATUM(n))+#define PG_GETARG_INT16(n) DatumGetInt16(PG_GETARG_DATUM(n))+#define PG_GETARG_UINT16(n) DatumGetUInt16(PG_GETARG_DATUM(n))+#define PG_GETARG_CHAR(n) DatumGetChar(PG_GETARG_DATUM(n))+#define PG_GETARG_BOOL(n) DatumGetBool(PG_GETARG_DATUM(n))+#define PG_GETARG_OID(n) DatumGetObjectId(PG_GETARG_DATUM(n))+#define PG_GETARG_POINTER(n) DatumGetPointer(PG_GETARG_DATUM(n))+#define PG_GETARG_CSTRING(n) DatumGetCString(PG_GETARG_DATUM(n))+#define PG_GETARG_NAME(n) DatumGetName(PG_GETARG_DATUM(n))+/* these macros hide the pass-by-reference-ness of the datatype: */+#define PG_GETARG_FLOAT4(n) DatumGetFloat4(PG_GETARG_DATUM(n))+#define PG_GETARG_FLOAT8(n) DatumGetFloat8(PG_GETARG_DATUM(n))+#define PG_GETARG_INT64(n) DatumGetInt64(PG_GETARG_DATUM(n))+/* use this if you want the raw, possibly-toasted input datum: */+#define PG_GETARG_RAW_VARLENA_P(n) ((struct varlena *) PG_GETARG_POINTER(n))+/* use this if you want the input datum de-toasted: */+#define PG_GETARG_VARLENA_P(n) PG_DETOAST_DATUM(PG_GETARG_DATUM(n))+/* and this if you can handle 1-byte-header datums: */+#define PG_GETARG_VARLENA_PP(n) PG_DETOAST_DATUM_PACKED(PG_GETARG_DATUM(n))+/* DatumGetFoo macros for varlena types will typically look like this: */+#define DatumGetByteaP(X) ((bytea *) PG_DETOAST_DATUM(X))+#define DatumGetByteaPP(X) ((bytea *) PG_DETOAST_DATUM_PACKED(X))+#define DatumGetTextP(X) ((text *) PG_DETOAST_DATUM(X))+#define DatumGetTextPP(X) ((text *) PG_DETOAST_DATUM_PACKED(X))+#define DatumGetBpCharP(X) ((BpChar *) PG_DETOAST_DATUM(X))+#define DatumGetBpCharPP(X) ((BpChar *) PG_DETOAST_DATUM_PACKED(X))+#define DatumGetVarCharP(X) ((VarChar *) PG_DETOAST_DATUM(X))+#define DatumGetVarCharPP(X) ((VarChar *) PG_DETOAST_DATUM_PACKED(X))+#define DatumGetHeapTupleHeader(X) ((HeapTupleHeader) PG_DETOAST_DATUM(X))+/* And we also offer variants that return an OK-to-write copy */+#define DatumGetByteaPCopy(X) ((bytea *) PG_DETOAST_DATUM_COPY(X))+#define DatumGetTextPCopy(X) ((text *) PG_DETOAST_DATUM_COPY(X))+#define DatumGetBpCharPCopy(X) ((BpChar *) PG_DETOAST_DATUM_COPY(X))+#define DatumGetVarCharPCopy(X) ((VarChar *) PG_DETOAST_DATUM_COPY(X))+#define DatumGetHeapTupleHeaderCopy(X) ((HeapTupleHeader) PG_DETOAST_DATUM_COPY(X))+/* Variants which return n bytes starting at pos. m */+#define DatumGetByteaPSlice(X,m,n) ((bytea *) PG_DETOAST_DATUM_SLICE(X,m,n))+#define DatumGetTextPSlice(X,m,n) ((text *) PG_DETOAST_DATUM_SLICE(X,m,n))+#define DatumGetBpCharPSlice(X,m,n) ((BpChar *) PG_DETOAST_DATUM_SLICE(X,m,n))+#define DatumGetVarCharPSlice(X,m,n) ((VarChar *) PG_DETOAST_DATUM_SLICE(X,m,n))+/* GETARG macros for varlena types will typically look like this: */+#define PG_GETARG_BYTEA_P(n) DatumGetByteaP(PG_GETARG_DATUM(n))+#define PG_GETARG_BYTEA_PP(n) DatumGetByteaPP(PG_GETARG_DATUM(n))+#define PG_GETARG_TEXT_P(n) DatumGetTextP(PG_GETARG_DATUM(n))+#define PG_GETARG_TEXT_PP(n) DatumGetTextPP(PG_GETARG_DATUM(n))+#define PG_GETARG_BPCHAR_P(n) DatumGetBpCharP(PG_GETARG_DATUM(n))+#define PG_GETARG_BPCHAR_PP(n) DatumGetBpCharPP(PG_GETARG_DATUM(n))+#define PG_GETARG_VARCHAR_P(n) DatumGetVarCharP(PG_GETARG_DATUM(n))+#define PG_GETARG_VARCHAR_PP(n) DatumGetVarCharPP(PG_GETARG_DATUM(n))+#define PG_GETARG_HEAPTUPLEHEADER(n) DatumGetHeapTupleHeader(PG_GETARG_DATUM(n))+/* And we also offer variants that return an OK-to-write copy */+#define PG_GETARG_BYTEA_P_COPY(n) DatumGetByteaPCopy(PG_GETARG_DATUM(n))+#define PG_GETARG_TEXT_P_COPY(n) DatumGetTextPCopy(PG_GETARG_DATUM(n))+#define PG_GETARG_BPCHAR_P_COPY(n) DatumGetBpCharPCopy(PG_GETARG_DATUM(n))+#define PG_GETARG_VARCHAR_P_COPY(n) DatumGetVarCharPCopy(PG_GETARG_DATUM(n))+#define PG_GETARG_HEAPTUPLEHEADER_COPY(n) DatumGetHeapTupleHeaderCopy(PG_GETARG_DATUM(n))+/* And a b-byte slice from position a -also OK to write */+#define PG_GETARG_BYTEA_P_SLICE(n,a,b) DatumGetByteaPSlice(PG_GETARG_DATUM(n),a,b)+#define PG_GETARG_TEXT_P_SLICE(n,a,b) DatumGetTextPSlice(PG_GETARG_DATUM(n),a,b)+#define PG_GETARG_BPCHAR_P_SLICE(n,a,b) DatumGetBpCharPSlice(PG_GETARG_DATUM(n),a,b)+#define PG_GETARG_VARCHAR_P_SLICE(n,a,b) DatumGetVarCharPSlice(PG_GETARG_DATUM(n),a,b)++/* To return a NULL do this: */+#define PG_RETURN_NULL() \+ do { fcinfo->isnull = true; return (Datum) 0; } while (0)++/* A few internal functions return void (which is not the same as NULL!) */+#define PG_RETURN_VOID() return (Datum) 0++/* Macros for returning results of standard types */++#define PG_RETURN_DATUM(x) return (x)+#define PG_RETURN_INT32(x) return Int32GetDatum(x)+#define PG_RETURN_UINT32(x) return UInt32GetDatum(x)+#define PG_RETURN_INT16(x) return Int16GetDatum(x)+#define PG_RETURN_UINT16(x) return UInt16GetDatum(x)+#define PG_RETURN_CHAR(x) return CharGetDatum(x)+#define PG_RETURN_BOOL(x) return BoolGetDatum(x)+#define PG_RETURN_OID(x) return ObjectIdGetDatum(x)+#define PG_RETURN_POINTER(x) return PointerGetDatum(x)+#define PG_RETURN_CSTRING(x) return CStringGetDatum(x)+#define PG_RETURN_NAME(x) return NameGetDatum(x)+/* these macros hide the pass-by-reference-ness of the datatype: */+#define PG_RETURN_FLOAT4(x) return Float4GetDatum(x)+#define PG_RETURN_FLOAT8(x) return Float8GetDatum(x)+#define PG_RETURN_INT64(x) return Int64GetDatum(x)+/* RETURN macros for other pass-by-ref types will typically look like this: */+#define PG_RETURN_BYTEA_P(x) PG_RETURN_POINTER(x)+#define PG_RETURN_TEXT_P(x) PG_RETURN_POINTER(x)+#define PG_RETURN_BPCHAR_P(x) PG_RETURN_POINTER(x)+#define PG_RETURN_VARCHAR_P(x) PG_RETURN_POINTER(x)+#define PG_RETURN_HEAPTUPLEHEADER(x) return HeapTupleHeaderGetDatum(x)+++/*-------------------------------------------------------------------------+ * Support for detecting call convention of dynamically-loaded functions+ *+ * Dynamically loaded functions may use either the version-1 ("new style")+ * or version-0 ("old style") calling convention. Version 1 is the call+ * convention defined in this header file; version 0 is the old "plain C"+ * convention. A version-1 function must be accompanied by the macro call+ *+ * PG_FUNCTION_INFO_V1(function_name);+ *+ * Note that internal functions do not need this decoration since they are+ * assumed to be version-1.+ *+ *-------------------------------------------------------------------------+ */++typedef struct+{+ int api_version; /* specifies call convention version number */+ /* More fields may be added later, for version numbers > 1. */+} Pg_finfo_record;++/* Expected signature of an info function */+typedef const Pg_finfo_record *(*PGFInfoFunction) (void);++/*+ * Macro to build an info function associated with the given function name.+ * Win32 loadable functions usually link with 'dlltool --export-all', but it+ * doesn't hurt to add PGDLLIMPORT in case they don't.+ */+#define PG_FUNCTION_INFO_V1(funcname) \+Datum funcname(PG_FUNCTION_ARGS); \+extern PGDLLEXPORT const Pg_finfo_record * CppConcat(pg_finfo_,funcname)(void); \+const Pg_finfo_record * \+CppConcat(pg_finfo_,funcname) (void) \+{ \+ static const Pg_finfo_record my_finfo = { 1 }; \+ return &my_finfo; \+} \+extern int no_such_variable+++/*-------------------------------------------------------------------------+ * Support for verifying backend compatibility of loaded modules+ *+ * We require dynamically-loaded modules to include the macro call+ * PG_MODULE_MAGIC;+ * so that we can check for obvious incompatibility, such as being compiled+ * for a different major PostgreSQL version.+ *+ * To compile with versions of PostgreSQL that do not support this,+ * you may put an #ifdef/#endif test around it. Note that in a multiple-+ * source-file module, the macro call should only appear once.+ *+ * The specific items included in the magic block are intended to be ones that+ * are custom-configurable and especially likely to break dynamically loaded+ * modules if they were compiled with other values. Also, the length field+ * can be used to detect definition changes.+ *+ * Note: we compare magic blocks with memcmp(), so there had better not be+ * any alignment pad bytes in them.+ *+ * Note: when changing the contents of magic blocks, be sure to adjust the+ * incompatible_module_error() function in dfmgr.c.+ *-------------------------------------------------------------------------+ */++/* Definition of the magic block structure */+typedef struct+{+ int len; /* sizeof(this struct) */+ int version; /* PostgreSQL major version */+ int funcmaxargs; /* FUNC_MAX_ARGS */+ int indexmaxkeys; /* INDEX_MAX_KEYS */+ int namedatalen; /* NAMEDATALEN */+ int float4byval; /* FLOAT4PASSBYVAL */+ int float8byval; /* FLOAT8PASSBYVAL */+} Pg_magic_struct;++/* The actual data block contents */+#define PG_MODULE_MAGIC_DATA \+{ \+ sizeof(Pg_magic_struct), \+ PG_VERSION_NUM / 100, \+ FUNC_MAX_ARGS, \+ INDEX_MAX_KEYS, \+ NAMEDATALEN, \+ FLOAT4PASSBYVAL, \+ FLOAT8PASSBYVAL \+}++/*+ * Declare the module magic function. It needs to be a function as the dlsym+ * in the backend is only guaranteed to work on functions, not data+ */+typedef const Pg_magic_struct *(*PGModuleMagicFunction) (void);++#define PG_MAGIC_FUNCTION_NAME Pg_magic_func+#define PG_MAGIC_FUNCTION_NAME_STRING "Pg_magic_func"++#define PG_MODULE_MAGIC \+extern PGDLLEXPORT const Pg_magic_struct *PG_MAGIC_FUNCTION_NAME(void); \+const Pg_magic_struct * \+PG_MAGIC_FUNCTION_NAME(void) \+{ \+ static const Pg_magic_struct Pg_magic_data = PG_MODULE_MAGIC_DATA; \+ return &Pg_magic_data; \+} \+extern int no_such_variable+++/*-------------------------------------------------------------------------+ * Support routines and macros for callers of fmgr-compatible functions+ *-------------------------------------------------------------------------+ */++/* These are for invocation of a specifically named function with a+ * directly-computed parameter list. Note that neither arguments nor result+ * are allowed to be NULL.+ */+extern Datum DirectFunctionCall1Coll(PGFunction func, Oid collation,+ Datum arg1);+extern Datum DirectFunctionCall2Coll(PGFunction func, Oid collation,+ Datum arg1, Datum arg2);+extern Datum DirectFunctionCall3Coll(PGFunction func, Oid collation,+ Datum arg1, Datum arg2,+ Datum arg3);+extern Datum DirectFunctionCall4Coll(PGFunction func, Oid collation,+ Datum arg1, Datum arg2,+ Datum arg3, Datum arg4);+extern Datum DirectFunctionCall5Coll(PGFunction func, Oid collation,+ Datum arg1, Datum arg2,+ Datum arg3, Datum arg4, Datum arg5);+extern Datum DirectFunctionCall6Coll(PGFunction func, Oid collation,+ Datum arg1, Datum arg2,+ Datum arg3, Datum arg4, Datum arg5,+ Datum arg6);+extern Datum DirectFunctionCall7Coll(PGFunction func, Oid collation,+ Datum arg1, Datum arg2,+ Datum arg3, Datum arg4, Datum arg5,+ Datum arg6, Datum arg7);+extern Datum DirectFunctionCall8Coll(PGFunction func, Oid collation,+ Datum arg1, Datum arg2,+ Datum arg3, Datum arg4, Datum arg5,+ Datum arg6, Datum arg7, Datum arg8);+extern Datum DirectFunctionCall9Coll(PGFunction func, Oid collation,+ Datum arg1, Datum arg2,+ Datum arg3, Datum arg4, Datum arg5,+ Datum arg6, Datum arg7, Datum arg8,+ Datum arg9);++/* These are for invocation of a previously-looked-up function with a+ * directly-computed parameter list. Note that neither arguments nor result+ * are allowed to be NULL.+ */+extern Datum FunctionCall1Coll(FmgrInfo *flinfo, Oid collation,+ Datum arg1);+extern Datum FunctionCall2Coll(FmgrInfo *flinfo, Oid collation,+ Datum arg1, Datum arg2);+extern Datum FunctionCall3Coll(FmgrInfo *flinfo, Oid collation,+ Datum arg1, Datum arg2,+ Datum arg3);+extern Datum FunctionCall4Coll(FmgrInfo *flinfo, Oid collation,+ Datum arg1, Datum arg2,+ Datum arg3, Datum arg4);+extern Datum FunctionCall5Coll(FmgrInfo *flinfo, Oid collation,+ Datum arg1, Datum arg2,+ Datum arg3, Datum arg4, Datum arg5);+extern Datum FunctionCall6Coll(FmgrInfo *flinfo, Oid collation,+ Datum arg1, Datum arg2,+ Datum arg3, Datum arg4, Datum arg5,+ Datum arg6);+extern Datum FunctionCall7Coll(FmgrInfo *flinfo, Oid collation,+ Datum arg1, Datum arg2,+ Datum arg3, Datum arg4, Datum arg5,+ Datum arg6, Datum arg7);+extern Datum FunctionCall8Coll(FmgrInfo *flinfo, Oid collation,+ Datum arg1, Datum arg2,+ Datum arg3, Datum arg4, Datum arg5,+ Datum arg6, Datum arg7, Datum arg8);+extern Datum FunctionCall9Coll(FmgrInfo *flinfo, Oid collation,+ Datum arg1, Datum arg2,+ Datum arg3, Datum arg4, Datum arg5,+ Datum arg6, Datum arg7, Datum arg8,+ Datum arg9);++/* These are for invocation of a function identified by OID with a+ * directly-computed parameter list. Note that neither arguments nor result+ * are allowed to be NULL. These are essentially fmgr_info() followed by+ * FunctionCallN(). If the same function is to be invoked repeatedly, do the+ * fmgr_info() once and then use FunctionCallN().+ */+extern Datum OidFunctionCall0Coll(Oid functionId, Oid collation);+extern Datum OidFunctionCall1Coll(Oid functionId, Oid collation,+ Datum arg1);+extern Datum OidFunctionCall2Coll(Oid functionId, Oid collation,+ Datum arg1, Datum arg2);+extern Datum OidFunctionCall3Coll(Oid functionId, Oid collation,+ Datum arg1, Datum arg2,+ Datum arg3);+extern Datum OidFunctionCall4Coll(Oid functionId, Oid collation,+ Datum arg1, Datum arg2,+ Datum arg3, Datum arg4);+extern Datum OidFunctionCall5Coll(Oid functionId, Oid collation,+ Datum arg1, Datum arg2,+ Datum arg3, Datum arg4, Datum arg5);+extern Datum OidFunctionCall6Coll(Oid functionId, Oid collation,+ Datum arg1, Datum arg2,+ Datum arg3, Datum arg4, Datum arg5,+ Datum arg6);+extern Datum OidFunctionCall7Coll(Oid functionId, Oid collation,+ Datum arg1, Datum arg2,+ Datum arg3, Datum arg4, Datum arg5,+ Datum arg6, Datum arg7);+extern Datum OidFunctionCall8Coll(Oid functionId, Oid collation,+ Datum arg1, Datum arg2,+ Datum arg3, Datum arg4, Datum arg5,+ Datum arg6, Datum arg7, Datum arg8);+extern Datum OidFunctionCall9Coll(Oid functionId, Oid collation,+ Datum arg1, Datum arg2,+ Datum arg3, Datum arg4, Datum arg5,+ Datum arg6, Datum arg7, Datum arg8,+ Datum arg9);++/* These macros allow the collation argument to be omitted (with a default of+ * InvalidOid, ie, no collation). They exist mostly for backwards+ * compatibility of source code.+ */+#define DirectFunctionCall1(func, arg1) \+ DirectFunctionCall1Coll(func, InvalidOid, arg1)+#define DirectFunctionCall2(func, arg1, arg2) \+ DirectFunctionCall2Coll(func, InvalidOid, arg1, arg2)+#define DirectFunctionCall3(func, arg1, arg2, arg3) \+ DirectFunctionCall3Coll(func, InvalidOid, arg1, arg2, arg3)+#define DirectFunctionCall4(func, arg1, arg2, arg3, arg4) \+ DirectFunctionCall4Coll(func, InvalidOid, arg1, arg2, arg3, arg4)+#define DirectFunctionCall5(func, arg1, arg2, arg3, arg4, arg5) \+ DirectFunctionCall5Coll(func, InvalidOid, arg1, arg2, arg3, arg4, arg5)+#define DirectFunctionCall6(func, arg1, arg2, arg3, arg4, arg5, arg6) \+ DirectFunctionCall6Coll(func, InvalidOid, arg1, arg2, arg3, arg4, arg5, arg6)+#define DirectFunctionCall7(func, arg1, arg2, arg3, arg4, arg5, arg6, arg7) \+ DirectFunctionCall7Coll(func, InvalidOid, arg1, arg2, arg3, arg4, arg5, arg6, arg7)+#define DirectFunctionCall8(func, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) \+ DirectFunctionCall8Coll(func, InvalidOid, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8)+#define DirectFunctionCall9(func, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9) \+ DirectFunctionCall9Coll(func, InvalidOid, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9)+#define FunctionCall1(flinfo, arg1) \+ FunctionCall1Coll(flinfo, InvalidOid, arg1)+#define FunctionCall2(flinfo, arg1, arg2) \+ FunctionCall2Coll(flinfo, InvalidOid, arg1, arg2)+#define FunctionCall3(flinfo, arg1, arg2, arg3) \+ FunctionCall3Coll(flinfo, InvalidOid, arg1, arg2, arg3)+#define FunctionCall4(flinfo, arg1, arg2, arg3, arg4) \+ FunctionCall4Coll(flinfo, InvalidOid, arg1, arg2, arg3, arg4)+#define FunctionCall5(flinfo, arg1, arg2, arg3, arg4, arg5) \+ FunctionCall5Coll(flinfo, InvalidOid, arg1, arg2, arg3, arg4, arg5)+#define FunctionCall6(flinfo, arg1, arg2, arg3, arg4, arg5, arg6) \+ FunctionCall6Coll(flinfo, InvalidOid, arg1, arg2, arg3, arg4, arg5, arg6)+#define FunctionCall7(flinfo, arg1, arg2, arg3, arg4, arg5, arg6, arg7) \+ FunctionCall7Coll(flinfo, InvalidOid, arg1, arg2, arg3, arg4, arg5, arg6, arg7)+#define FunctionCall8(flinfo, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) \+ FunctionCall8Coll(flinfo, InvalidOid, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8)+#define FunctionCall9(flinfo, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9) \+ FunctionCall9Coll(flinfo, InvalidOid, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9)+#define OidFunctionCall0(functionId) \+ OidFunctionCall0Coll(functionId, InvalidOid)+#define OidFunctionCall1(functionId, arg1) \+ OidFunctionCall1Coll(functionId, InvalidOid, arg1)+#define OidFunctionCall2(functionId, arg1, arg2) \+ OidFunctionCall2Coll(functionId, InvalidOid, arg1, arg2)+#define OidFunctionCall3(functionId, arg1, arg2, arg3) \+ OidFunctionCall3Coll(functionId, InvalidOid, arg1, arg2, arg3)+#define OidFunctionCall4(functionId, arg1, arg2, arg3, arg4) \+ OidFunctionCall4Coll(functionId, InvalidOid, arg1, arg2, arg3, arg4)+#define OidFunctionCall5(functionId, arg1, arg2, arg3, arg4, arg5) \+ OidFunctionCall5Coll(functionId, InvalidOid, arg1, arg2, arg3, arg4, arg5)+#define OidFunctionCall6(functionId, arg1, arg2, arg3, arg4, arg5, arg6) \+ OidFunctionCall6Coll(functionId, InvalidOid, arg1, arg2, arg3, arg4, arg5, arg6)+#define OidFunctionCall7(functionId, arg1, arg2, arg3, arg4, arg5, arg6, arg7) \+ OidFunctionCall7Coll(functionId, InvalidOid, arg1, arg2, arg3, arg4, arg5, arg6, arg7)+#define OidFunctionCall8(functionId, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) \+ OidFunctionCall8Coll(functionId, InvalidOid, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8)+#define OidFunctionCall9(functionId, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9) \+ OidFunctionCall9Coll(functionId, InvalidOid, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9)+++/* Special cases for convenient invocation of datatype I/O functions. */+extern Datum InputFunctionCall(FmgrInfo *flinfo, char *str,+ Oid typioparam, int32 typmod);+extern Datum OidInputFunctionCall(Oid functionId, char *str,+ Oid typioparam, int32 typmod);+extern char *OutputFunctionCall(FmgrInfo *flinfo, Datum val);+extern char *OidOutputFunctionCall(Oid functionId, Datum val);+extern Datum ReceiveFunctionCall(FmgrInfo *flinfo, fmStringInfo buf,+ Oid typioparam, int32 typmod);+extern Datum OidReceiveFunctionCall(Oid functionId, fmStringInfo buf,+ Oid typioparam, int32 typmod);+extern bytea *SendFunctionCall(FmgrInfo *flinfo, Datum val);+extern bytea *OidSendFunctionCall(Oid functionId, Datum val);+++/*+ * Routines in fmgr.c+ */+extern const Pg_finfo_record *fetch_finfo_record(void *filehandle, char *funcname);+extern void clear_external_function_hash(void *filehandle);+extern Oid fmgr_internal_function(const char *proname);+extern Oid get_fn_expr_rettype(FmgrInfo *flinfo);+extern Oid get_fn_expr_argtype(FmgrInfo *flinfo, int argnum);+extern Oid get_call_expr_argtype(fmNodePtr expr, int argnum);+extern bool get_fn_expr_arg_stable(FmgrInfo *flinfo, int argnum);+extern bool get_call_expr_arg_stable(fmNodePtr expr, int argnum);+extern bool get_fn_expr_variadic(FmgrInfo *flinfo);+extern bool CheckFunctionValidatorAccess(Oid validatorOid, Oid functionOid);++/*+ * Routines in dfmgr.c+ */+extern char *Dynamic_library_path;++extern PGFunction load_external_function(char *filename, char *funcname,+ bool signalNotFound, void **filehandle);+extern PGFunction lookup_external_function(void *filehandle, char *funcname);+extern void load_file(const char *filename, bool restricted);+extern void **find_rendezvous_variable(const char *varName);+extern Size EstimateLibraryStateSpace(void);+extern void SerializeLibraryState(Size maxsize, char *start_address);+extern void RestoreLibraryState(char *start_address);++/*+ * Support for aggregate functions+ *+ * These are actually in executor/nodeAgg.c, but we declare them here since+ * the whole point is for callers to not be overly friendly with nodeAgg.+ */++/* AggCheckCallContext can return one of the following codes, or 0: */+#define AGG_CONTEXT_AGGREGATE 1 /* regular aggregate */+#define AGG_CONTEXT_WINDOW 2 /* window function */++extern int AggCheckCallContext(FunctionCallInfo fcinfo,+ MemoryContext *aggcontext);+extern fmAggrefPtr AggGetAggref(FunctionCallInfo fcinfo);+extern MemoryContext AggGetTempMemoryContext(FunctionCallInfo fcinfo);+extern void AggRegisterCallback(FunctionCallInfo fcinfo,+ fmExprContextCallbackFunction func,+ Datum arg);++/*+ * We allow plugin modules to hook function entry/exit. This is intended+ * as support for loadable security policy modules, which may want to+ * perform additional privilege checks on function entry or exit, or to do+ * other internal bookkeeping. To make this possible, such modules must be+ * able not only to support normal function entry and exit, but also to trap+ * the case where we bail out due to an error; and they must also be able to+ * prevent inlining.+ */+typedef enum FmgrHookEventType+{+ FHET_START,+ FHET_END,+ FHET_ABORT+} FmgrHookEventType;++typedef bool (*needs_fmgr_hook_type) (Oid fn_oid);++typedef void (*fmgr_hook_type) (FmgrHookEventType event,+ FmgrInfo *flinfo, Datum *arg);++extern PGDLLIMPORT needs_fmgr_hook_type needs_fmgr_hook;+extern PGDLLIMPORT fmgr_hook_type fmgr_hook;++#define FmgrHookIsNeeded(fn_oid) \+ (!needs_fmgr_hook ? false : (*needs_fmgr_hook)(fn_oid))++/*+ * !!! OLD INTERFACE !!!+ *+ * fmgr() is the only remaining vestige of the old-style caller support+ * functions. It's no longer used anywhere in the Postgres distribution,+ * but we should leave it around for a release or two to ease the transition+ * for user-supplied C functions. OidFunctionCallN() replaces it for new+ * code.+ */++/*+ * DEPRECATED, DO NOT USE IN NEW CODE+ */+extern char *fmgr(Oid procedureId,...);++#endif /* FMGR_H */
+ foreign/libpg_query/src/postgres/include/funcapi.h view
@@ -0,0 +1,318 @@+/*-------------------------------------------------------------------------+ *+ * funcapi.h+ * Definitions for functions which return composite type and/or sets+ *+ * This file must be included by all Postgres modules that either define+ * or call FUNCAPI-callable functions or macros.+ *+ *+ * Copyright (c) 2002-2015, PostgreSQL Global Development Group+ *+ * src/include/funcapi.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef FUNCAPI_H+#define FUNCAPI_H++#include "fmgr.h"+#include "access/tupdesc.h"+#include "executor/executor.h"+#include "executor/tuptable.h"+++/*-------------------------------------------------------------------------+ * Support to ease writing Functions returning composite types+ *-------------------------------------------------------------------------+ *+ * This struct holds arrays of individual attribute information+ * needed to create a tuple from raw C strings. It also requires+ * a copy of the TupleDesc. The information carried here+ * is derived from the TupleDesc, but it is stored here to+ * avoid redundant cpu cycles on each call to an SRF.+ */+typedef struct AttInMetadata+{+ /* full TupleDesc */+ TupleDesc tupdesc;++ /* array of attribute type input function finfo */+ FmgrInfo *attinfuncs;++ /* array of attribute type i/o parameter OIDs */+ Oid *attioparams;++ /* array of attribute typmod */+ int32 *atttypmods;+} AttInMetadata;++/*-------------------------------------------------------------------------+ * Support struct to ease writing Set Returning Functions (SRFs)+ *-------------------------------------------------------------------------+ *+ * This struct holds function context for Set Returning Functions.+ * Use fn_extra to hold a pointer to it across calls+ */+typedef struct FuncCallContext+{+ /*+ * Number of times we've been called before+ *+ * call_cntr is initialized to 0 for you by SRF_FIRSTCALL_INIT(), and+ * incremented for you every time SRF_RETURN_NEXT() is called.+ */+ uint32 call_cntr;++ /*+ * OPTIONAL maximum number of calls+ *+ * max_calls is here for convenience only and setting it is optional. If+ * not set, you must provide alternative means to know when the function+ * is done.+ */+ uint32 max_calls;++ /*+ * OPTIONAL pointer to result slot+ *+ * This is obsolete and only present for backwards compatibility, viz,+ * user-defined SRFs that use the deprecated TupleDescGetSlot().+ */+ TupleTableSlot *slot;++ /*+ * OPTIONAL pointer to miscellaneous user-provided context information+ *+ * user_fctx is for use as a pointer to your own struct to retain+ * arbitrary context information between calls of your function.+ */+ void *user_fctx;++ /*+ * OPTIONAL pointer to struct containing attribute type input metadata+ *+ * attinmeta is for use when returning tuples (i.e. composite data types)+ * and is not used when returning base data types. It is only needed if+ * you intend to use BuildTupleFromCStrings() to create the return tuple.+ */+ AttInMetadata *attinmeta;++ /*+ * memory context used for structures that must live for multiple calls+ *+ * multi_call_memory_ctx is set by SRF_FIRSTCALL_INIT() for you, and used+ * by SRF_RETURN_DONE() for cleanup. It is the most appropriate memory+ * context for any memory that is to be reused across multiple calls of+ * the SRF.+ */+ MemoryContext multi_call_memory_ctx;++ /*+ * OPTIONAL pointer to struct containing tuple description+ *+ * tuple_desc is for use when returning tuples (i.e. composite data types)+ * and is only needed if you are going to build the tuples with+ * heap_form_tuple() rather than with BuildTupleFromCStrings(). Note that+ * the TupleDesc pointer stored here should usually have been run through+ * BlessTupleDesc() first.+ */+ TupleDesc tuple_desc;++} FuncCallContext;++/*----------+ * Support to ease writing functions returning composite types+ *+ * External declarations:+ * get_call_result_type:+ * Given a function's call info record, determine the kind of datatype+ * it is supposed to return. If resultTypeId isn't NULL, *resultTypeId+ * receives the actual datatype OID (this is mainly useful for scalar+ * result types). If resultTupleDesc isn't NULL, *resultTupleDesc+ * receives a pointer to a TupleDesc when the result is of a composite+ * type, or NULL when it's a scalar result or the rowtype could not be+ * determined. NB: the tupledesc should be copied if it is to be+ * accessed over a long period.+ * get_expr_result_type:+ * Given an expression node, return the same info as for+ * get_call_result_type. Note: the cases in which rowtypes cannot be+ * determined are different from the cases for get_call_result_type.+ * get_func_result_type:+ * Given only a function's OID, return the same info as for+ * get_call_result_type. Note: the cases in which rowtypes cannot be+ * determined are different from the cases for get_call_result_type.+ * Do *not* use this if you can use one of the others.+ *----------+ */++/* Type categories for get_call_result_type and siblings */+typedef enum TypeFuncClass+{+ TYPEFUNC_SCALAR, /* scalar result type */+ TYPEFUNC_COMPOSITE, /* determinable rowtype result */+ TYPEFUNC_RECORD, /* indeterminate rowtype result */+ TYPEFUNC_OTHER /* bogus type, eg pseudotype */+} TypeFuncClass;++extern TypeFuncClass get_call_result_type(FunctionCallInfo fcinfo,+ Oid *resultTypeId,+ TupleDesc *resultTupleDesc);+extern TypeFuncClass get_expr_result_type(Node *expr,+ Oid *resultTypeId,+ TupleDesc *resultTupleDesc);+extern TypeFuncClass get_func_result_type(Oid functionId,+ Oid *resultTypeId,+ TupleDesc *resultTupleDesc);++extern bool resolve_polymorphic_argtypes(int numargs, Oid *argtypes,+ char *argmodes,+ Node *call_expr);++extern int get_func_arg_info(HeapTuple procTup,+ Oid **p_argtypes, char ***p_argnames,+ char **p_argmodes);++extern int get_func_input_arg_names(Datum proargnames, Datum proargmodes,+ char ***arg_names);++extern int get_func_trftypes(HeapTuple procTup, Oid **p_trftypes);+extern char *get_func_result_name(Oid functionId);++extern TupleDesc build_function_result_tupdesc_d(Datum proallargtypes,+ Datum proargmodes,+ Datum proargnames);+extern TupleDesc build_function_result_tupdesc_t(HeapTuple procTuple);+++/*----------+ * Support to ease writing functions returning composite types+ *+ * External declarations:+ * TupleDesc BlessTupleDesc(TupleDesc tupdesc) - "Bless" a completed tuple+ * descriptor so that it can be used to return properly labeled tuples.+ * You need to call this if you are going to use heap_form_tuple directly.+ * TupleDescGetAttInMetadata does it for you, however, so no need to call+ * it if you call TupleDescGetAttInMetadata.+ * AttInMetadata *TupleDescGetAttInMetadata(TupleDesc tupdesc) - Build an+ * AttInMetadata struct based on the given TupleDesc. AttInMetadata can+ * be used in conjunction with C strings to produce a properly formed+ * tuple.+ * HeapTuple BuildTupleFromCStrings(AttInMetadata *attinmeta, char **values) -+ * build a HeapTuple given user data in C string form. values is an array+ * of C strings, one for each attribute of the return tuple.+ * Datum HeapTupleHeaderGetDatum(HeapTupleHeader tuple) - convert a+ * HeapTupleHeader to a Datum.+ *+ * Macro declarations:+ * HeapTupleGetDatum(HeapTuple tuple) - convert a HeapTuple to a Datum.+ *+ * Obsolete routines and macros:+ * TupleDesc RelationNameGetTupleDesc(const char *relname) - Use to get a+ * TupleDesc based on a named relation.+ * TupleDesc TypeGetTupleDesc(Oid typeoid, List *colaliases) - Use to get a+ * TupleDesc based on a type OID.+ * TupleTableSlot *TupleDescGetSlot(TupleDesc tupdesc) - Builds a+ * TupleTableSlot, which is not needed anymore.+ * TupleGetDatum(TupleTableSlot *slot, HeapTuple tuple) - get a Datum+ * given a tuple and a slot.+ *----------+ */++#define HeapTupleGetDatum(tuple) HeapTupleHeaderGetDatum((tuple)->t_data)+/* obsolete version of above */+#define TupleGetDatum(_slot, _tuple) HeapTupleGetDatum(_tuple)++extern TupleDesc RelationNameGetTupleDesc(const char *relname);+extern TupleDesc TypeGetTupleDesc(Oid typeoid, List *colaliases);++/* from execTuples.c */+extern TupleDesc BlessTupleDesc(TupleDesc tupdesc);+extern AttInMetadata *TupleDescGetAttInMetadata(TupleDesc tupdesc);+extern HeapTuple BuildTupleFromCStrings(AttInMetadata *attinmeta, char **values);+extern Datum HeapTupleHeaderGetDatum(HeapTupleHeader tuple);+extern TupleTableSlot *TupleDescGetSlot(TupleDesc tupdesc);+++/*----------+ * Support for Set Returning Functions (SRFs)+ *+ * The basic API for SRFs looks something like:+ *+ * Datum+ * my_Set_Returning_Function(PG_FUNCTION_ARGS)+ * {+ * FuncCallContext *funcctx;+ * Datum result;+ * MemoryContext oldcontext;+ * <user defined declarations>+ *+ * if (SRF_IS_FIRSTCALL())+ * {+ * funcctx = SRF_FIRSTCALL_INIT();+ * // switch context when allocating stuff to be used in later calls+ * oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);+ * <user defined code>+ * <if returning composite>+ * <build TupleDesc, and perhaps AttInMetaData>+ * <endif returning composite>+ * <user defined code>+ * // return to original context when allocating transient memory+ * MemoryContextSwitchTo(oldcontext);+ * }+ * <user defined code>+ * funcctx = SRF_PERCALL_SETUP();+ * <user defined code>+ *+ * if (funcctx->call_cntr < funcctx->max_calls)+ * {+ * <user defined code>+ * <obtain result Datum>+ * SRF_RETURN_NEXT(funcctx, result);+ * }+ * else+ * SRF_RETURN_DONE(funcctx);+ * }+ *+ *----------+ */++/* from funcapi.c */+extern FuncCallContext *init_MultiFuncCall(PG_FUNCTION_ARGS);+extern FuncCallContext *per_MultiFuncCall(PG_FUNCTION_ARGS);+extern void end_MultiFuncCall(PG_FUNCTION_ARGS, FuncCallContext *funcctx);++#define SRF_IS_FIRSTCALL() (fcinfo->flinfo->fn_extra == NULL)++#define SRF_FIRSTCALL_INIT() init_MultiFuncCall(fcinfo)++#define SRF_PERCALL_SETUP() per_MultiFuncCall(fcinfo)++#define SRF_RETURN_NEXT(_funcctx, _result) \+ do { \+ ReturnSetInfo *rsi; \+ (_funcctx)->call_cntr++; \+ rsi = (ReturnSetInfo *) fcinfo->resultinfo; \+ rsi->isDone = ExprMultipleResult; \+ PG_RETURN_DATUM(_result); \+ } while (0)++#define SRF_RETURN_NEXT_NULL(_funcctx) \+ do { \+ ReturnSetInfo *rsi; \+ (_funcctx)->call_cntr++; \+ rsi = (ReturnSetInfo *) fcinfo->resultinfo; \+ rsi->isDone = ExprMultipleResult; \+ PG_RETURN_NULL(); \+ } while (0)++#define SRF_RETURN_DONE(_funcctx) \+ do { \+ ReturnSetInfo *rsi; \+ end_MultiFuncCall(fcinfo, _funcctx); \+ rsi = (ReturnSetInfo *) fcinfo->resultinfo; \+ rsi->isDone = ExprEndResult; \+ PG_RETURN_NULL(); \+ } while (0)++#endif /* FUNCAPI_H */
+ foreign/libpg_query/src/postgres/include/getaddrinfo.h view
@@ -0,0 +1,164 @@+/*-------------------------------------------------------------------------+ *+ * getaddrinfo.h+ * Support getaddrinfo() on platforms that don't have it.+ *+ * Note: we use our own routines on platforms that don't HAVE_STRUCT_ADDRINFO,+ * whether or not the library routine getaddrinfo() can be found. This+ * policy is needed because on some platforms a manually installed libbind.a+ * may provide getaddrinfo(), yet the system headers may not provide the+ * struct definitions needed to call it. To avoid conflict with the libbind+ * definition in such cases, we rename our routines to pg_xxx() via macros.+ *+ * This code will also work on platforms where struct addrinfo is defined+ * in the system headers but no getaddrinfo() can be located.+ *+ * Copyright (c) 2003-2015, PostgreSQL Global Development Group+ *+ * src/include/getaddrinfo.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef GETADDRINFO_H+#define GETADDRINFO_H++#include <sys/socket.h>+#include <netdb.h>+++/* Various macros that ought to be in <netdb.h>, but might not be */++#ifndef EAI_FAIL+#ifndef WIN32+#define EAI_BADFLAGS (-1)+#define EAI_NONAME (-2)+#define EAI_AGAIN (-3)+#define EAI_FAIL (-4)+#define EAI_FAMILY (-6)+#define EAI_SOCKTYPE (-7)+#define EAI_SERVICE (-8)+#define EAI_MEMORY (-10)+#define EAI_SYSTEM (-11)+#else /* WIN32 */+#ifdef WIN32_ONLY_COMPILER+#ifndef WSA_NOT_ENOUGH_MEMORY+#define WSA_NOT_ENOUGH_MEMORY (WSAENOBUFS)+#endif+#ifndef __BORLANDC__+#define WSATYPE_NOT_FOUND (WSABASEERR+109)+#endif+#endif+#define EAI_AGAIN WSATRY_AGAIN+#define EAI_BADFLAGS WSAEINVAL+#define EAI_FAIL WSANO_RECOVERY+#define EAI_FAMILY WSAEAFNOSUPPORT+#define EAI_MEMORY WSA_NOT_ENOUGH_MEMORY+#define EAI_NODATA WSANO_DATA+#define EAI_NONAME WSAHOST_NOT_FOUND+#define EAI_SERVICE WSATYPE_NOT_FOUND+#define EAI_SOCKTYPE WSAESOCKTNOSUPPORT+#endif /* !WIN32 */+#endif /* !EAI_FAIL */++#ifndef AI_PASSIVE+#define AI_PASSIVE 0x0001+#endif++#ifndef AI_NUMERICHOST+/*+ * some platforms don't support AI_NUMERICHOST; define as zero if using+ * the system version of getaddrinfo...+ */+#if defined(HAVE_STRUCT_ADDRINFO) && defined(HAVE_GETADDRINFO)+#define AI_NUMERICHOST 0+#else+#define AI_NUMERICHOST 0x0004+#endif+#endif++#ifndef NI_NUMERICHOST+#define NI_NUMERICHOST 1+#endif+#ifndef NI_NUMERICSERV+#define NI_NUMERICSERV 2+#endif+#ifndef NI_NAMEREQD+#define NI_NAMEREQD 4+#endif++#ifndef NI_MAXHOST+#define NI_MAXHOST 1025+#endif+#ifndef NI_MAXSERV+#define NI_MAXSERV 32+#endif+++#ifndef HAVE_STRUCT_ADDRINFO++#ifndef WIN32+struct addrinfo+{+ int ai_flags;+ int ai_family;+ int ai_socktype;+ int ai_protocol;+ size_t ai_addrlen;+ struct sockaddr *ai_addr;+ char *ai_canonname;+ struct addrinfo *ai_next;+};+#else+/*+ * The order of the structure elements on Win32 doesn't match the+ * order specified in the standard, but we have to match it for+ * IPv6 to work.+ */+struct addrinfo+{+ int ai_flags;+ int ai_family;+ int ai_socktype;+ int ai_protocol;+ size_t ai_addrlen;+ char *ai_canonname;+ struct sockaddr *ai_addr;+ struct addrinfo *ai_next;+};+#endif+#endif /* HAVE_STRUCT_ADDRINFO */+++#ifndef HAVE_GETADDRINFO++/* Rename private copies per comments above */+#ifdef getaddrinfo+#undef getaddrinfo+#endif+#define getaddrinfo pg_getaddrinfo++#ifdef freeaddrinfo+#undef freeaddrinfo+#endif+#define freeaddrinfo pg_freeaddrinfo++#ifdef gai_strerror+#undef gai_strerror+#endif+#define gai_strerror pg_gai_strerror++#ifdef getnameinfo+#undef getnameinfo+#endif+#define getnameinfo pg_getnameinfo++extern int getaddrinfo(const char *node, const char *service,+ const struct addrinfo * hints, struct addrinfo ** res);+extern void freeaddrinfo(struct addrinfo * res);+extern const char *gai_strerror(int errcode);+extern int getnameinfo(const struct sockaddr * sa, int salen,+ char *node, int nodelen,+ char *service, int servicelen, int flags);+#endif /* HAVE_GETADDRINFO */++#endif /* GETADDRINFO_H */
+ foreign/libpg_query/src/postgres/include/lib/ilist.h view
@@ -0,0 +1,775 @@+/*-------------------------------------------------------------------------+ *+ * ilist.h+ * integrated/inline doubly- and singly-linked lists+ *+ * These list types are useful when there are only a predetermined set of+ * lists that an object could be in. List links are embedded directly into+ * the objects, and thus no extra memory management overhead is required.+ * (Of course, if only a small proportion of existing objects are in a list,+ * the link fields in the remainder would be wasted space. But usually,+ * it saves space to not have separately-allocated list nodes.)+ *+ * None of the functions here allocate any memory; they just manipulate+ * externally managed memory. The APIs for singly and doubly linked lists+ * are identical as far as capabilities of both allow.+ *+ * Each list has a list header, which exists even when the list is empty.+ * An empty singly-linked list has a NULL pointer in its header.+ * There are two kinds of empty doubly linked lists: those that have been+ * initialized to NULL, and those that have been initialized to circularity.+ * (If a dlist is modified and then all its elements are deleted, it will be+ * in the circular state.) We prefer circular dlists because there are some+ * operations that can be done without branches (and thus faster) on lists+ * that use circular representation. However, it is often convenient to+ * initialize list headers to zeroes rather than setting them up with an+ * explicit initialization function, so we also allow the other case.+ *+ * EXAMPLES+ *+ * Here's a simple example demonstrating how this can be used. Let's assume+ * we want to store information about the tables contained in a database.+ *+ * #include "lib/ilist.h"+ *+ * // Define struct for the databases including a list header that will be+ * // used to access the nodes in the table list later on.+ * typedef struct my_database+ * {+ * char *datname;+ * dlist_head tables;+ * // ...+ * } my_database;+ *+ * // Define struct for the tables. Note the list_node element which stores+ * // prev/next list links. The list_node element need not be first.+ * typedef struct my_table+ * {+ * char *tablename;+ * dlist_node list_node;+ * perm_t permissions;+ * // ...+ * } my_table;+ *+ * // create a database+ * my_database *db = create_database();+ *+ * // and add a few tables to its table list+ * dlist_push_head(&db->tables, &create_table(db, "a")->list_node);+ * ...+ * dlist_push_head(&db->tables, &create_table(db, "b")->list_node);+ *+ *+ * To iterate over the table list, we allocate an iterator variable and use+ * a specialized looping construct. Inside a dlist_foreach, the iterator's+ * 'cur' field can be used to access the current element. iter.cur points to+ * a 'dlist_node', but most of the time what we want is the actual table+ * information; dlist_container() gives us that, like so:+ *+ * dlist_iter iter;+ * dlist_foreach(iter, &db->tables)+ * {+ * my_table *tbl = dlist_container(my_table, list_node, iter.cur);+ * printf("we have a table: %s in database %s\n",+ * tbl->tablename, db->datname);+ * }+ *+ *+ * While a simple iteration is useful, we sometimes also want to manipulate+ * the list while iterating. There is a different iterator element and looping+ * construct for that. Suppose we want to delete tables that meet a certain+ * criterion:+ *+ * dlist_mutable_iter miter;+ * dlist_foreach_modify(miter, &db->tables)+ * {+ * my_table *tbl = dlist_container(my_table, list_node, miter.cur);+ *+ * if (!tbl->to_be_deleted)+ * continue; // don't touch this one+ *+ * // unlink the current table from the linked list+ * dlist_delete(miter.cur);+ * // as these lists never manage memory, we can still access the table+ * // after it's been unlinked+ * drop_table(db, tbl);+ * }+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * IDENTIFICATION+ * src/include/lib/ilist.h+ *-------------------------------------------------------------------------+ */+#ifndef ILIST_H+#define ILIST_H++/*+ * Enable for extra debugging. This is rather expensive, so it's not enabled by+ * default even when USE_ASSERT_CHECKING.+ */+/* #define ILIST_DEBUG */++/*+ * Node of a doubly linked list.+ *+ * Embed this in structs that need to be part of a doubly linked list.+ */+typedef struct dlist_node dlist_node;+struct dlist_node+{+ dlist_node *prev;+ dlist_node *next;+};++/*+ * Head of a doubly linked list.+ *+ * Non-empty lists are internally circularly linked. Circular lists have the+ * advantage of not needing any branches in the most common list manipulations.+ * An empty list can also be represented as a pair of NULL pointers, making+ * initialization easier.+ */+typedef struct dlist_head+{+ /*+ * head.next either points to the first element of the list; to &head if+ * it's a circular empty list; or to NULL if empty and not circular.+ *+ * head.prev either points to the last element of the list; to &head if+ * it's a circular empty list; or to NULL if empty and not circular.+ */+ dlist_node head;+} dlist_head;+++/*+ * Doubly linked list iterator.+ *+ * Used as state in dlist_foreach() and dlist_reverse_foreach(). To get the+ * current element of the iteration use the 'cur' member.+ *+ * Iterations using this are *not* allowed to change the list while iterating!+ *+ * NB: We use an extra "end" field here to avoid multiple evaluations of+ * arguments in the dlist_foreach() macro.+ */+typedef struct dlist_iter+{+ dlist_node *cur; /* current element */+ dlist_node *end; /* last node we'll iterate to */+} dlist_iter;++/*+ * Doubly linked list iterator allowing some modifications while iterating.+ *+ * Used as state in dlist_foreach_modify(). To get the current element of the+ * iteration use the 'cur' member.+ *+ * Iterations using this are only allowed to change the list at the current+ * point of iteration. It is fine to delete the current node, but it is *not*+ * fine to insert or delete adjacent nodes.+ *+ * NB: We need a separate type for mutable iterations so that we can store+ * the 'next' node of the current node in case it gets deleted or modified.+ */+typedef struct dlist_mutable_iter+{+ dlist_node *cur; /* current element */+ dlist_node *next; /* next node we'll iterate to */+ dlist_node *end; /* last node we'll iterate to */+} dlist_mutable_iter;++/*+ * Node of a singly linked list.+ *+ * Embed this in structs that need to be part of a singly linked list.+ */+typedef struct slist_node slist_node;+struct slist_node+{+ slist_node *next;+};++/*+ * Head of a singly linked list.+ *+ * Singly linked lists are not circularly linked, in contrast to doubly linked+ * lists; we just set head.next to NULL if empty. This doesn't incur any+ * additional branches in the usual manipulations.+ */+typedef struct slist_head+{+ slist_node head;+} slist_head;++/*+ * Singly linked list iterator.+ *+ * Used as state in slist_foreach(). To get the current element of the+ * iteration use the 'cur' member.+ *+ * It's allowed to modify the list while iterating, with the exception of+ * deleting the iterator's current node; deletion of that node requires+ * care if the iteration is to be continued afterward. (Doing so and also+ * deleting or inserting adjacent list elements might misbehave; also, if+ * the user frees the current node's storage, continuing the iteration is+ * not safe.)+ *+ * NB: this wouldn't really need to be an extra struct, we could use an+ * slist_node * directly. We prefer a separate type for consistency.+ */+typedef struct slist_iter+{+ slist_node *cur;+} slist_iter;++/*+ * Singly linked list iterator allowing some modifications while iterating.+ *+ * Used as state in slist_foreach_modify(). To get the current element of the+ * iteration use the 'cur' member.+ *+ * The only list modification allowed while iterating is to remove the current+ * node via slist_delete_current() (*not* slist_delete()). Insertion or+ * deletion of nodes adjacent to the current node would misbehave.+ */+typedef struct slist_mutable_iter+{+ slist_node *cur; /* current element */+ slist_node *next; /* next node we'll iterate to */+ slist_node *prev; /* prev node, for deletions */+} slist_mutable_iter;+++/* Static initializers */+#define DLIST_STATIC_INIT(name) {{&(name).head, &(name).head}}+#define SLIST_STATIC_INIT(name) {{NULL}}+++/* Prototypes for functions too big to be inline */++/* Caution: this is O(n); consider using slist_delete_current() instead */+extern void slist_delete(slist_head *head, slist_node *node);++#ifdef ILIST_DEBUG+extern void dlist_check(dlist_head *head);+extern void slist_check(slist_head *head);+#else+/*+ * These seemingly useless casts to void are here to keep the compiler quiet+ * about the argument being unused in many functions in a non-debug compile,+ * in which functions the only point of passing the list head pointer is to be+ * able to run these checks.+ */+#define dlist_check(head) ((void) (head))+#define slist_check(head) ((void) (head))+#endif /* ILIST_DEBUG */+++/*+ * We want the functions below to be inline; but if the compiler doesn't+ * support that, fall back on providing them as regular functions. See+ * STATIC_IF_INLINE in c.h.+ */+#ifndef PG_USE_INLINE+extern void dlist_init(dlist_head *head);+extern bool dlist_is_empty(dlist_head *head);+extern void dlist_push_head(dlist_head *head, dlist_node *node);+extern void dlist_push_tail(dlist_head *head, dlist_node *node);+extern void dlist_insert_after(dlist_node *after, dlist_node *node);+extern void dlist_insert_before(dlist_node *before, dlist_node *node);+extern void dlist_delete(dlist_node *node);+extern dlist_node *dlist_pop_head_node(dlist_head *head);+extern void dlist_move_head(dlist_head *head, dlist_node *node);+extern bool dlist_has_next(dlist_head *head, dlist_node *node);+extern bool dlist_has_prev(dlist_head *head, dlist_node *node);+extern dlist_node *dlist_next_node(dlist_head *head, dlist_node *node);+extern dlist_node *dlist_prev_node(dlist_head *head, dlist_node *node);+extern dlist_node *dlist_head_node(dlist_head *head);+extern dlist_node *dlist_tail_node(dlist_head *head);++/* dlist macro support functions */+extern void *dlist_tail_element_off(dlist_head *head, size_t off);+extern void *dlist_head_element_off(dlist_head *head, size_t off);+#endif /* !PG_USE_INLINE */++#if defined(PG_USE_INLINE) || defined(ILIST_INCLUDE_DEFINITIONS)+/*+ * Initialize a doubly linked list.+ * Previous state will be thrown away without any cleanup.+ */+STATIC_IF_INLINE void+dlist_init(dlist_head *head)+{+ head->head.next = head->head.prev = &head->head;+}++/*+ * Is the list empty?+ *+ * An empty list has either its first 'next' pointer set to NULL, or to itself.+ */+STATIC_IF_INLINE bool+dlist_is_empty(dlist_head *head)+{+ dlist_check(head);++ return head->head.next == NULL || head->head.next == &(head->head);+}++/*+ * Insert a node at the beginning of the list.+ */+STATIC_IF_INLINE void+dlist_push_head(dlist_head *head, dlist_node *node)+{+ if (head->head.next == NULL) /* convert NULL header to circular */+ dlist_init(head);++ node->next = head->head.next;+ node->prev = &head->head;+ node->next->prev = node;+ head->head.next = node;++ dlist_check(head);+}++/*+ * Insert a node at the end of the list.+ */+STATIC_IF_INLINE void+dlist_push_tail(dlist_head *head, dlist_node *node)+{+ if (head->head.next == NULL) /* convert NULL header to circular */+ dlist_init(head);++ node->next = &head->head;+ node->prev = head->head.prev;+ node->prev->next = node;+ head->head.prev = node;++ dlist_check(head);+}++/*+ * Insert a node after another *in the same list*+ */+STATIC_IF_INLINE void+dlist_insert_after(dlist_node *after, dlist_node *node)+{+ node->prev = after;+ node->next = after->next;+ after->next = node;+ node->next->prev = node;+}++/*+ * Insert a node before another *in the same list*+ */+STATIC_IF_INLINE void+dlist_insert_before(dlist_node *before, dlist_node *node)+{+ node->prev = before->prev;+ node->next = before;+ before->prev = node;+ node->prev->next = node;+}++/*+ * Delete 'node' from its list (it must be in one).+ */+STATIC_IF_INLINE void+dlist_delete(dlist_node *node)+{+ node->prev->next = node->next;+ node->next->prev = node->prev;+}++/*+ * Remove and return the first node from a list (there must be one).+ */+STATIC_IF_INLINE dlist_node *+dlist_pop_head_node(dlist_head *head)+{+ dlist_node *node;++ Assert(!dlist_is_empty(head));+ node = head->head.next;+ dlist_delete(node);+ return node;+}++/*+ * Move element from its current position in the list to the head position in+ * the same list.+ *+ * Undefined behaviour if 'node' is not already part of the list.+ */+STATIC_IF_INLINE void+dlist_move_head(dlist_head *head, dlist_node *node)+{+ /* fast path if it's already at the head */+ if (head->head.next == node)+ return;++ dlist_delete(node);+ dlist_push_head(head, node);++ dlist_check(head);+}++/*+ * Check whether 'node' has a following node.+ * Caution: unreliable if 'node' is not in the list.+ */+STATIC_IF_INLINE bool+dlist_has_next(dlist_head *head, dlist_node *node)+{+ return node->next != &head->head;+}++/*+ * Check whether 'node' has a preceding node.+ * Caution: unreliable if 'node' is not in the list.+ */+STATIC_IF_INLINE bool+dlist_has_prev(dlist_head *head, dlist_node *node)+{+ return node->prev != &head->head;+}++/*+ * Return the next node in the list (there must be one).+ */+STATIC_IF_INLINE dlist_node *+dlist_next_node(dlist_head *head, dlist_node *node)+{+ Assert(dlist_has_next(head, node));+ return node->next;+}++/*+ * Return previous node in the list (there must be one).+ */+STATIC_IF_INLINE dlist_node *+dlist_prev_node(dlist_head *head, dlist_node *node)+{+ Assert(dlist_has_prev(head, node));+ return node->prev;+}++/* internal support function to get address of head element's struct */+STATIC_IF_INLINE void *+dlist_head_element_off(dlist_head *head, size_t off)+{+ Assert(!dlist_is_empty(head));+ return (char *) head->head.next - off;+}++/*+ * Return the first node in the list (there must be one).+ */+STATIC_IF_INLINE dlist_node *+dlist_head_node(dlist_head *head)+{+ return (dlist_node *) dlist_head_element_off(head, 0);+}++/* internal support function to get address of tail element's struct */+STATIC_IF_INLINE void *+dlist_tail_element_off(dlist_head *head, size_t off)+{+ Assert(!dlist_is_empty(head));+ return (char *) head->head.prev - off;+}++/*+ * Return the last node in the list (there must be one).+ */+STATIC_IF_INLINE dlist_node *+dlist_tail_node(dlist_head *head)+{+ return (dlist_node *) dlist_tail_element_off(head, 0);+}+#endif /* PG_USE_INLINE || ILIST_INCLUDE_DEFINITIONS */++/*+ * Return the containing struct of 'type' where 'membername' is the dlist_node+ * pointed at by 'ptr'.+ *+ * This is used to convert a dlist_node * back to its containing struct.+ */+#define dlist_container(type, membername, ptr) \+ (AssertVariableIsOfTypeMacro(ptr, dlist_node *), \+ AssertVariableIsOfTypeMacro(((type *) NULL)->membername, dlist_node), \+ ((type *) ((char *) (ptr) - offsetof(type, membername))))++/*+ * Return the address of the first element in the list.+ *+ * The list must not be empty.+ */+#define dlist_head_element(type, membername, lhead) \+ (AssertVariableIsOfTypeMacro(((type *) NULL)->membername, dlist_node), \+ (type *) dlist_head_element_off(lhead, offsetof(type, membername)))++/*+ * Return the address of the last element in the list.+ *+ * The list must not be empty.+ */+#define dlist_tail_element(type, membername, lhead) \+ (AssertVariableIsOfTypeMacro(((type *) NULL)->membername, dlist_node), \+ ((type *) dlist_tail_element_off(lhead, offsetof(type, membername))))++/*+ * Iterate through the list pointed at by 'lhead' storing the state in 'iter'.+ *+ * Access the current element with iter.cur.+ *+ * It is *not* allowed to manipulate the list during iteration.+ */+#define dlist_foreach(iter, lhead) \+ for (AssertVariableIsOfTypeMacro(iter, dlist_iter), \+ AssertVariableIsOfTypeMacro(lhead, dlist_head *), \+ (iter).end = &(lhead)->head, \+ (iter).cur = (iter).end->next ? (iter).end->next : (iter).end; \+ (iter).cur != (iter).end; \+ (iter).cur = (iter).cur->next)++/*+ * Iterate through the list pointed at by 'lhead' storing the state in 'iter'.+ *+ * Access the current element with iter.cur.+ *+ * Iterations using this are only allowed to change the list at the current+ * point of iteration. It is fine to delete the current node, but it is *not*+ * fine to insert or delete adjacent nodes.+ */+#define dlist_foreach_modify(iter, lhead) \+ for (AssertVariableIsOfTypeMacro(iter, dlist_mutable_iter), \+ AssertVariableIsOfTypeMacro(lhead, dlist_head *), \+ (iter).end = &(lhead)->head, \+ (iter).cur = (iter).end->next ? (iter).end->next : (iter).end, \+ (iter).next = (iter).cur->next; \+ (iter).cur != (iter).end; \+ (iter).cur = (iter).next, (iter).next = (iter).cur->next)++/*+ * Iterate through the list in reverse order.+ *+ * It is *not* allowed to manipulate the list during iteration.+ */+#define dlist_reverse_foreach(iter, lhead) \+ for (AssertVariableIsOfTypeMacro(iter, dlist_iter), \+ AssertVariableIsOfTypeMacro(lhead, dlist_head *), \+ (iter).end = &(lhead)->head, \+ (iter).cur = (iter).end->prev ? (iter).end->prev : (iter).end; \+ (iter).cur != (iter).end; \+ (iter).cur = (iter).cur->prev)+++/*+ * We want the functions below to be inline; but if the compiler doesn't+ * support that, fall back on providing them as regular functions. See+ * STATIC_IF_INLINE in c.h.+ */+#ifndef PG_USE_INLINE+extern void slist_init(slist_head *head);+extern bool slist_is_empty(slist_head *head);+extern void slist_push_head(slist_head *head, slist_node *node);+extern void slist_insert_after(slist_node *after, slist_node *node);+extern slist_node *slist_pop_head_node(slist_head *head);+extern bool slist_has_next(slist_head *head, slist_node *node);+extern slist_node *slist_next_node(slist_head *head, slist_node *node);+extern slist_node *slist_head_node(slist_head *head);+extern void slist_delete_current(slist_mutable_iter *iter);++/* slist macro support function */+extern void *slist_head_element_off(slist_head *head, size_t off);+#endif++#if defined(PG_USE_INLINE) || defined(ILIST_INCLUDE_DEFINITIONS)+/*+ * Initialize a singly linked list.+ * Previous state will be thrown away without any cleanup.+ */+STATIC_IF_INLINE void+slist_init(slist_head *head)+{+ head->head.next = NULL;+}++/*+ * Is the list empty?+ */+STATIC_IF_INLINE bool+slist_is_empty(slist_head *head)+{+ slist_check(head);++ return head->head.next == NULL;+}++/*+ * Insert a node at the beginning of the list.+ */+STATIC_IF_INLINE void+slist_push_head(slist_head *head, slist_node *node)+{+ node->next = head->head.next;+ head->head.next = node;++ slist_check(head);+}++/*+ * Insert a node after another *in the same list*+ */+STATIC_IF_INLINE void+slist_insert_after(slist_node *after, slist_node *node)+{+ node->next = after->next;+ after->next = node;+}++/*+ * Remove and return the first node from a list (there must be one).+ */+STATIC_IF_INLINE slist_node *+slist_pop_head_node(slist_head *head)+{+ slist_node *node;++ Assert(!slist_is_empty(head));+ node = head->head.next;+ head->head.next = node->next;+ slist_check(head);+ return node;+}++/*+ * Check whether 'node' has a following node.+ */+STATIC_IF_INLINE bool+slist_has_next(slist_head *head, slist_node *node)+{+ slist_check(head);++ return node->next != NULL;+}++/*+ * Return the next node in the list (there must be one).+ */+STATIC_IF_INLINE slist_node *+slist_next_node(slist_head *head, slist_node *node)+{+ Assert(slist_has_next(head, node));+ return node->next;+}++/* internal support function to get address of head element's struct */+STATIC_IF_INLINE void *+slist_head_element_off(slist_head *head, size_t off)+{+ Assert(!slist_is_empty(head));+ return (char *) head->head.next - off;+}++/*+ * Return the first node in the list (there must be one).+ */+STATIC_IF_INLINE slist_node *+slist_head_node(slist_head *head)+{+ return (slist_node *) slist_head_element_off(head, 0);+}++/*+ * Delete the list element the iterator currently points to.+ *+ * Caution: this modifies iter->cur, so don't use that again in the current+ * loop iteration.+ */+STATIC_IF_INLINE void+slist_delete_current(slist_mutable_iter *iter)+{+ /*+ * Update previous element's forward link. If the iteration is at the+ * first list element, iter->prev will point to the list header's "head"+ * field, so we don't need a special case for that.+ */+ iter->prev->next = iter->next;++ /*+ * Reset cur to prev, so that prev will continue to point to the prior+ * valid list element after slist_foreach_modify() advances to the next.+ */+ iter->cur = iter->prev;+}+#endif /* PG_USE_INLINE || ILIST_INCLUDE_DEFINITIONS */++/*+ * Return the containing struct of 'type' where 'membername' is the slist_node+ * pointed at by 'ptr'.+ *+ * This is used to convert a slist_node * back to its containing struct.+ */+#define slist_container(type, membername, ptr) \+ (AssertVariableIsOfTypeMacro(ptr, slist_node *), \+ AssertVariableIsOfTypeMacro(((type *) NULL)->membername, slist_node), \+ ((type *) ((char *) (ptr) - offsetof(type, membername))))++/*+ * Return the address of the first element in the list.+ *+ * The list must not be empty.+ */+#define slist_head_element(type, membername, lhead) \+ (AssertVariableIsOfTypeMacro(((type *) NULL)->membername, slist_node), \+ (type *) slist_head_element_off(lhead, offsetof(type, membername)))++/*+ * Iterate through the list pointed at by 'lhead' storing the state in 'iter'.+ *+ * Access the current element with iter.cur.+ *+ * It's allowed to modify the list while iterating, with the exception of+ * deleting the iterator's current node; deletion of that node requires+ * care if the iteration is to be continued afterward. (Doing so and also+ * deleting or inserting adjacent list elements might misbehave; also, if+ * the user frees the current node's storage, continuing the iteration is+ * not safe.)+ */+#define slist_foreach(iter, lhead) \+ for (AssertVariableIsOfTypeMacro(iter, slist_iter), \+ AssertVariableIsOfTypeMacro(lhead, slist_head *), \+ (iter).cur = (lhead)->head.next; \+ (iter).cur != NULL; \+ (iter).cur = (iter).cur->next)++/*+ * Iterate through the list pointed at by 'lhead' storing the state in 'iter'.+ *+ * Access the current element with iter.cur.+ *+ * The only list modification allowed while iterating is to remove the current+ * node via slist_delete_current() (*not* slist_delete()). Insertion or+ * deletion of nodes adjacent to the current node would misbehave.+ */+#define slist_foreach_modify(iter, lhead) \+ for (AssertVariableIsOfTypeMacro(iter, slist_mutable_iter), \+ AssertVariableIsOfTypeMacro(lhead, slist_head *), \+ (iter).prev = &(lhead)->head, \+ (iter).cur = (iter).prev->next, \+ (iter).next = (iter).cur ? (iter).cur->next : NULL; \+ (iter).cur != NULL; \+ (iter).prev = (iter).cur, \+ (iter).cur = (iter).next, \+ (iter).next = (iter).next ? (iter).next->next : NULL)++#endif /* ILIST_H */
+ foreign/libpg_query/src/postgres/include/lib/pairingheap.h view
@@ -0,0 +1,102 @@+/*+ * pairingheap.h+ *+ * A Pairing Heap implementation+ *+ * Portions Copyright (c) 2012-2015, PostgreSQL Global Development Group+ *+ * src/include/lib/pairingheap.h+ */++#ifndef PAIRINGHEAP_H+#define PAIRINGHEAP_H++#include "lib/stringinfo.h"++/* Enable if you need the pairingheap_dump() debug function */+/* #define PAIRINGHEAP_DEBUG */++/*+ * This represents an element stored in the heap. Embed this in a larger+ * struct containing the actual data you're storing.+ *+ * A node can have multiple children, which form a double-linked list.+ * first_child points to the node's first child, and the subsequent children+ * can be found by following the next_sibling pointers. The last child has+ * next_sibling == NULL. The prev_or_parent pointer points to the node's+ * previous sibling, or if the node is its parent's first child, to the+ * parent.+ */+typedef struct pairingheap_node+{+ struct pairingheap_node *first_child;+ struct pairingheap_node *next_sibling;+ struct pairingheap_node *prev_or_parent;+} pairingheap_node;++/*+ * Return the containing struct of 'type' where 'membername' is the+ * pairingheap_node pointed at by 'ptr'.+ *+ * This is used to convert a pairingheap_node * back to its containing struct.+ */+#define pairingheap_container(type, membername, ptr) \+ (AssertVariableIsOfTypeMacro(ptr, pairingheap_node *), \+ AssertVariableIsOfTypeMacro(((type *) NULL)->membername, pairingheap_node), \+ ((type *) ((char *) (ptr) - offsetof(type, membername))))++/*+ * Like pairingheap_container, but used when the pointer is 'const ptr'+ */+#define pairingheap_const_container(type, membername, ptr) \+ (AssertVariableIsOfTypeMacro(ptr, const pairingheap_node *), \+ AssertVariableIsOfTypeMacro(((type *) NULL)->membername, pairingheap_node), \+ ((const type *) ((const char *) (ptr) - offsetof(type, membername))))++/*+ * For a max-heap, the comparator must return <0 iff a < b, 0 iff a == b,+ * and >0 iff a > b. For a min-heap, the conditions are reversed.+ */+typedef int (*pairingheap_comparator) (const pairingheap_node *a,+ const pairingheap_node *b,+ void *arg);++/*+ * A pairing heap.+ *+ * You can use pairingheap_allocate() to create a new palloc'd heap, or embed+ * this in a larger struct, set ph_compare and ph_arg directly and initialize+ * ph_root to NULL.+ */+typedef struct pairingheap+{+ pairingheap_comparator ph_compare; /* comparison function */+ void *ph_arg; /* opaque argument to ph_compare */+ pairingheap_node *ph_root; /* current root of the heap */+} pairingheap;++extern pairingheap *pairingheap_allocate(pairingheap_comparator compare,+ void *arg);+extern void pairingheap_free(pairingheap *heap);+extern void pairingheap_add(pairingheap *heap, pairingheap_node *node);+extern pairingheap_node *pairingheap_first(pairingheap *heap);+extern pairingheap_node *pairingheap_remove_first(pairingheap *heap);+extern void pairingheap_remove(pairingheap *heap, pairingheap_node *node);++#ifdef PAIRINGHEAP_DEBUG+extern char *pairingheap_dump(pairingheap *heap,+ void (*dumpfunc) (pairingheap_node *node, StringInfo buf, void *opaque),+ void *opaque);+#endif++/* Resets the heap to be empty. */+#define pairingheap_reset(h) ((h)->ph_root = NULL)++/* Is the heap empty? */+#define pairingheap_is_empty(h) ((h)->ph_root == NULL)++/* Is there exactly one node in the heap? */+#define pairingheap_is_singular(h) \+ ((h)->ph_root && (h)->ph_root->first_child == NULL)++#endif /* PAIRINGHEAP_H */
+ foreign/libpg_query/src/postgres/include/lib/stringinfo.h view
@@ -0,0 +1,152 @@+/*-------------------------------------------------------------------------+ *+ * stringinfo.h+ * Declarations/definitions for "StringInfo" functions.+ *+ * StringInfo provides an indefinitely-extensible string data type.+ * It can be used to buffer either ordinary C strings (null-terminated text)+ * or arbitrary binary data. All storage is allocated with palloc().+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/lib/stringinfo.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef STRINGINFO_H+#define STRINGINFO_H++/*-------------------------+ * StringInfoData holds information about an extensible string.+ * data is the current buffer for the string (allocated with palloc).+ * len is the current string length. There is guaranteed to be+ * a terminating '\0' at data[len], although this is not very+ * useful when the string holds binary data rather than text.+ * maxlen is the allocated size in bytes of 'data', i.e. the maximum+ * string size (including the terminating '\0' char) that we can+ * currently store in 'data' without having to reallocate+ * more space. We must always have maxlen > len.+ * cursor is initialized to zero by makeStringInfo or initStringInfo,+ * but is not otherwise touched by the stringinfo.c routines.+ * Some routines use it to scan through a StringInfo.+ *-------------------------+ */+typedef struct StringInfoData+{+ char *data;+ int len;+ int maxlen;+ int cursor;+} StringInfoData;++typedef StringInfoData *StringInfo;+++/*------------------------+ * There are two ways to create a StringInfo object initially:+ *+ * StringInfo stringptr = makeStringInfo();+ * Both the StringInfoData and the data buffer are palloc'd.+ *+ * StringInfoData string;+ * initStringInfo(&string);+ * The data buffer is palloc'd but the StringInfoData is just local.+ * This is the easiest approach for a StringInfo object that will+ * only live as long as the current routine.+ *+ * To destroy a StringInfo, pfree() the data buffer, and then pfree() the+ * StringInfoData if it was palloc'd. There's no special support for this.+ *+ * NOTE: some routines build up a string using StringInfo, and then+ * release the StringInfoData but return the data string itself to their+ * caller. At that point the data string looks like a plain palloc'd+ * string.+ *-------------------------+ */++/*------------------------+ * makeStringInfo+ * Create an empty 'StringInfoData' & return a pointer to it.+ */+extern StringInfo makeStringInfo(void);++/*------------------------+ * initStringInfo+ * Initialize a StringInfoData struct (with previously undefined contents)+ * to describe an empty string.+ */+extern void initStringInfo(StringInfo str);++/*------------------------+ * resetStringInfo+ * Clears the current content of the StringInfo, if any. The+ * StringInfo remains valid.+ */+extern void resetStringInfo(StringInfo str);++/*------------------------+ * appendStringInfo+ * Format text data under the control of fmt (an sprintf-style format string)+ * and append it to whatever is already in str. More space is allocated+ * to str if necessary. This is sort of like a combination of sprintf and+ * strcat.+ */+extern void appendStringInfo(StringInfo str, const char *fmt,...) pg_attribute_printf(2, 3);++/*------------------------+ * appendStringInfoVA+ * Attempt to format text data under the control of fmt (an sprintf-style+ * format string) and append it to whatever is already in str. If successful+ * return zero; if not (because there's not enough space), return an estimate+ * of the space needed, without modifying str. Typically the caller should+ * pass the return value to enlargeStringInfo() before trying again; see+ * appendStringInfo for standard usage pattern.+ */+extern int appendStringInfoVA(StringInfo str, const char *fmt, va_list args) pg_attribute_printf(2, 0);++/*------------------------+ * appendStringInfoString+ * Append a null-terminated string to str.+ * Like appendStringInfo(str, "%s", s) but faster.+ */+extern void appendStringInfoString(StringInfo str, const char *s);++/*------------------------+ * appendStringInfoChar+ * Append a single byte to str.+ * Like appendStringInfo(str, "%c", ch) but much faster.+ */+extern void appendStringInfoChar(StringInfo str, char ch);++/*------------------------+ * appendStringInfoCharMacro+ * As above, but a macro for even more speed where it matters.+ * Caution: str argument will be evaluated multiple times.+ */+#define appendStringInfoCharMacro(str,ch) \+ (((str)->len + 1 >= (str)->maxlen) ? \+ appendStringInfoChar(str, ch) : \+ (void)((str)->data[(str)->len] = (ch), (str)->data[++(str)->len] = '\0'))++/*------------------------+ * appendStringInfoSpaces+ * Append a given number of spaces to str.+ */+extern void appendStringInfoSpaces(StringInfo str, int count);++/*------------------------+ * appendBinaryStringInfo+ * Append arbitrary binary data to a StringInfo, allocating more space+ * if necessary.+ */+extern void appendBinaryStringInfo(StringInfo str,+ const char *data, int datalen);++/*------------------------+ * enlargeStringInfo+ * Make sure a StringInfo's buffer can hold at least 'needed' more bytes.+ */+extern void enlargeStringInfo(StringInfo str, int needed);++#endif /* STRINGINFO_H */
+ foreign/libpg_query/src/postgres/include/libpq/auth.h view
@@ -0,0 +1,29 @@+/*-------------------------------------------------------------------------+ *+ * auth.h+ * Definitions for network authentication routines+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/libpq/auth.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef AUTH_H+#define AUTH_H++#include "libpq/libpq-be.h"++extern char *pg_krb_server_keyfile;+extern bool pg_krb_caseins_users;+extern char *pg_krb_realm;++extern void ClientAuthentication(Port *port);++/* Hook for plugins to get control in ClientAuthentication() */+typedef void (*ClientAuthentication_hook_type) (Port *, int);+extern PGDLLIMPORT ClientAuthentication_hook_type ClientAuthentication_hook;++#endif /* AUTH_H */
+ foreign/libpg_query/src/postgres/include/libpq/be-fsstubs.h view
@@ -0,0 +1,68 @@+/*-------------------------------------------------------------------------+ *+ * be-fsstubs.h+ *+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/libpq/be-fsstubs.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef BE_FSSTUBS_H+#define BE_FSSTUBS_H++#include "fmgr.h"++/*+ * LO functions available via pg_proc entries+ */+extern Datum lo_import(PG_FUNCTION_ARGS);+extern Datum lo_import_with_oid(PG_FUNCTION_ARGS);+extern Datum lo_export(PG_FUNCTION_ARGS);++extern Datum lo_creat(PG_FUNCTION_ARGS);+extern Datum lo_create(PG_FUNCTION_ARGS);+extern Datum lo_from_bytea(PG_FUNCTION_ARGS);++extern Datum lo_open(PG_FUNCTION_ARGS);+extern Datum lo_close(PG_FUNCTION_ARGS);++extern Datum loread(PG_FUNCTION_ARGS);+extern Datum lowrite(PG_FUNCTION_ARGS);++extern Datum lo_get(PG_FUNCTION_ARGS);+extern Datum lo_get_fragment(PG_FUNCTION_ARGS);+extern Datum lo_put(PG_FUNCTION_ARGS);++extern Datum lo_lseek(PG_FUNCTION_ARGS);+extern Datum lo_tell(PG_FUNCTION_ARGS);+extern Datum lo_lseek64(PG_FUNCTION_ARGS);+extern Datum lo_tell64(PG_FUNCTION_ARGS);+extern Datum lo_unlink(PG_FUNCTION_ARGS);+extern Datum lo_truncate(PG_FUNCTION_ARGS);+extern Datum lo_truncate64(PG_FUNCTION_ARGS);++/*+ * compatibility option for access control+ */+extern bool lo_compat_privileges;++/*+ * These are not fmgr-callable, but are available to C code.+ * Probably these should have had the underscore-free names,+ * but too late now...+ */+extern int lo_read(int fd, char *buf, int len);+extern int lo_write(int fd, const char *buf, int len);++/*+ * Cleanup LOs at xact commit/abort+ */+extern void AtEOXact_LargeObject(bool isCommit);+extern void AtEOSubXact_LargeObject(bool isCommit, SubTransactionId mySubid,+ SubTransactionId parentSubid);++#endif /* BE_FSSTUBS_H */
+ foreign/libpg_query/src/postgres/include/libpq/hba.h view
@@ -0,0 +1,107 @@+/*-------------------------------------------------------------------------+ *+ * hba.h+ * Interface to hba.c+ *+ *+ * src/include/libpq/hba.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef HBA_H+#define HBA_H++#include "libpq/pqcomm.h" /* pgrminclude ignore */ /* needed for NetBSD */+#include "nodes/pg_list.h"+#include "regex/regex.h"+++typedef enum UserAuth+{+ uaReject,+ uaImplicitReject,+ uaTrust,+ uaIdent,+ uaPassword,+ uaMD5,+ uaGSS,+ uaSSPI,+ uaPAM,+ uaLDAP,+ uaCert,+ uaRADIUS,+ uaPeer+} UserAuth;++typedef enum IPCompareMethod+{+ ipCmpMask,+ ipCmpSameHost,+ ipCmpSameNet,+ ipCmpAll+} IPCompareMethod;++typedef enum ConnType+{+ ctLocal,+ ctHost,+ ctHostSSL,+ ctHostNoSSL+} ConnType;++typedef struct HbaLine+{+ int linenumber;+ char *rawline;+ ConnType conntype;+ List *databases;+ List *roles;+ struct sockaddr_storage addr;+ struct sockaddr_storage mask;+ IPCompareMethod ip_cmp_method;+ char *hostname;+ UserAuth auth_method;++ char *usermap;+ char *pamservice;+ bool ldaptls;+ char *ldapserver;+ int ldapport;+ char *ldapbinddn;+ char *ldapbindpasswd;+ char *ldapsearchattribute;+ char *ldapbasedn;+ int ldapscope;+ char *ldapprefix;+ char *ldapsuffix;+ bool clientcert;+ char *krb_realm;+ bool include_realm;+ char *radiusserver;+ char *radiussecret;+ char *radiusidentifier;+ int radiusport;+} HbaLine;++typedef struct IdentLine+{+ int linenumber;++ char *usermap;+ char *ident_user;+ char *pg_role;+ regex_t re;+} IdentLine;++/* kluge to avoid including libpq/libpq-be.h here */+typedef struct Port hbaPort;++extern bool load_hba(void);+extern bool load_ident(void);+extern void hba_getauthmethod(hbaPort *port);+extern int check_usermap(const char *usermap_name,+ const char *pg_role, const char *auth_user,+ bool case_sensitive);+extern bool pg_isblank(const char c);++#endif /* HBA_H */
+ foreign/libpg_query/src/postgres/include/libpq/ip.h view
@@ -0,0 +1,51 @@+/*-------------------------------------------------------------------------+ *+ * ip.h+ * Definitions for IPv6-aware network access.+ *+ * These definitions are used by both frontend and backend code. Be careful+ * what you include here!+ *+ * Copyright (c) 2003-2015, PostgreSQL Global Development Group+ *+ * src/include/libpq/ip.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef IP_H+#define IP_H++#include "getaddrinfo.h" /* pgrminclude ignore */+#include "libpq/pqcomm.h" /* pgrminclude ignore */+++#ifdef HAVE_UNIX_SOCKETS+#define IS_AF_UNIX(fam) ((fam) == AF_UNIX)+#else+#define IS_AF_UNIX(fam) (0)+#endif++typedef void (*PgIfAddrCallback) (struct sockaddr * addr,+ struct sockaddr * netmask,+ void *cb_data);++extern int pg_getaddrinfo_all(const char *hostname, const char *servname,+ const struct addrinfo * hintp,+ struct addrinfo ** result);+extern void pg_freeaddrinfo_all(int hint_ai_family, struct addrinfo * ai);++extern int pg_getnameinfo_all(const struct sockaddr_storage * addr, int salen,+ char *node, int nodelen,+ char *service, int servicelen,+ int flags);++extern int pg_range_sockaddr(const struct sockaddr_storage * addr,+ const struct sockaddr_storage * netaddr,+ const struct sockaddr_storage * netmask);++extern int pg_sockaddr_cidr_mask(struct sockaddr_storage * mask,+ char *numbits, int family);++extern int pg_foreach_ifaddr(PgIfAddrCallback callback, void *cb_data);++#endif /* IP_H */
+ foreign/libpg_query/src/postgres/include/libpq/libpq-be.h view
@@ -0,0 +1,229 @@+/*-------------------------------------------------------------------------+ *+ * libpq_be.h+ * This file contains definitions for structures and externs used+ * by the postmaster during client authentication.+ *+ * Note that this is backend-internal and is NOT exported to clients.+ * Structs that need to be client-visible are in pqcomm.h.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/libpq/libpq-be.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef LIBPQ_BE_H+#define LIBPQ_BE_H++#ifdef HAVE_SYS_TIME_H+#include <sys/time.h>+#endif+#ifdef USE_OPENSSL+#include <openssl/ssl.h>+#include <openssl/err.h>+#endif+#ifdef HAVE_NETINET_TCP_H+#include <netinet/tcp.h>+#endif++#ifdef ENABLE_GSS+#if defined(HAVE_GSSAPI_H)+#include <gssapi.h>+#else+#include <gssapi/gssapi.h>+#endif /* HAVE_GSSAPI_H */+/*+ * GSSAPI brings in headers that set a lot of things in the global namespace on win32,+ * that doesn't match the msvc build. It gives a bunch of compiler warnings that we ignore,+ * but also defines a symbol that simply does not exist. Undefine it again.+ */+#ifdef WIN32_ONLY_COMPILER+#undef HAVE_GETADDRINFO+#endif+#endif /* ENABLE_GSS */++#ifdef ENABLE_SSPI+#define SECURITY_WIN32+#if defined(WIN32) && !defined(WIN32_ONLY_COMPILER)+#include <ntsecapi.h>+#endif+#include <security.h>+#undef SECURITY_WIN32++#ifndef ENABLE_GSS+/*+ * Define a fake structure compatible with GSSAPI on Unix.+ */+typedef struct+{+ void *value;+ int length;+} gss_buffer_desc;+#endif+#endif /* ENABLE_SSPI */++#include "datatype/timestamp.h"+#include "libpq/hba.h"+#include "libpq/pqcomm.h"+++typedef enum CAC_state+{+ CAC_OK, CAC_STARTUP, CAC_SHUTDOWN, CAC_RECOVERY, CAC_TOOMANY,+ CAC_WAITBACKUP+} CAC_state;+++/*+ * GSSAPI specific state information+ */+#if defined(ENABLE_GSS) | defined(ENABLE_SSPI)+typedef struct+{+ gss_buffer_desc outbuf; /* GSSAPI output token buffer */+#ifdef ENABLE_GSS+ gss_cred_id_t cred; /* GSSAPI connection cred's */+ gss_ctx_id_t ctx; /* GSSAPI connection context */+ gss_name_t name; /* GSSAPI client name */+#endif+} pg_gssinfo;+#endif++/*+ * This is used by the postmaster in its communication with frontends. It+ * contains all state information needed during this communication before the+ * backend is run. The Port structure is kept in malloc'd memory and is+ * still available when a backend is running (see MyProcPort). The data+ * it points to must also be malloc'd, or else palloc'd in TopMemoryContext,+ * so that it survives into PostgresMain execution!+ *+ * remote_hostname is set if we did a successful reverse lookup of the+ * client's IP address during connection setup.+ * remote_hostname_resolv tracks the state of hostname verification:+ * +1 = remote_hostname is known to resolve to client's IP address+ * -1 = remote_hostname is known NOT to resolve to client's IP address+ * 0 = we have not done the forward DNS lookup yet+ * -2 = there was an error in name resolution+ * If reverse lookup of the client IP address fails, remote_hostname will be+ * left NULL while remote_hostname_resolv is set to -2. If reverse lookup+ * succeeds but forward lookup fails, remote_hostname_resolv is also set to -2+ * (the case is distinguishable because remote_hostname isn't NULL). In+ * either of the -2 cases, remote_hostname_errcode saves the lookup return+ * code for possible later use with gai_strerror.+ */++typedef struct Port+{+ pgsocket sock; /* File descriptor */+ bool noblock; /* is the socket in non-blocking mode? */+ ProtocolVersion proto; /* FE/BE protocol version */+ SockAddr laddr; /* local addr (postmaster) */+ SockAddr raddr; /* remote addr (client) */+ char *remote_host; /* name (or ip addr) of remote host */+ char *remote_hostname;/* name (not ip addr) of remote host, if+ * available */+ int remote_hostname_resolv; /* see above */+ int remote_hostname_errcode; /* see above */+ char *remote_port; /* text rep of remote port */+ CAC_state canAcceptConnections; /* postmaster connection status */++ /*+ * Information that needs to be saved from the startup packet and passed+ * into backend execution. "char *" fields are NULL if not set.+ * guc_options points to a List of alternating option names and values.+ */+ char *database_name;+ char *user_name;+ char *cmdline_options;+ List *guc_options;++ /*+ * Information that needs to be held during the authentication cycle.+ */+ HbaLine *hba;+ char md5Salt[4]; /* Password salt */++ /*+ * Information that really has no business at all being in struct Port,+ * but since it gets used by elog.c in the same way as database_name and+ * other members of this struct, we may as well keep it here.+ */+ TimestampTz SessionStartTime; /* backend start time */++ /*+ * TCP keepalive settings.+ *+ * default values are 0 if AF_UNIX or not yet known; current values are 0+ * if AF_UNIX or using the default. Also, -1 in a default value means we+ * were unable to find out the default (getsockopt failed).+ */+ int default_keepalives_idle;+ int default_keepalives_interval;+ int default_keepalives_count;+ int keepalives_idle;+ int keepalives_interval;+ int keepalives_count;++#if defined(ENABLE_GSS) || defined(ENABLE_SSPI)++ /*+ * If GSSAPI is supported, store GSSAPI information. Otherwise, store a+ * NULL pointer to make sure offsets in the struct remain the same.+ */+ pg_gssinfo *gss;+#else+ void *gss;+#endif++ /*+ * SSL structures.+ */+ bool ssl_in_use;+ char *peer_cn;+ bool peer_cert_valid;++ /*+ * OpenSSL structures. (Keep these last so that the locations of other+ * fields are the same whether or not you build with OpenSSL.)+ */+#ifdef USE_OPENSSL+ SSL *ssl;+ X509 *peer;+ unsigned long count;+#endif+} Port;++#ifdef USE_SSL+/*+ * These functions are implemented by the glue code specific to each+ * SSL implementation (e.g. be-secure-openssl.c)+ */+extern void be_tls_init(void);+extern int be_tls_open_server(Port *port);+extern void be_tls_close(Port *port);+extern ssize_t be_tls_read(Port *port, void *ptr, size_t len, int *waitfor);+extern ssize_t be_tls_write(Port *port, void *ptr, size_t len, int *waitfor);++extern int be_tls_get_cipher_bits(Port *port);+extern bool be_tls_get_compression(Port *port);+extern void be_tls_get_version(Port *port, char *ptr, size_t len);+extern void be_tls_get_cipher(Port *port, char *ptr, size_t len);+extern void be_tls_get_peerdn_name(Port *port, char *ptr, size_t len);+#endif++extern ProtocolVersion FrontendProtocol;++/* TCP keepalives configuration. These are no-ops on an AF_UNIX socket. */++extern int pq_getkeepalivesidle(Port *port);+extern int pq_getkeepalivesinterval(Port *port);+extern int pq_getkeepalivescount(Port *port);++extern int pq_setkeepalivesidle(int idle, Port *port);+extern int pq_setkeepalivesinterval(int interval, Port *port);+extern int pq_setkeepalivescount(int count, Port *port);++#endif /* LIBPQ_BE_H */
+ foreign/libpg_query/src/postgres/include/libpq/libpq.h view
@@ -0,0 +1,103 @@+/*-------------------------------------------------------------------------+ *+ * libpq.h+ * POSTGRES LIBPQ buffer structure definitions.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/libpq/libpq.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef LIBPQ_H+#define LIBPQ_H++#include <sys/types.h>+#include <netinet/in.h>++#include "lib/stringinfo.h"+#include "libpq/libpq-be.h"+++typedef struct+{+ void (*comm_reset) (void);+ int (*flush) (void);+ int (*flush_if_writable) (void);+ bool (*is_send_pending) (void);+ int (*putmessage) (char msgtype, const char *s, size_t len);+ void (*putmessage_noblock) (char msgtype, const char *s, size_t len);+ void (*startcopyout) (void);+ void (*endcopyout) (bool errorAbort);+} PQcommMethods;++extern PGDLLIMPORT PQcommMethods *PqCommMethods;++#define pq_comm_reset() (PqCommMethods->comm_reset())+#define pq_flush() (PqCommMethods->flush())+#define pq_flush_if_writable() (PqCommMethods->flush_if_writable())+#define pq_is_send_pending() (PqCommMethods->is_send_pending())+#define pq_putmessage(msgtype, s, len) \+ (PqCommMethods->putmessage(msgtype, s, len))+#define pq_putmessage_noblock(msgtype, s, len) \+ (PqCommMethods->putmessage(msgtype, s, len))+#define pq_startcopyout() (PqCommMethods->startcopyout())+#define pq_endcopyout(errorAbort) (PqCommMethods->endcopyout(errorAbort))++/*+ * External functions.+ */++/*+ * prototypes for functions in pqcomm.c+ */+extern int StreamServerPort(int family, char *hostName,+ unsigned short portNumber, char *unixSocketDir,+ pgsocket ListenSocket[], int MaxListen);+extern int StreamConnection(pgsocket server_fd, Port *port);+extern void StreamClose(pgsocket sock);+extern void TouchSocketFiles(void);+extern void RemoveSocketFiles(void);+extern void pq_init(void);+extern int pq_getbytes(char *s, size_t len);+extern int pq_getstring(StringInfo s);+extern void pq_startmsgread(void);+extern void pq_endmsgread(void);+extern bool pq_is_reading_msg(void);+extern int pq_getmessage(StringInfo s, int maxlen);+extern int pq_getbyte(void);+extern int pq_peekbyte(void);+extern int pq_getbyte_if_available(unsigned char *c);+extern int pq_putbytes(const char *s, size_t len);++/*+ * prototypes for functions in be-secure.c+ */+extern char *ssl_cert_file;+extern char *ssl_key_file;+extern char *ssl_ca_file;+extern char *ssl_crl_file;++extern int (*pq_putmessage_hook) (char msgtype, const char *s, size_t len);+extern int (*pq_flush_hook) (void);++extern int secure_initialize(void);+extern bool secure_loaded_verify_locations(void);+extern void secure_destroy(void);+extern int secure_open_server(Port *port);+extern void secure_close(Port *port);+extern ssize_t secure_read(Port *port, void *ptr, size_t len);+extern ssize_t secure_write(Port *port, void *ptr, size_t len);+extern ssize_t secure_raw_read(Port *port, void *ptr, size_t len);+extern ssize_t secure_raw_write(Port *port, const void *ptr, size_t len);++extern bool ssl_loaded_verify_locations;++/* GUCs */+extern char *SSLCipherSuites;+extern char *SSLECDHCurve;+extern bool SSLPreferServerCiphers;++#endif /* LIBPQ_H */
+ foreign/libpg_query/src/postgres/include/libpq/pqcomm.h view
@@ -0,0 +1,204 @@+/*-------------------------------------------------------------------------+ *+ * pqcomm.h+ * Definitions common to frontends and backends.+ *+ * NOTE: for historical reasons, this does not correspond to pqcomm.c.+ * pqcomm.c's routines are declared in libpq.h.+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/libpq/pqcomm.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef PQCOMM_H+#define PQCOMM_H++#include <sys/socket.h>+#include <netdb.h>+#ifdef HAVE_SYS_UN_H+#include <sys/un.h>+#endif+#include <netinet/in.h>++#ifdef HAVE_STRUCT_SOCKADDR_STORAGE++#ifndef HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY+#ifdef HAVE_STRUCT_SOCKADDR_STORAGE___SS_FAMILY+#define ss_family __ss_family+#else+#error struct sockaddr_storage does not provide an ss_family member+#endif+#endif++#ifdef HAVE_STRUCT_SOCKADDR_STORAGE___SS_LEN+#define ss_len __ss_len+#define HAVE_STRUCT_SOCKADDR_STORAGE_SS_LEN 1+#endif+#else /* !HAVE_STRUCT_SOCKADDR_STORAGE */++/* Define a struct sockaddr_storage if we don't have one. */++struct sockaddr_storage+{+ union+ {+ struct sockaddr sa; /* get the system-dependent fields */+ int64 ss_align; /* ensures struct is properly aligned */+ char ss_pad[128]; /* ensures struct has desired size */+ } ss_stuff;+};++#define ss_family ss_stuff.sa.sa_family+/* It should have an ss_len field if sockaddr has sa_len. */+#ifdef HAVE_STRUCT_SOCKADDR_SA_LEN+#define ss_len ss_stuff.sa.sa_len+#define HAVE_STRUCT_SOCKADDR_STORAGE_SS_LEN 1+#endif+#endif /* HAVE_STRUCT_SOCKADDR_STORAGE */++typedef struct+{+ struct sockaddr_storage addr;+ ACCEPT_TYPE_ARG3 salen;+} SockAddr;++/* Configure the UNIX socket location for the well known port. */++#define UNIXSOCK_PATH(path, port, sockdir) \+ snprintf(path, sizeof(path), "%s/.s.PGSQL.%d", \+ ((sockdir) && *(sockdir) != '\0') ? (sockdir) : \+ DEFAULT_PGSOCKET_DIR, \+ (port))++/*+ * The maximum workable length of a socket path is what will fit into+ * struct sockaddr_un. This is usually only 100 or so bytes :-(.+ *+ * For consistency, always pass a MAXPGPATH-sized buffer to UNIXSOCK_PATH(),+ * then complain if the resulting string is >= UNIXSOCK_PATH_BUFLEN bytes.+ * (Because the standard API for getaddrinfo doesn't allow it to complain in+ * a useful way when the socket pathname is too long, we have to test for+ * this explicitly, instead of just letting the subroutine return an error.)+ */+#define UNIXSOCK_PATH_BUFLEN sizeof(((struct sockaddr_un *) NULL)->sun_path)+++/*+ * These manipulate the frontend/backend protocol version number.+ *+ * The major number should be incremented for incompatible changes. The minor+ * number should be incremented for compatible changes (eg. additional+ * functionality).+ *+ * If a backend supports version m.n of the protocol it must actually support+ * versions m.[0..n]. Backend support for version m-1 can be dropped after a+ * `reasonable' length of time.+ *+ * A frontend isn't required to support anything other than the current+ * version.+ */++#define PG_PROTOCOL_MAJOR(v) ((v) >> 16)+#define PG_PROTOCOL_MINOR(v) ((v) & 0x0000ffff)+#define PG_PROTOCOL(m,n) (((m) << 16) | (n))++/* The earliest and latest frontend/backend protocol version supported. */++#define PG_PROTOCOL_EARLIEST PG_PROTOCOL(1,0)+#define PG_PROTOCOL_LATEST PG_PROTOCOL(3,0)++typedef uint32 ProtocolVersion; /* FE/BE protocol version number */++typedef ProtocolVersion MsgType;+++/*+ * Packet lengths are 4 bytes in network byte order.+ *+ * The initial length is omitted from the packet layouts appearing below.+ */++typedef uint32 PacketLen;+++/*+ * Old-style startup packet layout with fixed-width fields. This is used in+ * protocol 1.0 and 2.0, but not in later versions. Note that the fields+ * in this layout are '\0' terminated only if there is room.+ */++#define SM_DATABASE 64+#define SM_USER 32+/* We append database name if db_user_namespace true. */+#define SM_DATABASE_USER (SM_DATABASE+SM_USER+1) /* +1 for @ */+#define SM_OPTIONS 64+#define SM_UNUSED 64+#define SM_TTY 64++typedef struct StartupPacket+{+ ProtocolVersion protoVersion; /* Protocol version */+ char database[SM_DATABASE]; /* Database name */+ /* Db_user_namespace appends dbname */+ char user[SM_USER]; /* User name */+ char options[SM_OPTIONS]; /* Optional additional args */+ char unused[SM_UNUSED]; /* Unused */+ char tty[SM_TTY]; /* Tty for debug output */+} StartupPacket;++extern bool Db_user_namespace;++/*+ * In protocol 3.0 and later, the startup packet length is not fixed, but+ * we set an arbitrary limit on it anyway. This is just to prevent simple+ * denial-of-service attacks via sending enough data to run the server+ * out of memory.+ */+#define MAX_STARTUP_PACKET_LENGTH 10000+++/* These are the authentication request codes sent by the backend. */++#define AUTH_REQ_OK 0 /* User is authenticated */+#define AUTH_REQ_KRB4 1 /* Kerberos V4. Not supported any more. */+#define AUTH_REQ_KRB5 2 /* Kerberos V5. Not supported any more. */+#define AUTH_REQ_PASSWORD 3 /* Password */+#define AUTH_REQ_CRYPT 4 /* crypt password. Not supported any more. */+#define AUTH_REQ_MD5 5 /* md5 password */+#define AUTH_REQ_SCM_CREDS 6 /* transfer SCM credentials */+#define AUTH_REQ_GSS 7 /* GSSAPI without wrap() */+#define AUTH_REQ_GSS_CONT 8 /* Continue GSS exchanges */+#define AUTH_REQ_SSPI 9 /* SSPI negotiate without wrap() */++typedef uint32 AuthRequest;+++/*+ * A client can also send a cancel-current-operation request to the postmaster.+ * This is uglier than sending it directly to the client's backend, but it+ * avoids depending on out-of-band communication facilities.+ *+ * The cancel request code must not match any protocol version number+ * we're ever likely to use. This random choice should do.+ */+#define CANCEL_REQUEST_CODE PG_PROTOCOL(1234,5678)++typedef struct CancelRequestPacket+{+ /* Note that each field is stored in network byte order! */+ MsgType cancelRequestCode; /* code to identify a cancel request */+ uint32 backendPID; /* PID of client's backend */+ uint32 cancelAuthCode; /* secret key to authorize cancel */+} CancelRequestPacket;+++/*+ * A client can also start by sending a SSL negotiation request, to get a+ * secure channel.+ */+#define NEGOTIATE_SSL_CODE PG_PROTOCOL(1234,5679)++#endif /* PQCOMM_H */
+ foreign/libpg_query/src/postgres/include/libpq/pqformat.h view
@@ -0,0 +1,49 @@+/*-------------------------------------------------------------------------+ *+ * pqformat.h+ * Definitions for formatting and parsing frontend/backend messages+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/libpq/pqformat.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef PQFORMAT_H+#define PQFORMAT_H++#include "lib/stringinfo.h"++extern void pq_beginmessage(StringInfo buf, char msgtype);+extern void pq_sendbyte(StringInfo buf, int byt);+extern void pq_sendbytes(StringInfo buf, const char *data, int datalen);+extern void pq_sendcountedtext(StringInfo buf, const char *str, int slen,+ bool countincludesself);+extern void pq_sendtext(StringInfo buf, const char *str, int slen);+extern void pq_sendstring(StringInfo buf, const char *str);+extern void pq_send_ascii_string(StringInfo buf, const char *str);+extern void pq_sendint(StringInfo buf, int i, int b);+extern void pq_sendint64(StringInfo buf, int64 i);+extern void pq_sendfloat4(StringInfo buf, float4 f);+extern void pq_sendfloat8(StringInfo buf, float8 f);+extern void pq_endmessage(StringInfo buf);++extern void pq_begintypsend(StringInfo buf);+extern bytea *pq_endtypsend(StringInfo buf);++extern void pq_puttextmessage(char msgtype, const char *str);+extern void pq_putemptymessage(char msgtype);++extern int pq_getmsgbyte(StringInfo msg);+extern unsigned int pq_getmsgint(StringInfo msg, int b);+extern int64 pq_getmsgint64(StringInfo msg);+extern float4 pq_getmsgfloat4(StringInfo msg);+extern float8 pq_getmsgfloat8(StringInfo msg);+extern const char *pq_getmsgbytes(StringInfo msg, int datalen);+extern void pq_copymsgbytes(StringInfo msg, char *buf, int datalen);+extern char *pq_getmsgtext(StringInfo msg, int rawbytes, int *nbytes);+extern const char *pq_getmsgstring(StringInfo msg);+extern void pq_getmsgend(StringInfo msg);++#endif /* PQFORMAT_H */
+ foreign/libpg_query/src/postgres/include/libpq/pqsignal.h view
@@ -0,0 +1,42 @@+/*-------------------------------------------------------------------------+ *+ * pqsignal.h+ * Backend signal(2) support (see also src/port/pqsignal.c)+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/libpq/pqsignal.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef PQSIGNAL_H+#define PQSIGNAL_H++#include <signal.h>++#ifdef HAVE_SIGPROCMASK+extern sigset_t UnBlockSig,+ BlockSig,+ StartupBlockSig;++#define PG_SETMASK(mask) sigprocmask(SIG_SETMASK, mask, NULL)+#else /* not HAVE_SIGPROCMASK */+extern int UnBlockSig,+ BlockSig,+ StartupBlockSig;++#ifndef WIN32+#define PG_SETMASK(mask) sigsetmask(*((int*)(mask)))+#else+#define PG_SETMASK(mask) pqsigsetmask(*((int*)(mask)))+int pqsigsetmask(int mask);+#endif++#define sigaddset(set, signum) (*(set) |= (sigmask(signum)))+#define sigdelset(set, signum) (*(set) &= ~(sigmask(signum)))+#endif /* not HAVE_SIGPROCMASK */++extern void pqinitmask(void);++#endif /* PQSIGNAL_H */
+ foreign/libpg_query/src/postgres/include/mb/pg_wchar.h view
@@ -0,0 +1,559 @@+/*-------------------------------------------------------------------------+ *+ * pg_wchar.h+ * multibyte-character support+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/mb/pg_wchar.h+ *+ * NOTES+ * This is used both by the backend and by libpq, but should not be+ * included by libpq client programs. In particular, a libpq client+ * should not assume that the encoding IDs used by the version of libpq+ * it's linked to match up with the IDs declared here.+ *+ *-------------------------------------------------------------------------+ */+#ifndef PG_WCHAR_H+#define PG_WCHAR_H++/*+ * The pg_wchar type+ */+typedef unsigned int pg_wchar;++/*+ * Maximum byte length of multibyte characters in any backend encoding+ */+#define MAX_MULTIBYTE_CHAR_LEN 4++/*+ * various definitions for EUC+ */+#define SS2 0x8e /* single shift 2 (JIS0201) */+#define SS3 0x8f /* single shift 3 (JIS0212) */++/*+ * SJIS validation macros+ */+#define ISSJISHEAD(c) (((c) >= 0x81 && (c) <= 0x9f) || ((c) >= 0xe0 && (c) <= 0xfc))+#define ISSJISTAIL(c) (((c) >= 0x40 && (c) <= 0x7e) || ((c) >= 0x80 && (c) <= 0xfc))++/*----------------------------------------------------+ * MULE Internal Encoding (MIC)+ *+ * This encoding follows the design used within XEmacs; it is meant to+ * subsume many externally-defined character sets. Each character includes+ * identification of the character set it belongs to, so the encoding is+ * general but somewhat bulky.+ *+ * Currently PostgreSQL supports 5 types of MULE character sets:+ *+ * 1) 1-byte ASCII characters. Each byte is below 0x80.+ *+ * 2) "Official" single byte charsets such as ISO-8859-1 (Latin1).+ * Each MULE character consists of 2 bytes: LC1 + C1, where LC1 is+ * an identifier for the charset (in the range 0x81 to 0x8d) and C1+ * is the character code (in the range 0xa0 to 0xff).+ *+ * 3) "Private" single byte charsets such as SISHENG. Each MULE+ * character consists of 3 bytes: LCPRV1 + LC12 + C1, where LCPRV1+ * is a private-charset flag, LC12 is an identifier for the charset,+ * and C1 is the character code (in the range 0xa0 to 0xff).+ * LCPRV1 is either 0x9a (if LC12 is in the range 0xa0 to 0xdf)+ * or 0x9b (if LC12 is in the range 0xe0 to 0xef).+ *+ * 4) "Official" multibyte charsets such as JIS X0208. Each MULE+ * character consists of 3 bytes: LC2 + C1 + C2, where LC2 is+ * an identifier for the charset (in the range 0x90 to 0x99) and C1+ * and C2 form the character code (each in the range 0xa0 to 0xff).+ *+ * 5) "Private" multibyte charsets such as CNS 11643-1992 Plane 3.+ * Each MULE character consists of 4 bytes: LCPRV2 + LC22 + C1 + C2,+ * where LCPRV2 is a private-charset flag, LC22 is an identifier for+ * the charset, and C1 and C2 form the character code (each in the range+ * 0xa0 to 0xff). LCPRV2 is either 0x9c (if LC22 is in the range 0xf0+ * to 0xf4) or 0x9d (if LC22 is in the range 0xf5 to 0xfe).+ *+ * "Official" encodings are those that have been assigned code numbers by+ * the XEmacs project; "private" encodings have Postgres-specific charset+ * identifiers.+ *+ * See the "XEmacs Internals Manual", available at http://www.xemacs.org,+ * for more details. Note that for historical reasons, Postgres'+ * private-charset flag values do not match what XEmacs says they should be,+ * so this isn't really exactly MULE (not that private charsets would be+ * interoperable anyway).+ *+ * Note that XEmacs's implementation is different from what emacs does.+ * We follow emacs's implementation, rather than XEmacs's.+ *----------------------------------------------------+ */++/*+ * Charset identifiers (also called "leading bytes" in the MULE documentation)+ */++/*+ * Charset IDs for official single byte encodings (0x81-0x8e)+ */+#define LC_ISO8859_1 0x81 /* ISO8859 Latin 1 */+#define LC_ISO8859_2 0x82 /* ISO8859 Latin 2 */+#define LC_ISO8859_3 0x83 /* ISO8859 Latin 3 */+#define LC_ISO8859_4 0x84 /* ISO8859 Latin 4 */+#define LC_TIS620 0x85 /* Thai (not supported yet) */+#define LC_ISO8859_7 0x86 /* Greek (not supported yet) */+#define LC_ISO8859_6 0x87 /* Arabic (not supported yet) */+#define LC_ISO8859_8 0x88 /* Hebrew (not supported yet) */+#define LC_JISX0201K 0x89 /* Japanese 1 byte kana */+#define LC_JISX0201R 0x8a /* Japanese 1 byte Roman */+/* Note that 0x8b seems to be unused as of Emacs 20.7.+ * However, there might be a chance that 0x8b could be used+ * in later versions of Emacs.+ */+#define LC_KOI8_R 0x8b /* Cyrillic KOI8-R */+#define LC_ISO8859_5 0x8c /* ISO8859 Cyrillic */+#define LC_ISO8859_9 0x8d /* ISO8859 Latin 5 (not supported yet) */+#define LC_ISO8859_15 0x8e /* ISO8859 Latin 15 (not supported yet) */+/* #define CONTROL_1 0x8f control characters (unused) */++/* Is a leading byte for "official" single byte encodings? */+#define IS_LC1(c) ((unsigned char)(c) >= 0x81 && (unsigned char)(c) <= 0x8d)++/*+ * Charset IDs for official multibyte encodings (0x90-0x99)+ * 0x9a-0x9d are free. 0x9e and 0x9f are reserved.+ */+#define LC_JISX0208_1978 0x90 /* Japanese Kanji, old JIS (not supported) */+#define LC_GB2312_80 0x91 /* Chinese */+#define LC_JISX0208 0x92 /* Japanese Kanji (JIS X 0208) */+#define LC_KS5601 0x93 /* Korean */+#define LC_JISX0212 0x94 /* Japanese Kanji (JIS X 0212) */+#define LC_CNS11643_1 0x95 /* CNS 11643-1992 Plane 1 */+#define LC_CNS11643_2 0x96 /* CNS 11643-1992 Plane 2 */+#define LC_JISX0213_1 0x97/* Japanese Kanji (JIS X 0213 Plane 1) (not+ * supported) */+#define LC_BIG5_1 0x98 /* Plane 1 Chinese traditional (not supported) */+#define LC_BIG5_2 0x99 /* Plane 1 Chinese traditional (not supported) */++/* Is a leading byte for "official" multibyte encodings? */+#define IS_LC2(c) ((unsigned char)(c) >= 0x90 && (unsigned char)(c) <= 0x99)++/*+ * Postgres-specific prefix bytes for "private" single byte encodings+ * (According to the MULE docs, we should be using 0x9e for this)+ */+#define LCPRV1_A 0x9a+#define LCPRV1_B 0x9b+#define IS_LCPRV1(c) ((unsigned char)(c) == LCPRV1_A || (unsigned char)(c) == LCPRV1_B)+#define IS_LCPRV1_A_RANGE(c) \+ ((unsigned char)(c) >= 0xa0 && (unsigned char)(c) <= 0xdf)+#define IS_LCPRV1_B_RANGE(c) \+ ((unsigned char)(c) >= 0xe0 && (unsigned char)(c) <= 0xef)++/*+ * Postgres-specific prefix bytes for "private" multibyte encodings+ * (According to the MULE docs, we should be using 0x9f for this)+ */+#define LCPRV2_A 0x9c+#define LCPRV2_B 0x9d+#define IS_LCPRV2(c) ((unsigned char)(c) == LCPRV2_A || (unsigned char)(c) == LCPRV2_B)+#define IS_LCPRV2_A_RANGE(c) \+ ((unsigned char)(c) >= 0xf0 && (unsigned char)(c) <= 0xf4)+#define IS_LCPRV2_B_RANGE(c) \+ ((unsigned char)(c) >= 0xf5 && (unsigned char)(c) <= 0xfe)++/*+ * Charset IDs for private single byte encodings (0xa0-0xef)+ */+#define LC_SISHENG 0xa0/* Chinese SiSheng characters for+ * PinYin/ZhuYin (not supported) */+#define LC_IPA 0xa1/* IPA (International Phonetic Association)+ * (not supported) */+#define LC_VISCII_LOWER 0xa2/* Vietnamese VISCII1.1 lower-case (not+ * supported) */+#define LC_VISCII_UPPER 0xa3/* Vietnamese VISCII1.1 upper-case (not+ * supported) */+#define LC_ARABIC_DIGIT 0xa4 /* Arabic digit (not supported) */+#define LC_ARABIC_1_COLUMN 0xa5 /* Arabic 1-column (not supported) */+#define LC_ASCII_RIGHT_TO_LEFT 0xa6 /* ASCII (left half of ISO8859-1) with+ * right-to-left direction (not+ * supported) */+#define LC_LAO 0xa7/* Lao characters (ISO10646 0E80..0EDF) (not+ * supported) */+#define LC_ARABIC_2_COLUMN 0xa8 /* Arabic 1-column (not supported) */++/*+ * Charset IDs for private multibyte encodings (0xf0-0xff)+ */+#define LC_INDIAN_1_COLUMN 0xf0/* Indian charset for 1-column width glyphs+ * (not supported) */+#define LC_TIBETAN_1_COLUMN 0xf1/* Tibetan 1-column width glyphs (not+ * supported) */+#define LC_UNICODE_SUBSET_2 0xf2/* Unicode characters of the range+ * U+2500..U+33FF. (not supported) */+#define LC_UNICODE_SUBSET_3 0xf3/* Unicode characters of the range+ * U+E000..U+FFFF. (not supported) */+#define LC_UNICODE_SUBSET 0xf4/* Unicode characters of the range+ * U+0100..U+24FF. (not supported) */+#define LC_ETHIOPIC 0xf5 /* Ethiopic characters (not supported) */+#define LC_CNS11643_3 0xf6 /* CNS 11643-1992 Plane 3 */+#define LC_CNS11643_4 0xf7 /* CNS 11643-1992 Plane 4 */+#define LC_CNS11643_5 0xf8 /* CNS 11643-1992 Plane 5 */+#define LC_CNS11643_6 0xf9 /* CNS 11643-1992 Plane 6 */+#define LC_CNS11643_7 0xfa /* CNS 11643-1992 Plane 7 */+#define LC_INDIAN_2_COLUMN 0xfb/* Indian charset for 2-column width glyphs+ * (not supported) */+#define LC_TIBETAN 0xfc /* Tibetan (not supported) */+/* #define FREE 0xfd free (unused) */+/* #define FREE 0xfe free (unused) */+/* #define FREE 0xff free (unused) */++/*----------------------------------------------------+ * end of MULE stuff+ *----------------------------------------------------+ */++/*+ * PostgreSQL encoding identifiers+ *+ * WARNING: the order of this enum must be same as order of entries+ * in the pg_enc2name_tbl[] array (in mb/encnames.c), and+ * in the pg_wchar_table[] array (in mb/wchar.c)!+ *+ * If you add some encoding don't forget to check+ * PG_ENCODING_BE_LAST macro.+ *+ * PG_SQL_ASCII is default encoding and must be = 0.+ *+ * XXX We must avoid renumbering any backend encoding until libpq's major+ * version number is increased beyond 5; it turns out that the backend+ * encoding IDs are effectively part of libpq's ABI as far as 8.2 initdb and+ * psql are concerned.+ */+typedef enum pg_enc+{+ PG_SQL_ASCII = 0, /* SQL/ASCII */+ PG_EUC_JP, /* EUC for Japanese */+ PG_EUC_CN, /* EUC for Chinese */+ PG_EUC_KR, /* EUC for Korean */+ PG_EUC_TW, /* EUC for Taiwan */+ PG_EUC_JIS_2004, /* EUC-JIS-2004 */+ PG_UTF8, /* Unicode UTF8 */+ PG_MULE_INTERNAL, /* Mule internal code */+ PG_LATIN1, /* ISO-8859-1 Latin 1 */+ PG_LATIN2, /* ISO-8859-2 Latin 2 */+ PG_LATIN3, /* ISO-8859-3 Latin 3 */+ PG_LATIN4, /* ISO-8859-4 Latin 4 */+ PG_LATIN5, /* ISO-8859-9 Latin 5 */+ PG_LATIN6, /* ISO-8859-10 Latin6 */+ PG_LATIN7, /* ISO-8859-13 Latin7 */+ PG_LATIN8, /* ISO-8859-14 Latin8 */+ PG_LATIN9, /* ISO-8859-15 Latin9 */+ PG_LATIN10, /* ISO-8859-16 Latin10 */+ PG_WIN1256, /* windows-1256 */+ PG_WIN1258, /* Windows-1258 */+ PG_WIN866, /* (MS-DOS CP866) */+ PG_WIN874, /* windows-874 */+ PG_KOI8R, /* KOI8-R */+ PG_WIN1251, /* windows-1251 */+ PG_WIN1252, /* windows-1252 */+ PG_ISO_8859_5, /* ISO-8859-5 */+ PG_ISO_8859_6, /* ISO-8859-6 */+ PG_ISO_8859_7, /* ISO-8859-7 */+ PG_ISO_8859_8, /* ISO-8859-8 */+ PG_WIN1250, /* windows-1250 */+ PG_WIN1253, /* windows-1253 */+ PG_WIN1254, /* windows-1254 */+ PG_WIN1255, /* windows-1255 */+ PG_WIN1257, /* windows-1257 */+ PG_KOI8U, /* KOI8-U */+ /* PG_ENCODING_BE_LAST points to the above entry */++ /* followings are for client encoding only */+ PG_SJIS, /* Shift JIS (Windows-932) */+ PG_BIG5, /* Big5 (Windows-950) */+ PG_GBK, /* GBK (Windows-936) */+ PG_UHC, /* UHC (Windows-949) */+ PG_GB18030, /* GB18030 */+ PG_JOHAB, /* EUC for Korean JOHAB */+ PG_SHIFT_JIS_2004, /* Shift-JIS-2004 */+ _PG_LAST_ENCODING_ /* mark only */++} pg_enc;++#define PG_ENCODING_BE_LAST PG_KOI8U++/*+ * Please use these tests before access to pg_encconv_tbl[]+ * or to other places...+ */+#define PG_VALID_BE_ENCODING(_enc) \+ ((_enc) >= 0 && (_enc) <= PG_ENCODING_BE_LAST)++#define PG_ENCODING_IS_CLIENT_ONLY(_enc) \+ ((_enc) > PG_ENCODING_BE_LAST && (_enc) < _PG_LAST_ENCODING_)++#define PG_VALID_ENCODING(_enc) \+ ((_enc) >= 0 && (_enc) < _PG_LAST_ENCODING_)++/* On FE are possible all encodings */+#define PG_VALID_FE_ENCODING(_enc) PG_VALID_ENCODING(_enc)++/*+ * Table for mapping an encoding number to official encoding name and+ * possibly other subsidiary data. Be careful to check encoding number+ * before accessing a table entry!+ *+ * if (PG_VALID_ENCODING(encoding))+ * pg_enc2name_tbl[ encoding ];+ */+typedef struct pg_enc2name+{+ const char *name;+ pg_enc encoding;+#ifdef WIN32+ unsigned codepage; /* codepage for WIN32 */+#endif+} pg_enc2name;++extern const pg_enc2name pg_enc2name_tbl[];++/*+ * Encoding names for gettext+ */+typedef struct pg_enc2gettext+{+ pg_enc encoding;+ const char *name;+} pg_enc2gettext;++extern const pg_enc2gettext pg_enc2gettext_tbl[];++/*+ * pg_wchar stuff+ */+typedef int (*mb2wchar_with_len_converter) (const unsigned char *from,+ pg_wchar *to,+ int len);++typedef int (*wchar2mb_with_len_converter) (const pg_wchar *from,+ unsigned char *to,+ int len);++typedef int (*mblen_converter) (const unsigned char *mbstr);++typedef int (*mbdisplaylen_converter) (const unsigned char *mbstr);++typedef bool (*mbcharacter_incrementer) (unsigned char *mbstr, int len);++typedef int (*mbverifier) (const unsigned char *mbstr, int len);++typedef struct+{+ mb2wchar_with_len_converter mb2wchar_with_len; /* convert a multibyte+ * string to a wchar */+ wchar2mb_with_len_converter wchar2mb_with_len; /* convert a wchar+ * string to a multibyte */+ mblen_converter mblen; /* get byte length of a char */+ mbdisplaylen_converter dsplen; /* get display width of a char */+ mbverifier mbverify; /* verify multibyte sequence */+ int maxmblen; /* max bytes for a char in this encoding */+} pg_wchar_tbl;++extern const pg_wchar_tbl pg_wchar_table[];++/*+ * Data structures for conversions between UTF-8 and other encodings+ * (UtfToLocal() and LocalToUtf()). In these data structures, characters of+ * either encoding are represented by uint32 words; hence we can only support+ * characters up to 4 bytes long. For example, the byte sequence 0xC2 0x89+ * would be represented by 0x0000C289, and 0xE8 0xA2 0xB4 by 0x00E8A2B4.+ *+ * Maps are arrays of these structs, which must be in order by the lookup key+ * (so that bsearch() can be used).+ *+ * UTF-8 to local code conversion map+ */+typedef struct+{+ uint32 utf; /* UTF-8 */+ uint32 code; /* local code */+} pg_utf_to_local;++/*+ * local code to UTF-8 conversion map+ */+typedef struct+{+ uint32 code; /* local code */+ uint32 utf; /* UTF-8 */+} pg_local_to_utf;++/*+ * UTF-8 to local code conversion map (for combined characters)+ */+typedef struct+{+ uint32 utf1; /* UTF-8 code 1 */+ uint32 utf2; /* UTF-8 code 2 */+ uint32 code; /* local code */+} pg_utf_to_local_combined;++/*+ * local code to UTF-8 conversion map (for combined characters)+ */+typedef struct+{+ uint32 code; /* local code */+ uint32 utf1; /* UTF-8 code 1 */+ uint32 utf2; /* UTF-8 code 2 */+} pg_local_to_utf_combined;++/*+ * callback function for algorithmic encoding conversions (in either direction)+ *+ * if function returns zero, it does not know how to convert the code+ */+typedef uint32 (*utf_local_conversion_func) (uint32 code);++/*+ * Support macro for encoding conversion functions to validate their+ * arguments. (This could be made more compact if we included fmgr.h+ * here, but we don't want to do that because this header file is also+ * used by frontends.)+ */+#define CHECK_ENCODING_CONVERSION_ARGS(srcencoding,destencoding) \+ check_encoding_conversion_args(PG_GETARG_INT32(0), \+ PG_GETARG_INT32(1), \+ PG_GETARG_INT32(4), \+ (srcencoding), \+ (destencoding))+++/*+ * These functions are considered part of libpq's exported API and+ * are also declared in libpq-fe.h.+ */+extern int pg_char_to_encoding(const char *name);+extern const char *pg_encoding_to_char(int encoding);+extern int pg_valid_server_encoding_id(int encoding);++/*+ * Remaining functions are not considered part of libpq's API, though many+ * of them do exist inside libpq.+ */+extern int pg_mb2wchar(const char *from, pg_wchar *to);+extern int pg_mb2wchar_with_len(const char *from, pg_wchar *to, int len);+extern int pg_encoding_mb2wchar_with_len(int encoding,+ const char *from, pg_wchar *to, int len);+extern int pg_wchar2mb(const pg_wchar *from, char *to);+extern int pg_wchar2mb_with_len(const pg_wchar *from, char *to, int len);+extern int pg_encoding_wchar2mb_with_len(int encoding,+ const pg_wchar *from, char *to, int len);+extern int pg_char_and_wchar_strcmp(const char *s1, const pg_wchar *s2);+extern int pg_wchar_strncmp(const pg_wchar *s1, const pg_wchar *s2, size_t n);+extern int pg_char_and_wchar_strncmp(const char *s1, const pg_wchar *s2, size_t n);+extern size_t pg_wchar_strlen(const pg_wchar *wstr);+extern int pg_mblen(const char *mbstr);+extern int pg_dsplen(const char *mbstr);+extern int pg_encoding_mblen(int encoding, const char *mbstr);+extern int pg_encoding_dsplen(int encoding, const char *mbstr);+extern int pg_encoding_verifymb(int encoding, const char *mbstr, int len);+extern int pg_mule_mblen(const unsigned char *mbstr);+extern int pg_mic_mblen(const unsigned char *mbstr);+extern int pg_mbstrlen(const char *mbstr);+extern int pg_mbstrlen_with_len(const char *mbstr, int len);+extern int pg_mbcliplen(const char *mbstr, int len, int limit);+extern int pg_encoding_mbcliplen(int encoding, const char *mbstr,+ int len, int limit);+extern int pg_mbcharcliplen(const char *mbstr, int len, int imit);+extern int pg_encoding_max_length(int encoding);+extern int pg_database_encoding_max_length(void);+extern mbcharacter_incrementer pg_database_encoding_character_incrementer(void);++extern int PrepareClientEncoding(int encoding);+extern int SetClientEncoding(int encoding);+extern void InitializeClientEncoding(void);+extern int pg_get_client_encoding(void);+extern const char *pg_get_client_encoding_name(void);++extern void SetDatabaseEncoding(int encoding);+extern int GetDatabaseEncoding(void);+extern const char *GetDatabaseEncodingName(void);+extern void SetMessageEncoding(int encoding);+extern int GetMessageEncoding(void);++#ifdef ENABLE_NLS+extern int pg_bind_textdomain_codeset(const char *domainname);+#endif++extern int pg_valid_client_encoding(const char *name);+extern int pg_valid_server_encoding(const char *name);++extern unsigned char *unicode_to_utf8(pg_wchar c, unsigned char *utf8string);+extern pg_wchar utf8_to_unicode(const unsigned char *c);+extern int pg_utf_mblen(const unsigned char *);+extern unsigned char *pg_do_encoding_conversion(unsigned char *src, int len,+ int src_encoding,+ int dest_encoding);++extern char *pg_client_to_server(const char *s, int len);+extern char *pg_server_to_client(const char *s, int len);+extern char *pg_any_to_server(const char *s, int len, int encoding);+extern char *pg_server_to_any(const char *s, int len, int encoding);++extern unsigned short BIG5toCNS(unsigned short big5, unsigned char *lc);+extern unsigned short CNStoBIG5(unsigned short cns, unsigned char lc);++extern void UtfToLocal(const unsigned char *utf, int len,+ unsigned char *iso,+ const pg_utf_to_local *map, int mapsize,+ const pg_utf_to_local_combined *cmap, int cmapsize,+ utf_local_conversion_func conv_func,+ int encoding);+extern void LocalToUtf(const unsigned char *iso, int len,+ unsigned char *utf,+ const pg_local_to_utf *map, int mapsize,+ const pg_local_to_utf_combined *cmap, int cmapsize,+ utf_local_conversion_func conv_func,+ int encoding);++extern bool pg_verifymbstr(const char *mbstr, int len, bool noError);+extern bool pg_verify_mbstr(int encoding, const char *mbstr, int len,+ bool noError);+extern int pg_verify_mbstr_len(int encoding, const char *mbstr, int len,+ bool noError);++extern void check_encoding_conversion_args(int src_encoding,+ int dest_encoding,+ int len,+ int expected_src_encoding,+ int expected_dest_encoding);++extern void report_invalid_encoding(int encoding, const char *mbstr, int len) pg_attribute_noreturn();+extern void report_untranslatable_char(int src_encoding, int dest_encoding,+ const char *mbstr, int len) pg_attribute_noreturn();++extern void pg_ascii2mic(const unsigned char *l, unsigned char *p, int len);+extern void pg_mic2ascii(const unsigned char *mic, unsigned char *p, int len);+extern void latin2mic(const unsigned char *l, unsigned char *p, int len,+ int lc, int encoding);+extern void mic2latin(const unsigned char *mic, unsigned char *p, int len,+ int lc, int encoding);+extern void latin2mic_with_table(const unsigned char *l, unsigned char *p,+ int len, int lc, int encoding,+ const unsigned char *tab);+extern void mic2latin_with_table(const unsigned char *mic, unsigned char *p,+ int len, int lc, int encoding,+ const unsigned char *tab);++extern bool pg_utf8_islegal(const unsigned char *source, int length);++#ifdef WIN32+extern WCHAR *pgwin32_message_to_UTF16(const char *str, int len, int *utf16len);+#endif++#endif /* PG_WCHAR_H */
+ foreign/libpg_query/src/postgres/include/miscadmin.h view
@@ -0,0 +1,467 @@+/*-------------------------------------------------------------------------+ *+ * miscadmin.h+ * This file contains general postgres administration and initialization+ * stuff that used to be spread out between the following files:+ * globals.h global variables+ * pdir.h directory path crud+ * pinit.h postgres initialization+ * pmod.h processing modes+ * Over time, this has also become the preferred place for widely known+ * resource-limitation stuff, such as work_mem and check_stack_depth().+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/miscadmin.h+ *+ * NOTES+ * some of the information in this file should be moved to other files.+ *+ *-------------------------------------------------------------------------+ */+#ifndef MISCADMIN_H+#define MISCADMIN_H++#include "pgtime.h" /* for pg_time_t */+++#define PG_BACKEND_VERSIONSTR "postgres (PostgreSQL) " PG_VERSION "\n"++#define InvalidPid (-1)+++/*****************************************************************************+ * System interrupt and critical section handling+ *+ * There are two types of interrupts that a running backend needs to accept+ * without messing up its state: QueryCancel (SIGINT) and ProcDie (SIGTERM).+ * In both cases, we need to be able to clean up the current transaction+ * gracefully, so we can't respond to the interrupt instantaneously ---+ * there's no guarantee that internal data structures would be self-consistent+ * if the code is interrupted at an arbitrary instant. Instead, the signal+ * handlers set flags that are checked periodically during execution.+ *+ * The CHECK_FOR_INTERRUPTS() macro is called at strategically located spots+ * where it is normally safe to accept a cancel or die interrupt. In some+ * cases, we invoke CHECK_FOR_INTERRUPTS() inside low-level subroutines that+ * might sometimes be called in contexts that do *not* want to allow a cancel+ * or die interrupt. The HOLD_INTERRUPTS() and RESUME_INTERRUPTS() macros+ * allow code to ensure that no cancel or die interrupt will be accepted,+ * even if CHECK_FOR_INTERRUPTS() gets called in a subroutine. The interrupt+ * will be held off until CHECK_FOR_INTERRUPTS() is done outside any+ * HOLD_INTERRUPTS() ... RESUME_INTERRUPTS() section.+ *+ * There is also a mechanism to prevent query cancel interrupts, while still+ * allowing die interrupts: HOLD_CANCEL_INTERRUPTS() and+ * RESUME_CANCEL_INTERRUPTS().+ *+ * Special mechanisms are used to let an interrupt be accepted when we are+ * waiting for a lock or when we are waiting for command input (but, of+ * course, only if the interrupt holdoff counter is zero). See the+ * related code for details.+ *+ * A lost connection is handled similarly, although the loss of connection+ * does not raise a signal, but is detected when we fail to write to the+ * socket. If there was a signal for a broken connection, we could make use of+ * it by setting ClientConnectionLost in the signal handler.+ *+ * A related, but conceptually distinct, mechanism is the "critical section"+ * mechanism. A critical section not only holds off cancel/die interrupts,+ * but causes any ereport(ERROR) or ereport(FATAL) to become ereport(PANIC)+ * --- that is, a system-wide reset is forced. Needless to say, only really+ * *critical* code should be marked as a critical section! Currently, this+ * mechanism is only used for XLOG-related code.+ *+ *****************************************************************************/++/* in globals.c */+/* these are marked volatile because they are set by signal handlers: */+extern PGDLLIMPORT __thread volatile bool InterruptPending;+extern PGDLLIMPORT volatile bool QueryCancelPending;+extern PGDLLIMPORT volatile bool ProcDiePending;++extern volatile bool ClientConnectionLost;++/* these are marked volatile because they are examined by signal handlers: */+extern PGDLLIMPORT __thread volatile uint32 InterruptHoldoffCount;+extern PGDLLIMPORT __thread volatile uint32 QueryCancelHoldoffCount;+extern PGDLLIMPORT __thread volatile uint32 CritSectionCount;++/* in tcop/postgres.c */+extern void ProcessInterrupts(void);++#ifndef WIN32++#define CHECK_FOR_INTERRUPTS() \+do { \+ if (InterruptPending) \+ ProcessInterrupts(); \+} while(0)+#else /* WIN32 */++#define CHECK_FOR_INTERRUPTS() \+do { \+ if (UNBLOCKED_SIGNAL_QUEUE()) \+ pgwin32_dispatch_queued_signals(); \+ if (InterruptPending) \+ ProcessInterrupts(); \+} while(0)+#endif /* WIN32 */+++#define HOLD_INTERRUPTS() (InterruptHoldoffCount++)++#define RESUME_INTERRUPTS() \+do { \+ Assert(InterruptHoldoffCount > 0); \+ InterruptHoldoffCount--; \+} while(0)++#define HOLD_CANCEL_INTERRUPTS() (QueryCancelHoldoffCount++)++#define RESUME_CANCEL_INTERRUPTS() \+do { \+ Assert(QueryCancelHoldoffCount > 0); \+ QueryCancelHoldoffCount--; \+} while(0)++#define START_CRIT_SECTION() (CritSectionCount++)++#define END_CRIT_SECTION() \+do { \+ Assert(CritSectionCount > 0); \+ CritSectionCount--; \+} while(0)+++/*****************************************************************************+ * globals.h -- *+ *****************************************************************************/++/*+ * from utils/init/globals.c+ */+extern pid_t PostmasterPid;+extern __thread bool IsPostmasterEnvironment;+extern PGDLLIMPORT bool IsUnderPostmaster;+extern bool IsBackgroundWorker;+extern PGDLLIMPORT bool IsBinaryUpgrade;++extern __thread bool ExitOnAnyError;++extern PGDLLIMPORT char *DataDir;++extern PGDLLIMPORT int NBuffers;+extern int MaxBackends;+extern int MaxConnections;+extern int max_worker_processes;++extern PGDLLIMPORT int MyProcPid;+extern PGDLLIMPORT pg_time_t MyStartTime;+extern PGDLLIMPORT struct Port *MyProcPort;+extern PGDLLIMPORT struct Latch *MyLatch;+extern long MyCancelKey;+extern int MyPMChildSlot;++extern char OutputFileName[];+extern PGDLLIMPORT char my_exec_path[];+extern char pkglib_path[];++#ifdef EXEC_BACKEND+extern char postgres_exec_path[];+#endif++/*+ * done in storage/backendid.h for now.+ *+ * extern BackendId MyBackendId;+ */+extern PGDLLIMPORT Oid MyDatabaseId;++extern PGDLLIMPORT Oid MyDatabaseTableSpace;++/*+ * Date/Time Configuration+ *+ * DateStyle defines the output formatting choice for date/time types:+ * USE_POSTGRES_DATES specifies traditional Postgres format+ * USE_ISO_DATES specifies ISO-compliant format+ * USE_SQL_DATES specifies Oracle/Ingres-compliant format+ * USE_GERMAN_DATES specifies German-style dd.mm/yyyy+ *+ * DateOrder defines the field order to be assumed when reading an+ * ambiguous date (anything not in YYYY-MM-DD format, with a four-digit+ * year field first, is taken to be ambiguous):+ * DATEORDER_YMD specifies field order yy-mm-dd+ * DATEORDER_DMY specifies field order dd-mm-yy ("European" convention)+ * DATEORDER_MDY specifies field order mm-dd-yy ("US" convention)+ *+ * In the Postgres and SQL DateStyles, DateOrder also selects output field+ * order: day comes before month in DMY style, else month comes before day.+ *+ * The user-visible "DateStyle" run-time parameter subsumes both of these.+ */++/* valid DateStyle values */+#define USE_POSTGRES_DATES 0+#define USE_ISO_DATES 1+#define USE_SQL_DATES 2+#define USE_GERMAN_DATES 3+#define USE_XSD_DATES 4++/* valid DateOrder values */+#define DATEORDER_YMD 0+#define DATEORDER_DMY 1+#define DATEORDER_MDY 2++extern PGDLLIMPORT int DateStyle;+extern PGDLLIMPORT int DateOrder;++/*+ * IntervalStyles+ * INTSTYLE_POSTGRES Like Postgres < 8.4 when DateStyle = 'iso'+ * INTSTYLE_POSTGRES_VERBOSE Like Postgres < 8.4 when DateStyle != 'iso'+ * INTSTYLE_SQL_STANDARD SQL standard interval literals+ * INTSTYLE_ISO_8601 ISO-8601-basic formatted intervals+ */+#define INTSTYLE_POSTGRES 0+#define INTSTYLE_POSTGRES_VERBOSE 1+#define INTSTYLE_SQL_STANDARD 2+#define INTSTYLE_ISO_8601 3++extern PGDLLIMPORT int IntervalStyle;++#define MAXTZLEN 10 /* max TZ name len, not counting tr. null */++extern bool enableFsync;+extern bool allowSystemTableMods;+extern PGDLLIMPORT int work_mem;+extern PGDLLIMPORT int maintenance_work_mem;++extern int VacuumCostPageHit;+extern int VacuumCostPageMiss;+extern int VacuumCostPageDirty;+extern int VacuumCostLimit;+extern int VacuumCostDelay;++extern int VacuumPageHit;+extern int VacuumPageMiss;+extern int VacuumPageDirty;++extern int VacuumCostBalance;+extern bool VacuumCostActive;+++/* in tcop/postgres.c */++#if defined(__ia64__) || defined(__ia64)+typedef struct+{+ char *stack_base_ptr;+ char *register_stack_base_ptr;+} pg_stack_base_t;+#else+typedef char *pg_stack_base_t;+#endif++extern pg_stack_base_t set_stack_base(void);+extern void restore_stack_base(pg_stack_base_t base);+extern void check_stack_depth(void);+extern bool stack_is_too_deep(void);++/* in tcop/utility.c */+extern void PreventCommandIfReadOnly(const char *cmdname);+extern void PreventCommandIfParallelMode(const char *cmdname);+extern void PreventCommandDuringRecovery(const char *cmdname);++/* in utils/misc/guc.c */+extern int trace_recovery_messages;+extern int trace_recovery(int trace_level);++/*****************************************************************************+ * pdir.h -- *+ * POSTGRES directory path definitions. *+ *****************************************************************************/++/* flags to be OR'd to form sec_context */+#define SECURITY_LOCAL_USERID_CHANGE 0x0001+#define SECURITY_RESTRICTED_OPERATION 0x0002+#define SECURITY_NOFORCE_RLS 0x0004++extern char *DatabasePath;++/* now in utils/init/miscinit.c */+extern void InitPostmasterChild(void);+extern void InitStandaloneProcess(const char *argv0);++extern void SetDatabasePath(const char *path);++extern char *GetUserNameFromId(Oid roleid, bool noerr);+extern Oid GetUserId(void);+extern Oid GetOuterUserId(void);+extern Oid GetSessionUserId(void);+extern Oid GetAuthenticatedUserId(void);+extern void GetUserIdAndSecContext(Oid *userid, int *sec_context);+extern void SetUserIdAndSecContext(Oid userid, int sec_context);+extern bool InLocalUserIdChange(void);+extern bool InSecurityRestrictedOperation(void);+extern bool InNoForceRLSOperation(void);+extern void GetUserIdAndContext(Oid *userid, bool *sec_def_context);+extern void SetUserIdAndContext(Oid userid, bool sec_def_context);+extern void InitializeSessionUserId(const char *rolename, Oid useroid);+extern void InitializeSessionUserIdStandalone(void);+extern void SetSessionAuthorization(Oid userid, bool is_superuser);+extern Oid GetCurrentRoleId(void);+extern void SetCurrentRoleId(Oid roleid, bool is_superuser);++extern void SetDataDir(const char *dir);+extern void ChangeToDataDir(void);++extern void SwitchToSharedLatch(void);+extern void SwitchBackToLocalLatch(void);++/* in utils/misc/superuser.c */+extern bool superuser(void); /* current user is superuser */+extern bool superuser_arg(Oid roleid); /* given user is superuser */+++/*****************************************************************************+ * pmod.h -- *+ * POSTGRES processing mode definitions. *+ *****************************************************************************/++/*+ * Description:+ * There are three processing modes in POSTGRES. They are+ * BootstrapProcessing or "bootstrap," InitProcessing or+ * "initialization," and NormalProcessing or "normal."+ *+ * The first two processing modes are used during special times. When the+ * system state indicates bootstrap processing, transactions are all given+ * transaction id "one" and are consequently guaranteed to commit. This mode+ * is used during the initial generation of template databases.+ *+ * Initialization mode: used while starting a backend, until all normal+ * initialization is complete. Some code behaves differently when executed+ * in this mode to enable system bootstrapping.+ *+ * If a POSTGRES backend process is in normal mode, then all code may be+ * executed normally.+ */++typedef enum ProcessingMode+{+ BootstrapProcessing, /* bootstrap creation of template database */+ InitProcessing, /* initializing system */+ NormalProcessing /* normal processing */+} ProcessingMode;++extern ProcessingMode Mode;++#define IsBootstrapProcessingMode() (Mode == BootstrapProcessing)+#define IsInitProcessingMode() (Mode == InitProcessing)+#define IsNormalProcessingMode() (Mode == NormalProcessing)++#define GetProcessingMode() Mode++#define SetProcessingMode(mode) \+ do { \+ AssertArg((mode) == BootstrapProcessing || \+ (mode) == InitProcessing || \+ (mode) == NormalProcessing); \+ Mode = (mode); \+ } while(0)+++/*+ * Auxiliary-process type identifiers. These used to be in bootstrap.h+ * but it seems saner to have them here, with the ProcessingMode stuff.+ * The MyAuxProcType global is defined and set in bootstrap.c.+ */++typedef enum+{+ NotAnAuxProcess = -1,+ CheckerProcess = 0,+ BootstrapProcess,+ StartupProcess,+ BgWriterProcess,+ CheckpointerProcess,+ WalWriterProcess,+ WalReceiverProcess,++ NUM_AUXPROCTYPES /* Must be last! */+} AuxProcType;++extern AuxProcType MyAuxProcType;++#define AmBootstrapProcess() (MyAuxProcType == BootstrapProcess)+#define AmStartupProcess() (MyAuxProcType == StartupProcess)+#define AmBackgroundWriterProcess() (MyAuxProcType == BgWriterProcess)+#define AmCheckpointerProcess() (MyAuxProcType == CheckpointerProcess)+#define AmWalWriterProcess() (MyAuxProcType == WalWriterProcess)+#define AmWalReceiverProcess() (MyAuxProcType == WalReceiverProcess)+++/*****************************************************************************+ * pinit.h -- *+ * POSTGRES initialization and cleanup definitions. *+ *****************************************************************************/++/* in utils/init/postinit.c */+extern void pg_split_opts(char **argv, int *argcp, const char *optstr);+extern void InitializeMaxBackends(void);+extern void InitPostgres(const char *in_dbname, Oid dboid, const char *username,+ Oid useroid, char *out_dbname);+extern void BaseInit(void);++/* in utils/init/miscinit.c */+extern bool IgnoreSystemIndexes;+extern PGDLLIMPORT bool process_shared_preload_libraries_in_progress;+extern char *session_preload_libraries_string;+extern char *shared_preload_libraries_string;+extern char *local_preload_libraries_string;++/*+ * As of 9.1, the contents of the data-directory lock file are:+ *+ * line #+ * 1 postmaster PID (or negative of a standalone backend's PID)+ * 2 data directory path+ * 3 postmaster start timestamp (time_t representation)+ * 4 port number+ * 5 first Unix socket directory path (empty if none)+ * 6 first listen_address (IP address or "*"; empty if no TCP port)+ * 7 shared memory key (not present on Windows)+ *+ * Lines 6 and up are added via AddToDataDirLockFile() after initial file+ * creation.+ *+ * The socket lock file, if used, has the same contents as lines 1-5.+ */+#define LOCK_FILE_LINE_PID 1+#define LOCK_FILE_LINE_DATA_DIR 2+#define LOCK_FILE_LINE_START_TIME 3+#define LOCK_FILE_LINE_PORT 4+#define LOCK_FILE_LINE_SOCKET_DIR 5+#define LOCK_FILE_LINE_LISTEN_ADDR 6+#define LOCK_FILE_LINE_SHMEM_KEY 7++extern void CreateDataDirLockFile(bool amPostmaster);+extern void CreateSocketLockFile(const char *socketfile, bool amPostmaster,+ const char *socketDir);+extern void TouchSocketLockFiles(void);+extern void AddToDataDirLockFile(int target_line, const char *str);+extern bool RecheckDataDirLockFile(void);+extern void ValidatePgVersion(const char *path);+extern void process_shared_preload_libraries(void);+extern void process_session_preload_libraries(void);+extern void pg_bindtextdomain(const char *domain);+extern bool has_rolreplication(Oid roleid);++/* in access/transam/xlog.c */+extern bool BackupInProgress(void);+extern void CancelBackup(void);++#endif /* MISCADMIN_H */
+ foreign/libpg_query/src/postgres/include/nodes/bitmapset.h view
@@ -0,0 +1,98 @@+/*-------------------------------------------------------------------------+ *+ * bitmapset.h+ * PostgreSQL generic bitmap set package+ *+ * A bitmap set can represent any set of nonnegative integers, although+ * it is mainly intended for sets where the maximum value is not large,+ * say at most a few hundred. By convention, a NULL pointer is always+ * accepted by all operations to represent the empty set. (But beware+ * that this is not the only representation of the empty set. Use+ * bms_is_empty() in preference to testing for NULL.)+ *+ *+ * Copyright (c) 2003-2015, PostgreSQL Global Development Group+ *+ * src/include/nodes/bitmapset.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef BITMAPSET_H+#define BITMAPSET_H++/*+ * Data representation+ */++/* The unit size can be adjusted by changing these three declarations: */+#define BITS_PER_BITMAPWORD 32+typedef uint32 bitmapword; /* must be an unsigned type */+typedef int32 signedbitmapword; /* must be the matching signed type */++typedef struct Bitmapset+{+ int nwords; /* number of words in array */+ bitmapword words[FLEXIBLE_ARRAY_MEMBER]; /* really [nwords] */+} Bitmapset;+++/* result of bms_subset_compare */+typedef enum+{+ BMS_EQUAL, /* sets are equal */+ BMS_SUBSET1, /* first set is a subset of the second */+ BMS_SUBSET2, /* second set is a subset of the first */+ BMS_DIFFERENT /* neither set is a subset of the other */+} BMS_Comparison;++/* result of bms_membership */+typedef enum+{+ BMS_EMPTY_SET, /* 0 members */+ BMS_SINGLETON, /* 1 member */+ BMS_MULTIPLE /* >1 member */+} BMS_Membership;+++/*+ * function prototypes in nodes/bitmapset.c+ */++extern Bitmapset *bms_copy(const Bitmapset *a);+extern bool bms_equal(const Bitmapset *a, const Bitmapset *b);+extern Bitmapset *bms_make_singleton(int x);+extern void bms_free(Bitmapset *a);++extern Bitmapset *bms_union(const Bitmapset *a, const Bitmapset *b);+extern Bitmapset *bms_intersect(const Bitmapset *a, const Bitmapset *b);+extern Bitmapset *bms_difference(const Bitmapset *a, const Bitmapset *b);+extern bool bms_is_subset(const Bitmapset *a, const Bitmapset *b);+extern BMS_Comparison bms_subset_compare(const Bitmapset *a, const Bitmapset *b);+extern bool bms_is_member(int x, const Bitmapset *a);+extern bool bms_overlap(const Bitmapset *a, const Bitmapset *b);+extern bool bms_nonempty_difference(const Bitmapset *a, const Bitmapset *b);+extern int bms_singleton_member(const Bitmapset *a);+extern bool bms_get_singleton_member(const Bitmapset *a, int *member);+extern int bms_num_members(const Bitmapset *a);++/* optimized tests when we don't need to know exact membership count: */+extern BMS_Membership bms_membership(const Bitmapset *a);+extern bool bms_is_empty(const Bitmapset *a);++/* these routines recycle (modify or free) their non-const inputs: */++extern Bitmapset *bms_add_member(Bitmapset *a, int x);+extern Bitmapset *bms_del_member(Bitmapset *a, int x);+extern Bitmapset *bms_add_members(Bitmapset *a, const Bitmapset *b);+extern Bitmapset *bms_int_members(Bitmapset *a, const Bitmapset *b);+extern Bitmapset *bms_del_members(Bitmapset *a, const Bitmapset *b);+extern Bitmapset *bms_join(Bitmapset *a, Bitmapset *b);++/* support for iterating through the integer elements of a set: */+extern int bms_first_member(Bitmapset *a);+extern int bms_next_member(const Bitmapset *a, int prevbit);++/* support for hashtables using Bitmapsets as keys: */+extern uint32 bms_hash_value(const Bitmapset *a);++#endif /* BITMAPSET_H */
+ foreign/libpg_query/src/postgres/include/nodes/execnodes.h view
@@ -0,0 +1,2045 @@+/*-------------------------------------------------------------------------+ *+ * execnodes.h+ * definitions for executor state nodes+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/nodes/execnodes.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef EXECNODES_H+#define EXECNODES_H++#include "access/genam.h"+#include "access/heapam.h"+#include "executor/instrument.h"+#include "lib/pairingheap.h"+#include "nodes/params.h"+#include "nodes/plannodes.h"+#include "utils/reltrigger.h"+#include "utils/sortsupport.h"+#include "utils/tuplestore.h"+#include "utils/tuplesort.h"+++/* ----------------+ * IndexInfo information+ *+ * this struct holds the information needed to construct new index+ * entries for a particular index. Used for both index_build and+ * retail creation of index entries.+ *+ * NumIndexAttrs number of columns in this index+ * KeyAttrNumbers underlying-rel attribute numbers used as keys+ * (zeroes indicate expressions)+ * Expressions expr trees for expression entries, or NIL if none+ * ExpressionsState exec state for expressions, or NIL if none+ * Predicate partial-index predicate, or NIL if none+ * PredicateState exec state for predicate, or NIL if none+ * ExclusionOps Per-column exclusion operators, or NULL if none+ * ExclusionProcs Underlying function OIDs for ExclusionOps+ * ExclusionStrats Opclass strategy numbers for ExclusionOps+ * UniqueOps Theses are like Exclusion*, but for unique indexes+ * UniqueProcs+ * UniqueStrats+ * Unique is it a unique index?+ * ReadyForInserts is it valid for inserts?+ * Concurrent are we doing a concurrent index build?+ * BrokenHotChain did we detect any broken HOT chains?+ *+ * ii_Concurrent and ii_BrokenHotChain are used only during index build;+ * they're conventionally set to false otherwise.+ * ----------------+ */+typedef struct IndexInfo+{+ NodeTag type;+ int ii_NumIndexAttrs;+ AttrNumber ii_KeyAttrNumbers[INDEX_MAX_KEYS];+ List *ii_Expressions; /* list of Expr */+ List *ii_ExpressionsState; /* list of ExprState */+ List *ii_Predicate; /* list of Expr */+ List *ii_PredicateState; /* list of ExprState */+ Oid *ii_ExclusionOps; /* array with one entry per column */+ Oid *ii_ExclusionProcs; /* array with one entry per column */+ uint16 *ii_ExclusionStrats; /* array with one entry per column */+ Oid *ii_UniqueOps; /* array with one entry per column */+ Oid *ii_UniqueProcs; /* array with one entry per column */+ uint16 *ii_UniqueStrats; /* array with one entry per column */+ bool ii_Unique;+ bool ii_ReadyForInserts;+ bool ii_Concurrent;+ bool ii_BrokenHotChain;+} IndexInfo;++/* ----------------+ * ExprContext_CB+ *+ * List of callbacks to be called at ExprContext shutdown.+ * ----------------+ */+typedef void (*ExprContextCallbackFunction) (Datum arg);++typedef struct ExprContext_CB+{+ struct ExprContext_CB *next;+ ExprContextCallbackFunction function;+ Datum arg;+} ExprContext_CB;++/* ----------------+ * ExprContext+ *+ * This class holds the "current context" information+ * needed to evaluate expressions for doing tuple qualifications+ * and tuple projections. For example, if an expression refers+ * to an attribute in the current inner tuple then we need to know+ * what the current inner tuple is and so we look at the expression+ * context.+ *+ * There are two memory contexts associated with an ExprContext:+ * * ecxt_per_query_memory is a query-lifespan context, typically the same+ * context the ExprContext node itself is allocated in. This context+ * can be used for purposes such as storing function call cache info.+ * * ecxt_per_tuple_memory is a short-term context for expression results.+ * As the name suggests, it will typically be reset once per tuple,+ * before we begin to evaluate expressions for that tuple. Each+ * ExprContext normally has its very own per-tuple memory context.+ *+ * CurrentMemoryContext should be set to ecxt_per_tuple_memory before+ * calling ExecEvalExpr() --- see ExecEvalExprSwitchContext().+ * ----------------+ */+typedef struct ExprContext+{+ NodeTag type;++ /* Tuples that Var nodes in expression may refer to */+ TupleTableSlot *ecxt_scantuple;+ TupleTableSlot *ecxt_innertuple;+ TupleTableSlot *ecxt_outertuple;++ /* Memory contexts for expression evaluation --- see notes above */+ MemoryContext ecxt_per_query_memory;+ MemoryContext ecxt_per_tuple_memory;++ /* Values to substitute for Param nodes in expression */+ ParamExecData *ecxt_param_exec_vals; /* for PARAM_EXEC params */+ ParamListInfo ecxt_param_list_info; /* for other param types */++ /*+ * Values to substitute for Aggref nodes in the expressions of an Agg+ * node, or for WindowFunc nodes within a WindowAgg node.+ */+ Datum *ecxt_aggvalues; /* precomputed values for aggs/windowfuncs */+ bool *ecxt_aggnulls; /* null flags for aggs/windowfuncs */++ /* Value to substitute for CaseTestExpr nodes in expression */+ Datum caseValue_datum;+ bool caseValue_isNull;++ /* Value to substitute for CoerceToDomainValue nodes in expression */+ Datum domainValue_datum;+ bool domainValue_isNull;++ /* Link to containing EState (NULL if a standalone ExprContext) */+ struct EState *ecxt_estate;++ /* Functions to call back when ExprContext is shut down or rescanned */+ ExprContext_CB *ecxt_callbacks;+} ExprContext;++/*+ * Set-result status returned by ExecEvalExpr()+ */+typedef enum+{+ ExprSingleResult, /* expression does not return a set */+ ExprMultipleResult, /* this result is an element of a set */+ ExprEndResult /* there are no more elements in the set */+} ExprDoneCond;++/*+ * Return modes for functions returning sets. Note values must be chosen+ * as separate bits so that a bitmask can be formed to indicate supported+ * modes. SFRM_Materialize_Random and SFRM_Materialize_Preferred are+ * auxiliary flags about SFRM_Materialize mode, rather than separate modes.+ */+typedef enum+{+ SFRM_ValuePerCall = 0x01, /* one value returned per call */+ SFRM_Materialize = 0x02, /* result set instantiated in Tuplestore */+ SFRM_Materialize_Random = 0x04, /* Tuplestore needs randomAccess */+ SFRM_Materialize_Preferred = 0x08 /* caller prefers Tuplestore */+} SetFunctionReturnMode;++/*+ * When calling a function that might return a set (multiple rows),+ * a node of this type is passed as fcinfo->resultinfo to allow+ * return status to be passed back. A function returning set should+ * raise an error if no such resultinfo is provided.+ */+typedef struct ReturnSetInfo+{+ NodeTag type;+ /* values set by caller: */+ ExprContext *econtext; /* context function is being called in */+ TupleDesc expectedDesc; /* tuple descriptor expected by caller */+ int allowedModes; /* bitmask: return modes caller can handle */+ /* result status from function (but pre-initialized by caller): */+ SetFunctionReturnMode returnMode; /* actual return mode */+ ExprDoneCond isDone; /* status for ValuePerCall mode */+ /* fields filled by function in Materialize return mode: */+ Tuplestorestate *setResult; /* holds the complete returned tuple set */+ TupleDesc setDesc; /* actual descriptor for returned tuples */+} ReturnSetInfo;++/* ----------------+ * ProjectionInfo node information+ *+ * This is all the information needed to perform projections ---+ * that is, form new tuples by evaluation of targetlist expressions.+ * Nodes which need to do projections create one of these.+ *+ * ExecProject() evaluates the tlist, forms a tuple, and stores it+ * in the given slot. Note that the result will be a "virtual" tuple+ * unless ExecMaterializeSlot() is then called to force it to be+ * converted to a physical tuple. The slot must have a tupledesc+ * that matches the output of the tlist!+ *+ * The planner very often produces tlists that consist entirely of+ * simple Var references (lower levels of a plan tree almost always+ * look like that). And top-level tlists are often mostly Vars too.+ * We therefore optimize execution of simple-Var tlist entries.+ * The pi_targetlist list actually contains only the tlist entries that+ * aren't simple Vars, while those that are Vars are processed using the+ * varSlotOffsets/varNumbers/varOutputCols arrays.+ *+ * The lastXXXVar fields are used to optimize fetching of fields from+ * input tuples: they let us do a slot_getsomeattrs() call to ensure+ * that all needed attributes are extracted in one pass.+ *+ * targetlist target list for projection (non-Var expressions only)+ * exprContext expression context in which to evaluate targetlist+ * slot slot to place projection result in+ * itemIsDone workspace array for ExecProject+ * directMap true if varOutputCols[] is an identity map+ * numSimpleVars number of simple Vars found in original tlist+ * varSlotOffsets array indicating which slot each simple Var is from+ * varNumbers array containing input attr numbers of simple Vars+ * varOutputCols array containing output attr numbers of simple Vars+ * lastInnerVar highest attnum from inner tuple slot (0 if none)+ * lastOuterVar highest attnum from outer tuple slot (0 if none)+ * lastScanVar highest attnum from scan tuple slot (0 if none)+ * ----------------+ */+typedef struct ProjectionInfo+{+ NodeTag type;+ List *pi_targetlist;+ ExprContext *pi_exprContext;+ TupleTableSlot *pi_slot;+ ExprDoneCond *pi_itemIsDone;+ bool pi_directMap;+ int pi_numSimpleVars;+ int *pi_varSlotOffsets;+ int *pi_varNumbers;+ int *pi_varOutputCols;+ int pi_lastInnerVar;+ int pi_lastOuterVar;+ int pi_lastScanVar;+} ProjectionInfo;++/* ----------------+ * JunkFilter+ *+ * This class is used to store information regarding junk attributes.+ * A junk attribute is an attribute in a tuple that is needed only for+ * storing intermediate information in the executor, and does not belong+ * in emitted tuples. For example, when we do an UPDATE query,+ * the planner adds a "junk" entry to the targetlist so that the tuples+ * returned to ExecutePlan() contain an extra attribute: the ctid of+ * the tuple to be updated. This is needed to do the update, but we+ * don't want the ctid to be part of the stored new tuple! So, we+ * apply a "junk filter" to remove the junk attributes and form the+ * real output tuple. The junkfilter code also provides routines to+ * extract the values of the junk attribute(s) from the input tuple.+ *+ * targetList: the original target list (including junk attributes).+ * cleanTupType: the tuple descriptor for the "clean" tuple (with+ * junk attributes removed).+ * cleanMap: A map with the correspondence between the non-junk+ * attribute numbers of the "original" tuple and the+ * attribute numbers of the "clean" tuple.+ * resultSlot: tuple slot used to hold cleaned tuple.+ * junkAttNo: not used by junkfilter code. Can be used by caller+ * to remember the attno of a specific junk attribute+ * (nodeModifyTable.c keeps the "ctid" or "wholerow"+ * attno here).+ * ----------------+ */+typedef struct JunkFilter+{+ NodeTag type;+ List *jf_targetList;+ TupleDesc jf_cleanTupType;+ AttrNumber *jf_cleanMap;+ TupleTableSlot *jf_resultSlot;+ AttrNumber jf_junkAttNo;+} JunkFilter;++/* ----------------+ * ResultRelInfo information+ *+ * Whenever we update an existing relation, we have to+ * update indices on the relation, and perhaps also fire triggers.+ * The ResultRelInfo class is used to hold all the information needed+ * about a result relation, including indices.. -cim 10/15/89+ *+ * RangeTableIndex result relation's range table index+ * RelationDesc relation descriptor for result relation+ * NumIndices # of indices existing on result relation+ * IndexRelationDescs array of relation descriptors for indices+ * IndexRelationInfo array of key/attr info for indices+ * TrigDesc triggers to be fired, if any+ * TrigFunctions cached lookup info for trigger functions+ * TrigWhenExprs array of trigger WHEN expr states+ * TrigInstrument optional runtime measurements for triggers+ * FdwRoutine FDW callback functions, if foreign table+ * FdwState available to save private state of FDW+ * WithCheckOptions list of WithCheckOption's to be checked+ * WithCheckOptionExprs list of WithCheckOption expr states+ * ConstraintExprs array of constraint-checking expr states+ * junkFilter for removing junk attributes from tuples+ * projectReturning for computing a RETURNING list+ * onConflictSetProj for computing ON CONFLICT DO UPDATE SET+ * onConflictSetWhere list of ON CONFLICT DO UPDATE exprs (qual)+ * ----------------+ */+typedef struct ResultRelInfo+{+ NodeTag type;+ Index ri_RangeTableIndex;+ Relation ri_RelationDesc;+ int ri_NumIndices;+ RelationPtr ri_IndexRelationDescs;+ IndexInfo **ri_IndexRelationInfo;+ TriggerDesc *ri_TrigDesc;+ FmgrInfo *ri_TrigFunctions;+ List **ri_TrigWhenExprs;+ Instrumentation *ri_TrigInstrument;+ struct FdwRoutine *ri_FdwRoutine;+ void *ri_FdwState;+ List *ri_WithCheckOptions;+ List *ri_WithCheckOptionExprs;+ List **ri_ConstraintExprs;+ JunkFilter *ri_junkFilter;+ ProjectionInfo *ri_projectReturning;+ ProjectionInfo *ri_onConflictSetProj;+ List *ri_onConflictSetWhere;+} ResultRelInfo;++/* ----------------+ * EState information+ *+ * Master working state for an Executor invocation+ * ----------------+ */+typedef struct EState+{+ NodeTag type;++ /* Basic state for all query types: */+ ScanDirection es_direction; /* current scan direction */+ Snapshot es_snapshot; /* time qual to use */+ Snapshot es_crosscheck_snapshot; /* crosscheck time qual for RI */+ List *es_range_table; /* List of RangeTblEntry */+ PlannedStmt *es_plannedstmt; /* link to top of plan tree */++ JunkFilter *es_junkFilter; /* top-level junk filter, if any */++ /* If query can insert/delete tuples, the command ID to mark them with */+ CommandId es_output_cid;++ /* Info about target table(s) for insert/update/delete queries: */+ ResultRelInfo *es_result_relations; /* array of ResultRelInfos */+ int es_num_result_relations; /* length of array */+ ResultRelInfo *es_result_relation_info; /* currently active array elt */++ /* Stuff used for firing triggers: */+ List *es_trig_target_relations; /* trigger-only ResultRelInfos */+ TupleTableSlot *es_trig_tuple_slot; /* for trigger output tuples */+ TupleTableSlot *es_trig_oldtup_slot; /* for TriggerEnabled */+ TupleTableSlot *es_trig_newtup_slot; /* for TriggerEnabled */++ /* Parameter info: */+ ParamListInfo es_param_list_info; /* values of external params */+ ParamExecData *es_param_exec_vals; /* values of internal params */++ /* Other working state: */+ MemoryContext es_query_cxt; /* per-query context in which EState lives */++ List *es_tupleTable; /* List of TupleTableSlots */++ List *es_rowMarks; /* List of ExecRowMarks */++ uint32 es_processed; /* # of tuples processed */+ Oid es_lastoid; /* last oid processed (by INSERT) */++ int es_top_eflags; /* eflags passed to ExecutorStart */+ int es_instrument; /* OR of InstrumentOption flags */+ bool es_finished; /* true when ExecutorFinish is done */++ List *es_exprcontexts; /* List of ExprContexts within EState */++ List *es_subplanstates; /* List of PlanState for SubPlans */++ List *es_auxmodifytables; /* List of secondary ModifyTableStates */++ /*+ * this ExprContext is for per-output-tuple operations, such as constraint+ * checks and index-value computations. It will be reset for each output+ * tuple. Note that it will be created only if needed.+ */+ ExprContext *es_per_tuple_exprcontext;++ /*+ * These fields are for re-evaluating plan quals when an updated tuple is+ * substituted in READ COMMITTED mode. es_epqTuple[] contains tuples that+ * scan plan nodes should return instead of whatever they'd normally+ * return, or NULL if nothing to return; es_epqTupleSet[] is true if a+ * particular array entry is valid; and es_epqScanDone[] is state to+ * remember if the tuple has been returned already. Arrays are of size+ * list_length(es_range_table) and are indexed by scan node scanrelid - 1.+ */+ HeapTuple *es_epqTuple; /* array of EPQ substitute tuples */+ bool *es_epqTupleSet; /* true if EPQ tuple is provided */+ bool *es_epqScanDone; /* true if EPQ tuple has been fetched */+} EState;+++/*+ * ExecRowMark -+ * runtime representation of FOR [KEY] UPDATE/SHARE clauses+ *+ * When doing UPDATE, DELETE, or SELECT FOR [KEY] UPDATE/SHARE, we will have an+ * ExecRowMark for each non-target relation in the query (except inheritance+ * parent RTEs, which can be ignored at runtime). Virtual relations such as+ * subqueries-in-FROM will have an ExecRowMark with relation == NULL. See+ * PlanRowMark for details about most of the fields. In addition to fields+ * directly derived from PlanRowMark, we store an activity flag (to denote+ * inactive children of inheritance trees), curCtid, which is used by the+ * WHERE CURRENT OF code, and ermExtra, which is available for use by the plan+ * node that sources the relation (e.g., for a foreign table the FDW can use+ * ermExtra to hold information).+ *+ * EState->es_rowMarks is a list of these structs.+ */+typedef struct ExecRowMark+{+ Relation relation; /* opened and suitably locked relation */+ Oid relid; /* its OID (or InvalidOid, if subquery) */+ Index rti; /* its range table index */+ Index prti; /* parent range table index, if child */+ Index rowmarkId; /* unique identifier for resjunk columns */+ RowMarkType markType; /* see enum in nodes/plannodes.h */+ LockClauseStrength strength; /* LockingClause's strength, or LCS_NONE */+ LockWaitPolicy waitPolicy; /* NOWAIT and SKIP LOCKED */+ bool ermActive; /* is this mark relevant for current tuple? */+ ItemPointerData curCtid; /* ctid of currently locked tuple, if any */+ void *ermExtra; /* available for use by relation source node */+} ExecRowMark;++/*+ * ExecAuxRowMark -+ * additional runtime representation of FOR [KEY] UPDATE/SHARE clauses+ *+ * Each LockRows and ModifyTable node keeps a list of the rowmarks it needs to+ * deal with. In addition to a pointer to the related entry in es_rowMarks,+ * this struct carries the column number(s) of the resjunk columns associated+ * with the rowmark (see comments for PlanRowMark for more detail). In the+ * case of ModifyTable, there has to be a separate ExecAuxRowMark list for+ * each child plan, because the resjunk columns could be at different physical+ * column positions in different subplans.+ */+typedef struct ExecAuxRowMark+{+ ExecRowMark *rowmark; /* related entry in es_rowMarks */+ AttrNumber ctidAttNo; /* resno of ctid junk attribute, if any */+ AttrNumber toidAttNo; /* resno of tableoid junk attribute, if any */+ AttrNumber wholeAttNo; /* resno of whole-row junk attribute, if any */+} ExecAuxRowMark;+++/* ----------------------------------------------------------------+ * Tuple Hash Tables+ *+ * All-in-memory tuple hash tables are used for a number of purposes.+ *+ * Note: tab_hash_funcs are for the key datatype(s) stored in the table,+ * and tab_eq_funcs are non-cross-type equality operators for those types.+ * Normally these are the only functions used, but FindTupleHashEntry()+ * supports searching a hashtable using cross-data-type hashing. For that,+ * the caller must supply hash functions for the LHS datatype as well as+ * the cross-type equality operators to use. in_hash_funcs and cur_eq_funcs+ * are set to point to the caller's function arrays while doing such a search.+ * During LookupTupleHashEntry(), they point to tab_hash_funcs and+ * tab_eq_funcs respectively.+ * ----------------------------------------------------------------+ */+typedef struct TupleHashEntryData *TupleHashEntry;+typedef struct TupleHashTableData *TupleHashTable;++typedef struct TupleHashEntryData+{+ /* firstTuple must be the first field in this struct! */+ MinimalTuple firstTuple; /* copy of first tuple in this group */+ /* there may be additional data beyond the end of this struct */+} TupleHashEntryData; /* VARIABLE LENGTH STRUCT */++typedef struct TupleHashTableData+{+ HTAB *hashtab; /* underlying dynahash table */+ int numCols; /* number of columns in lookup key */+ AttrNumber *keyColIdx; /* attr numbers of key columns */+ FmgrInfo *tab_hash_funcs; /* hash functions for table datatype(s) */+ FmgrInfo *tab_eq_funcs; /* equality functions for table datatype(s) */+ MemoryContext tablecxt; /* memory context containing table */+ MemoryContext tempcxt; /* context for function evaluations */+ Size entrysize; /* actual size to make each hash entry */+ TupleTableSlot *tableslot; /* slot for referencing table entries */+ /* The following fields are set transiently for each table search: */+ TupleTableSlot *inputslot; /* current input tuple's slot */+ FmgrInfo *in_hash_funcs; /* hash functions for input datatype(s) */+ FmgrInfo *cur_eq_funcs; /* equality functions for input vs. table */+} TupleHashTableData;++typedef HASH_SEQ_STATUS TupleHashIterator;++/*+ * Use InitTupleHashIterator/TermTupleHashIterator for a read/write scan.+ * Use ResetTupleHashIterator if the table can be frozen (in this case no+ * explicit scan termination is needed).+ */+#define InitTupleHashIterator(htable, iter) \+ hash_seq_init(iter, (htable)->hashtab)+#define TermTupleHashIterator(iter) \+ hash_seq_term(iter)+#define ResetTupleHashIterator(htable, iter) \+ do { \+ hash_freeze((htable)->hashtab); \+ hash_seq_init(iter, (htable)->hashtab); \+ } while (0)+#define ScanTupleHashTable(iter) \+ ((TupleHashEntry) hash_seq_search(iter))+++/* ----------------------------------------------------------------+ * Expression State Trees+ *+ * Each executable expression tree has a parallel ExprState tree.+ *+ * Unlike PlanState, there is not an exact one-for-one correspondence between+ * ExprState node types and Expr node types. Many Expr node types have no+ * need for node-type-specific run-time state, and so they can use plain+ * ExprState or GenericExprState as their associated ExprState node type.+ * ----------------------------------------------------------------+ */++/* ----------------+ * ExprState node+ *+ * ExprState is the common superclass for all ExprState-type nodes.+ *+ * It can also be instantiated directly for leaf Expr nodes that need no+ * local run-time state (such as Var, Const, or Param).+ *+ * To save on dispatch overhead, each ExprState node contains a function+ * pointer to the routine to execute to evaluate the node.+ * ----------------+ */++typedef struct ExprState ExprState;++typedef Datum (*ExprStateEvalFunc) (ExprState *expression,+ ExprContext *econtext,+ bool *isNull,+ ExprDoneCond *isDone);++struct ExprState+{+ NodeTag type;+ Expr *expr; /* associated Expr node */+ ExprStateEvalFunc evalfunc; /* routine to run to execute node */+};++/* ----------------+ * GenericExprState node+ *+ * This is used for Expr node types that need no local run-time state,+ * but have one child Expr node.+ * ----------------+ */+typedef struct GenericExprState+{+ ExprState xprstate;+ ExprState *arg; /* state of my child node */+} GenericExprState;++/* ----------------+ * WholeRowVarExprState node+ * ----------------+ */+typedef struct WholeRowVarExprState+{+ ExprState xprstate;+ struct PlanState *parent; /* parent PlanState, or NULL if none */+ TupleDesc wrv_tupdesc; /* descriptor for resulting tuples */+ JunkFilter *wrv_junkFilter; /* JunkFilter to remove resjunk cols */+} WholeRowVarExprState;++/* ----------------+ * AggrefExprState node+ * ----------------+ */+typedef struct AggrefExprState+{+ ExprState xprstate;+ List *aggdirectargs; /* states of direct-argument expressions */+ List *args; /* states of aggregated-argument expressions */+ ExprState *aggfilter; /* state of FILTER expression, if any */+ int aggno; /* ID number for agg within its plan node */+} AggrefExprState;++/* ----------------+ * GroupingFuncExprState node+ *+ * The list of column numbers refers to the input tuples of the Agg node to+ * which the GroupingFunc belongs, and may contain 0 for references to columns+ * that are only present in grouping sets processed by different Agg nodes (and+ * which are therefore always considered "grouping" here).+ * ----------------+ */+typedef struct GroupingFuncExprState+{+ ExprState xprstate;+ struct AggState *aggstate;+ List *clauses; /* integer list of column numbers */+} GroupingFuncExprState;++/* ----------------+ * WindowFuncExprState node+ * ----------------+ */+typedef struct WindowFuncExprState+{+ ExprState xprstate;+ List *args; /* states of argument expressions */+ ExprState *aggfilter; /* FILTER expression */+ int wfuncno; /* ID number for wfunc within its plan node */+} WindowFuncExprState;++/* ----------------+ * ArrayRefExprState node+ *+ * Note: array types can be fixed-length (typlen > 0), but only when the+ * element type is itself fixed-length. Otherwise they are varlena structures+ * and have typlen = -1. In any case, an array type is never pass-by-value.+ * ----------------+ */+typedef struct ArrayRefExprState+{+ ExprState xprstate;+ List *refupperindexpr; /* states for child nodes */+ List *reflowerindexpr;+ ExprState *refexpr;+ ExprState *refassgnexpr;+ int16 refattrlength; /* typlen of array type */+ int16 refelemlength; /* typlen of the array element type */+ bool refelembyval; /* is the element type pass-by-value? */+ char refelemalign; /* typalign of the element type */+} ArrayRefExprState;++/* ----------------+ * FuncExprState node+ *+ * Although named for FuncExpr, this is also used for OpExpr, DistinctExpr,+ * and NullIf nodes; be careful to check what xprstate.expr is actually+ * pointing at!+ * ----------------+ */+typedef struct FuncExprState+{+ ExprState xprstate;+ List *args; /* states of argument expressions */++ /*+ * Function manager's lookup info for the target function. If func.fn_oid+ * is InvalidOid, we haven't initialized it yet (nor any of the following+ * fields).+ */+ FmgrInfo func;++ /*+ * For a set-returning function (SRF) that returns a tuplestore, we keep+ * the tuplestore here and dole out the result rows one at a time. The+ * slot holds the row currently being returned.+ */+ Tuplestorestate *funcResultStore;+ TupleTableSlot *funcResultSlot;++ /*+ * In some cases we need to compute a tuple descriptor for the function's+ * output. If so, it's stored here.+ */+ TupleDesc funcResultDesc;+ bool funcReturnsTuple; /* valid when funcResultDesc isn't+ * NULL */++ /*+ * setArgsValid is true when we are evaluating a set-returning function+ * that uses value-per-call mode and we are in the middle of a call+ * series; we want to pass the same argument values to the function again+ * (and again, until it returns ExprEndResult). This indicates that+ * fcinfo_data already contains valid argument data.+ */+ bool setArgsValid;++ /*+ * Flag to remember whether we found a set-valued argument to the+ * function. This causes the function result to be a set as well. Valid+ * only when setArgsValid is true or funcResultStore isn't NULL.+ */+ bool setHasSetArg; /* some argument returns a set */++ /*+ * Flag to remember whether we have registered a shutdown callback for+ * this FuncExprState. We do so only if funcResultStore or setArgsValid+ * has been set at least once (since all the callback is for is to release+ * the tuplestore or clear setArgsValid).+ */+ bool shutdown_reg; /* a shutdown callback is registered */++ /*+ * Call parameter structure for the function. This has been initialized+ * (by InitFunctionCallInfoData) if func.fn_oid is valid. It also saves+ * argument values between calls, when setArgsValid is true.+ */+ FunctionCallInfoData fcinfo_data;+} FuncExprState;++/* ----------------+ * ScalarArrayOpExprState node+ *+ * This is a FuncExprState plus some additional data.+ * ----------------+ */+typedef struct ScalarArrayOpExprState+{+ FuncExprState fxprstate;+ /* Cached info about array element type */+ Oid element_type;+ int16 typlen;+ bool typbyval;+ char typalign;+} ScalarArrayOpExprState;++/* ----------------+ * BoolExprState node+ * ----------------+ */+typedef struct BoolExprState+{+ ExprState xprstate;+ List *args; /* states of argument expression(s) */+} BoolExprState;++/* ----------------+ * SubPlanState node+ * ----------------+ */+typedef struct SubPlanState+{+ ExprState xprstate;+ struct PlanState *planstate; /* subselect plan's state tree */+ struct PlanState *parent; /* parent plan node's state tree */+ ExprState *testexpr; /* state of combining expression */+ List *args; /* states of argument expression(s) */+ HeapTuple curTuple; /* copy of most recent tuple from subplan */+ Datum curArray; /* most recent array from ARRAY() subplan */+ /* these are used when hashing the subselect's output: */+ ProjectionInfo *projLeft; /* for projecting lefthand exprs */+ ProjectionInfo *projRight; /* for projecting subselect output */+ TupleHashTable hashtable; /* hash table for no-nulls subselect rows */+ TupleHashTable hashnulls; /* hash table for rows with null(s) */+ bool havehashrows; /* TRUE if hashtable is not empty */+ bool havenullrows; /* TRUE if hashnulls is not empty */+ MemoryContext hashtablecxt; /* memory context containing hash tables */+ MemoryContext hashtempcxt; /* temp memory context for hash tables */+ ExprContext *innerecontext; /* econtext for computing inner tuples */+ AttrNumber *keyColIdx; /* control data for hash tables */+ FmgrInfo *tab_hash_funcs; /* hash functions for table datatype(s) */+ FmgrInfo *tab_eq_funcs; /* equality functions for table datatype(s) */+ FmgrInfo *lhs_hash_funcs; /* hash functions for lefthand datatype(s) */+ FmgrInfo *cur_eq_funcs; /* equality functions for LHS vs. table */+} SubPlanState;++/* ----------------+ * AlternativeSubPlanState node+ * ----------------+ */+typedef struct AlternativeSubPlanState+{+ ExprState xprstate;+ List *subplans; /* states of alternative subplans */+ int active; /* list index of the one we're using */+} AlternativeSubPlanState;++/* ----------------+ * FieldSelectState node+ * ----------------+ */+typedef struct FieldSelectState+{+ ExprState xprstate;+ ExprState *arg; /* input expression */+ TupleDesc argdesc; /* tupdesc for most recent input */+} FieldSelectState;++/* ----------------+ * FieldStoreState node+ * ----------------+ */+typedef struct FieldStoreState+{+ ExprState xprstate;+ ExprState *arg; /* input tuple value */+ List *newvals; /* new value(s) for field(s) */+ TupleDesc argdesc; /* tupdesc for most recent input */+} FieldStoreState;++/* ----------------+ * CoerceViaIOState node+ * ----------------+ */+typedef struct CoerceViaIOState+{+ ExprState xprstate;+ ExprState *arg; /* input expression */+ FmgrInfo outfunc; /* lookup info for source output function */+ FmgrInfo infunc; /* lookup info for result input function */+ Oid intypioparam; /* argument needed for input function */+} CoerceViaIOState;++/* ----------------+ * ArrayCoerceExprState node+ * ----------------+ */+typedef struct ArrayCoerceExprState+{+ ExprState xprstate;+ ExprState *arg; /* input array value */+ Oid resultelemtype; /* element type of result array */+ FmgrInfo elemfunc; /* lookup info for element coercion function */+ /* use struct pointer to avoid including array.h here */+ struct ArrayMapState *amstate; /* workspace for array_map */+} ArrayCoerceExprState;++/* ----------------+ * ConvertRowtypeExprState node+ * ----------------+ */+typedef struct ConvertRowtypeExprState+{+ ExprState xprstate;+ ExprState *arg; /* input tuple value */+ TupleDesc indesc; /* tupdesc for source rowtype */+ TupleDesc outdesc; /* tupdesc for result rowtype */+ /* use "struct" so we needn't include tupconvert.h here */+ struct TupleConversionMap *map;+ bool initialized;+} ConvertRowtypeExprState;++/* ----------------+ * CaseExprState node+ * ----------------+ */+typedef struct CaseExprState+{+ ExprState xprstate;+ ExprState *arg; /* implicit equality comparison argument */+ List *args; /* the arguments (list of WHEN clauses) */+ ExprState *defresult; /* the default result (ELSE clause) */+} CaseExprState;++/* ----------------+ * CaseWhenState node+ * ----------------+ */+typedef struct CaseWhenState+{+ ExprState xprstate;+ ExprState *expr; /* condition expression */+ ExprState *result; /* substitution result */+} CaseWhenState;++/* ----------------+ * ArrayExprState node+ *+ * Note: ARRAY[] expressions always produce varlena arrays, never fixed-length+ * arrays.+ * ----------------+ */+typedef struct ArrayExprState+{+ ExprState xprstate;+ List *elements; /* states for child nodes */+ int16 elemlength; /* typlen of the array element type */+ bool elembyval; /* is the element type pass-by-value? */+ char elemalign; /* typalign of the element type */+} ArrayExprState;++/* ----------------+ * RowExprState node+ * ----------------+ */+typedef struct RowExprState+{+ ExprState xprstate;+ List *args; /* the arguments */+ TupleDesc tupdesc; /* descriptor for result tuples */+} RowExprState;++/* ----------------+ * RowCompareExprState node+ * ----------------+ */+typedef struct RowCompareExprState+{+ ExprState xprstate;+ List *largs; /* the left-hand input arguments */+ List *rargs; /* the right-hand input arguments */+ FmgrInfo *funcs; /* array of comparison function info */+ Oid *collations; /* array of collations to use */+} RowCompareExprState;++/* ----------------+ * CoalesceExprState node+ * ----------------+ */+typedef struct CoalesceExprState+{+ ExprState xprstate;+ List *args; /* the arguments */+} CoalesceExprState;++/* ----------------+ * MinMaxExprState node+ * ----------------+ */+typedef struct MinMaxExprState+{+ ExprState xprstate;+ List *args; /* the arguments */+ FmgrInfo cfunc; /* lookup info for comparison func */+} MinMaxExprState;++/* ----------------+ * XmlExprState node+ * ----------------+ */+typedef struct XmlExprState+{+ ExprState xprstate;+ List *named_args; /* ExprStates for named arguments */+ List *args; /* ExprStates for other arguments */+} XmlExprState;++/* ----------------+ * NullTestState node+ * ----------------+ */+typedef struct NullTestState+{+ ExprState xprstate;+ ExprState *arg; /* input expression */+ /* used only if input is of composite type: */+ TupleDesc argdesc; /* tupdesc for most recent input */+} NullTestState;++/* ----------------+ * CoerceToDomainState node+ * ----------------+ */+typedef struct CoerceToDomainState+{+ ExprState xprstate;+ ExprState *arg; /* input expression */+ /* Cached set of constraints that need to be checked */+ /* use struct pointer to avoid including typcache.h here */+ struct DomainConstraintRef *constraint_ref;+} CoerceToDomainState;++/*+ * DomainConstraintState - one item to check during CoerceToDomain+ *+ * Note: this is just a Node, and not an ExprState, because it has no+ * corresponding Expr to link to. Nonetheless it is part of an ExprState+ * tree, so we give it a name following the xxxState convention.+ */+typedef enum DomainConstraintType+{+ DOM_CONSTRAINT_NOTNULL,+ DOM_CONSTRAINT_CHECK+} DomainConstraintType;++typedef struct DomainConstraintState+{+ NodeTag type;+ DomainConstraintType constrainttype; /* constraint type */+ char *name; /* name of constraint (for error msgs) */+ ExprState *check_expr; /* for CHECK, a boolean expression */+} DomainConstraintState;+++/* ----------------------------------------------------------------+ * Executor State Trees+ *+ * An executing query has a PlanState tree paralleling the Plan tree+ * that describes the plan.+ * ----------------------------------------------------------------+ */++/* ----------------+ * PlanState node+ *+ * We never actually instantiate any PlanState nodes; this is just the common+ * abstract superclass for all PlanState-type nodes.+ * ----------------+ */+typedef struct PlanState+{+ NodeTag type;++ Plan *plan; /* associated Plan node */++ EState *state; /* at execution time, states of individual+ * nodes point to one EState for the whole+ * top-level plan */++ Instrumentation *instrument; /* Optional runtime stats for this node */++ /*+ * Common structural data for all Plan types. These links to subsidiary+ * state trees parallel links in the associated plan tree (except for the+ * subPlan list, which does not exist in the plan tree).+ */+ List *targetlist; /* target list to be computed at this node */+ List *qual; /* implicitly-ANDed qual conditions */+ struct PlanState *lefttree; /* input plan tree(s) */+ struct PlanState *righttree;+ List *initPlan; /* Init SubPlanState nodes (un-correlated expr+ * subselects) */+ List *subPlan; /* SubPlanState nodes in my expressions */++ /*+ * State for management of parameter-change-driven rescanning+ */+ Bitmapset *chgParam; /* set of IDs of changed Params */++ /*+ * Other run-time state needed by most if not all node types.+ */+ TupleTableSlot *ps_ResultTupleSlot; /* slot for my result tuples */+ ExprContext *ps_ExprContext; /* node's expression-evaluation context */+ ProjectionInfo *ps_ProjInfo; /* info for doing tuple projection */+ bool ps_TupFromTlist;/* state flag for processing set-valued+ * functions in targetlist */+} PlanState;++/* ----------------+ * these are defined to avoid confusion problems with "left"+ * and "right" and "inner" and "outer". The convention is that+ * the "left" plan is the "outer" plan and the "right" plan is+ * the inner plan, but these make the code more readable.+ * ----------------+ */+#define innerPlanState(node) (((PlanState *)(node))->righttree)+#define outerPlanState(node) (((PlanState *)(node))->lefttree)++/* Macros for inline access to certain instrumentation counters */+#define InstrCountFiltered1(node, delta) \+ do { \+ if (((PlanState *)(node))->instrument) \+ ((PlanState *)(node))->instrument->nfiltered1 += (delta); \+ } while(0)+#define InstrCountFiltered2(node, delta) \+ do { \+ if (((PlanState *)(node))->instrument) \+ ((PlanState *)(node))->instrument->nfiltered2 += (delta); \+ } while(0)++/*+ * EPQState is state for executing an EvalPlanQual recheck on a candidate+ * tuple in ModifyTable or LockRows. The estate and planstate fields are+ * NULL if inactive.+ */+typedef struct EPQState+{+ EState *estate; /* subsidiary EState */+ PlanState *planstate; /* plan state tree ready to be executed */+ TupleTableSlot *origslot; /* original output tuple to be rechecked */+ Plan *plan; /* plan tree to be executed */+ List *arowMarks; /* ExecAuxRowMarks (non-locking only) */+ int epqParam; /* ID of Param to force scan node re-eval */+} EPQState;+++/* ----------------+ * ResultState information+ * ----------------+ */+typedef struct ResultState+{+ PlanState ps; /* its first field is NodeTag */+ ExprState *resconstantqual;+ bool rs_done; /* are we done? */+ bool rs_checkqual; /* do we need to check the qual? */+} ResultState;++/* ----------------+ * ModifyTableState information+ * ----------------+ */+typedef struct ModifyTableState+{+ PlanState ps; /* its first field is NodeTag */+ CmdType operation; /* INSERT, UPDATE, or DELETE */+ bool canSetTag; /* do we set the command tag/es_processed? */+ bool mt_done; /* are we done? */+ PlanState **mt_plans; /* subplans (one per target rel) */+ int mt_nplans; /* number of plans in the array */+ int mt_whichplan; /* which one is being executed (0..n-1) */+ ResultRelInfo *resultRelInfo; /* per-subplan target relations */+ List **mt_arowmarks; /* per-subplan ExecAuxRowMark lists */+ EPQState mt_epqstate; /* for evaluating EvalPlanQual rechecks */+ bool fireBSTriggers; /* do we need to fire stmt triggers? */+ OnConflictAction mt_onconflict; /* ON CONFLICT type */+ List *mt_arbiterindexes; /* unique index OIDs to arbitrate+ * taking alt path */+ TupleTableSlot *mt_existing; /* slot to store existing target tuple in */+ List *mt_excludedtlist; /* the excluded pseudo relation's+ * tlist */+ TupleTableSlot *mt_conflproj; /* CONFLICT ... SET ... projection+ * target */+} ModifyTableState;++/* ----------------+ * AppendState information+ *+ * nplans how many plans are in the array+ * whichplan which plan is being executed (0 .. n-1)+ * ----------------+ */+typedef struct AppendState+{+ PlanState ps; /* its first field is NodeTag */+ PlanState **appendplans; /* array of PlanStates for my inputs */+ int as_nplans;+ int as_whichplan;+} AppendState;++/* ----------------+ * MergeAppendState information+ *+ * nplans how many plans are in the array+ * nkeys number of sort key columns+ * sortkeys sort keys in SortSupport representation+ * slots current output tuple of each subplan+ * heap heap of active tuples+ * initialized true if we have fetched first tuple from each subplan+ * ----------------+ */+typedef struct MergeAppendState+{+ PlanState ps; /* its first field is NodeTag */+ PlanState **mergeplans; /* array of PlanStates for my inputs */+ int ms_nplans;+ int ms_nkeys;+ SortSupport ms_sortkeys; /* array of length ms_nkeys */+ TupleTableSlot **ms_slots; /* array of length ms_nplans */+ struct binaryheap *ms_heap; /* binary heap of slot indices */+ bool ms_initialized; /* are subplans started? */+} MergeAppendState;++/* ----------------+ * RecursiveUnionState information+ *+ * RecursiveUnionState is used for performing a recursive union.+ *+ * recursing T when we're done scanning the non-recursive term+ * intermediate_empty T if intermediate_table is currently empty+ * working_table working table (to be scanned by recursive term)+ * intermediate_table current recursive output (next generation of WT)+ * ----------------+ */+typedef struct RecursiveUnionState+{+ PlanState ps; /* its first field is NodeTag */+ bool recursing;+ bool intermediate_empty;+ Tuplestorestate *working_table;+ Tuplestorestate *intermediate_table;+ /* Remaining fields are unused in UNION ALL case */+ FmgrInfo *eqfunctions; /* per-grouping-field equality fns */+ FmgrInfo *hashfunctions; /* per-grouping-field hash fns */+ MemoryContext tempContext; /* short-term context for comparisons */+ TupleHashTable hashtable; /* hash table for tuples already seen */+ MemoryContext tableContext; /* memory context containing hash table */+} RecursiveUnionState;++/* ----------------+ * BitmapAndState information+ * ----------------+ */+typedef struct BitmapAndState+{+ PlanState ps; /* its first field is NodeTag */+ PlanState **bitmapplans; /* array of PlanStates for my inputs */+ int nplans; /* number of input plans */+} BitmapAndState;++/* ----------------+ * BitmapOrState information+ * ----------------+ */+typedef struct BitmapOrState+{+ PlanState ps; /* its first field is NodeTag */+ PlanState **bitmapplans; /* array of PlanStates for my inputs */+ int nplans; /* number of input plans */+} BitmapOrState;++/* ----------------------------------------------------------------+ * Scan State Information+ * ----------------------------------------------------------------+ */++/* ----------------+ * ScanState information+ *+ * ScanState extends PlanState for node types that represent+ * scans of an underlying relation. It can also be used for nodes+ * that scan the output of an underlying plan node --- in that case,+ * only ScanTupleSlot is actually useful, and it refers to the tuple+ * retrieved from the subplan.+ *+ * currentRelation relation being scanned (NULL if none)+ * currentScanDesc current scan descriptor for scan (NULL if none)+ * ScanTupleSlot pointer to slot in tuple table holding scan tuple+ * ----------------+ */+typedef struct ScanState+{+ PlanState ps; /* its first field is NodeTag */+ Relation ss_currentRelation;+ HeapScanDesc ss_currentScanDesc;+ TupleTableSlot *ss_ScanTupleSlot;+} ScanState;++/*+ * SeqScan uses a bare ScanState as its state node, since it needs+ * no additional fields.+ */+typedef ScanState SeqScanState;++/* ----------------+ * SampleScanState information+ * ----------------+ */+typedef struct SampleScanState+{+ ScanState ss;+ List *args; /* expr states for TABLESAMPLE params */+ ExprState *repeatable; /* expr state for REPEATABLE expr */+ /* use struct pointer to avoid including tsmapi.h here */+ struct TsmRoutine *tsmroutine; /* descriptor for tablesample method */+ void *tsm_state; /* tablesample method can keep state here */+ bool use_bulkread; /* use bulkread buffer access strategy? */+ bool use_pagemode; /* use page-at-a-time visibility checking? */+ bool begun; /* false means need to call BeginSampleScan */+ uint32 seed; /* random seed */+} SampleScanState;++/*+ * These structs store information about index quals that don't have simple+ * constant right-hand sides. See comments for ExecIndexBuildScanKeys()+ * for discussion.+ */+typedef struct+{+ ScanKey scan_key; /* scankey to put value into */+ ExprState *key_expr; /* expr to evaluate to get value */+ bool key_toastable; /* is expr's result a toastable datatype? */+} IndexRuntimeKeyInfo;++typedef struct+{+ ScanKey scan_key; /* scankey to put value into */+ ExprState *array_expr; /* expr to evaluate to get array value */+ int next_elem; /* next array element to use */+ int num_elems; /* number of elems in current array value */+ Datum *elem_values; /* array of num_elems Datums */+ bool *elem_nulls; /* array of num_elems is-null flags */+} IndexArrayKeyInfo;++/* ----------------+ * IndexScanState information+ *+ * indexqualorig execution state for indexqualorig expressions+ * indexorderbyorig execution state for indexorderbyorig expressions+ * ScanKeys Skey structures for index quals+ * NumScanKeys number of ScanKeys+ * OrderByKeys Skey structures for index ordering operators+ * NumOrderByKeys number of OrderByKeys+ * RuntimeKeys info about Skeys that must be evaluated at runtime+ * NumRuntimeKeys number of RuntimeKeys+ * RuntimeKeysReady true if runtime Skeys have been computed+ * RuntimeContext expr context for evaling runtime Skeys+ * RelationDesc index relation descriptor+ * ScanDesc index scan descriptor+ *+ * ReorderQueue tuples that need reordering due to re-check+ * ReachedEnd have we fetched all tuples from index already?+ * OrderByValues values of ORDER BY exprs of last fetched tuple+ * OrderByNulls null flags for OrderByValues+ * SortSupport for reordering ORDER BY exprs+ * OrderByTypByVals is the datatype of order by expression pass-by-value?+ * OrderByTypLens typlens of the datatypes of order by expressions+ * ----------------+ */+typedef struct IndexScanState+{+ ScanState ss; /* its first field is NodeTag */+ List *indexqualorig;+ List *indexorderbyorig;+ ScanKey iss_ScanKeys;+ int iss_NumScanKeys;+ ScanKey iss_OrderByKeys;+ int iss_NumOrderByKeys;+ IndexRuntimeKeyInfo *iss_RuntimeKeys;+ int iss_NumRuntimeKeys;+ bool iss_RuntimeKeysReady;+ ExprContext *iss_RuntimeContext;+ Relation iss_RelationDesc;+ IndexScanDesc iss_ScanDesc;++ /* These are needed for re-checking ORDER BY expr ordering */+ pairingheap *iss_ReorderQueue;+ bool iss_ReachedEnd;+ Datum *iss_OrderByValues;+ bool *iss_OrderByNulls;+ SortSupport iss_SortSupport;+ bool *iss_OrderByTypByVals;+ int16 *iss_OrderByTypLens;+} IndexScanState;++/* ----------------+ * IndexOnlyScanState information+ *+ * indexqual execution state for indexqual expressions+ * ScanKeys Skey structures for index quals+ * NumScanKeys number of ScanKeys+ * OrderByKeys Skey structures for index ordering operators+ * NumOrderByKeys number of OrderByKeys+ * RuntimeKeys info about Skeys that must be evaluated at runtime+ * NumRuntimeKeys number of RuntimeKeys+ * RuntimeKeysReady true if runtime Skeys have been computed+ * RuntimeContext expr context for evaling runtime Skeys+ * RelationDesc index relation descriptor+ * ScanDesc index scan descriptor+ * VMBuffer buffer in use for visibility map testing, if any+ * HeapFetches number of tuples we were forced to fetch from heap+ * ----------------+ */+typedef struct IndexOnlyScanState+{+ ScanState ss; /* its first field is NodeTag */+ List *indexqual;+ ScanKey ioss_ScanKeys;+ int ioss_NumScanKeys;+ ScanKey ioss_OrderByKeys;+ int ioss_NumOrderByKeys;+ IndexRuntimeKeyInfo *ioss_RuntimeKeys;+ int ioss_NumRuntimeKeys;+ bool ioss_RuntimeKeysReady;+ ExprContext *ioss_RuntimeContext;+ Relation ioss_RelationDesc;+ IndexScanDesc ioss_ScanDesc;+ Buffer ioss_VMBuffer;+ long ioss_HeapFetches;+} IndexOnlyScanState;++/* ----------------+ * BitmapIndexScanState information+ *+ * result bitmap to return output into, or NULL+ * ScanKeys Skey structures for index quals+ * NumScanKeys number of ScanKeys+ * RuntimeKeys info about Skeys that must be evaluated at runtime+ * NumRuntimeKeys number of RuntimeKeys+ * ArrayKeys info about Skeys that come from ScalarArrayOpExprs+ * NumArrayKeys number of ArrayKeys+ * RuntimeKeysReady true if runtime Skeys have been computed+ * RuntimeContext expr context for evaling runtime Skeys+ * RelationDesc index relation descriptor+ * ScanDesc index scan descriptor+ * ----------------+ */+typedef struct BitmapIndexScanState+{+ ScanState ss; /* its first field is NodeTag */+ TIDBitmap *biss_result;+ ScanKey biss_ScanKeys;+ int biss_NumScanKeys;+ IndexRuntimeKeyInfo *biss_RuntimeKeys;+ int biss_NumRuntimeKeys;+ IndexArrayKeyInfo *biss_ArrayKeys;+ int biss_NumArrayKeys;+ bool biss_RuntimeKeysReady;+ ExprContext *biss_RuntimeContext;+ Relation biss_RelationDesc;+ IndexScanDesc biss_ScanDesc;+} BitmapIndexScanState;++/* ----------------+ * BitmapHeapScanState information+ *+ * bitmapqualorig execution state for bitmapqualorig expressions+ * tbm bitmap obtained from child index scan(s)+ * tbmiterator iterator for scanning current pages+ * tbmres current-page data+ * exact_pages total number of exact pages retrieved+ * lossy_pages total number of lossy pages retrieved+ * prefetch_iterator iterator for prefetching ahead of current page+ * prefetch_pages # pages prefetch iterator is ahead of current+ * prefetch_target target prefetch distance+ * ----------------+ */+typedef struct BitmapHeapScanState+{+ ScanState ss; /* its first field is NodeTag */+ List *bitmapqualorig;+ TIDBitmap *tbm;+ TBMIterator *tbmiterator;+ TBMIterateResult *tbmres;+ long exact_pages;+ long lossy_pages;+ TBMIterator *prefetch_iterator;+ int prefetch_pages;+ int prefetch_target;+} BitmapHeapScanState;++/* ----------------+ * TidScanState information+ *+ * isCurrentOf scan has a CurrentOfExpr qual+ * NumTids number of tids in this scan+ * TidPtr index of currently fetched tid+ * TidList evaluated item pointers (array of size NumTids)+ * ----------------+ */+typedef struct TidScanState+{+ ScanState ss; /* its first field is NodeTag */+ List *tss_tidquals; /* list of ExprState nodes */+ bool tss_isCurrentOf;+ int tss_NumTids;+ int tss_TidPtr;+ ItemPointerData *tss_TidList;+ HeapTupleData tss_htup;+} TidScanState;++/* ----------------+ * SubqueryScanState information+ *+ * SubqueryScanState is used for scanning a sub-query in the range table.+ * ScanTupleSlot references the current output tuple of the sub-query.+ * ----------------+ */+typedef struct SubqueryScanState+{+ ScanState ss; /* its first field is NodeTag */+ PlanState *subplan;+} SubqueryScanState;++/* ----------------+ * FunctionScanState information+ *+ * Function nodes are used to scan the results of a+ * function appearing in FROM (typically a function returning set).+ *+ * eflags node's capability flags+ * ordinality is this scan WITH ORDINALITY?+ * simple true if we have 1 function and no ordinality+ * ordinal current ordinal column value+ * nfuncs number of functions being executed+ * funcstates per-function execution states (private in+ * nodeFunctionscan.c)+ * argcontext memory context to evaluate function arguments in+ * ----------------+ */+struct FunctionScanPerFuncState;++typedef struct FunctionScanState+{+ ScanState ss; /* its first field is NodeTag */+ int eflags;+ bool ordinality;+ bool simple;+ int64 ordinal;+ int nfuncs;+ struct FunctionScanPerFuncState *funcstates; /* array of length+ * nfuncs */+ MemoryContext argcontext;+} FunctionScanState;++/* ----------------+ * ValuesScanState information+ *+ * ValuesScan nodes are used to scan the results of a VALUES list+ *+ * rowcontext per-expression-list context+ * exprlists array of expression lists being evaluated+ * array_len size of array+ * curr_idx current array index (0-based)+ *+ * Note: ss.ps.ps_ExprContext is used to evaluate any qual or projection+ * expressions attached to the node. We create a second ExprContext,+ * rowcontext, in which to build the executor expression state for each+ * Values sublist. Resetting this context lets us get rid of expression+ * state for each row, avoiding major memory leakage over a long values list.+ * ----------------+ */+typedef struct ValuesScanState+{+ ScanState ss; /* its first field is NodeTag */+ ExprContext *rowcontext;+ List **exprlists;+ int array_len;+ int curr_idx;+} ValuesScanState;++/* ----------------+ * CteScanState information+ *+ * CteScan nodes are used to scan a CommonTableExpr query.+ *+ * Multiple CteScan nodes can read out from the same CTE query. We use+ * a tuplestore to hold rows that have been read from the CTE query but+ * not yet consumed by all readers.+ * ----------------+ */+typedef struct CteScanState+{+ ScanState ss; /* its first field is NodeTag */+ int eflags; /* capability flags to pass to tuplestore */+ int readptr; /* index of my tuplestore read pointer */+ PlanState *cteplanstate; /* PlanState for the CTE query itself */+ /* Link to the "leader" CteScanState (possibly this same node) */+ struct CteScanState *leader;+ /* The remaining fields are only valid in the "leader" CteScanState */+ Tuplestorestate *cte_table; /* rows already read from the CTE query */+ bool eof_cte; /* reached end of CTE query? */+} CteScanState;++/* ----------------+ * WorkTableScanState information+ *+ * WorkTableScan nodes are used to scan the work table created by+ * a RecursiveUnion node. We locate the RecursiveUnion node+ * during executor startup.+ * ----------------+ */+typedef struct WorkTableScanState+{+ ScanState ss; /* its first field is NodeTag */+ RecursiveUnionState *rustate;+} WorkTableScanState;++/* ----------------+ * ForeignScanState information+ *+ * ForeignScan nodes are used to scan foreign-data tables.+ * ----------------+ */+typedef struct ForeignScanState+{+ ScanState ss; /* its first field is NodeTag */+ List *fdw_recheck_quals; /* original quals not in ss.ps.qual */+ /* use struct pointer to avoid including fdwapi.h here */+ struct FdwRoutine *fdwroutine;+ void *fdw_state; /* foreign-data wrapper can keep state here */+} ForeignScanState;++/* ----------------+ * CustomScanState information+ *+ * CustomScan nodes are used to execute custom code within executor.+ *+ * Core code must avoid assuming that the CustomScanState is only as large as+ * the structure declared here; providers are allowed to make it the first+ * element in a larger structure, and typically would need to do so. The+ * struct is actually allocated by the CreateCustomScanState method associated+ * with the plan node. Any additional fields can be initialized there, or in+ * the BeginCustomScan method.+ * ----------------+ */+struct ExplainState; /* avoid including explain.h here */+struct CustomScanState;++typedef struct CustomExecMethods+{+ const char *CustomName;++ /* Executor methods: mark/restore are optional, the rest are required */+ void (*BeginCustomScan) (struct CustomScanState *node,+ EState *estate,+ int eflags);+ TupleTableSlot *(*ExecCustomScan) (struct CustomScanState *node);+ void (*EndCustomScan) (struct CustomScanState *node);+ void (*ReScanCustomScan) (struct CustomScanState *node);+ void (*MarkPosCustomScan) (struct CustomScanState *node);+ void (*RestrPosCustomScan) (struct CustomScanState *node);++ /* Optional: print additional information in EXPLAIN */+ void (*ExplainCustomScan) (struct CustomScanState *node,+ List *ancestors,+ struct ExplainState *es);+} CustomExecMethods;++typedef struct CustomScanState+{+ ScanState ss;+ uint32 flags; /* mask of CUSTOMPATH_* flags, see relation.h */+ List *custom_ps; /* list of child PlanState nodes, if any */+ const CustomExecMethods *methods;+} CustomScanState;++/* ----------------------------------------------------------------+ * Join State Information+ * ----------------------------------------------------------------+ */++/* ----------------+ * JoinState information+ *+ * Superclass for state nodes of join plans.+ * ----------------+ */+typedef struct JoinState+{+ PlanState ps;+ JoinType jointype;+ List *joinqual; /* JOIN quals (in addition to ps.qual) */+} JoinState;++/* ----------------+ * NestLoopState information+ *+ * NeedNewOuter true if need new outer tuple on next call+ * MatchedOuter true if found a join match for current outer tuple+ * NullInnerTupleSlot prepared null tuple for left outer joins+ * ----------------+ */+typedef struct NestLoopState+{+ JoinState js; /* its first field is NodeTag */+ bool nl_NeedNewOuter;+ bool nl_MatchedOuter;+ TupleTableSlot *nl_NullInnerTupleSlot;+} NestLoopState;++/* ----------------+ * MergeJoinState information+ *+ * NumClauses number of mergejoinable join clauses+ * Clauses info for each mergejoinable clause+ * JoinState current state of ExecMergeJoin state machine+ * ExtraMarks true to issue extra Mark operations on inner scan+ * ConstFalseJoin true if we have a constant-false joinqual+ * FillOuter true if should emit unjoined outer tuples anyway+ * FillInner true if should emit unjoined inner tuples anyway+ * MatchedOuter true if found a join match for current outer tuple+ * MatchedInner true if found a join match for current inner tuple+ * OuterTupleSlot slot in tuple table for cur outer tuple+ * InnerTupleSlot slot in tuple table for cur inner tuple+ * MarkedTupleSlot slot in tuple table for marked tuple+ * NullOuterTupleSlot prepared null tuple for right outer joins+ * NullInnerTupleSlot prepared null tuple for left outer joins+ * OuterEContext workspace for computing outer tuple's join values+ * InnerEContext workspace for computing inner tuple's join values+ * ----------------+ */+/* private in nodeMergejoin.c: */+typedef struct MergeJoinClauseData *MergeJoinClause;++typedef struct MergeJoinState+{+ JoinState js; /* its first field is NodeTag */+ int mj_NumClauses;+ MergeJoinClause mj_Clauses; /* array of length mj_NumClauses */+ int mj_JoinState;+ bool mj_ExtraMarks;+ bool mj_ConstFalseJoin;+ bool mj_FillOuter;+ bool mj_FillInner;+ bool mj_MatchedOuter;+ bool mj_MatchedInner;+ TupleTableSlot *mj_OuterTupleSlot;+ TupleTableSlot *mj_InnerTupleSlot;+ TupleTableSlot *mj_MarkedTupleSlot;+ TupleTableSlot *mj_NullOuterTupleSlot;+ TupleTableSlot *mj_NullInnerTupleSlot;+ ExprContext *mj_OuterEContext;+ ExprContext *mj_InnerEContext;+} MergeJoinState;++/* ----------------+ * HashJoinState information+ *+ * hashclauses original form of the hashjoin condition+ * hj_OuterHashKeys the outer hash keys in the hashjoin condition+ * hj_InnerHashKeys the inner hash keys in the hashjoin condition+ * hj_HashOperators the join operators in the hashjoin condition+ * hj_HashTable hash table for the hashjoin+ * (NULL if table not built yet)+ * hj_CurHashValue hash value for current outer tuple+ * hj_CurBucketNo regular bucket# for current outer tuple+ * hj_CurSkewBucketNo skew bucket# for current outer tuple+ * hj_CurTuple last inner tuple matched to current outer+ * tuple, or NULL if starting search+ * (hj_CurXXX variables are undefined if+ * OuterTupleSlot is empty!)+ * hj_OuterTupleSlot tuple slot for outer tuples+ * hj_HashTupleSlot tuple slot for inner (hashed) tuples+ * hj_NullOuterTupleSlot prepared null tuple for right/full outer joins+ * hj_NullInnerTupleSlot prepared null tuple for left/full outer joins+ * hj_FirstOuterTupleSlot first tuple retrieved from outer plan+ * hj_JoinState current state of ExecHashJoin state machine+ * hj_MatchedOuter true if found a join match for current outer+ * hj_OuterNotEmpty true if outer relation known not empty+ * ----------------+ */++/* these structs are defined in executor/hashjoin.h: */+typedef struct HashJoinTupleData *HashJoinTuple;+typedef struct HashJoinTableData *HashJoinTable;++typedef struct HashJoinState+{+ JoinState js; /* its first field is NodeTag */+ List *hashclauses; /* list of ExprState nodes */+ List *hj_OuterHashKeys; /* list of ExprState nodes */+ List *hj_InnerHashKeys; /* list of ExprState nodes */+ List *hj_HashOperators; /* list of operator OIDs */+ HashJoinTable hj_HashTable;+ uint32 hj_CurHashValue;+ int hj_CurBucketNo;+ int hj_CurSkewBucketNo;+ HashJoinTuple hj_CurTuple;+ TupleTableSlot *hj_OuterTupleSlot;+ TupleTableSlot *hj_HashTupleSlot;+ TupleTableSlot *hj_NullOuterTupleSlot;+ TupleTableSlot *hj_NullInnerTupleSlot;+ TupleTableSlot *hj_FirstOuterTupleSlot;+ int hj_JoinState;+ bool hj_MatchedOuter;+ bool hj_OuterNotEmpty;+} HashJoinState;+++/* ----------------------------------------------------------------+ * Materialization State Information+ * ----------------------------------------------------------------+ */++/* ----------------+ * MaterialState information+ *+ * materialize nodes are used to materialize the results+ * of a subplan into a temporary file.+ *+ * ss.ss_ScanTupleSlot refers to output of underlying plan.+ * ----------------+ */+typedef struct MaterialState+{+ ScanState ss; /* its first field is NodeTag */+ int eflags; /* capability flags to pass to tuplestore */+ bool eof_underlying; /* reached end of underlying plan? */+ Tuplestorestate *tuplestorestate;+} MaterialState;++/* ----------------+ * SortState information+ * ----------------+ */+typedef struct SortState+{+ ScanState ss; /* its first field is NodeTag */+ bool randomAccess; /* need random access to sort output? */+ bool bounded; /* is the result set bounded? */+ int64 bound; /* if bounded, how many tuples are needed */+ bool sort_Done; /* sort completed yet? */+ bool bounded_Done; /* value of bounded we did the sort with */+ int64 bound_Done; /* value of bound we did the sort with */+ void *tuplesortstate; /* private state of tuplesort.c */+} SortState;++/* ---------------------+ * GroupState information+ * -------------------------+ */+typedef struct GroupState+{+ ScanState ss; /* its first field is NodeTag */+ FmgrInfo *eqfunctions; /* per-field lookup data for equality fns */+ bool grp_done; /* indicates completion of Group scan */+} GroupState;++/* ---------------------+ * AggState information+ *+ * ss.ss_ScanTupleSlot refers to output of underlying plan.+ *+ * Note: ss.ps.ps_ExprContext contains ecxt_aggvalues and+ * ecxt_aggnulls arrays, which hold the computed agg values for the current+ * input group during evaluation of an Agg node's output tuple(s). We+ * create a second ExprContext, tmpcontext, in which to evaluate input+ * expressions and run the aggregate transition functions.+ * -------------------------+ */+/* these structs are private in nodeAgg.c: */+typedef struct AggStatePerAggData *AggStatePerAgg;+typedef struct AggStatePerGroupData *AggStatePerGroup;+typedef struct AggStatePerPhaseData *AggStatePerPhase;++typedef struct AggState+{+ ScanState ss; /* its first field is NodeTag */+ List *aggs; /* all Aggref nodes in targetlist & quals */+ int numaggs; /* length of list (could be zero!) */+ AggStatePerPhase phase; /* pointer to current phase data */+ int numphases; /* number of phases */+ int current_phase; /* current phase number */+ FmgrInfo *hashfunctions; /* per-grouping-field hash fns */+ AggStatePerAgg peragg; /* per-Aggref information */+ ExprContext **aggcontexts; /* econtexts for long-lived data (per GS) */+ ExprContext *tmpcontext; /* econtext for input expressions */+ AggStatePerAgg curperagg; /* identifies currently active aggregate */+ bool input_done; /* indicates end of input */+ bool agg_done; /* indicates completion of Agg scan */+ int projected_set; /* The last projected grouping set */+ int current_set; /* The current grouping set being evaluated */+ Bitmapset *grouped_cols; /* grouped cols in current projection */+ List *all_grouped_cols; /* list of all grouped cols in DESC+ * order */+ /* These fields are for grouping set phase data */+ int maxsets; /* The max number of sets in any phase */+ AggStatePerPhase phases; /* array of all phases */+ Tuplesortstate *sort_in; /* sorted input to phases > 0 */+ Tuplesortstate *sort_out; /* input is copied here for next phase */+ TupleTableSlot *sort_slot; /* slot for sort results */+ /* these fields are used in AGG_PLAIN and AGG_SORTED modes: */+ AggStatePerGroup pergroup; /* per-Aggref-per-group working state */+ HeapTuple grp_firstTuple; /* copy of first tuple of current group */+ /* these fields are used in AGG_HASHED mode: */+ TupleHashTable hashtable; /* hash table with one entry per group */+ TupleTableSlot *hashslot; /* slot for loading hash table */+ List *hash_needed; /* list of columns needed in hash table */+ bool table_filled; /* hash table filled yet? */+ TupleHashIterator hashiter; /* for iterating through hash table */+} AggState;++/* ----------------+ * WindowAggState information+ * ----------------+ */+/* these structs are private in nodeWindowAgg.c: */+typedef struct WindowStatePerFuncData *WindowStatePerFunc;+typedef struct WindowStatePerAggData *WindowStatePerAgg;++typedef struct WindowAggState+{+ ScanState ss; /* its first field is NodeTag */++ /* these fields are filled in by ExecInitExpr: */+ List *funcs; /* all WindowFunc nodes in targetlist */+ int numfuncs; /* total number of window functions */+ int numaggs; /* number that are plain aggregates */++ WindowStatePerFunc perfunc; /* per-window-function information */+ WindowStatePerAgg peragg; /* per-plain-aggregate information */+ FmgrInfo *partEqfunctions; /* equality funcs for partition columns */+ FmgrInfo *ordEqfunctions; /* equality funcs for ordering columns */+ Tuplestorestate *buffer; /* stores rows of current partition */+ int current_ptr; /* read pointer # for current */+ int64 spooled_rows; /* total # of rows in buffer */+ int64 currentpos; /* position of current row in partition */+ int64 frameheadpos; /* current frame head position */+ int64 frametailpos; /* current frame tail position */+ /* use struct pointer to avoid including windowapi.h here */+ struct WindowObjectData *agg_winobj; /* winobj for aggregate+ * fetches */+ int64 aggregatedbase; /* start row for current aggregates */+ int64 aggregatedupto; /* rows before this one are aggregated */++ int frameOptions; /* frame_clause options, see WindowDef */+ ExprState *startOffset; /* expression for starting bound offset */+ ExprState *endOffset; /* expression for ending bound offset */+ Datum startOffsetValue; /* result of startOffset evaluation */+ Datum endOffsetValue; /* result of endOffset evaluation */++ MemoryContext partcontext; /* context for partition-lifespan data */+ MemoryContext aggcontext; /* shared context for aggregate working data */+ MemoryContext curaggcontext; /* current aggregate's working data */+ ExprContext *tmpcontext; /* short-term evaluation context */++ bool all_first; /* true if the scan is starting */+ bool all_done; /* true if the scan is finished */+ bool partition_spooled; /* true if all tuples in current+ * partition have been spooled into+ * tuplestore */+ bool more_partitions;/* true if there's more partitions after this+ * one */+ bool framehead_valid;/* true if frameheadpos is known up to date+ * for current row */+ bool frametail_valid;/* true if frametailpos is known up to date+ * for current row */++ TupleTableSlot *first_part_slot; /* first tuple of current or next+ * partition */++ /* temporary slots for tuples fetched back from tuplestore */+ TupleTableSlot *agg_row_slot;+ TupleTableSlot *temp_slot_1;+ TupleTableSlot *temp_slot_2;+} WindowAggState;++/* ----------------+ * UniqueState information+ *+ * Unique nodes are used "on top of" sort nodes to discard+ * duplicate tuples returned from the sort phase. Basically+ * all it does is compare the current tuple from the subplan+ * with the previously fetched tuple (stored in its result slot).+ * If the two are identical in all interesting fields, then+ * we just fetch another tuple from the sort and try again.+ * ----------------+ */+typedef struct UniqueState+{+ PlanState ps; /* its first field is NodeTag */+ FmgrInfo *eqfunctions; /* per-field lookup data for equality fns */+ MemoryContext tempContext; /* short-term context for comparisons */+} UniqueState;++/* ----------------+ * HashState information+ * ----------------+ */+typedef struct HashState+{+ PlanState ps; /* its first field is NodeTag */+ HashJoinTable hashtable; /* hash table for the hashjoin */+ List *hashkeys; /* list of ExprState nodes */+ /* hashkeys is same as parent's hj_InnerHashKeys */+} HashState;++/* ----------------+ * SetOpState information+ *+ * Even in "sorted" mode, SetOp nodes are more complex than a simple+ * Unique, since we have to count how many duplicates to return. But+ * we also support hashing, so this is really more like a cut-down+ * form of Agg.+ * ----------------+ */+/* this struct is private in nodeSetOp.c: */+typedef struct SetOpStatePerGroupData *SetOpStatePerGroup;++typedef struct SetOpState+{+ PlanState ps; /* its first field is NodeTag */+ FmgrInfo *eqfunctions; /* per-grouping-field equality fns */+ FmgrInfo *hashfunctions; /* per-grouping-field hash fns */+ bool setop_done; /* indicates completion of output scan */+ long numOutput; /* number of dups left to output */+ MemoryContext tempContext; /* short-term context for comparisons */+ /* these fields are used in SETOP_SORTED mode: */+ SetOpStatePerGroup pergroup; /* per-group working state */+ HeapTuple grp_firstTuple; /* copy of first tuple of current group */+ /* these fields are used in SETOP_HASHED mode: */+ TupleHashTable hashtable; /* hash table with one entry per group */+ MemoryContext tableContext; /* memory context containing hash table */+ bool table_filled; /* hash table filled yet? */+ TupleHashIterator hashiter; /* for iterating through hash table */+} SetOpState;++/* ----------------+ * LockRowsState information+ *+ * LockRows nodes are used to enforce FOR [KEY] UPDATE/SHARE locking.+ * ----------------+ */+typedef struct LockRowsState+{+ PlanState ps; /* its first field is NodeTag */+ List *lr_arowMarks; /* List of ExecAuxRowMarks */+ EPQState lr_epqstate; /* for evaluating EvalPlanQual rechecks */+ HeapTuple *lr_curtuples; /* locked tuples (one entry per RT entry) */+ int lr_ntables; /* length of lr_curtuples[] array */+} LockRowsState;++/* ----------------+ * LimitState information+ *+ * Limit nodes are used to enforce LIMIT/OFFSET clauses.+ * They just select the desired subrange of their subplan's output.+ *+ * offset is the number of initial tuples to skip (0 does nothing).+ * count is the number of tuples to return after skipping the offset tuples.+ * If no limit count was specified, count is undefined and noCount is true.+ * When lstate == LIMIT_INITIAL, offset/count/noCount haven't been set yet.+ * ----------------+ */+typedef enum+{+ LIMIT_INITIAL, /* initial state for LIMIT node */+ LIMIT_RESCAN, /* rescan after recomputing parameters */+ LIMIT_EMPTY, /* there are no returnable rows */+ LIMIT_INWINDOW, /* have returned a row in the window */+ LIMIT_SUBPLANEOF, /* at EOF of subplan (within window) */+ LIMIT_WINDOWEND, /* stepped off end of window */+ LIMIT_WINDOWSTART /* stepped off beginning of window */+} LimitStateCond;++typedef struct LimitState+{+ PlanState ps; /* its first field is NodeTag */+ ExprState *limitOffset; /* OFFSET parameter, or NULL if none */+ ExprState *limitCount; /* COUNT parameter, or NULL if none */+ int64 offset; /* current OFFSET value */+ int64 count; /* current COUNT, if any */+ bool noCount; /* if true, ignore count */+ LimitStateCond lstate; /* state machine status, as above */+ int64 position; /* 1-based index of last tuple returned */+ TupleTableSlot *subSlot; /* tuple last obtained from subplan */+} LimitState;++#endif /* EXECNODES_H */
+ foreign/libpg_query/src/postgres/include/nodes/lockoptions.h view
@@ -0,0 +1,46 @@+/*-------------------------------------------------------------------------+ *+ * lockoptions.h+ * Common header for some locking-related declarations.+ *+ *+ * Copyright (c) 2014-2015, PostgreSQL Global Development Group+ *+ * src/include/nodes/lockoptions.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef LOCKOPTIONS_H+#define LOCKOPTIONS_H++/*+ * This enum represents the different strengths of FOR UPDATE/SHARE clauses.+ * The ordering here is important, because the highest numerical value takes+ * precedence when a RTE is specified multiple ways. See applyLockingClause.+ */+typedef enum LockClauseStrength+{+ LCS_NONE, /* no such clause - only used in PlanRowMark */+ LCS_FORKEYSHARE, /* FOR KEY SHARE */+ LCS_FORSHARE, /* FOR SHARE */+ LCS_FORNOKEYUPDATE, /* FOR NO KEY UPDATE */+ LCS_FORUPDATE /* FOR UPDATE */+} LockClauseStrength;++/*+ * This enum controls how to deal with rows being locked by FOR UPDATE/SHARE+ * clauses (i.e., it represents the NOWAIT and SKIP LOCKED options).+ * The ordering here is important, because the highest numerical value takes+ * precedence when a RTE is specified multiple ways. See applyLockingClause.+ */+typedef enum LockWaitPolicy+{+ /* Wait for the lock to become available (default behavior) */+ LockWaitBlock,+ /* Skip rows that can't be locked (SKIP LOCKED) */+ LockWaitSkip,+ /* Raise an error if a row cannot be locked (NOWAIT) */+ LockWaitError+} LockWaitPolicy;++#endif /* LOCKOPTIONS_H */
+ foreign/libpg_query/src/postgres/include/nodes/makefuncs.h view
@@ -0,0 +1,86 @@+/*-------------------------------------------------------------------------+ *+ * makefuncs.h+ * prototypes for the creator functions (for primitive nodes)+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/nodes/makefuncs.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef MAKEFUNC_H+#define MAKEFUNC_H++#include "nodes/parsenodes.h"+++extern A_Expr *makeA_Expr(A_Expr_Kind kind, List *name,+ Node *lexpr, Node *rexpr, int location);++extern A_Expr *makeSimpleA_Expr(A_Expr_Kind kind, char *name,+ Node *lexpr, Node *rexpr, int location);++extern Var *makeVar(Index varno,+ AttrNumber varattno,+ Oid vartype,+ int32 vartypmod,+ Oid varcollid,+ Index varlevelsup);++extern Var *makeVarFromTargetEntry(Index varno,+ TargetEntry *tle);++extern Var *makeWholeRowVar(RangeTblEntry *rte,+ Index varno,+ Index varlevelsup,+ bool allowScalar);++extern TargetEntry *makeTargetEntry(Expr *expr,+ AttrNumber resno,+ char *resname,+ bool resjunk);++extern TargetEntry *flatCopyTargetEntry(TargetEntry *src_tle);++extern FromExpr *makeFromExpr(List *fromlist, Node *quals);++extern Const *makeConst(Oid consttype,+ int32 consttypmod,+ Oid constcollid,+ int constlen,+ Datum constvalue,+ bool constisnull,+ bool constbyval);++extern Const *makeNullConst(Oid consttype, int32 consttypmod, Oid constcollid);++extern Node *makeBoolConst(bool value, bool isnull);++extern Expr *makeBoolExpr(BoolExprType boolop, List *args, int location);++extern Alias *makeAlias(const char *aliasname, List *colnames);++extern RelabelType *makeRelabelType(Expr *arg, Oid rtype, int32 rtypmod,+ Oid rcollid, CoercionForm rformat);++extern RangeVar *makeRangeVar(char *schemaname, char *relname, int location);++extern TypeName *makeTypeName(char *typnam);+extern TypeName *makeTypeNameFromNameList(List *names);+extern TypeName *makeTypeNameFromOid(Oid typeOid, int32 typmod);++extern FuncExpr *makeFuncExpr(Oid funcid, Oid rettype, List *args,+ Oid funccollid, Oid inputcollid, CoercionForm fformat);++extern FuncCall *makeFuncCall(List *name, List *args, int location);++extern DefElem *makeDefElem(char *name, Node *arg);+extern DefElem *makeDefElemExtended(char *nameSpace, char *name, Node *arg,+ DefElemAction defaction, int location);++extern GroupingSet *makeGroupingSet(GroupingSetKind kind, List *content, int location);++#endif /* MAKEFUNC_H */
+ foreign/libpg_query/src/postgres/include/nodes/memnodes.h view
@@ -0,0 +1,81 @@+/*-------------------------------------------------------------------------+ *+ * memnodes.h+ * POSTGRES memory context node definitions.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/nodes/memnodes.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef MEMNODES_H+#define MEMNODES_H++#include "nodes/nodes.h"++/*+ * MemoryContext+ * A logical context in which memory allocations occur.+ *+ * MemoryContext itself is an abstract type that can have multiple+ * implementations, though for now we have only AllocSetContext.+ * The function pointers in MemoryContextMethods define one specific+ * implementation of MemoryContext --- they are a virtual function table+ * in C++ terms.+ *+ * Node types that are actual implementations of memory contexts must+ * begin with the same fields as MemoryContext.+ *+ * Note: for largely historical reasons, typedef MemoryContext is a pointer+ * to the context struct rather than the struct type itself.+ */++typedef struct MemoryContextMethods+{+ void *(*alloc) (MemoryContext context, Size size);+ /* call this free_p in case someone #define's free() */+ void (*free_p) (MemoryContext context, void *pointer);+ void *(*realloc) (MemoryContext context, void *pointer, Size size);+ void (*init) (MemoryContext context);+ void (*reset) (MemoryContext context);+ void (*delete_context) (MemoryContext context);+ Size (*get_chunk_space) (MemoryContext context, void *pointer);+ bool (*is_empty) (MemoryContext context);+ void (*stats) (MemoryContext context, int level);+#ifdef MEMORY_CONTEXT_CHECKING+ void (*check) (MemoryContext context);+#endif+} MemoryContextMethods;+++typedef struct MemoryContextData+{+ NodeTag type; /* identifies exact kind of context */+ /* these two fields are placed here to minimize alignment wastage: */+ bool isReset; /* T = no space alloced since last reset */+ bool allowInCritSection; /* allow palloc in critical section */+ MemoryContextMethods *methods; /* virtual function table */+ MemoryContext parent; /* NULL if no parent (toplevel context) */+ MemoryContext firstchild; /* head of linked list of children */+ MemoryContext nextchild; /* next child of same parent */+ char *name; /* context name (just for debugging) */+ MemoryContextCallback *reset_cbs; /* list of reset/delete callbacks */+} MemoryContextData;++/* utils/palloc.h contains typedef struct MemoryContextData *MemoryContext */+++/*+ * MemoryContextIsValid+ * True iff memory context is valid.+ *+ * Add new context types to the set accepted by this macro.+ */+#define MemoryContextIsValid(context) \+ ((context) != NULL && \+ (IsA((context), AllocSetContext)))++#endif /* MEMNODES_H */
+ foreign/libpg_query/src/postgres/include/nodes/nodeFuncs.h view
@@ -0,0 +1,66 @@+/*-------------------------------------------------------------------------+ *+ * nodeFuncs.h+ * Various general-purpose manipulations of Node trees+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/nodes/nodeFuncs.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef NODEFUNCS_H+#define NODEFUNCS_H++#include "nodes/parsenodes.h"+++/* flags bits for query_tree_walker and query_tree_mutator */+#define QTW_IGNORE_RT_SUBQUERIES 0x01 /* subqueries in rtable */+#define QTW_IGNORE_CTE_SUBQUERIES 0x02 /* subqueries in cteList */+#define QTW_IGNORE_RC_SUBQUERIES 0x03 /* both of above */+#define QTW_IGNORE_JOINALIASES 0x04 /* JOIN alias var lists */+#define QTW_IGNORE_RANGE_TABLE 0x08 /* skip rangetable entirely */+#define QTW_EXAMINE_RTES 0x10 /* examine RTEs */+#define QTW_DONT_COPY_QUERY 0x20 /* do not copy top Query */+++extern Oid exprType(const Node *expr);+extern int32 exprTypmod(const Node *expr);+extern bool exprIsLengthCoercion(const Node *expr, int32 *coercedTypmod);+extern Node *relabel_to_typmod(Node *expr, int32 typmod);+extern Node *strip_implicit_coercions(Node *node);+extern bool expression_returns_set(Node *clause);++extern Oid exprCollation(const Node *expr);+extern Oid exprInputCollation(const Node *expr);+extern void exprSetCollation(Node *expr, Oid collation);+extern void exprSetInputCollation(Node *expr, Oid inputcollation);++extern int exprLocation(const Node *expr);++extern bool expression_tree_walker(Node *node, bool (*walker) (),+ void *context);+extern Node *expression_tree_mutator(Node *node, Node *(*mutator) (),+ void *context);++extern bool query_tree_walker(Query *query, bool (*walker) (),+ void *context, int flags);+extern Query *query_tree_mutator(Query *query, Node *(*mutator) (),+ void *context, int flags);++extern bool range_table_walker(List *rtable, bool (*walker) (),+ void *context, int flags);+extern List *range_table_mutator(List *rtable, Node *(*mutator) (),+ void *context, int flags);++extern bool query_or_expression_tree_walker(Node *node, bool (*walker) (),+ void *context, int flags);+extern Node *query_or_expression_tree_mutator(Node *node, Node *(*mutator) (),+ void *context, int flags);++extern bool raw_expression_tree_walker(Node *node, bool (*walker) (),+ void *context);++#endif /* NODEFUNCS_H */
+ foreign/libpg_query/src/postgres/include/nodes/nodes.h view
@@ -0,0 +1,652 @@+/*-------------------------------------------------------------------------+ *+ * nodes.h+ * Definitions for tagged nodes.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/nodes/nodes.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef NODES_H+#define NODES_H++/*+ * The first field of every node is NodeTag. Each node created (with makeNode)+ * will have one of the following tags as the value of its first field.+ *+ * Note that the numbers of the node tags are not contiguous. We left holes+ * here so that we can add more tags without changing the existing enum's.+ * (Since node tag numbers never exist outside backend memory, there's no+ * real harm in renumbering, it just costs a full rebuild ...)+ */+typedef enum NodeTag+{+ T_Invalid = 0,++ /*+ * TAGS FOR EXECUTOR NODES (execnodes.h)+ */+ T_IndexInfo = 10,+ T_ExprContext,+ T_ProjectionInfo,+ T_JunkFilter,+ T_ResultRelInfo,+ T_EState,+ T_TupleTableSlot,++ /*+ * TAGS FOR PLAN NODES (plannodes.h)+ */+ T_Plan = 100,+ T_Result,+ T_ModifyTable,+ T_Append,+ T_MergeAppend,+ T_RecursiveUnion,+ T_BitmapAnd,+ T_BitmapOr,+ T_Scan,+ T_SeqScan,+ T_SampleScan,+ T_IndexScan,+ T_IndexOnlyScan,+ T_BitmapIndexScan,+ T_BitmapHeapScan,+ T_TidScan,+ T_SubqueryScan,+ T_FunctionScan,+ T_ValuesScan,+ T_CteScan,+ T_WorkTableScan,+ T_ForeignScan,+ T_CustomScan,+ T_Join,+ T_NestLoop,+ T_MergeJoin,+ T_HashJoin,+ T_Material,+ T_Sort,+ T_Group,+ T_Agg,+ T_WindowAgg,+ T_Unique,+ T_Hash,+ T_SetOp,+ T_LockRows,+ T_Limit,+ /* these aren't subclasses of Plan: */+ T_NestLoopParam,+ T_PlanRowMark,+ T_PlanInvalItem,++ /*+ * TAGS FOR PLAN STATE NODES (execnodes.h)+ *+ * These should correspond one-to-one with Plan node types.+ */+ T_PlanState = 200,+ T_ResultState,+ T_ModifyTableState,+ T_AppendState,+ T_MergeAppendState,+ T_RecursiveUnionState,+ T_BitmapAndState,+ T_BitmapOrState,+ T_ScanState,+ T_SeqScanState,+ T_SampleScanState,+ T_IndexScanState,+ T_IndexOnlyScanState,+ T_BitmapIndexScanState,+ T_BitmapHeapScanState,+ T_TidScanState,+ T_SubqueryScanState,+ T_FunctionScanState,+ T_ValuesScanState,+ T_CteScanState,+ T_WorkTableScanState,+ T_ForeignScanState,+ T_CustomScanState,+ T_JoinState,+ T_NestLoopState,+ T_MergeJoinState,+ T_HashJoinState,+ T_MaterialState,+ T_SortState,+ T_GroupState,+ T_AggState,+ T_WindowAggState,+ T_UniqueState,+ T_HashState,+ T_SetOpState,+ T_LockRowsState,+ T_LimitState,++ /*+ * TAGS FOR PRIMITIVE NODES (primnodes.h)+ */+ T_Alias = 300,+ T_RangeVar,+ T_Expr,+ T_Var,+ T_Const,+ T_Param,+ T_Aggref,+ T_GroupingFunc,+ T_WindowFunc,+ T_ArrayRef,+ T_FuncExpr,+ T_NamedArgExpr,+ T_OpExpr,+ T_DistinctExpr,+ T_NullIfExpr,+ T_ScalarArrayOpExpr,+ T_BoolExpr,+ T_SubLink,+ T_SubPlan,+ T_AlternativeSubPlan,+ T_FieldSelect,+ T_FieldStore,+ T_RelabelType,+ T_CoerceViaIO,+ T_ArrayCoerceExpr,+ T_ConvertRowtypeExpr,+ T_CollateExpr,+ T_CaseExpr,+ T_CaseWhen,+ T_CaseTestExpr,+ T_ArrayExpr,+ T_RowExpr,+ T_RowCompareExpr,+ T_CoalesceExpr,+ T_MinMaxExpr,+ T_XmlExpr,+ T_NullTest,+ T_BooleanTest,+ T_CoerceToDomain,+ T_CoerceToDomainValue,+ T_SetToDefault,+ T_CurrentOfExpr,+ T_InferenceElem,+ T_TargetEntry,+ T_RangeTblRef,+ T_JoinExpr,+ T_FromExpr,+ T_OnConflictExpr,+ T_IntoClause,++ /*+ * TAGS FOR EXPRESSION STATE NODES (execnodes.h)+ *+ * These correspond (not always one-for-one) to primitive nodes derived+ * from Expr.+ */+ T_ExprState = 400,+ T_GenericExprState,+ T_WholeRowVarExprState,+ T_AggrefExprState,+ T_GroupingFuncExprState,+ T_WindowFuncExprState,+ T_ArrayRefExprState,+ T_FuncExprState,+ T_ScalarArrayOpExprState,+ T_BoolExprState,+ T_SubPlanState,+ T_AlternativeSubPlanState,+ T_FieldSelectState,+ T_FieldStoreState,+ T_CoerceViaIOState,+ T_ArrayCoerceExprState,+ T_ConvertRowtypeExprState,+ T_CaseExprState,+ T_CaseWhenState,+ T_ArrayExprState,+ T_RowExprState,+ T_RowCompareExprState,+ T_CoalesceExprState,+ T_MinMaxExprState,+ T_XmlExprState,+ T_NullTestState,+ T_CoerceToDomainState,+ T_DomainConstraintState,++ /*+ * TAGS FOR PLANNER NODES (relation.h)+ */+ T_PlannerInfo = 500,+ T_PlannerGlobal,+ T_RelOptInfo,+ T_IndexOptInfo,+ T_ParamPathInfo,+ T_Path,+ T_IndexPath,+ T_BitmapHeapPath,+ T_BitmapAndPath,+ T_BitmapOrPath,+ T_NestPath,+ T_MergePath,+ T_HashPath,+ T_TidPath,+ T_ForeignPath,+ T_CustomPath,+ T_AppendPath,+ T_MergeAppendPath,+ T_ResultPath,+ T_MaterialPath,+ T_UniquePath,+ T_EquivalenceClass,+ T_EquivalenceMember,+ T_PathKey,+ T_RestrictInfo,+ T_PlaceHolderVar,+ T_SpecialJoinInfo,+ T_AppendRelInfo,+ T_PlaceHolderInfo,+ T_MinMaxAggInfo,+ T_PlannerParamItem,++ /*+ * TAGS FOR MEMORY NODES (memnodes.h)+ */+ T_MemoryContext = 600,+ T_AllocSetContext,++ /*+ * TAGS FOR VALUE NODES (value.h)+ */+ T_Value = 650,+ T_Integer,+ T_Float,+ T_String,+ T_BitString,+ T_Null,++ /*+ * TAGS FOR LIST NODES (pg_list.h)+ */+ T_List,+ T_IntList,+ T_OidList,++ /*+ * TAGS FOR STATEMENT NODES (mostly in parsenodes.h)+ */+ T_Query = 700,+ T_PlannedStmt,+ T_InsertStmt,+ T_DeleteStmt,+ T_UpdateStmt,+ T_SelectStmt,+ T_AlterTableStmt,+ T_AlterTableCmd,+ T_AlterDomainStmt,+ T_SetOperationStmt,+ T_GrantStmt,+ T_GrantRoleStmt,+ T_AlterDefaultPrivilegesStmt,+ T_ClosePortalStmt,+ T_ClusterStmt,+ T_CopyStmt,+ T_CreateStmt,+ T_DefineStmt,+ T_DropStmt,+ T_TruncateStmt,+ T_CommentStmt,+ T_FetchStmt,+ T_IndexStmt,+ T_CreateFunctionStmt,+ T_AlterFunctionStmt,+ T_DoStmt,+ T_RenameStmt,+ T_RuleStmt,+ T_NotifyStmt,+ T_ListenStmt,+ T_UnlistenStmt,+ T_TransactionStmt,+ T_ViewStmt,+ T_LoadStmt,+ T_CreateDomainStmt,+ T_CreatedbStmt,+ T_DropdbStmt,+ T_VacuumStmt,+ T_ExplainStmt,+ T_CreateTableAsStmt,+ T_CreateSeqStmt,+ T_AlterSeqStmt,+ T_VariableSetStmt,+ T_VariableShowStmt,+ T_DiscardStmt,+ T_CreateTrigStmt,+ T_CreatePLangStmt,+ T_CreateRoleStmt,+ T_AlterRoleStmt,+ T_DropRoleStmt,+ T_LockStmt,+ T_ConstraintsSetStmt,+ T_ReindexStmt,+ T_CheckPointStmt,+ T_CreateSchemaStmt,+ T_AlterDatabaseStmt,+ T_AlterDatabaseSetStmt,+ T_AlterRoleSetStmt,+ T_CreateConversionStmt,+ T_CreateCastStmt,+ T_CreateOpClassStmt,+ T_CreateOpFamilyStmt,+ T_AlterOpFamilyStmt,+ T_PrepareStmt,+ T_ExecuteStmt,+ T_DeallocateStmt,+ T_DeclareCursorStmt,+ T_CreateTableSpaceStmt,+ T_DropTableSpaceStmt,+ T_AlterObjectSchemaStmt,+ T_AlterOwnerStmt,+ T_DropOwnedStmt,+ T_ReassignOwnedStmt,+ T_CompositeTypeStmt,+ T_CreateEnumStmt,+ T_CreateRangeStmt,+ T_AlterEnumStmt,+ T_AlterTSDictionaryStmt,+ T_AlterTSConfigurationStmt,+ T_CreateFdwStmt,+ T_AlterFdwStmt,+ T_CreateForeignServerStmt,+ T_AlterForeignServerStmt,+ T_CreateUserMappingStmt,+ T_AlterUserMappingStmt,+ T_DropUserMappingStmt,+ T_AlterTableSpaceOptionsStmt,+ T_AlterTableMoveAllStmt,+ T_SecLabelStmt,+ T_CreateForeignTableStmt,+ T_ImportForeignSchemaStmt,+ T_CreateExtensionStmt,+ T_AlterExtensionStmt,+ T_AlterExtensionContentsStmt,+ T_CreateEventTrigStmt,+ T_AlterEventTrigStmt,+ T_RefreshMatViewStmt,+ T_ReplicaIdentityStmt,+ T_AlterSystemStmt,+ T_CreatePolicyStmt,+ T_AlterPolicyStmt,+ T_CreateTransformStmt,++ /*+ * TAGS FOR PARSE TREE NODES (parsenodes.h)+ */+ T_A_Expr = 900,+ T_ColumnRef,+ T_ParamRef,+ T_A_Const,+ T_FuncCall,+ T_A_Star,+ T_A_Indices,+ T_A_Indirection,+ T_A_ArrayExpr,+ T_ResTarget,+ T_MultiAssignRef,+ T_TypeCast,+ T_CollateClause,+ T_SortBy,+ T_WindowDef,+ T_RangeSubselect,+ T_RangeFunction,+ T_RangeTableSample,+ T_TypeName,+ T_ColumnDef,+ T_IndexElem,+ T_Constraint,+ T_DefElem,+ T_RangeTblEntry,+ T_RangeTblFunction,+ T_TableSampleClause,+ T_WithCheckOption,+ T_SortGroupClause,+ T_GroupingSet,+ T_WindowClause,+ T_FuncWithArgs,+ T_AccessPriv,+ T_CreateOpClassItem,+ T_TableLikeClause,+ T_FunctionParameter,+ T_LockingClause,+ T_RowMarkClause,+ T_XmlSerialize,+ T_WithClause,+ T_InferClause,+ T_OnConflictClause,+ T_CommonTableExpr,+ T_RoleSpec,++ /*+ * TAGS FOR REPLICATION GRAMMAR PARSE NODES (replnodes.h)+ */+ T_IdentifySystemCmd,+ T_BaseBackupCmd,+ T_CreateReplicationSlotCmd,+ T_DropReplicationSlotCmd,+ T_StartReplicationCmd,+ T_TimeLineHistoryCmd,++ /*+ * TAGS FOR RANDOM OTHER STUFF+ *+ * These are objects that aren't part of parse/plan/execute node tree+ * structures, but we give them NodeTags anyway for identification+ * purposes (usually because they are involved in APIs where we want to+ * pass multiple object types through the same pointer).+ */+ T_TriggerData = 950, /* in commands/trigger.h */+ T_EventTriggerData, /* in commands/event_trigger.h */+ T_ReturnSetInfo, /* in nodes/execnodes.h */+ T_WindowObjectData, /* private in nodeWindowAgg.c */+ T_TIDBitmap, /* in nodes/tidbitmap.h */+ T_InlineCodeBlock, /* in nodes/parsenodes.h */+ T_FdwRoutine, /* in foreign/fdwapi.h */+ T_TsmRoutine /* in access/tsmapi.h */+} NodeTag;++/*+ * The first field of a node of any type is guaranteed to be the NodeTag.+ * Hence the type of any node can be gotten by casting it to Node. Declaring+ * a variable to be of Node * (instead of void *) can also facilitate+ * debugging.+ */+typedef struct Node+{+ NodeTag type;+} Node;++#define nodeTag(nodeptr) (((const Node*)(nodeptr))->type)++/*+ * newNode -+ * create a new node of the specified size and tag the node with the+ * specified tag.+ *+ * !WARNING!: Avoid using newNode directly. You should be using the+ * macro makeNode. eg. to create a Query node, use makeNode(Query)+ *+ * Note: the size argument should always be a compile-time constant, so the+ * apparent risk of multiple evaluation doesn't matter in practice.+ */+#ifdef __GNUC__++/* With GCC, we can use a compound statement within an expression */+#define newNode(size, tag) \+({ Node *_result; \+ AssertMacro((size) >= sizeof(Node)); /* need the tag, at least */ \+ _result = (Node *) palloc0fast(size); \+ _result->type = (tag); \+ _result; \+})+#else++/*+ * There is no way to dereference the palloc'ed pointer to assign the+ * tag, and also return the pointer itself, so we need a holder variable.+ * Fortunately, this macro isn't recursive so we just define+ * a global variable for this purpose.+ */+extern PGDLLIMPORT Node *newNodeMacroHolder;++#define newNode(size, tag) \+( \+ AssertMacro((size) >= sizeof(Node)), /* need the tag, at least */ \+ newNodeMacroHolder = (Node *) palloc0fast(size), \+ newNodeMacroHolder->type = (tag), \+ newNodeMacroHolder \+)+#endif /* __GNUC__ */+++#define makeNode(_type_) ((_type_ *) newNode(sizeof(_type_),T_##_type_))+#define NodeSetTag(nodeptr,t) (((Node*)(nodeptr))->type = (t))++#define IsA(nodeptr,_type_) (nodeTag(nodeptr) == T_##_type_)++/* ----------------------------------------------------------------+ * extern declarations follow+ * ----------------------------------------------------------------+ */++/*+ * nodes/{outfuncs.c,print.c}+ */+extern char *nodeToString(const void *obj);++/*+ * nodes/{readfuncs.c,read.c}+ */+extern void *stringToNode(char *str);++/*+ * nodes/copyfuncs.c+ */+extern void *copyObject(const void *obj);++/*+ * nodes/equalfuncs.c+ */+extern bool equal(const void *a, const void *b);+++/*+ * Typedefs for identifying qualifier selectivities and plan costs as such.+ * These are just plain "double"s, but declaring a variable as Selectivity+ * or Cost makes the intent more obvious.+ *+ * These could have gone into plannodes.h or some such, but many files+ * depend on them...+ */+typedef double Selectivity; /* fraction of tuples a qualifier will pass */+typedef double Cost; /* execution cost (in page-access units) */+++/*+ * CmdType -+ * enums for type of operation represented by a Query or PlannedStmt+ *+ * This is needed in both parsenodes.h and plannodes.h, so put it here...+ */+typedef enum CmdType+{+ CMD_UNKNOWN,+ CMD_SELECT, /* select stmt */+ CMD_UPDATE, /* update stmt */+ CMD_INSERT, /* insert stmt */+ CMD_DELETE,+ CMD_UTILITY, /* cmds like create, destroy, copy, vacuum,+ * etc. */+ CMD_NOTHING /* dummy command for instead nothing rules+ * with qual */+} CmdType;+++/*+ * JoinType -+ * enums for types of relation joins+ *+ * JoinType determines the exact semantics of joining two relations using+ * a matching qualification. For example, it tells what to do with a tuple+ * that has no match in the other relation.+ *+ * This is needed in both parsenodes.h and plannodes.h, so put it here...+ */+typedef enum JoinType+{+ /*+ * The canonical kinds of joins according to the SQL JOIN syntax. Only+ * these codes can appear in parser output (e.g., JoinExpr nodes).+ */+ JOIN_INNER, /* matching tuple pairs only */+ JOIN_LEFT, /* pairs + unmatched LHS tuples */+ JOIN_FULL, /* pairs + unmatched LHS + unmatched RHS */+ JOIN_RIGHT, /* pairs + unmatched RHS tuples */++ /*+ * Semijoins and anti-semijoins (as defined in relational theory) do not+ * appear in the SQL JOIN syntax, but there are standard idioms for+ * representing them (e.g., using EXISTS). The planner recognizes these+ * cases and converts them to joins. So the planner and executor must+ * support these codes. NOTE: in JOIN_SEMI output, it is unspecified+ * which matching RHS row is joined to. In JOIN_ANTI output, the row is+ * guaranteed to be null-extended.+ */+ JOIN_SEMI, /* 1 copy of each LHS row that has match(es) */+ JOIN_ANTI, /* 1 copy of each LHS row that has no match */++ /*+ * These codes are used internally in the planner, but are not supported+ * by the executor (nor, indeed, by most of the planner).+ */+ JOIN_UNIQUE_OUTER, /* LHS path must be made unique */+ JOIN_UNIQUE_INNER /* RHS path must be made unique */++ /*+ * We might need additional join types someday.+ */+} JoinType;++/*+ * OUTER joins are those for which pushed-down quals must behave differently+ * from the join's own quals. This is in fact everything except INNER and+ * SEMI joins. However, this macro must also exclude the JOIN_UNIQUE symbols+ * since those are temporary proxies for what will eventually be an INNER+ * join.+ *+ * Note: semijoins are a hybrid case, but we choose to treat them as not+ * being outer joins. This is okay principally because the SQL syntax makes+ * it impossible to have a pushed-down qual that refers to the inner relation+ * of a semijoin; so there is no strong need to distinguish join quals from+ * pushed-down quals. This is convenient because for almost all purposes,+ * quals attached to a semijoin can be treated the same as innerjoin quals.+ */+#define IS_OUTER_JOIN(jointype) \+ (((1 << (jointype)) & \+ ((1 << JOIN_LEFT) | \+ (1 << JOIN_FULL) | \+ (1 << JOIN_RIGHT) | \+ (1 << JOIN_ANTI))) != 0)++/*+ * OnConflictAction -+ * "ON CONFLICT" clause type of query+ *+ * This is needed in both parsenodes.h and plannodes.h, so put it here...+ */+typedef enum OnConflictAction+{+ ONCONFLICT_NONE, /* No "ON CONFLICT" clause */+ ONCONFLICT_NOTHING, /* ON CONFLICT ... DO NOTHING */+ ONCONFLICT_UPDATE /* ON CONFLICT ... DO UPDATE */+} OnConflictAction;++#endif /* NODES_H */
+ foreign/libpg_query/src/postgres/include/nodes/params.h view
@@ -0,0 +1,106 @@+/*-------------------------------------------------------------------------+ *+ * params.h+ * Support for finding the values associated with Param nodes.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/nodes/params.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef PARAMS_H+#define PARAMS_H++/* To avoid including a pile of parser headers, reference ParseState thus: */+struct ParseState;+++/* ----------------+ * ParamListInfo+ *+ * ParamListInfo arrays are used to pass parameters into the executor+ * for parameterized plans. Each entry in the array defines the value+ * to be substituted for a PARAM_EXTERN parameter. The "paramid"+ * of a PARAM_EXTERN Param can range from 1 to numParams.+ *+ * Although parameter numbers are normally consecutive, we allow+ * ptype == InvalidOid to signal an unused array entry.+ *+ * pflags is a flags field. Currently the only used bit is:+ * PARAM_FLAG_CONST signals the planner that it may treat this parameter+ * as a constant (i.e., generate a plan that works only for this value+ * of the parameter).+ *+ * There are two hook functions that can be associated with a ParamListInfo+ * array to support dynamic parameter handling. First, if paramFetch+ * isn't null and the executor requires a value for an invalid parameter+ * (one with ptype == InvalidOid), the paramFetch hook is called to give+ * it a chance to fill in the parameter value. Second, a parserSetup+ * hook can be supplied to re-instantiate the original parsing hooks if+ * a query needs to be re-parsed/planned (as a substitute for supposing+ * that the current ptype values represent a fixed set of parameter types).++ * Although the data structure is really an array, not a list, we keep+ * the old typedef name to avoid unnecessary code changes.+ * ----------------+ */++#define PARAM_FLAG_CONST 0x0001 /* parameter is constant */++typedef struct ParamExternData+{+ Datum value; /* parameter value */+ bool isnull; /* is it NULL? */+ uint16 pflags; /* flag bits, see above */+ Oid ptype; /* parameter's datatype, or 0 */+} ParamExternData;++typedef struct ParamListInfoData *ParamListInfo;++typedef void (*ParamFetchHook) (ParamListInfo params, int paramid);++typedef void (*ParserSetupHook) (struct ParseState *pstate, void *arg);++typedef struct ParamListInfoData+{+ ParamFetchHook paramFetch; /* parameter fetch hook */+ void *paramFetchArg;+ ParserSetupHook parserSetup; /* parser setup hook */+ void *parserSetupArg;+ int numParams; /* number of ParamExternDatas following */+ ParamExternData params[FLEXIBLE_ARRAY_MEMBER];+} ParamListInfoData;+++/* ----------------+ * ParamExecData+ *+ * ParamExecData entries are used for executor internal parameters+ * (that is, values being passed into or out of a sub-query). The+ * paramid of a PARAM_EXEC Param is a (zero-based) index into an+ * array of ParamExecData records, which is referenced through+ * es_param_exec_vals or ecxt_param_exec_vals.+ *+ * If execPlan is not NULL, it points to a SubPlanState node that needs+ * to be executed to produce the value. (This is done so that we can have+ * lazy evaluation of InitPlans: they aren't executed until/unless a+ * result value is needed.) Otherwise the value is assumed to be valid+ * when needed.+ * ----------------+ */++typedef struct ParamExecData+{+ void *execPlan; /* should be "SubPlanState *" */+ Datum value;+ bool isnull;+} ParamExecData;+++/* Functions found in src/backend/nodes/params.c */+extern ParamListInfo copyParamList(ParamListInfo from);++#endif /* PARAMS_H */
+ foreign/libpg_query/src/postgres/include/nodes/parsenodes.h view
@@ -0,0 +1,3056 @@+/*-------------------------------------------------------------------------+ *+ * parsenodes.h+ * definitions for parse tree nodes+ *+ * Many of the node types used in parsetrees include a "location" field.+ * This is a byte (not character) offset in the original source text, to be+ * used for positioning an error cursor when there is an error related to+ * the node. Access to the original source text is needed to make use of+ * the location.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/nodes/parsenodes.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef PARSENODES_H+#define PARSENODES_H++#include "nodes/bitmapset.h"+#include "nodes/lockoptions.h"+#include "nodes/primnodes.h"+#include "nodes/value.h"++/* Possible sources of a Query */+typedef enum QuerySource+{+ QSRC_ORIGINAL, /* original parsetree (explicit query) */+ QSRC_PARSER, /* added by parse analysis (now unused) */+ QSRC_INSTEAD_RULE, /* added by unconditional INSTEAD rule */+ QSRC_QUAL_INSTEAD_RULE, /* added by conditional INSTEAD rule */+ QSRC_NON_INSTEAD_RULE /* added by non-INSTEAD rule */+} QuerySource;++/* Sort ordering options for ORDER BY and CREATE INDEX */+typedef enum SortByDir+{+ SORTBY_DEFAULT,+ SORTBY_ASC,+ SORTBY_DESC,+ SORTBY_USING /* not allowed in CREATE INDEX ... */+} SortByDir;++typedef enum SortByNulls+{+ SORTBY_NULLS_DEFAULT,+ SORTBY_NULLS_FIRST,+ SORTBY_NULLS_LAST+} SortByNulls;++/*+ * Grantable rights are encoded so that we can OR them together in a bitmask.+ * The present representation of AclItem limits us to 16 distinct rights,+ * even though AclMode is defined as uint32. See utils/acl.h.+ *+ * Caution: changing these codes breaks stored ACLs, hence forces initdb.+ */+typedef uint32 AclMode; /* a bitmask of privilege bits */++#define ACL_INSERT (1<<0) /* for relations */+#define ACL_SELECT (1<<1)+#define ACL_UPDATE (1<<2)+#define ACL_DELETE (1<<3)+#define ACL_TRUNCATE (1<<4)+#define ACL_REFERENCES (1<<5)+#define ACL_TRIGGER (1<<6)+#define ACL_EXECUTE (1<<7) /* for functions */+#define ACL_USAGE (1<<8) /* for languages, namespaces, FDWs, and+ * servers */+#define ACL_CREATE (1<<9) /* for namespaces and databases */+#define ACL_CREATE_TEMP (1<<10) /* for databases */+#define ACL_CONNECT (1<<11) /* for databases */+#define N_ACL_RIGHTS 12 /* 1 plus the last 1<<x */+#define ACL_NO_RIGHTS 0+/* Currently, SELECT ... FOR [KEY] UPDATE/SHARE requires UPDATE privileges */+#define ACL_SELECT_FOR_UPDATE ACL_UPDATE+++/*****************************************************************************+ * Query Tree+ *****************************************************************************/++/*+ * Query -+ * Parse analysis turns all statements into a Query tree+ * for further processing by the rewriter and planner.+ *+ * Utility statements (i.e. non-optimizable statements) have the+ * utilityStmt field set, and the Query itself is mostly dummy.+ * DECLARE CURSOR is a special case: it is represented like a SELECT,+ * but the original DeclareCursorStmt is stored in utilityStmt.+ *+ * Planning converts a Query tree into a Plan tree headed by a PlannedStmt+ * node --- the Query structure is not used by the executor.+ */+typedef struct Query+{+ NodeTag type;++ CmdType commandType; /* select|insert|update|delete|utility */++ QuerySource querySource; /* where did I come from? */++ uint32 queryId; /* query identifier (can be set by plugins) */++ bool canSetTag; /* do I set the command result tag? */++ Node *utilityStmt; /* non-null if this is DECLARE CURSOR or a+ * non-optimizable statement */++ int resultRelation; /* rtable index of target relation for+ * INSERT/UPDATE/DELETE; 0 for SELECT */++ bool hasAggs; /* has aggregates in tlist or havingQual */+ bool hasWindowFuncs; /* has window functions in tlist */+ bool hasSubLinks; /* has subquery SubLink */+ bool hasDistinctOn; /* distinctClause is from DISTINCT ON */+ bool hasRecursive; /* WITH RECURSIVE was specified */+ bool hasModifyingCTE; /* has INSERT/UPDATE/DELETE in WITH */+ bool hasForUpdate; /* FOR [KEY] UPDATE/SHARE was specified */+ bool hasRowSecurity; /* row security applied? */++ List *cteList; /* WITH list (of CommonTableExpr's) */++ List *rtable; /* list of range table entries */+ FromExpr *jointree; /* table join tree (FROM and WHERE clauses) */++ List *targetList; /* target list (of TargetEntry) */++ OnConflictExpr *onConflict; /* ON CONFLICT DO [NOTHING | UPDATE] */++ List *returningList; /* return-values list (of TargetEntry) */++ List *groupClause; /* a list of SortGroupClause's */++ List *groupingSets; /* a list of GroupingSet's if present */++ Node *havingQual; /* qualifications applied to groups */++ List *windowClause; /* a list of WindowClause's */++ List *distinctClause; /* a list of SortGroupClause's */++ List *sortClause; /* a list of SortGroupClause's */++ Node *limitOffset; /* # of result tuples to skip (int8 expr) */+ Node *limitCount; /* # of result tuples to return (int8 expr) */++ List *rowMarks; /* a list of RowMarkClause's */++ Node *setOperations; /* set-operation tree if this is top level of+ * a UNION/INTERSECT/EXCEPT query */++ List *constraintDeps; /* a list of pg_constraint OIDs that the query+ * depends on to be semantically valid */++ List *withCheckOptions; /* a list of WithCheckOption's, which are+ * only added during rewrite and therefore+ * are not written out as part of Query. */+} Query;+++/****************************************************************************+ * Supporting data structures for Parse Trees+ *+ * Most of these node types appear in raw parsetrees output by the grammar,+ * and get transformed to something else by the analyzer. A few of them+ * are used as-is in transformed querytrees.+ ****************************************************************************/++/*+ * TypeName - specifies a type in definitions+ *+ * For TypeName structures generated internally, it is often easier to+ * specify the type by OID than by name. If "names" is NIL then the+ * actual type OID is given by typeOid, otherwise typeOid is unused.+ * Similarly, if "typmods" is NIL then the actual typmod is expected to+ * be prespecified in typemod, otherwise typemod is unused.+ *+ * If pct_type is TRUE, then names is actually a field name and we look up+ * the type of that field. Otherwise (the normal case), names is a type+ * name possibly qualified with schema and database name.+ */+typedef struct TypeName+{+ NodeTag type;+ List *names; /* qualified name (list of Value strings) */+ Oid typeOid; /* type identified by OID */+ bool setof; /* is a set? */+ bool pct_type; /* %TYPE specified? */+ List *typmods; /* type modifier expression(s) */+ int32 typemod; /* prespecified type modifier */+ List *arrayBounds; /* array bounds */+ int location; /* token location, or -1 if unknown */+} TypeName;++/*+ * ColumnRef - specifies a reference to a column, or possibly a whole tuple+ *+ * The "fields" list must be nonempty. It can contain string Value nodes+ * (representing names) and A_Star nodes (representing occurrence of a '*').+ * Currently, A_Star must appear only as the last list element --- the grammar+ * is responsible for enforcing this!+ *+ * Note: any array subscripting or selection of fields from composite columns+ * is represented by an A_Indirection node above the ColumnRef. However,+ * for simplicity in the normal case, initial field selection from a table+ * name is represented within ColumnRef and not by adding A_Indirection.+ */+typedef struct ColumnRef+{+ NodeTag type;+ List *fields; /* field names (Value strings) or A_Star */+ int location; /* token location, or -1 if unknown */+} ColumnRef;++/*+ * ParamRef - specifies a $n parameter reference+ */+typedef struct ParamRef+{+ NodeTag type;+ int number; /* the number of the parameter */+ int location; /* token location, or -1 if unknown */+} ParamRef;++/*+ * A_Expr - infix, prefix, and postfix expressions+ */+typedef enum A_Expr_Kind+{+ AEXPR_OP, /* normal operator */+ AEXPR_OP_ANY, /* scalar op ANY (array) */+ AEXPR_OP_ALL, /* scalar op ALL (array) */+ AEXPR_DISTINCT, /* IS DISTINCT FROM - name must be "=" */+ AEXPR_NULLIF, /* NULLIF - name must be "=" */+ AEXPR_OF, /* IS [NOT] OF - name must be "=" or "<>" */+ AEXPR_IN, /* [NOT] IN - name must be "=" or "<>" */+ AEXPR_LIKE, /* [NOT] LIKE - name must be "~~" or "!~~" */+ AEXPR_ILIKE, /* [NOT] ILIKE - name must be "~~*" or "!~~*" */+ AEXPR_SIMILAR, /* [NOT] SIMILAR - name must be "~" or "!~" */+ AEXPR_BETWEEN, /* name must be "BETWEEN" */+ AEXPR_NOT_BETWEEN, /* name must be "NOT BETWEEN" */+ AEXPR_BETWEEN_SYM, /* name must be "BETWEEN SYMMETRIC" */+ AEXPR_NOT_BETWEEN_SYM, /* name must be "NOT BETWEEN SYMMETRIC" */+ AEXPR_PAREN /* nameless dummy node for parentheses */+} A_Expr_Kind;++typedef struct A_Expr+{+ NodeTag type;+ A_Expr_Kind kind; /* see above */+ List *name; /* possibly-qualified name of operator */+ Node *lexpr; /* left argument, or NULL if none */+ Node *rexpr; /* right argument, or NULL if none */+ int location; /* token location, or -1 if unknown */+} A_Expr;++/*+ * A_Const - a literal constant+ */+typedef struct A_Const+{+ NodeTag type;+ Value val; /* value (includes type info, see value.h) */+ int location; /* token location, or -1 if unknown */+} A_Const;++/*+ * TypeCast - a CAST expression+ */+typedef struct TypeCast+{+ NodeTag type;+ Node *arg; /* the expression being casted */+ TypeName *typeName; /* the target type */+ int location; /* token location, or -1 if unknown */+} TypeCast;++/*+ * CollateClause - a COLLATE expression+ */+typedef struct CollateClause+{+ NodeTag type;+ Node *arg; /* input expression */+ List *collname; /* possibly-qualified collation name */+ int location; /* token location, or -1 if unknown */+} CollateClause;++/*+ * RoleSpec - a role name or one of a few special values.+ */+typedef enum RoleSpecType+{+ ROLESPEC_CSTRING, /* role name is stored as a C string */+ ROLESPEC_CURRENT_USER, /* role spec is CURRENT_USER */+ ROLESPEC_SESSION_USER, /* role spec is SESSION_USER */+ ROLESPEC_PUBLIC /* role name is "public" */+} RoleSpecType;++typedef struct RoleSpec+{+ NodeTag type;+ RoleSpecType roletype; /* Type of this rolespec */+ char *rolename; /* filled only for ROLESPEC_CSTRING */+ int location; /* token location, or -1 if unknown */+} RoleSpec;++/*+ * FuncCall - a function or aggregate invocation+ *+ * agg_order (if not NIL) indicates we saw 'foo(... ORDER BY ...)', or if+ * agg_within_group is true, it was 'foo(...) WITHIN GROUP (ORDER BY ...)'.+ * agg_star indicates we saw a 'foo(*)' construct, while agg_distinct+ * indicates we saw 'foo(DISTINCT ...)'. In any of these cases, the+ * construct *must* be an aggregate call. Otherwise, it might be either an+ * aggregate or some other kind of function. However, if FILTER or OVER is+ * present it had better be an aggregate or window function.+ *+ * Normally, you'd initialize this via makeFuncCall() and then only change the+ * parts of the struct its defaults don't match afterwards, as needed.+ */+typedef struct FuncCall+{+ NodeTag type;+ List *funcname; /* qualified name of function */+ List *args; /* the arguments (list of exprs) */+ List *agg_order; /* ORDER BY (list of SortBy) */+ Node *agg_filter; /* FILTER clause, if any */+ bool agg_within_group; /* ORDER BY appeared in WITHIN GROUP */+ bool agg_star; /* argument was really '*' */+ bool agg_distinct; /* arguments were labeled DISTINCT */+ bool func_variadic; /* last argument was labeled VARIADIC */+ struct WindowDef *over; /* OVER clause, if any */+ int location; /* token location, or -1 if unknown */+} FuncCall;++/*+ * A_Star - '*' representing all columns of a table or compound field+ *+ * This can appear within ColumnRef.fields, A_Indirection.indirection, and+ * ResTarget.indirection lists.+ */+typedef struct A_Star+{+ NodeTag type;+} A_Star;++/*+ * A_Indices - array subscript or slice bounds ([lidx:uidx] or [uidx])+ */+typedef struct A_Indices+{+ NodeTag type;+ Node *lidx; /* NULL if it's a single subscript */+ Node *uidx;+} A_Indices;++/*+ * A_Indirection - select a field and/or array element from an expression+ *+ * The indirection list can contain A_Indices nodes (representing+ * subscripting), string Value nodes (representing field selection --- the+ * string value is the name of the field to select), and A_Star nodes+ * (representing selection of all fields of a composite type).+ * For example, a complex selection operation like+ * (foo).field1[42][7].field2+ * would be represented with a single A_Indirection node having a 4-element+ * indirection list.+ *+ * Currently, A_Star must appear only as the last list element --- the grammar+ * is responsible for enforcing this!+ */+typedef struct A_Indirection+{+ NodeTag type;+ Node *arg; /* the thing being selected from */+ List *indirection; /* subscripts and/or field names and/or * */+} A_Indirection;++/*+ * A_ArrayExpr - an ARRAY[] construct+ */+typedef struct A_ArrayExpr+{+ NodeTag type;+ List *elements; /* array element expressions */+ int location; /* token location, or -1 if unknown */+} A_ArrayExpr;++/*+ * ResTarget -+ * result target (used in target list of pre-transformed parse trees)+ *+ * In a SELECT target list, 'name' is the column label from an+ * 'AS ColumnLabel' clause, or NULL if there was none, and 'val' is the+ * value expression itself. The 'indirection' field is not used.+ *+ * INSERT uses ResTarget in its target-column-names list. Here, 'name' is+ * the name of the destination column, 'indirection' stores any subscripts+ * attached to the destination, and 'val' is not used.+ *+ * In an UPDATE target list, 'name' is the name of the destination column,+ * 'indirection' stores any subscripts attached to the destination, and+ * 'val' is the expression to assign.+ *+ * See A_Indirection for more info about what can appear in 'indirection'.+ */+typedef struct ResTarget+{+ NodeTag type;+ char *name; /* column name or NULL */+ List *indirection; /* subscripts, field names, and '*', or NIL */+ Node *val; /* the value expression to compute or assign */+ int location; /* token location, or -1 if unknown */+} ResTarget;++/*+ * MultiAssignRef - element of a row source expression for UPDATE+ *+ * In an UPDATE target list, when we have SET (a,b,c) = row-valued-expression,+ * we generate separate ResTarget items for each of a,b,c. Their "val" trees+ * are MultiAssignRef nodes numbered 1..n, linking to a common copy of the+ * row-valued-expression (which parse analysis will process only once, when+ * handling the MultiAssignRef with colno=1).+ */+typedef struct MultiAssignRef+{+ NodeTag type;+ Node *source; /* the row-valued expression */+ int colno; /* column number for this target (1..n) */+ int ncolumns; /* number of targets in the construct */+} MultiAssignRef;++/*+ * SortBy - for ORDER BY clause+ */+typedef struct SortBy+{+ NodeTag type;+ Node *node; /* expression to sort on */+ SortByDir sortby_dir; /* ASC/DESC/USING/default */+ SortByNulls sortby_nulls; /* NULLS FIRST/LAST */+ List *useOp; /* name of op to use, if SORTBY_USING */+ int location; /* operator location, or -1 if none/unknown */+} SortBy;++/*+ * WindowDef - raw representation of WINDOW and OVER clauses+ *+ * For entries in a WINDOW list, "name" is the window name being defined.+ * For OVER clauses, we use "name" for the "OVER window" syntax, or "refname"+ * for the "OVER (window)" syntax, which is subtly different --- the latter+ * implies overriding the window frame clause.+ */+typedef struct WindowDef+{+ NodeTag type;+ char *name; /* window's own name */+ char *refname; /* referenced window name, if any */+ List *partitionClause; /* PARTITION BY expression list */+ List *orderClause; /* ORDER BY (list of SortBy) */+ int frameOptions; /* frame_clause options, see below */+ Node *startOffset; /* expression for starting bound, if any */+ Node *endOffset; /* expression for ending bound, if any */+ int location; /* parse location, or -1 if none/unknown */+} WindowDef;++/*+ * frameOptions is an OR of these bits. The NONDEFAULT and BETWEEN bits are+ * used so that ruleutils.c can tell which properties were specified and+ * which were defaulted; the correct behavioral bits must be set either way.+ * The START_foo and END_foo options must come in pairs of adjacent bits for+ * the convenience of gram.y, even though some of them are useless/invalid.+ * We will need more bits (and fields) to cover the full SQL:2008 option set.+ */+#define FRAMEOPTION_NONDEFAULT 0x00001 /* any specified? */+#define FRAMEOPTION_RANGE 0x00002 /* RANGE behavior */+#define FRAMEOPTION_ROWS 0x00004 /* ROWS behavior */+#define FRAMEOPTION_BETWEEN 0x00008 /* BETWEEN given? */+#define FRAMEOPTION_START_UNBOUNDED_PRECEDING 0x00010 /* start is U. P. */+#define FRAMEOPTION_END_UNBOUNDED_PRECEDING 0x00020 /* (disallowed) */+#define FRAMEOPTION_START_UNBOUNDED_FOLLOWING 0x00040 /* (disallowed) */+#define FRAMEOPTION_END_UNBOUNDED_FOLLOWING 0x00080 /* end is U. F. */+#define FRAMEOPTION_START_CURRENT_ROW 0x00100 /* start is C. R. */+#define FRAMEOPTION_END_CURRENT_ROW 0x00200 /* end is C. R. */+#define FRAMEOPTION_START_VALUE_PRECEDING 0x00400 /* start is V. P. */+#define FRAMEOPTION_END_VALUE_PRECEDING 0x00800 /* end is V. P. */+#define FRAMEOPTION_START_VALUE_FOLLOWING 0x01000 /* start is V. F. */+#define FRAMEOPTION_END_VALUE_FOLLOWING 0x02000 /* end is V. F. */++#define FRAMEOPTION_START_VALUE \+ (FRAMEOPTION_START_VALUE_PRECEDING | FRAMEOPTION_START_VALUE_FOLLOWING)+#define FRAMEOPTION_END_VALUE \+ (FRAMEOPTION_END_VALUE_PRECEDING | FRAMEOPTION_END_VALUE_FOLLOWING)++#define FRAMEOPTION_DEFAULTS \+ (FRAMEOPTION_RANGE | FRAMEOPTION_START_UNBOUNDED_PRECEDING | \+ FRAMEOPTION_END_CURRENT_ROW)++/*+ * RangeSubselect - subquery appearing in a FROM clause+ */+typedef struct RangeSubselect+{+ NodeTag type;+ bool lateral; /* does it have LATERAL prefix? */+ Node *subquery; /* the untransformed sub-select clause */+ Alias *alias; /* table alias & optional column aliases */+} RangeSubselect;++/*+ * RangeFunction - function call appearing in a FROM clause+ *+ * functions is a List because we use this to represent the construct+ * ROWS FROM(func1(...), func2(...), ...). Each element of this list is a+ * two-element sublist, the first element being the untransformed function+ * call tree, and the second element being a possibly-empty list of ColumnDef+ * nodes representing any columndef list attached to that function within the+ * ROWS FROM() syntax.+ *+ * alias and coldeflist represent any alias and/or columndef list attached+ * at the top level. (We disallow coldeflist appearing both here and+ * per-function, but that's checked in parse analysis, not by the grammar.)+ */+typedef struct RangeFunction+{+ NodeTag type;+ bool lateral; /* does it have LATERAL prefix? */+ bool ordinality; /* does it have WITH ORDINALITY suffix? */+ bool is_rowsfrom; /* is result of ROWS FROM() syntax? */+ List *functions; /* per-function information, see above */+ Alias *alias; /* table alias & optional column aliases */+ List *coldeflist; /* list of ColumnDef nodes to describe result+ * of function returning RECORD */+} RangeFunction;++/*+ * RangeTableSample - TABLESAMPLE appearing in a raw FROM clause+ *+ * This node, appearing only in raw parse trees, represents+ * <relation> TABLESAMPLE <method> (<params>) REPEATABLE (<num>)+ * Currently, the <relation> can only be a RangeVar, but we might in future+ * allow RangeSubselect and other options. Note that the RangeTableSample+ * is wrapped around the node representing the <relation>, rather than being+ * a subfield of it.+ */+typedef struct RangeTableSample+{+ NodeTag type;+ Node *relation; /* relation to be sampled */+ List *method; /* sampling method name (possibly qualified) */+ List *args; /* argument(s) for sampling method */+ Node *repeatable; /* REPEATABLE expression, or NULL if none */+ int location; /* method name location, or -1 if unknown */+} RangeTableSample;++/*+ * ColumnDef - column definition (used in various creates)+ *+ * If the column has a default value, we may have the value expression+ * in either "raw" form (an untransformed parse tree) or "cooked" form+ * (a post-parse-analysis, executable expression tree), depending on+ * how this ColumnDef node was created (by parsing, or by inheritance+ * from an existing relation). We should never have both in the same node!+ *+ * Similarly, we may have a COLLATE specification in either raw form+ * (represented as a CollateClause with arg==NULL) or cooked form+ * (the collation's OID).+ *+ * The constraints list may contain a CONSTR_DEFAULT item in a raw+ * parsetree produced by gram.y, but transformCreateStmt will remove+ * the item and set raw_default instead. CONSTR_DEFAULT items+ * should not appear in any subsequent processing.+ */+typedef struct ColumnDef+{+ NodeTag type;+ char *colname; /* name of column */+ TypeName *typeName; /* type of column */+ int inhcount; /* number of times column is inherited */+ bool is_local; /* column has local (non-inherited) def'n */+ bool is_not_null; /* NOT NULL constraint specified? */+ bool is_from_type; /* column definition came from table type */+ char storage; /* attstorage setting, or 0 for default */+ Node *raw_default; /* default value (untransformed parse tree) */+ Node *cooked_default; /* default value (transformed expr tree) */+ CollateClause *collClause; /* untransformed COLLATE spec, if any */+ Oid collOid; /* collation OID (InvalidOid if not set) */+ List *constraints; /* other constraints on column */+ List *fdwoptions; /* per-column FDW options */+ int location; /* parse location, or -1 if none/unknown */+} ColumnDef;++/*+ * TableLikeClause - CREATE TABLE ( ... LIKE ... ) clause+ */+typedef struct TableLikeClause+{+ NodeTag type;+ RangeVar *relation;+ bits32 options; /* OR of TableLikeOption flags */+} TableLikeClause;++typedef enum TableLikeOption+{+ CREATE_TABLE_LIKE_DEFAULTS = 1 << 0,+ CREATE_TABLE_LIKE_CONSTRAINTS = 1 << 1,+ CREATE_TABLE_LIKE_INDEXES = 1 << 2,+ CREATE_TABLE_LIKE_STORAGE = 1 << 3,+ CREATE_TABLE_LIKE_COMMENTS = 1 << 4,+ CREATE_TABLE_LIKE_ALL = PG_INT32_MAX+} TableLikeOption;++/*+ * IndexElem - index parameters (used in CREATE INDEX, and in ON CONFLICT)+ *+ * For a plain index attribute, 'name' is the name of the table column to+ * index, and 'expr' is NULL. For an index expression, 'name' is NULL and+ * 'expr' is the expression tree.+ */+typedef struct IndexElem+{+ NodeTag type;+ char *name; /* name of attribute to index, or NULL */+ Node *expr; /* expression to index, or NULL */+ char *indexcolname; /* name for index column; NULL = default */+ List *collation; /* name of collation; NIL = default */+ List *opclass; /* name of desired opclass; NIL = default */+ SortByDir ordering; /* ASC/DESC/default */+ SortByNulls nulls_ordering; /* FIRST/LAST/default */+} IndexElem;++/*+ * DefElem - a generic "name = value" option definition+ *+ * In some contexts the name can be qualified. Also, certain SQL commands+ * allow a SET/ADD/DROP action to be attached to option settings, so it's+ * convenient to carry a field for that too. (Note: currently, it is our+ * practice that the grammar allows namespace and action only in statements+ * where they are relevant; C code can just ignore those fields in other+ * statements.)+ */+typedef enum DefElemAction+{+ DEFELEM_UNSPEC, /* no action given */+ DEFELEM_SET,+ DEFELEM_ADD,+ DEFELEM_DROP+} DefElemAction;++typedef struct DefElem+{+ NodeTag type;+ char *defnamespace; /* NULL if unqualified name */+ char *defname;+ Node *arg; /* a (Value *) or a (TypeName *) */+ DefElemAction defaction; /* unspecified action, or SET/ADD/DROP */+ int location; /* parse location, or -1 if none/unknown */+} DefElem;++/*+ * LockingClause - raw representation of FOR [NO KEY] UPDATE/[KEY] SHARE+ * options+ *+ * Note: lockedRels == NIL means "all relations in query". Otherwise it+ * is a list of RangeVar nodes. (We use RangeVar mainly because it carries+ * a location field --- currently, parse analysis insists on unqualified+ * names in LockingClause.)+ */+typedef struct LockingClause+{+ NodeTag type;+ List *lockedRels; /* FOR [KEY] UPDATE/SHARE relations */+ LockClauseStrength strength;+ LockWaitPolicy waitPolicy; /* NOWAIT and SKIP LOCKED */+} LockingClause;++/*+ * XMLSERIALIZE (in raw parse tree only)+ */+typedef struct XmlSerialize+{+ NodeTag type;+ XmlOptionType xmloption; /* DOCUMENT or CONTENT */+ Node *expr;+ TypeName *typeName;+ int location; /* token location, or -1 if unknown */+} XmlSerialize;+++/****************************************************************************+ * Nodes for a Query tree+ ****************************************************************************/++/*--------------------+ * RangeTblEntry -+ * A range table is a List of RangeTblEntry nodes.+ *+ * A range table entry may represent a plain relation, a sub-select in+ * FROM, or the result of a JOIN clause. (Only explicit JOIN syntax+ * produces an RTE, not the implicit join resulting from multiple FROM+ * items. This is because we only need the RTE to deal with SQL features+ * like outer joins and join-output-column aliasing.) Other special+ * RTE types also exist, as indicated by RTEKind.+ *+ * Note that we consider RTE_RELATION to cover anything that has a pg_class+ * entry. relkind distinguishes the sub-cases.+ *+ * alias is an Alias node representing the AS alias-clause attached to the+ * FROM expression, or NULL if no clause.+ *+ * eref is the table reference name and column reference names (either+ * real or aliases). Note that system columns (OID etc) are not included+ * in the column list.+ * eref->aliasname is required to be present, and should generally be used+ * to identify the RTE for error messages etc.+ *+ * In RELATION RTEs, the colnames in both alias and eref are indexed by+ * physical attribute number; this means there must be colname entries for+ * dropped columns. When building an RTE we insert empty strings ("") for+ * dropped columns. Note however that a stored rule may have nonempty+ * colnames for columns dropped since the rule was created (and for that+ * matter the colnames might be out of date due to column renamings).+ * The same comments apply to FUNCTION RTEs when a function's return type+ * is a named composite type.+ *+ * In JOIN RTEs, the colnames in both alias and eref are one-to-one with+ * joinaliasvars entries. A JOIN RTE will omit columns of its inputs when+ * those columns are known to be dropped at parse time. Again, however,+ * a stored rule might contain entries for columns dropped since the rule+ * was created. (This is only possible for columns not actually referenced+ * in the rule.) When loading a stored rule, we replace the joinaliasvars+ * items for any such columns with null pointers. (We can't simply delete+ * them from the joinaliasvars list, because that would affect the attnums+ * of Vars referencing the rest of the list.)+ *+ * inh is TRUE for relation references that should be expanded to include+ * inheritance children, if the rel has any. This *must* be FALSE for+ * RTEs other than RTE_RELATION entries.+ *+ * inFromCl marks those range variables that are listed in the FROM clause.+ * It's false for RTEs that are added to a query behind the scenes, such+ * as the NEW and OLD variables for a rule, or the subqueries of a UNION.+ * This flag is not used anymore during parsing, since the parser now uses+ * a separate "namespace" data structure to control visibility, but it is+ * needed by ruleutils.c to determine whether RTEs should be shown in+ * decompiled queries.+ *+ * requiredPerms and checkAsUser specify run-time access permissions+ * checks to be performed at query startup. The user must have *all*+ * of the permissions that are OR'd together in requiredPerms (zero+ * indicates no permissions checking). If checkAsUser is not zero,+ * then do the permissions checks using the access rights of that user,+ * not the current effective user ID. (This allows rules to act as+ * setuid gateways.) Permissions checks only apply to RELATION RTEs.+ *+ * For SELECT/INSERT/UPDATE permissions, if the user doesn't have+ * table-wide permissions then it is sufficient to have the permissions+ * on all columns identified in selectedCols (for SELECT) and/or+ * insertedCols and/or updatedCols (INSERT with ON CONFLICT DO UPDATE may+ * have all 3). selectedCols, insertedCols and updatedCols are bitmapsets,+ * which cannot have negative integer members, so we subtract+ * FirstLowInvalidHeapAttributeNumber from column numbers before storing+ * them in these fields. A whole-row Var reference is represented by+ * setting the bit for InvalidAttrNumber.+ *--------------------+ */+typedef enum RTEKind+{+ RTE_RELATION, /* ordinary relation reference */+ RTE_SUBQUERY, /* subquery in FROM */+ RTE_JOIN, /* join */+ RTE_FUNCTION, /* function in FROM */+ RTE_VALUES, /* VALUES (<exprlist>), (<exprlist>), ... */+ RTE_CTE /* common table expr (WITH list element) */+} RTEKind;++typedef struct RangeTblEntry+{+ NodeTag type;++ RTEKind rtekind; /* see above */++ /*+ * XXX the fields applicable to only some rte kinds should be merged into+ * a union. I didn't do this yet because the diffs would impact a lot of+ * code that is being actively worked on. FIXME someday.+ */++ /*+ * Fields valid for a plain relation RTE (else zero):+ */+ Oid relid; /* OID of the relation */+ char relkind; /* relation kind (see pg_class.relkind) */+ struct TableSampleClause *tablesample; /* sampling info, or NULL */++ /*+ * Fields valid for a subquery RTE (else NULL):+ */+ Query *subquery; /* the sub-query */+ bool security_barrier; /* is from security_barrier view? */++ /*+ * Fields valid for a join RTE (else NULL/zero):+ *+ * joinaliasvars is a list of (usually) Vars corresponding to the columns+ * of the join result. An alias Var referencing column K of the join+ * result can be replaced by the K'th element of joinaliasvars --- but to+ * simplify the task of reverse-listing aliases correctly, we do not do+ * that until planning time. In detail: an element of joinaliasvars can+ * be a Var of one of the join's input relations, or such a Var with an+ * implicit coercion to the join's output column type, or a COALESCE+ * expression containing the two input column Vars (possibly coerced).+ * Within a Query loaded from a stored rule, it is also possible for+ * joinaliasvars items to be null pointers, which are placeholders for+ * (necessarily unreferenced) columns dropped since the rule was made.+ * Also, once planning begins, joinaliasvars items can be almost anything,+ * as a result of subquery-flattening substitutions.+ */+ JoinType jointype; /* type of join */+ List *joinaliasvars; /* list of alias-var expansions */++ /*+ * Fields valid for a function RTE (else NIL/zero):+ *+ * When funcordinality is true, the eref->colnames list includes an alias+ * for the ordinality column. The ordinality column is otherwise+ * implicit, and must be accounted for "by hand" in places such as+ * expandRTE().+ */+ List *functions; /* list of RangeTblFunction nodes */+ bool funcordinality; /* is this called WITH ORDINALITY? */++ /*+ * Fields valid for a values RTE (else NIL):+ */+ List *values_lists; /* list of expression lists */+ List *values_collations; /* OID list of column collation OIDs */++ /*+ * Fields valid for a CTE RTE (else NULL/zero):+ */+ char *ctename; /* name of the WITH list item */+ Index ctelevelsup; /* number of query levels up */+ bool self_reference; /* is this a recursive self-reference? */+ List *ctecoltypes; /* OID list of column type OIDs */+ List *ctecoltypmods; /* integer list of column typmods */+ List *ctecolcollations; /* OID list of column collation OIDs */++ /*+ * Fields valid in all RTEs:+ */+ Alias *alias; /* user-written alias clause, if any */+ Alias *eref; /* expanded reference names */+ bool lateral; /* subquery, function, or values is LATERAL? */+ bool inh; /* inheritance requested? */+ bool inFromCl; /* present in FROM clause? */+ AclMode requiredPerms; /* bitmask of required access permissions */+ Oid checkAsUser; /* if valid, check access as this role */+ Bitmapset *selectedCols; /* columns needing SELECT permission */+ Bitmapset *insertedCols; /* columns needing INSERT permission */+ Bitmapset *updatedCols; /* columns needing UPDATE permission */+ List *securityQuals; /* any security barrier quals to apply */+} RangeTblEntry;++/*+ * RangeTblFunction -+ * RangeTblEntry subsidiary data for one function in a FUNCTION RTE.+ *+ * If the function had a column definition list (required for an+ * otherwise-unspecified RECORD result), funccolnames lists the names given+ * in the definition list, funccoltypes lists their declared column types,+ * funccoltypmods lists their typmods, funccolcollations their collations.+ * Otherwise, those fields are NIL.+ *+ * Notice we don't attempt to store info about the results of functions+ * returning named composite types, because those can change from time to+ * time. We do however remember how many columns we thought the type had+ * (including dropped columns!), so that we can successfully ignore any+ * columns added after the query was parsed.+ */+typedef struct RangeTblFunction+{+ NodeTag type;++ Node *funcexpr; /* expression tree for func call */+ int funccolcount; /* number of columns it contributes to RTE */+ /* These fields record the contents of a column definition list, if any: */+ List *funccolnames; /* column names (list of String) */+ List *funccoltypes; /* OID list of column type OIDs */+ List *funccoltypmods; /* integer list of column typmods */+ List *funccolcollations; /* OID list of column collation OIDs */+ /* This is set during planning for use by the executor: */+ Bitmapset *funcparams; /* PARAM_EXEC Param IDs affecting this func */+} RangeTblFunction;++/*+ * TableSampleClause - TABLESAMPLE appearing in a transformed FROM clause+ *+ * Unlike RangeTableSample, this is a subnode of the relevant RangeTblEntry.+ */+typedef struct TableSampleClause+{+ NodeTag type;+ Oid tsmhandler; /* OID of the tablesample handler function */+ List *args; /* tablesample argument expression(s) */+ Expr *repeatable; /* REPEATABLE expression, or NULL if none */+} TableSampleClause;++/*+ * WithCheckOption -+ * representation of WITH CHECK OPTION checks to be applied to new tuples+ * when inserting/updating an auto-updatable view, or RLS WITH CHECK+ * policies to be applied when inserting/updating a relation with RLS.+ */+typedef enum WCOKind+{+ WCO_VIEW_CHECK, /* WCO on an auto-updatable view */+ WCO_RLS_INSERT_CHECK, /* RLS INSERT WITH CHECK policy */+ WCO_RLS_UPDATE_CHECK, /* RLS UPDATE WITH CHECK policy */+ WCO_RLS_CONFLICT_CHECK /* RLS ON CONFLICT DO UPDATE USING policy */+} WCOKind;++typedef struct WithCheckOption+{+ NodeTag type;+ WCOKind kind; /* kind of WCO */+ char *relname; /* name of relation that specified the WCO */+ char *polname; /* name of RLS policy being checked */+ Node *qual; /* constraint qual to check */+ bool cascaded; /* true for a cascaded WCO on a view */+} WithCheckOption;++/*+ * SortGroupClause -+ * representation of ORDER BY, GROUP BY, PARTITION BY,+ * DISTINCT, DISTINCT ON items+ *+ * You might think that ORDER BY is only interested in defining ordering,+ * and GROUP/DISTINCT are only interested in defining equality. However,+ * one way to implement grouping is to sort and then apply a "uniq"-like+ * filter. So it's also interesting to keep track of possible sort operators+ * for GROUP/DISTINCT, and in particular to try to sort for the grouping+ * in a way that will also yield a requested ORDER BY ordering. So we need+ * to be able to compare ORDER BY and GROUP/DISTINCT lists, which motivates+ * the decision to give them the same representation.+ *+ * tleSortGroupRef must match ressortgroupref of exactly one entry of the+ * query's targetlist; that is the expression to be sorted or grouped by.+ * eqop is the OID of the equality operator.+ * sortop is the OID of the ordering operator (a "<" or ">" operator),+ * or InvalidOid if not available.+ * nulls_first means about what you'd expect. If sortop is InvalidOid+ * then nulls_first is meaningless and should be set to false.+ * hashable is TRUE if eqop is hashable (note this condition also depends+ * on the datatype of the input expression).+ *+ * In an ORDER BY item, all fields must be valid. (The eqop isn't essential+ * here, but it's cheap to get it along with the sortop, and requiring it+ * to be valid eases comparisons to grouping items.) Note that this isn't+ * actually enough information to determine an ordering: if the sortop is+ * collation-sensitive, a collation OID is needed too. We don't store the+ * collation in SortGroupClause because it's not available at the time the+ * parser builds the SortGroupClause; instead, consult the exposed collation+ * of the referenced targetlist expression to find out what it is.+ *+ * In a grouping item, eqop must be valid. If the eqop is a btree equality+ * operator, then sortop should be set to a compatible ordering operator.+ * We prefer to set eqop/sortop/nulls_first to match any ORDER BY item that+ * the query presents for the same tlist item. If there is none, we just+ * use the default ordering op for the datatype.+ *+ * If the tlist item's type has a hash opclass but no btree opclass, then+ * we will set eqop to the hash equality operator, sortop to InvalidOid,+ * and nulls_first to false. A grouping item of this kind can only be+ * implemented by hashing, and of course it'll never match an ORDER BY item.+ *+ * The hashable flag is provided since we generally have the requisite+ * information readily available when the SortGroupClause is constructed,+ * and it's relatively expensive to get it again later. Note there is no+ * need for a "sortable" flag since OidIsValid(sortop) serves the purpose.+ *+ * A query might have both ORDER BY and DISTINCT (or DISTINCT ON) clauses.+ * In SELECT DISTINCT, the distinctClause list is as long or longer than the+ * sortClause list, while in SELECT DISTINCT ON it's typically shorter.+ * The two lists must match up to the end of the shorter one --- the parser+ * rearranges the distinctClause if necessary to make this true. (This+ * restriction ensures that only one sort step is needed to both satisfy the+ * ORDER BY and set up for the Unique step. This is semantically necessary+ * for DISTINCT ON, and presents no real drawback for DISTINCT.)+ */+typedef struct SortGroupClause+{+ NodeTag type;+ Index tleSortGroupRef; /* reference into targetlist */+ Oid eqop; /* the equality operator ('=' op) */+ Oid sortop; /* the ordering operator ('<' op), or 0 */+ bool nulls_first; /* do NULLs come before normal values? */+ bool hashable; /* can eqop be implemented by hashing? */+} SortGroupClause;++/*+ * GroupingSet -+ * representation of CUBE, ROLLUP and GROUPING SETS clauses+ *+ * In a Query with grouping sets, the groupClause contains a flat list of+ * SortGroupClause nodes for each distinct expression used. The actual+ * structure of the GROUP BY clause is given by the groupingSets tree.+ *+ * In the raw parser output, GroupingSet nodes (of all types except SIMPLE+ * which is not used) are potentially mixed in with the expressions in the+ * groupClause of the SelectStmt. (An expression can't contain a GroupingSet,+ * but a list may mix GroupingSet and expression nodes.) At this stage, the+ * content of each node is a list of expressions, some of which may be RowExprs+ * which represent sublists rather than actual row constructors, and nested+ * GroupingSet nodes where legal in the grammar. The structure directly+ * reflects the query syntax.+ *+ * In parse analysis, the transformed expressions are used to build the tlist+ * and groupClause list (of SortGroupClause nodes), and the groupingSets tree+ * is eventually reduced to a fixed format:+ *+ * EMPTY nodes represent (), and obviously have no content+ *+ * SIMPLE nodes represent a list of one or more expressions to be treated as an+ * atom by the enclosing structure; the content is an integer list of+ * ressortgroupref values (see SortGroupClause)+ *+ * CUBE and ROLLUP nodes contain a list of one or more SIMPLE nodes.+ *+ * SETS nodes contain a list of EMPTY, SIMPLE, CUBE or ROLLUP nodes, but after+ * parse analysis they cannot contain more SETS nodes; enough of the syntactic+ * transforms of the spec have been applied that we no longer have arbitrarily+ * deep nesting (though we still preserve the use of cube/rollup).+ *+ * Note that if the groupingSets tree contains no SIMPLE nodes (only EMPTY+ * nodes at the leaves), then the groupClause will be empty, but this is still+ * an aggregation query (similar to using aggs or HAVING without GROUP BY).+ *+ * As an example, the following clause:+ *+ * GROUP BY GROUPING SETS ((a,b), CUBE(c,(d,e)))+ *+ * looks like this after raw parsing:+ *+ * SETS( RowExpr(a,b) , CUBE( c, RowExpr(d,e) ) )+ *+ * and parse analysis converts it to:+ *+ * SETS( SIMPLE(1,2), CUBE( SIMPLE(3), SIMPLE(4,5) ) )+ */+typedef enum+{+ GROUPING_SET_EMPTY,+ GROUPING_SET_SIMPLE,+ GROUPING_SET_ROLLUP,+ GROUPING_SET_CUBE,+ GROUPING_SET_SETS+} GroupingSetKind;++typedef struct GroupingSet+{+ NodeTag type;+ GroupingSetKind kind;+ List *content;+ int location;+} GroupingSet;++/*+ * WindowClause -+ * transformed representation of WINDOW and OVER clauses+ *+ * A parsed Query's windowClause list contains these structs. "name" is set+ * if the clause originally came from WINDOW, and is NULL if it originally+ * was an OVER clause (but note that we collapse out duplicate OVERs).+ * partitionClause and orderClause are lists of SortGroupClause structs.+ * winref is an ID number referenced by WindowFunc nodes; it must be unique+ * among the members of a Query's windowClause list.+ * When refname isn't null, the partitionClause is always copied from there;+ * the orderClause might or might not be copied (see copiedOrder); the framing+ * options are never copied, per spec.+ */+typedef struct WindowClause+{+ NodeTag type;+ char *name; /* window name (NULL in an OVER clause) */+ char *refname; /* referenced window name, if any */+ List *partitionClause; /* PARTITION BY list */+ List *orderClause; /* ORDER BY list */+ int frameOptions; /* frame_clause options, see WindowDef */+ Node *startOffset; /* expression for starting bound, if any */+ Node *endOffset; /* expression for ending bound, if any */+ Index winref; /* ID referenced by window functions */+ bool copiedOrder; /* did we copy orderClause from refname? */+} WindowClause;++/*+ * RowMarkClause -+ * parser output representation of FOR [KEY] UPDATE/SHARE clauses+ *+ * Query.rowMarks contains a separate RowMarkClause node for each relation+ * identified as a FOR [KEY] UPDATE/SHARE target. If one of these clauses+ * is applied to a subquery, we generate RowMarkClauses for all normal and+ * subquery rels in the subquery, but they are marked pushedDown = true to+ * distinguish them from clauses that were explicitly written at this query+ * level. Also, Query.hasForUpdate tells whether there were explicit FOR+ * UPDATE/SHARE/KEY SHARE clauses in the current query level.+ */+typedef struct RowMarkClause+{+ NodeTag type;+ Index rti; /* range table index of target relation */+ LockClauseStrength strength;+ LockWaitPolicy waitPolicy; /* NOWAIT and SKIP LOCKED */+ bool pushedDown; /* pushed down from higher query level? */+} RowMarkClause;++/*+ * WithClause -+ * representation of WITH clause+ *+ * Note: WithClause does not propagate into the Query representation;+ * but CommonTableExpr does.+ */+typedef struct WithClause+{+ NodeTag type;+ List *ctes; /* list of CommonTableExprs */+ bool recursive; /* true = WITH RECURSIVE */+ int location; /* token location, or -1 if unknown */+} WithClause;++/*+ * InferClause -+ * ON CONFLICT unique index inference clause+ *+ * Note: InferClause does not propagate into the Query representation.+ */+typedef struct InferClause+{+ NodeTag type;+ List *indexElems; /* IndexElems to infer unique index */+ Node *whereClause; /* qualification (partial-index predicate) */+ char *conname; /* Constraint name, or NULL if unnamed */+ int location; /* token location, or -1 if unknown */+} InferClause;++/*+ * OnConflictClause -+ * representation of ON CONFLICT clause+ *+ * Note: OnConflictClause does not propagate into the Query representation.+ */+typedef struct OnConflictClause+{+ NodeTag type;+ OnConflictAction action; /* DO NOTHING or UPDATE? */+ InferClause *infer; /* Optional index inference clause */+ List *targetList; /* the target list (of ResTarget) */+ Node *whereClause; /* qualifications */+ int location; /* token location, or -1 if unknown */+} OnConflictClause;++/*+ * CommonTableExpr -+ * representation of WITH list element+ *+ * We don't currently support the SEARCH or CYCLE clause.+ */+typedef struct CommonTableExpr+{+ NodeTag type;+ char *ctename; /* query name (never qualified) */+ List *aliascolnames; /* optional list of column names */+ /* SelectStmt/InsertStmt/etc before parse analysis, Query afterwards: */+ Node *ctequery; /* the CTE's subquery */+ int location; /* token location, or -1 if unknown */+ /* These fields are set during parse analysis: */+ bool cterecursive; /* is this CTE actually recursive? */+ int cterefcount; /* number of RTEs referencing this CTE+ * (excluding internal self-references) */+ List *ctecolnames; /* list of output column names */+ List *ctecoltypes; /* OID list of output column type OIDs */+ List *ctecoltypmods; /* integer list of output column typmods */+ List *ctecolcollations; /* OID list of column collation OIDs */+} CommonTableExpr;++/* Convenience macro to get the output tlist of a CTE's query */+#define GetCTETargetList(cte) \+ (AssertMacro(IsA((cte)->ctequery, Query)), \+ ((Query *) (cte)->ctequery)->commandType == CMD_SELECT ? \+ ((Query *) (cte)->ctequery)->targetList : \+ ((Query *) (cte)->ctequery)->returningList)+++/*****************************************************************************+ * Optimizable Statements+ *****************************************************************************/++/* ----------------------+ * Insert Statement+ *+ * The source expression is represented by SelectStmt for both the+ * SELECT and VALUES cases. If selectStmt is NULL, then the query+ * is INSERT ... DEFAULT VALUES.+ * ----------------------+ */+typedef struct InsertStmt+{+ NodeTag type;+ RangeVar *relation; /* relation to insert into */+ List *cols; /* optional: names of the target columns */+ Node *selectStmt; /* the source SELECT/VALUES, or NULL */+ OnConflictClause *onConflictClause; /* ON CONFLICT clause */+ List *returningList; /* list of expressions to return */+ WithClause *withClause; /* WITH clause */+} InsertStmt;++/* ----------------------+ * Delete Statement+ * ----------------------+ */+typedef struct DeleteStmt+{+ NodeTag type;+ RangeVar *relation; /* relation to delete from */+ List *usingClause; /* optional using clause for more tables */+ Node *whereClause; /* qualifications */+ List *returningList; /* list of expressions to return */+ WithClause *withClause; /* WITH clause */+} DeleteStmt;++/* ----------------------+ * Update Statement+ * ----------------------+ */+typedef struct UpdateStmt+{+ NodeTag type;+ RangeVar *relation; /* relation to update */+ List *targetList; /* the target list (of ResTarget) */+ Node *whereClause; /* qualifications */+ List *fromClause; /* optional from clause for more tables */+ List *returningList; /* list of expressions to return */+ WithClause *withClause; /* WITH clause */+} UpdateStmt;++/* ----------------------+ * Select Statement+ *+ * A "simple" SELECT is represented in the output of gram.y by a single+ * SelectStmt node; so is a VALUES construct. A query containing set+ * operators (UNION, INTERSECT, EXCEPT) is represented by a tree of SelectStmt+ * nodes, in which the leaf nodes are component SELECTs and the internal nodes+ * represent UNION, INTERSECT, or EXCEPT operators. Using the same node+ * type for both leaf and internal nodes allows gram.y to stick ORDER BY,+ * LIMIT, etc, clause values into a SELECT statement without worrying+ * whether it is a simple or compound SELECT.+ * ----------------------+ */+typedef enum SetOperation+{+ SETOP_NONE = 0,+ SETOP_UNION,+ SETOP_INTERSECT,+ SETOP_EXCEPT+} SetOperation;++typedef struct SelectStmt+{+ NodeTag type;++ /*+ * These fields are used only in "leaf" SelectStmts.+ */+ List *distinctClause; /* NULL, list of DISTINCT ON exprs, or+ * lcons(NIL,NIL) for all (SELECT DISTINCT) */+ IntoClause *intoClause; /* target for SELECT INTO */+ List *targetList; /* the target list (of ResTarget) */+ List *fromClause; /* the FROM clause */+ Node *whereClause; /* WHERE qualification */+ List *groupClause; /* GROUP BY clauses */+ Node *havingClause; /* HAVING conditional-expression */+ List *windowClause; /* WINDOW window_name AS (...), ... */++ /*+ * In a "leaf" node representing a VALUES list, the above fields are all+ * null, and instead this field is set. Note that the elements of the+ * sublists are just expressions, without ResTarget decoration. Also note+ * that a list element can be DEFAULT (represented as a SetToDefault+ * node), regardless of the context of the VALUES list. It's up to parse+ * analysis to reject that where not valid.+ */+ List *valuesLists; /* untransformed list of expression lists */++ /*+ * These fields are used in both "leaf" SelectStmts and upper-level+ * SelectStmts.+ */+ List *sortClause; /* sort clause (a list of SortBy's) */+ Node *limitOffset; /* # of result tuples to skip */+ Node *limitCount; /* # of result tuples to return */+ List *lockingClause; /* FOR UPDATE (list of LockingClause's) */+ WithClause *withClause; /* WITH clause */++ /*+ * These fields are used only in upper-level SelectStmts.+ */+ SetOperation op; /* type of set op */+ bool all; /* ALL specified? */+ struct SelectStmt *larg; /* left child */+ struct SelectStmt *rarg; /* right child */+ /* Eventually add fields for CORRESPONDING spec here */+} SelectStmt;+++/* ----------------------+ * Set Operation node for post-analysis query trees+ *+ * After parse analysis, a SELECT with set operations is represented by a+ * top-level Query node containing the leaf SELECTs as subqueries in its+ * range table. Its setOperations field shows the tree of set operations,+ * with leaf SelectStmt nodes replaced by RangeTblRef nodes, and internal+ * nodes replaced by SetOperationStmt nodes. Information about the output+ * column types is added, too. (Note that the child nodes do not necessarily+ * produce these types directly, but we've checked that their output types+ * can be coerced to the output column type.) Also, if it's not UNION ALL,+ * information about the types' sort/group semantics is provided in the form+ * of a SortGroupClause list (same representation as, eg, DISTINCT).+ * The resolved common column collations are provided too; but note that if+ * it's not UNION ALL, it's okay for a column to not have a common collation,+ * so a member of the colCollations list could be InvalidOid even though the+ * column has a collatable type.+ * ----------------------+ */+typedef struct SetOperationStmt+{+ NodeTag type;+ SetOperation op; /* type of set op */+ bool all; /* ALL specified? */+ Node *larg; /* left child */+ Node *rarg; /* right child */+ /* Eventually add fields for CORRESPONDING spec here */++ /* Fields derived during parse analysis: */+ List *colTypes; /* OID list of output column type OIDs */+ List *colTypmods; /* integer list of output column typmods */+ List *colCollations; /* OID list of output column collation OIDs */+ List *groupClauses; /* a list of SortGroupClause's */+ /* groupClauses is NIL if UNION ALL, but must be set otherwise */+} SetOperationStmt;+++/*****************************************************************************+ * Other Statements (no optimizations required)+ *+ * These are not touched by parser/analyze.c except to put them into+ * the utilityStmt field of a Query. This is eventually passed to+ * ProcessUtility (by-passing rewriting and planning). Some of the+ * statements do need attention from parse analysis, and this is+ * done by routines in parser/parse_utilcmd.c after ProcessUtility+ * receives the command for execution.+ *****************************************************************************/++/*+ * When a command can act on several kinds of objects with only one+ * parse structure required, use these constants to designate the+ * object type. Note that commands typically don't support all the types.+ */++typedef enum ObjectType+{+ OBJECT_AGGREGATE,+ OBJECT_AMOP,+ OBJECT_AMPROC,+ OBJECT_ATTRIBUTE, /* type's attribute, when distinct from column */+ OBJECT_CAST,+ OBJECT_COLUMN,+ OBJECT_COLLATION,+ OBJECT_CONVERSION,+ OBJECT_DATABASE,+ OBJECT_DEFAULT,+ OBJECT_DEFACL,+ OBJECT_DOMAIN,+ OBJECT_DOMCONSTRAINT,+ OBJECT_EVENT_TRIGGER,+ OBJECT_EXTENSION,+ OBJECT_FDW,+ OBJECT_FOREIGN_SERVER,+ OBJECT_FOREIGN_TABLE,+ OBJECT_FUNCTION,+ OBJECT_INDEX,+ OBJECT_LANGUAGE,+ OBJECT_LARGEOBJECT,+ OBJECT_MATVIEW,+ OBJECT_OPCLASS,+ OBJECT_OPERATOR,+ OBJECT_OPFAMILY,+ OBJECT_POLICY,+ OBJECT_ROLE,+ OBJECT_RULE,+ OBJECT_SCHEMA,+ OBJECT_SEQUENCE,+ OBJECT_TABCONSTRAINT,+ OBJECT_TABLE,+ OBJECT_TABLESPACE,+ OBJECT_TRANSFORM,+ OBJECT_TRIGGER,+ OBJECT_TSCONFIGURATION,+ OBJECT_TSDICTIONARY,+ OBJECT_TSPARSER,+ OBJECT_TSTEMPLATE,+ OBJECT_TYPE,+ OBJECT_USER_MAPPING,+ OBJECT_VIEW+} ObjectType;++/* ----------------------+ * Create Schema Statement+ *+ * NOTE: the schemaElts list contains raw parsetrees for component statements+ * of the schema, such as CREATE TABLE, GRANT, etc. These are analyzed and+ * executed after the schema itself is created.+ * ----------------------+ */+typedef struct CreateSchemaStmt+{+ NodeTag type;+ char *schemaname; /* the name of the schema to create */+ Node *authrole; /* the owner of the created schema */+ List *schemaElts; /* schema components (list of parsenodes) */+ bool if_not_exists; /* just do nothing if schema already exists? */+} CreateSchemaStmt;++typedef enum DropBehavior+{+ DROP_RESTRICT, /* drop fails if any dependent objects */+ DROP_CASCADE /* remove dependent objects too */+} DropBehavior;++/* ----------------------+ * Alter Table+ * ----------------------+ */+typedef struct AlterTableStmt+{+ NodeTag type;+ RangeVar *relation; /* table to work on */+ List *cmds; /* list of subcommands */+ ObjectType relkind; /* type of object */+ bool missing_ok; /* skip error if table missing */+} AlterTableStmt;++typedef enum AlterTableType+{+ AT_AddColumn, /* add column */+ AT_AddColumnRecurse, /* internal to commands/tablecmds.c */+ AT_AddColumnToView, /* implicitly via CREATE OR REPLACE VIEW */+ AT_ColumnDefault, /* alter column default */+ AT_DropNotNull, /* alter column drop not null */+ AT_SetNotNull, /* alter column set not null */+ AT_SetStatistics, /* alter column set statistics */+ AT_SetOptions, /* alter column set ( options ) */+ AT_ResetOptions, /* alter column reset ( options ) */+ AT_SetStorage, /* alter column set storage */+ AT_DropColumn, /* drop column */+ AT_DropColumnRecurse, /* internal to commands/tablecmds.c */+ AT_AddIndex, /* add index */+ AT_ReAddIndex, /* internal to commands/tablecmds.c */+ AT_AddConstraint, /* add constraint */+ AT_AddConstraintRecurse, /* internal to commands/tablecmds.c */+ AT_ReAddConstraint, /* internal to commands/tablecmds.c */+ AT_AlterConstraint, /* alter constraint */+ AT_ValidateConstraint, /* validate constraint */+ AT_ValidateConstraintRecurse, /* internal to commands/tablecmds.c */+ AT_ProcessedConstraint, /* pre-processed add constraint (local in+ * parser/parse_utilcmd.c) */+ AT_AddIndexConstraint, /* add constraint using existing index */+ AT_DropConstraint, /* drop constraint */+ AT_DropConstraintRecurse, /* internal to commands/tablecmds.c */+ AT_ReAddComment, /* internal to commands/tablecmds.c */+ AT_AlterColumnType, /* alter column type */+ AT_AlterColumnGenericOptions, /* alter column OPTIONS (...) */+ AT_ChangeOwner, /* change owner */+ AT_ClusterOn, /* CLUSTER ON */+ AT_DropCluster, /* SET WITHOUT CLUSTER */+ AT_SetLogged, /* SET LOGGED */+ AT_SetUnLogged, /* SET UNLOGGED */+ AT_AddOids, /* SET WITH OIDS */+ AT_AddOidsRecurse, /* internal to commands/tablecmds.c */+ AT_DropOids, /* SET WITHOUT OIDS */+ AT_SetTableSpace, /* SET TABLESPACE */+ AT_SetRelOptions, /* SET (...) -- AM specific parameters */+ AT_ResetRelOptions, /* RESET (...) -- AM specific parameters */+ AT_ReplaceRelOptions, /* replace reloption list in its entirety */+ AT_EnableTrig, /* ENABLE TRIGGER name */+ AT_EnableAlwaysTrig, /* ENABLE ALWAYS TRIGGER name */+ AT_EnableReplicaTrig, /* ENABLE REPLICA TRIGGER name */+ AT_DisableTrig, /* DISABLE TRIGGER name */+ AT_EnableTrigAll, /* ENABLE TRIGGER ALL */+ AT_DisableTrigAll, /* DISABLE TRIGGER ALL */+ AT_EnableTrigUser, /* ENABLE TRIGGER USER */+ AT_DisableTrigUser, /* DISABLE TRIGGER USER */+ AT_EnableRule, /* ENABLE RULE name */+ AT_EnableAlwaysRule, /* ENABLE ALWAYS RULE name */+ AT_EnableReplicaRule, /* ENABLE REPLICA RULE name */+ AT_DisableRule, /* DISABLE RULE name */+ AT_AddInherit, /* INHERIT parent */+ AT_DropInherit, /* NO INHERIT parent */+ AT_AddOf, /* OF <type_name> */+ AT_DropOf, /* NOT OF */+ AT_ReplicaIdentity, /* REPLICA IDENTITY */+ AT_EnableRowSecurity, /* ENABLE ROW SECURITY */+ AT_DisableRowSecurity, /* DISABLE ROW SECURITY */+ AT_ForceRowSecurity, /* FORCE ROW SECURITY */+ AT_NoForceRowSecurity, /* NO FORCE ROW SECURITY */+ AT_GenericOptions /* OPTIONS (...) */+} AlterTableType;++typedef struct ReplicaIdentityStmt+{+ NodeTag type;+ char identity_type;+ char *name;+} ReplicaIdentityStmt;++typedef struct AlterTableCmd /* one subcommand of an ALTER TABLE */+{+ NodeTag type;+ AlterTableType subtype; /* Type of table alteration to apply */+ char *name; /* column, constraint, or trigger to act on,+ * or tablespace */+ Node *newowner; /* RoleSpec */+ Node *def; /* definition of new column, index,+ * constraint, or parent table */+ DropBehavior behavior; /* RESTRICT or CASCADE for DROP cases */+ bool missing_ok; /* skip error if missing? */+} AlterTableCmd;+++/* ----------------------+ * Alter Domain+ *+ * The fields are used in different ways by the different variants of+ * this command.+ * ----------------------+ */+typedef struct AlterDomainStmt+{+ NodeTag type;+ char subtype; /*------------+ * T = alter column default+ * N = alter column drop not null+ * O = alter column set not null+ * C = add constraint+ * X = drop constraint+ *------------+ */+ List *typeName; /* domain to work on */+ char *name; /* column or constraint name to act on */+ Node *def; /* definition of default or constraint */+ DropBehavior behavior; /* RESTRICT or CASCADE for DROP cases */+ bool missing_ok; /* skip error if missing? */+} AlterDomainStmt;+++/* ----------------------+ * Grant|Revoke Statement+ * ----------------------+ */+typedef enum GrantTargetType+{+ ACL_TARGET_OBJECT, /* grant on specific named object(s) */+ ACL_TARGET_ALL_IN_SCHEMA, /* grant on all objects in given schema(s) */+ ACL_TARGET_DEFAULTS /* ALTER DEFAULT PRIVILEGES */+} GrantTargetType;++typedef enum GrantObjectType+{+ ACL_OBJECT_COLUMN, /* column */+ ACL_OBJECT_RELATION, /* table, view */+ ACL_OBJECT_SEQUENCE, /* sequence */+ ACL_OBJECT_DATABASE, /* database */+ ACL_OBJECT_DOMAIN, /* domain */+ ACL_OBJECT_FDW, /* foreign-data wrapper */+ ACL_OBJECT_FOREIGN_SERVER, /* foreign server */+ ACL_OBJECT_FUNCTION, /* function */+ ACL_OBJECT_LANGUAGE, /* procedural language */+ ACL_OBJECT_LARGEOBJECT, /* largeobject */+ ACL_OBJECT_NAMESPACE, /* namespace */+ ACL_OBJECT_TABLESPACE, /* tablespace */+ ACL_OBJECT_TYPE /* type */+} GrantObjectType;++typedef struct GrantStmt+{+ NodeTag type;+ bool is_grant; /* true = GRANT, false = REVOKE */+ GrantTargetType targtype; /* type of the grant target */+ GrantObjectType objtype; /* kind of object being operated on */+ List *objects; /* list of RangeVar nodes, FuncWithArgs nodes,+ * or plain names (as Value strings) */+ List *privileges; /* list of AccessPriv nodes */+ /* privileges == NIL denotes ALL PRIVILEGES */+ List *grantees; /* list of RoleSpec nodes */+ bool grant_option; /* grant or revoke grant option */+ DropBehavior behavior; /* drop behavior (for REVOKE) */+} GrantStmt;++/*+ * Note: FuncWithArgs carries only the types of the input parameters of the+ * function. So it is sufficient to identify an existing function, but it+ * is not enough info to define a function nor to call it.+ */+typedef struct FuncWithArgs+{+ NodeTag type;+ List *funcname; /* qualified name of function */+ List *funcargs; /* list of Typename nodes */+} FuncWithArgs;++/*+ * An access privilege, with optional list of column names+ * priv_name == NULL denotes ALL PRIVILEGES (only used with a column list)+ * cols == NIL denotes "all columns"+ * Note that simple "ALL PRIVILEGES" is represented as a NIL list, not+ * an AccessPriv with both fields null.+ */+typedef struct AccessPriv+{+ NodeTag type;+ char *priv_name; /* string name of privilege */+ List *cols; /* list of Value strings */+} AccessPriv;++/* ----------------------+ * Grant/Revoke Role Statement+ *+ * Note: because of the parsing ambiguity with the GRANT <privileges>+ * statement, granted_roles is a list of AccessPriv; the execution code+ * should complain if any column lists appear. grantee_roles is a list+ * of role names, as Value strings.+ * ----------------------+ */+typedef struct GrantRoleStmt+{+ NodeTag type;+ List *granted_roles; /* list of roles to be granted/revoked */+ List *grantee_roles; /* list of member roles to add/delete */+ bool is_grant; /* true = GRANT, false = REVOKE */+ bool admin_opt; /* with admin option */+ Node *grantor; /* set grantor to other than current role */+ DropBehavior behavior; /* drop behavior (for REVOKE) */+} GrantRoleStmt;++/* ----------------------+ * Alter Default Privileges Statement+ * ----------------------+ */+typedef struct AlterDefaultPrivilegesStmt+{+ NodeTag type;+ List *options; /* list of DefElem */+ GrantStmt *action; /* GRANT/REVOKE action (with objects=NIL) */+} AlterDefaultPrivilegesStmt;++/* ----------------------+ * Copy Statement+ *+ * We support "COPY relation FROM file", "COPY relation TO file", and+ * "COPY (query) TO file". In any given CopyStmt, exactly one of "relation"+ * and "query" must be non-NULL.+ * ----------------------+ */+typedef struct CopyStmt+{+ NodeTag type;+ RangeVar *relation; /* the relation to copy */+ Node *query; /* the SELECT query to copy */+ List *attlist; /* List of column names (as Strings), or NIL+ * for all columns */+ bool is_from; /* TO or FROM */+ bool is_program; /* is 'filename' a program to popen? */+ char *filename; /* filename, or NULL for STDIN/STDOUT */+ List *options; /* List of DefElem nodes */+} CopyStmt;++/* ----------------------+ * SET Statement (includes RESET)+ *+ * "SET var TO DEFAULT" and "RESET var" are semantically equivalent, but we+ * preserve the distinction in VariableSetKind for CreateCommandTag().+ * ----------------------+ */+typedef enum+{+ VAR_SET_VALUE, /* SET var = value */+ VAR_SET_DEFAULT, /* SET var TO DEFAULT */+ VAR_SET_CURRENT, /* SET var FROM CURRENT */+ VAR_SET_MULTI, /* special case for SET TRANSACTION ... */+ VAR_RESET, /* RESET var */+ VAR_RESET_ALL /* RESET ALL */+} VariableSetKind;++typedef struct VariableSetStmt+{+ NodeTag type;+ VariableSetKind kind;+ char *name; /* variable to be set */+ List *args; /* List of A_Const nodes */+ bool is_local; /* SET LOCAL? */+} VariableSetStmt;++/* ----------------------+ * Show Statement+ * ----------------------+ */+typedef struct VariableShowStmt+{+ NodeTag type;+ char *name;+} VariableShowStmt;++/* ----------------------+ * Create Table Statement+ *+ * NOTE: in the raw gram.y output, ColumnDef and Constraint nodes are+ * intermixed in tableElts, and constraints is NIL. After parse analysis,+ * tableElts contains just ColumnDefs, and constraints contains just+ * Constraint nodes (in fact, only CONSTR_CHECK nodes, in the present+ * implementation).+ * ----------------------+ */++typedef struct CreateStmt+{+ NodeTag type;+ RangeVar *relation; /* relation to create */+ List *tableElts; /* column definitions (list of ColumnDef) */+ List *inhRelations; /* relations to inherit from (list of+ * inhRelation) */+ TypeName *ofTypename; /* OF typename */+ List *constraints; /* constraints (list of Constraint nodes) */+ List *options; /* options from WITH clause */+ OnCommitAction oncommit; /* what do we do at COMMIT? */+ char *tablespacename; /* table space to use, or NULL */+ bool if_not_exists; /* just do nothing if it already exists? */+} CreateStmt;++/* ----------+ * Definitions for constraints in CreateStmt+ *+ * Note that column defaults are treated as a type of constraint,+ * even though that's a bit odd semantically.+ *+ * For constraints that use expressions (CONSTR_CHECK, CONSTR_DEFAULT)+ * we may have the expression in either "raw" form (an untransformed+ * parse tree) or "cooked" form (the nodeToString representation of+ * an executable expression tree), depending on how this Constraint+ * node was created (by parsing, or by inheritance from an existing+ * relation). We should never have both in the same node!+ *+ * FKCONSTR_ACTION_xxx values are stored into pg_constraint.confupdtype+ * and pg_constraint.confdeltype columns; FKCONSTR_MATCH_xxx values are+ * stored into pg_constraint.confmatchtype. Changing the code values may+ * require an initdb!+ *+ * If skip_validation is true then we skip checking that the existing rows+ * in the table satisfy the constraint, and just install the catalog entries+ * for the constraint. A new FK constraint is marked as valid iff+ * initially_valid is true. (Usually skip_validation and initially_valid+ * are inverses, but we can set both true if the table is known empty.)+ *+ * Constraint attributes (DEFERRABLE etc) are initially represented as+ * separate Constraint nodes for simplicity of parsing. parse_utilcmd.c makes+ * a pass through the constraints list to insert the info into the appropriate+ * Constraint node.+ * ----------+ */++typedef enum ConstrType /* types of constraints */+{+ CONSTR_NULL, /* not standard SQL, but a lot of people+ * expect it */+ CONSTR_NOTNULL,+ CONSTR_DEFAULT,+ CONSTR_CHECK,+ CONSTR_PRIMARY,+ CONSTR_UNIQUE,+ CONSTR_EXCLUSION,+ CONSTR_FOREIGN,+ CONSTR_ATTR_DEFERRABLE, /* attributes for previous constraint node */+ CONSTR_ATTR_NOT_DEFERRABLE,+ CONSTR_ATTR_DEFERRED,+ CONSTR_ATTR_IMMEDIATE+} ConstrType;++/* Foreign key action codes */+#define FKCONSTR_ACTION_NOACTION 'a'+#define FKCONSTR_ACTION_RESTRICT 'r'+#define FKCONSTR_ACTION_CASCADE 'c'+#define FKCONSTR_ACTION_SETNULL 'n'+#define FKCONSTR_ACTION_SETDEFAULT 'd'++/* Foreign key matchtype codes */+#define FKCONSTR_MATCH_FULL 'f'+#define FKCONSTR_MATCH_PARTIAL 'p'+#define FKCONSTR_MATCH_SIMPLE 's'++typedef struct Constraint+{+ NodeTag type;+ ConstrType contype; /* see above */++ /* Fields used for most/all constraint types: */+ char *conname; /* Constraint name, or NULL if unnamed */+ bool deferrable; /* DEFERRABLE? */+ bool initdeferred; /* INITIALLY DEFERRED? */+ int location; /* token location, or -1 if unknown */++ /* Fields used for constraints with expressions (CHECK and DEFAULT): */+ bool is_no_inherit; /* is constraint non-inheritable? */+ Node *raw_expr; /* expr, as untransformed parse tree */+ char *cooked_expr; /* expr, as nodeToString representation */++ /* Fields used for unique constraints (UNIQUE and PRIMARY KEY): */+ List *keys; /* String nodes naming referenced column(s) */++ /* Fields used for EXCLUSION constraints: */+ List *exclusions; /* list of (IndexElem, operator name) pairs */++ /* Fields used for index constraints (UNIQUE, PRIMARY KEY, EXCLUSION): */+ List *options; /* options from WITH clause */+ char *indexname; /* existing index to use; otherwise NULL */+ char *indexspace; /* index tablespace; NULL for default */+ /* These could be, but currently are not, used for UNIQUE/PKEY: */+ char *access_method; /* index access method; NULL for default */+ Node *where_clause; /* partial index predicate */++ /* Fields used for FOREIGN KEY constraints: */+ RangeVar *pktable; /* Primary key table */+ List *fk_attrs; /* Attributes of foreign key */+ List *pk_attrs; /* Corresponding attrs in PK table */+ char fk_matchtype; /* FULL, PARTIAL, SIMPLE */+ char fk_upd_action; /* ON UPDATE action */+ char fk_del_action; /* ON DELETE action */+ List *old_conpfeqop; /* pg_constraint.conpfeqop of my former self */+ Oid old_pktable_oid; /* pg_constraint.confrelid of my former self */++ /* Fields used for constraints that allow a NOT VALID specification */+ bool skip_validation; /* skip validation of existing rows? */+ bool initially_valid; /* mark the new constraint as valid? */+} Constraint;++/* ----------------------+ * Create/Drop Table Space Statements+ * ----------------------+ */++typedef struct CreateTableSpaceStmt+{+ NodeTag type;+ char *tablespacename;+ Node *owner;+ char *location;+ List *options;+} CreateTableSpaceStmt;++typedef struct DropTableSpaceStmt+{+ NodeTag type;+ char *tablespacename;+ bool missing_ok; /* skip error if missing? */+} DropTableSpaceStmt;++typedef struct AlterTableSpaceOptionsStmt+{+ NodeTag type;+ char *tablespacename;+ List *options;+ bool isReset;+} AlterTableSpaceOptionsStmt;++typedef struct AlterTableMoveAllStmt+{+ NodeTag type;+ char *orig_tablespacename;+ ObjectType objtype; /* Object type to move */+ List *roles; /* List of roles to move objects of */+ char *new_tablespacename;+ bool nowait;+} AlterTableMoveAllStmt;++/* ----------------------+ * Create/Alter Extension Statements+ * ----------------------+ */++typedef struct CreateExtensionStmt+{+ NodeTag type;+ char *extname;+ bool if_not_exists; /* just do nothing if it already exists? */+ List *options; /* List of DefElem nodes */+} CreateExtensionStmt;++/* Only used for ALTER EXTENSION UPDATE; later might need an action field */+typedef struct AlterExtensionStmt+{+ NodeTag type;+ char *extname;+ List *options; /* List of DefElem nodes */+} AlterExtensionStmt;++typedef struct AlterExtensionContentsStmt+{+ NodeTag type;+ char *extname; /* Extension's name */+ int action; /* +1 = add object, -1 = drop object */+ ObjectType objtype; /* Object's type */+ List *objname; /* Qualified name of the object */+ List *objargs; /* Arguments if needed (eg, for functions) */+} AlterExtensionContentsStmt;++/* ----------------------+ * Create/Alter FOREIGN DATA WRAPPER Statements+ * ----------------------+ */++typedef struct CreateFdwStmt+{+ NodeTag type;+ char *fdwname; /* foreign-data wrapper name */+ List *func_options; /* HANDLER/VALIDATOR options */+ List *options; /* generic options to FDW */+} CreateFdwStmt;++typedef struct AlterFdwStmt+{+ NodeTag type;+ char *fdwname; /* foreign-data wrapper name */+ List *func_options; /* HANDLER/VALIDATOR options */+ List *options; /* generic options to FDW */+} AlterFdwStmt;++/* ----------------------+ * Create/Alter FOREIGN SERVER Statements+ * ----------------------+ */++typedef struct CreateForeignServerStmt+{+ NodeTag type;+ char *servername; /* server name */+ char *servertype; /* optional server type */+ char *version; /* optional server version */+ char *fdwname; /* FDW name */+ List *options; /* generic options to server */+} CreateForeignServerStmt;++typedef struct AlterForeignServerStmt+{+ NodeTag type;+ char *servername; /* server name */+ char *version; /* optional server version */+ List *options; /* generic options to server */+ bool has_version; /* version specified */+} AlterForeignServerStmt;++/* ----------------------+ * Create FOREIGN TABLE Statement+ * ----------------------+ */++typedef struct CreateForeignTableStmt+{+ CreateStmt base;+ char *servername;+ List *options;+} CreateForeignTableStmt;++/* ----------------------+ * Create/Drop USER MAPPING Statements+ * ----------------------+ */++typedef struct CreateUserMappingStmt+{+ NodeTag type;+ Node *user; /* user role */+ char *servername; /* server name */+ List *options; /* generic options to server */+} CreateUserMappingStmt;++typedef struct AlterUserMappingStmt+{+ NodeTag type;+ Node *user; /* user role */+ char *servername; /* server name */+ List *options; /* generic options to server */+} AlterUserMappingStmt;++typedef struct DropUserMappingStmt+{+ NodeTag type;+ Node *user; /* user role */+ char *servername; /* server name */+ bool missing_ok; /* ignore missing mappings */+} DropUserMappingStmt;++/* ----------------------+ * Import Foreign Schema Statement+ * ----------------------+ */++typedef enum ImportForeignSchemaType+{+ FDW_IMPORT_SCHEMA_ALL, /* all relations wanted */+ FDW_IMPORT_SCHEMA_LIMIT_TO, /* include only listed tables in import */+ FDW_IMPORT_SCHEMA_EXCEPT /* exclude listed tables from import */+} ImportForeignSchemaType;++typedef struct ImportForeignSchemaStmt+{+ NodeTag type;+ char *server_name; /* FDW server name */+ char *remote_schema; /* remote schema name to query */+ char *local_schema; /* local schema to create objects in */+ ImportForeignSchemaType list_type; /* type of table list */+ List *table_list; /* List of RangeVar */+ List *options; /* list of options to pass to FDW */+} ImportForeignSchemaStmt;++/*----------------------+ * Create POLICY Statement+ *----------------------+ */+typedef struct CreatePolicyStmt+{+ NodeTag type;+ char *policy_name; /* Policy's name */+ RangeVar *table; /* the table name the policy applies to */+ char *cmd_name; /* the command name the policy applies to */+ List *roles; /* the roles associated with the policy */+ Node *qual; /* the policy's condition */+ Node *with_check; /* the policy's WITH CHECK condition. */+} CreatePolicyStmt;++/*----------------------+ * Alter POLICY Statement+ *----------------------+ */+typedef struct AlterPolicyStmt+{+ NodeTag type;+ char *policy_name; /* Policy's name */+ RangeVar *table; /* the table name the policy applies to */+ List *roles; /* the roles associated with the policy */+ Node *qual; /* the policy's condition */+ Node *with_check; /* the policy's WITH CHECK condition. */+} AlterPolicyStmt;++/* ----------------------+ * Create TRIGGER Statement+ * ----------------------+ */+typedef struct CreateTrigStmt+{+ NodeTag type;+ char *trigname; /* TRIGGER's name */+ RangeVar *relation; /* relation trigger is on */+ List *funcname; /* qual. name of function to call */+ List *args; /* list of (T_String) Values or NIL */+ bool row; /* ROW/STATEMENT */+ /* timing uses the TRIGGER_TYPE bits defined in catalog/pg_trigger.h */+ int16 timing; /* BEFORE, AFTER, or INSTEAD */+ /* events uses the TRIGGER_TYPE bits defined in catalog/pg_trigger.h */+ int16 events; /* "OR" of INSERT/UPDATE/DELETE/TRUNCATE */+ List *columns; /* column names, or NIL for all columns */+ Node *whenClause; /* qual expression, or NULL if none */+ bool isconstraint; /* This is a constraint trigger */+ /* The remaining fields are only used for constraint triggers */+ bool deferrable; /* [NOT] DEFERRABLE */+ bool initdeferred; /* INITIALLY {DEFERRED|IMMEDIATE} */+ RangeVar *constrrel; /* opposite relation, if RI trigger */+} CreateTrigStmt;++/* ----------------------+ * Create EVENT TRIGGER Statement+ * ----------------------+ */+typedef struct CreateEventTrigStmt+{+ NodeTag type;+ char *trigname; /* TRIGGER's name */+ char *eventname; /* event's identifier */+ List *whenclause; /* list of DefElems indicating filtering */+ List *funcname; /* qual. name of function to call */+} CreateEventTrigStmt;++/* ----------------------+ * Alter EVENT TRIGGER Statement+ * ----------------------+ */+typedef struct AlterEventTrigStmt+{+ NodeTag type;+ char *trigname; /* TRIGGER's name */+ char tgenabled; /* trigger's firing configuration WRT+ * session_replication_role */+} AlterEventTrigStmt;++/* ----------------------+ * Create/Drop PROCEDURAL LANGUAGE Statements+ * Create PROCEDURAL LANGUAGE Statements+ * ----------------------+ */+typedef struct CreatePLangStmt+{+ NodeTag type;+ bool replace; /* T => replace if already exists */+ char *plname; /* PL name */+ List *plhandler; /* PL call handler function (qual. name) */+ List *plinline; /* optional inline function (qual. name) */+ List *plvalidator; /* optional validator function (qual. name) */+ bool pltrusted; /* PL is trusted */+} CreatePLangStmt;++/* ----------------------+ * Create/Alter/Drop Role Statements+ *+ * Note: these node types are also used for the backwards-compatible+ * Create/Alter/Drop User/Group statements. In the ALTER and DROP cases+ * there's really no need to distinguish what the original spelling was,+ * but for CREATE we mark the type because the defaults vary.+ * ----------------------+ */+typedef enum RoleStmtType+{+ ROLESTMT_ROLE,+ ROLESTMT_USER,+ ROLESTMT_GROUP+} RoleStmtType;++typedef struct CreateRoleStmt+{+ NodeTag type;+ RoleStmtType stmt_type; /* ROLE/USER/GROUP */+ char *role; /* role name */+ List *options; /* List of DefElem nodes */+} CreateRoleStmt;++typedef struct AlterRoleStmt+{+ NodeTag type;+ Node *role; /* role */+ List *options; /* List of DefElem nodes */+ int action; /* +1 = add members, -1 = drop members */+} AlterRoleStmt;++typedef struct AlterRoleSetStmt+{+ NodeTag type;+ Node *role; /* role */+ char *database; /* database name, or NULL */+ VariableSetStmt *setstmt; /* SET or RESET subcommand */+} AlterRoleSetStmt;++typedef struct DropRoleStmt+{+ NodeTag type;+ List *roles; /* List of roles to remove */+ bool missing_ok; /* skip error if a role is missing? */+} DropRoleStmt;++/* ----------------------+ * {Create|Alter} SEQUENCE Statement+ * ----------------------+ */++typedef struct CreateSeqStmt+{+ NodeTag type;+ RangeVar *sequence; /* the sequence to create */+ List *options;+ Oid ownerId; /* ID of owner, or InvalidOid for default */+ bool if_not_exists; /* just do nothing if it already exists? */+} CreateSeqStmt;++typedef struct AlterSeqStmt+{+ NodeTag type;+ RangeVar *sequence; /* the sequence to alter */+ List *options;+ bool missing_ok; /* skip error if a role is missing? */+} AlterSeqStmt;++/* ----------------------+ * Create {Aggregate|Operator|Type} Statement+ * ----------------------+ */+typedef struct DefineStmt+{+ NodeTag type;+ ObjectType kind; /* aggregate, operator, type */+ bool oldstyle; /* hack to signal old CREATE AGG syntax */+ List *defnames; /* qualified name (list of Value strings) */+ List *args; /* a list of TypeName (if needed) */+ List *definition; /* a list of DefElem */+} DefineStmt;++/* ----------------------+ * Create Domain Statement+ * ----------------------+ */+typedef struct CreateDomainStmt+{+ NodeTag type;+ List *domainname; /* qualified name (list of Value strings) */+ TypeName *typeName; /* the base type */+ CollateClause *collClause; /* untransformed COLLATE spec, if any */+ List *constraints; /* constraints (list of Constraint nodes) */+} CreateDomainStmt;++/* ----------------------+ * Create Operator Class Statement+ * ----------------------+ */+typedef struct CreateOpClassStmt+{+ NodeTag type;+ List *opclassname; /* qualified name (list of Value strings) */+ List *opfamilyname; /* qualified name (ditto); NIL if omitted */+ char *amname; /* name of index AM opclass is for */+ TypeName *datatype; /* datatype of indexed column */+ List *items; /* List of CreateOpClassItem nodes */+ bool isDefault; /* Should be marked as default for type? */+} CreateOpClassStmt;++#define OPCLASS_ITEM_OPERATOR 1+#define OPCLASS_ITEM_FUNCTION 2+#define OPCLASS_ITEM_STORAGETYPE 3++typedef struct CreateOpClassItem+{+ NodeTag type;+ int itemtype; /* see codes above */+ /* fields used for an operator or function item: */+ List *name; /* operator or function name */+ List *args; /* argument types */+ int number; /* strategy num or support proc num */+ List *order_family; /* only used for ordering operators */+ List *class_args; /* only used for functions */+ /* fields used for a storagetype item: */+ TypeName *storedtype; /* datatype stored in index */+} CreateOpClassItem;++/* ----------------------+ * Create Operator Family Statement+ * ----------------------+ */+typedef struct CreateOpFamilyStmt+{+ NodeTag type;+ List *opfamilyname; /* qualified name (list of Value strings) */+ char *amname; /* name of index AM opfamily is for */+} CreateOpFamilyStmt;++/* ----------------------+ * Alter Operator Family Statement+ * ----------------------+ */+typedef struct AlterOpFamilyStmt+{+ NodeTag type;+ List *opfamilyname; /* qualified name (list of Value strings) */+ char *amname; /* name of index AM opfamily is for */+ bool isDrop; /* ADD or DROP the items? */+ List *items; /* List of CreateOpClassItem nodes */+} AlterOpFamilyStmt;++/* ----------------------+ * Drop Table|Sequence|View|Index|Type|Domain|Conversion|Schema Statement+ * ----------------------+ */++typedef struct DropStmt+{+ NodeTag type;+ List *objects; /* list of sublists of names (as Values) */+ List *arguments; /* list of sublists of arguments (as Values) */+ ObjectType removeType; /* object type */+ DropBehavior behavior; /* RESTRICT or CASCADE behavior */+ bool missing_ok; /* skip error if object is missing? */+ bool concurrent; /* drop index concurrently? */+} DropStmt;++/* ----------------------+ * Truncate Table Statement+ * ----------------------+ */+typedef struct TruncateStmt+{+ NodeTag type;+ List *relations; /* relations (RangeVars) to be truncated */+ bool restart_seqs; /* restart owned sequences? */+ DropBehavior behavior; /* RESTRICT or CASCADE behavior */+} TruncateStmt;++/* ----------------------+ * Comment On Statement+ * ----------------------+ */+typedef struct CommentStmt+{+ NodeTag type;+ ObjectType objtype; /* Object's type */+ List *objname; /* Qualified name of the object */+ List *objargs; /* Arguments if needed (eg, for functions) */+ char *comment; /* Comment to insert, or NULL to remove */+} CommentStmt;++/* ----------------------+ * SECURITY LABEL Statement+ * ----------------------+ */+typedef struct SecLabelStmt+{+ NodeTag type;+ ObjectType objtype; /* Object's type */+ List *objname; /* Qualified name of the object */+ List *objargs; /* Arguments if needed (eg, for functions) */+ char *provider; /* Label provider (or NULL) */+ char *label; /* New security label to be assigned */+} SecLabelStmt;++/* ----------------------+ * Declare Cursor Statement+ *+ * Note: the "query" field of DeclareCursorStmt is only used in the raw grammar+ * output. After parse analysis it's set to null, and the Query points to the+ * DeclareCursorStmt, not vice versa.+ * ----------------------+ */+#define CURSOR_OPT_BINARY 0x0001 /* BINARY */+#define CURSOR_OPT_SCROLL 0x0002 /* SCROLL explicitly given */+#define CURSOR_OPT_NO_SCROLL 0x0004 /* NO SCROLL explicitly given */+#define CURSOR_OPT_INSENSITIVE 0x0008 /* INSENSITIVE */+#define CURSOR_OPT_HOLD 0x0010 /* WITH HOLD */+/* these planner-control flags do not correspond to any SQL grammar: */+#define CURSOR_OPT_FAST_PLAN 0x0020 /* prefer fast-start plan */+#define CURSOR_OPT_GENERIC_PLAN 0x0040 /* force use of generic plan */+#define CURSOR_OPT_CUSTOM_PLAN 0x0080 /* force use of custom plan */++typedef struct DeclareCursorStmt+{+ NodeTag type;+ char *portalname; /* name of the portal (cursor) */+ int options; /* bitmask of options (see above) */+ Node *query; /* the raw SELECT query */+} DeclareCursorStmt;++/* ----------------------+ * Close Portal Statement+ * ----------------------+ */+typedef struct ClosePortalStmt+{+ NodeTag type;+ char *portalname; /* name of the portal (cursor) */+ /* NULL means CLOSE ALL */+} ClosePortalStmt;++/* ----------------------+ * Fetch Statement (also Move)+ * ----------------------+ */+typedef enum FetchDirection+{+ /* for these, howMany is how many rows to fetch; FETCH_ALL means ALL */+ FETCH_FORWARD,+ FETCH_BACKWARD,+ /* for these, howMany indicates a position; only one row is fetched */+ FETCH_ABSOLUTE,+ FETCH_RELATIVE+} FetchDirection;++#define FETCH_ALL LONG_MAX++typedef struct FetchStmt+{+ NodeTag type;+ FetchDirection direction; /* see above */+ long howMany; /* number of rows, or position argument */+ char *portalname; /* name of portal (cursor) */+ bool ismove; /* TRUE if MOVE */+} FetchStmt;++/* ----------------------+ * Create Index Statement+ *+ * This represents creation of an index and/or an associated constraint.+ * If isconstraint is true, we should create a pg_constraint entry along+ * with the index. But if indexOid isn't InvalidOid, we are not creating an+ * index, just a UNIQUE/PKEY constraint using an existing index. isconstraint+ * must always be true in this case, and the fields describing the index+ * properties are empty.+ * ----------------------+ */+typedef struct IndexStmt+{+ NodeTag type;+ char *idxname; /* name of new index, or NULL for default */+ RangeVar *relation; /* relation to build index on */+ char *accessMethod; /* name of access method (eg. btree) */+ char *tableSpace; /* tablespace, or NULL for default */+ List *indexParams; /* columns to index: a list of IndexElem */+ List *options; /* WITH clause options: a list of DefElem */+ Node *whereClause; /* qualification (partial-index predicate) */+ List *excludeOpNames; /* exclusion operator names, or NIL if none */+ char *idxcomment; /* comment to apply to index, or NULL */+ Oid indexOid; /* OID of an existing index, if any */+ Oid oldNode; /* relfilenode of existing storage, if any */+ bool unique; /* is index unique? */+ bool primary; /* is index a primary key? */+ bool isconstraint; /* is it for a pkey/unique constraint? */+ bool deferrable; /* is the constraint DEFERRABLE? */+ bool initdeferred; /* is the constraint INITIALLY DEFERRED? */+ bool transformed; /* true when transformIndexStmt is finished */+ bool concurrent; /* should this be a concurrent index build? */+ bool if_not_exists; /* just do nothing if index already exists? */+} IndexStmt;++/* ----------------------+ * Create Function Statement+ * ----------------------+ */+typedef struct CreateFunctionStmt+{+ NodeTag type;+ bool replace; /* T => replace if already exists */+ List *funcname; /* qualified name of function to create */+ List *parameters; /* a list of FunctionParameter */+ TypeName *returnType; /* the return type */+ List *options; /* a list of DefElem */+ List *withClause; /* a list of DefElem */+} CreateFunctionStmt;++typedef enum FunctionParameterMode+{+ /* the assigned enum values appear in pg_proc, don't change 'em! */+ FUNC_PARAM_IN = 'i', /* input only */+ FUNC_PARAM_OUT = 'o', /* output only */+ FUNC_PARAM_INOUT = 'b', /* both */+ FUNC_PARAM_VARIADIC = 'v', /* variadic (always input) */+ FUNC_PARAM_TABLE = 't' /* table function output column */+} FunctionParameterMode;++typedef struct FunctionParameter+{+ NodeTag type;+ char *name; /* parameter name, or NULL if not given */+ TypeName *argType; /* TypeName for parameter type */+ FunctionParameterMode mode; /* IN/OUT/etc */+ Node *defexpr; /* raw default expr, or NULL if not given */+} FunctionParameter;++typedef struct AlterFunctionStmt+{+ NodeTag type;+ FuncWithArgs *func; /* name and args of function */+ List *actions; /* list of DefElem */+} AlterFunctionStmt;++/* ----------------------+ * DO Statement+ *+ * DoStmt is the raw parser output, InlineCodeBlock is the execution-time API+ * ----------------------+ */+typedef struct DoStmt+{+ NodeTag type;+ List *args; /* List of DefElem nodes */+} DoStmt;++typedef struct InlineCodeBlock+{+ NodeTag type;+ char *source_text; /* source text of anonymous code block */+ Oid langOid; /* OID of selected language */+ bool langIsTrusted; /* trusted property of the language */+} InlineCodeBlock;++/* ----------------------+ * Alter Object Rename Statement+ * ----------------------+ */+typedef struct RenameStmt+{+ NodeTag type;+ ObjectType renameType; /* OBJECT_TABLE, OBJECT_COLUMN, etc */+ ObjectType relationType; /* if column name, associated relation type */+ RangeVar *relation; /* in case it's a table */+ List *object; /* in case it's some other object */+ List *objarg; /* argument types, if applicable */+ char *subname; /* name of contained object (column, rule,+ * trigger, etc) */+ char *newname; /* the new name */+ DropBehavior behavior; /* RESTRICT or CASCADE behavior */+ bool missing_ok; /* skip error if missing? */+} RenameStmt;++/* ----------------------+ * ALTER object SET SCHEMA Statement+ * ----------------------+ */+typedef struct AlterObjectSchemaStmt+{+ NodeTag type;+ ObjectType objectType; /* OBJECT_TABLE, OBJECT_TYPE, etc */+ RangeVar *relation; /* in case it's a table */+ List *object; /* in case it's some other object */+ List *objarg; /* argument types, if applicable */+ char *newschema; /* the new schema */+ bool missing_ok; /* skip error if missing? */+} AlterObjectSchemaStmt;++/* ----------------------+ * Alter Object Owner Statement+ * ----------------------+ */+typedef struct AlterOwnerStmt+{+ NodeTag type;+ ObjectType objectType; /* OBJECT_TABLE, OBJECT_TYPE, etc */+ RangeVar *relation; /* in case it's a table */+ List *object; /* in case it's some other object */+ List *objarg; /* argument types, if applicable */+ Node *newowner; /* the new owner */+} AlterOwnerStmt;+++/* ----------------------+ * Create Rule Statement+ * ----------------------+ */+typedef struct RuleStmt+{+ NodeTag type;+ RangeVar *relation; /* relation the rule is for */+ char *rulename; /* name of the rule */+ Node *whereClause; /* qualifications */+ CmdType event; /* SELECT, INSERT, etc */+ bool instead; /* is a 'do instead'? */+ List *actions; /* the action statements */+ bool replace; /* OR REPLACE */+} RuleStmt;++/* ----------------------+ * Notify Statement+ * ----------------------+ */+typedef struct NotifyStmt+{+ NodeTag type;+ char *conditionname; /* condition name to notify */+ char *payload; /* the payload string, or NULL if none */+} NotifyStmt;++/* ----------------------+ * Listen Statement+ * ----------------------+ */+typedef struct ListenStmt+{+ NodeTag type;+ char *conditionname; /* condition name to listen on */+} ListenStmt;++/* ----------------------+ * Unlisten Statement+ * ----------------------+ */+typedef struct UnlistenStmt+{+ NodeTag type;+ char *conditionname; /* name to unlisten on, or NULL for all */+} UnlistenStmt;++/* ----------------------+ * {Begin|Commit|Rollback} Transaction Statement+ * ----------------------+ */+typedef enum TransactionStmtKind+{+ TRANS_STMT_BEGIN,+ TRANS_STMT_START, /* semantically identical to BEGIN */+ TRANS_STMT_COMMIT,+ TRANS_STMT_ROLLBACK,+ TRANS_STMT_SAVEPOINT,+ TRANS_STMT_RELEASE,+ TRANS_STMT_ROLLBACK_TO,+ TRANS_STMT_PREPARE,+ TRANS_STMT_COMMIT_PREPARED,+ TRANS_STMT_ROLLBACK_PREPARED+} TransactionStmtKind;++typedef struct TransactionStmt+{+ NodeTag type;+ TransactionStmtKind kind; /* see above */+ List *options; /* for BEGIN/START and savepoint commands */+ char *gid; /* for two-phase-commit related commands */+} TransactionStmt;++/* ----------------------+ * Create Type Statement, composite types+ * ----------------------+ */+typedef struct CompositeTypeStmt+{+ NodeTag type;+ RangeVar *typevar; /* the composite type to be created */+ List *coldeflist; /* list of ColumnDef nodes */+} CompositeTypeStmt;++/* ----------------------+ * Create Type Statement, enum types+ * ----------------------+ */+typedef struct CreateEnumStmt+{+ NodeTag type;+ List *typeName; /* qualified name (list of Value strings) */+ List *vals; /* enum values (list of Value strings) */+} CreateEnumStmt;++/* ----------------------+ * Create Type Statement, range types+ * ----------------------+ */+typedef struct CreateRangeStmt+{+ NodeTag type;+ List *typeName; /* qualified name (list of Value strings) */+ List *params; /* range parameters (list of DefElem) */+} CreateRangeStmt;++/* ----------------------+ * Alter Type Statement, enum types+ * ----------------------+ */+typedef struct AlterEnumStmt+{+ NodeTag type;+ List *typeName; /* qualified name (list of Value strings) */+ char *newVal; /* new enum value's name */+ char *newValNeighbor; /* neighboring enum value, if specified */+ bool newValIsAfter; /* place new enum value after neighbor? */+ bool skipIfExists; /* no error if label already exists */+} AlterEnumStmt;++/* ----------------------+ * Create View Statement+ * ----------------------+ */+typedef enum ViewCheckOption+{+ NO_CHECK_OPTION,+ LOCAL_CHECK_OPTION,+ CASCADED_CHECK_OPTION+} ViewCheckOption;++typedef struct ViewStmt+{+ NodeTag type;+ RangeVar *view; /* the view to be created */+ List *aliases; /* target column names */+ Node *query; /* the SELECT query */+ bool replace; /* replace an existing view? */+ List *options; /* options from WITH clause */+ ViewCheckOption withCheckOption; /* WITH CHECK OPTION */+} ViewStmt;++/* ----------------------+ * Load Statement+ * ----------------------+ */+typedef struct LoadStmt+{+ NodeTag type;+ char *filename; /* file to load */+} LoadStmt;++/* ----------------------+ * Createdb Statement+ * ----------------------+ */+typedef struct CreatedbStmt+{+ NodeTag type;+ char *dbname; /* name of database to create */+ List *options; /* List of DefElem nodes */+} CreatedbStmt;++/* ----------------------+ * Alter Database+ * ----------------------+ */+typedef struct AlterDatabaseStmt+{+ NodeTag type;+ char *dbname; /* name of database to alter */+ List *options; /* List of DefElem nodes */+} AlterDatabaseStmt;++typedef struct AlterDatabaseSetStmt+{+ NodeTag type;+ char *dbname; /* database name */+ VariableSetStmt *setstmt; /* SET or RESET subcommand */+} AlterDatabaseSetStmt;++/* ----------------------+ * Dropdb Statement+ * ----------------------+ */+typedef struct DropdbStmt+{+ NodeTag type;+ char *dbname; /* database to drop */+ bool missing_ok; /* skip error if db is missing? */+} DropdbStmt;++/* ----------------------+ * Alter System Statement+ * ----------------------+ */+typedef struct AlterSystemStmt+{+ NodeTag type;+ VariableSetStmt *setstmt; /* SET subcommand */+} AlterSystemStmt;++/* ----------------------+ * Cluster Statement (support pbrown's cluster index implementation)+ * ----------------------+ */+typedef struct ClusterStmt+{+ NodeTag type;+ RangeVar *relation; /* relation being indexed, or NULL if all */+ char *indexname; /* original index defined */+ bool verbose; /* print progress info */+} ClusterStmt;++/* ----------------------+ * Vacuum and Analyze Statements+ *+ * Even though these are nominally two statements, it's convenient to use+ * just one node type for both. Note that at least one of VACOPT_VACUUM+ * and VACOPT_ANALYZE must be set in options.+ * ----------------------+ */+typedef enum VacuumOption+{+ VACOPT_VACUUM = 1 << 0, /* do VACUUM */+ VACOPT_ANALYZE = 1 << 1, /* do ANALYZE */+ VACOPT_VERBOSE = 1 << 2, /* print progress info */+ VACOPT_FREEZE = 1 << 3, /* FREEZE option */+ VACOPT_FULL = 1 << 4, /* FULL (non-concurrent) vacuum */+ VACOPT_NOWAIT = 1 << 5, /* don't wait to get lock (autovacuum only) */+ VACOPT_SKIPTOAST = 1 << 6 /* don't process the TOAST table, if any */+} VacuumOption;++typedef struct VacuumStmt+{+ NodeTag type;+ int options; /* OR of VacuumOption flags */+ RangeVar *relation; /* single table to process, or NULL */+ List *va_cols; /* list of column names, or NIL for all */+} VacuumStmt;++/* ----------------------+ * Explain Statement+ *+ * The "query" field is either a raw parse tree (SelectStmt, InsertStmt, etc)+ * or a Query node if parse analysis has been done. Note that rewriting and+ * planning of the query are always postponed until execution of EXPLAIN.+ * ----------------------+ */+typedef struct ExplainStmt+{+ NodeTag type;+ Node *query; /* the query (see comments above) */+ List *options; /* list of DefElem nodes */+} ExplainStmt;++/* ----------------------+ * CREATE TABLE AS Statement (a/k/a SELECT INTO)+ *+ * A query written as CREATE TABLE AS will produce this node type natively.+ * A query written as SELECT ... INTO will be transformed to this form during+ * parse analysis.+ * A query written as CREATE MATERIALIZED view will produce this node type,+ * during parse analysis, since it needs all the same data.+ *+ * The "query" field is handled similarly to EXPLAIN, though note that it+ * can be a SELECT or an EXECUTE, but not other DML statements.+ * ----------------------+ */+typedef struct CreateTableAsStmt+{+ NodeTag type;+ Node *query; /* the query (see comments above) */+ IntoClause *into; /* destination table */+ ObjectType relkind; /* OBJECT_TABLE or OBJECT_MATVIEW */+ bool is_select_into; /* it was written as SELECT INTO */+ bool if_not_exists; /* just do nothing if it already exists? */+} CreateTableAsStmt;++/* ----------------------+ * REFRESH MATERIALIZED VIEW Statement+ * ----------------------+ */+typedef struct RefreshMatViewStmt+{+ NodeTag type;+ bool concurrent; /* allow concurrent access? */+ bool skipData; /* true for WITH NO DATA */+ RangeVar *relation; /* relation to insert into */+} RefreshMatViewStmt;++/* ----------------------+ * Checkpoint Statement+ * ----------------------+ */+typedef struct CheckPointStmt+{+ NodeTag type;+} CheckPointStmt;++/* ----------------------+ * Discard Statement+ * ----------------------+ */++typedef enum DiscardMode+{+ DISCARD_ALL,+ DISCARD_PLANS,+ DISCARD_SEQUENCES,+ DISCARD_TEMP+} DiscardMode;++typedef struct DiscardStmt+{+ NodeTag type;+ DiscardMode target;+} DiscardStmt;++/* ----------------------+ * LOCK Statement+ * ----------------------+ */+typedef struct LockStmt+{+ NodeTag type;+ List *relations; /* relations to lock */+ int mode; /* lock mode */+ bool nowait; /* no wait mode */+} LockStmt;++/* ----------------------+ * SET CONSTRAINTS Statement+ * ----------------------+ */+typedef struct ConstraintsSetStmt+{+ NodeTag type;+ List *constraints; /* List of names as RangeVars */+ bool deferred;+} ConstraintsSetStmt;++/* ----------------------+ * REINDEX Statement+ * ----------------------+ */++/* Reindex options */+#define REINDEXOPT_VERBOSE 1 << 0 /* print progress info */++typedef enum ReindexObjectType+{+ REINDEX_OBJECT_INDEX, /* index */+ REINDEX_OBJECT_TABLE, /* table or materialized view */+ REINDEX_OBJECT_SCHEMA, /* schema */+ REINDEX_OBJECT_SYSTEM, /* system catalogs */+ REINDEX_OBJECT_DATABASE /* database */+} ReindexObjectType;++typedef struct ReindexStmt+{+ NodeTag type;+ ReindexObjectType kind; /* REINDEX_OBJECT_INDEX, REINDEX_OBJECT_TABLE,+ * etc. */+ RangeVar *relation; /* Table or index to reindex */+ const char *name; /* name of database to reindex */+ int options; /* Reindex options flags */+} ReindexStmt;++/* ----------------------+ * CREATE CONVERSION Statement+ * ----------------------+ */+typedef struct CreateConversionStmt+{+ NodeTag type;+ List *conversion_name; /* Name of the conversion */+ char *for_encoding_name; /* source encoding name */+ char *to_encoding_name; /* destination encoding name */+ List *func_name; /* qualified conversion function name */+ bool def; /* is this a default conversion? */+} CreateConversionStmt;++/* ----------------------+ * CREATE CAST Statement+ * ----------------------+ */+typedef struct CreateCastStmt+{+ NodeTag type;+ TypeName *sourcetype;+ TypeName *targettype;+ FuncWithArgs *func;+ CoercionContext context;+ bool inout;+} CreateCastStmt;++/* ----------------------+ * CREATE TRANSFORM Statement+ * ----------------------+ */+typedef struct CreateTransformStmt+{+ NodeTag type;+ bool replace;+ TypeName *type_name;+ char *lang;+ FuncWithArgs *fromsql;+ FuncWithArgs *tosql;+} CreateTransformStmt;++/* ----------------------+ * PREPARE Statement+ * ----------------------+ */+typedef struct PrepareStmt+{+ NodeTag type;+ char *name; /* Name of plan, arbitrary */+ List *argtypes; /* Types of parameters (List of TypeName) */+ Node *query; /* The query itself (as a raw parsetree) */+} PrepareStmt;+++/* ----------------------+ * EXECUTE Statement+ * ----------------------+ */++typedef struct ExecuteStmt+{+ NodeTag type;+ char *name; /* The name of the plan to execute */+ List *params; /* Values to assign to parameters */+} ExecuteStmt;+++/* ----------------------+ * DEALLOCATE Statement+ * ----------------------+ */+typedef struct DeallocateStmt+{+ NodeTag type;+ char *name; /* The name of the plan to remove */+ /* NULL means DEALLOCATE ALL */+} DeallocateStmt;++/*+ * DROP OWNED statement+ */+typedef struct DropOwnedStmt+{+ NodeTag type;+ List *roles;+ DropBehavior behavior;+} DropOwnedStmt;++/*+ * REASSIGN OWNED statement+ */+typedef struct ReassignOwnedStmt+{+ NodeTag type;+ List *roles;+ Node *newrole;+} ReassignOwnedStmt;++/*+ * TS Dictionary stmts: DefineStmt, RenameStmt and DropStmt are default+ */+typedef struct AlterTSDictionaryStmt+{+ NodeTag type;+ List *dictname; /* qualified name (list of Value strings) */+ List *options; /* List of DefElem nodes */+} AlterTSDictionaryStmt;++/*+ * TS Configuration stmts: DefineStmt, RenameStmt and DropStmt are default+ */+typedef enum AlterTSConfigType+{+ ALTER_TSCONFIG_ADD_MAPPING,+ ALTER_TSCONFIG_ALTER_MAPPING_FOR_TOKEN,+ ALTER_TSCONFIG_REPLACE_DICT,+ ALTER_TSCONFIG_REPLACE_DICT_FOR_TOKEN,+ ALTER_TSCONFIG_DROP_MAPPING+} AlterTSConfigType;++typedef struct AlterTSConfigurationStmt+{+ NodeTag type;+ AlterTSConfigType kind; /* ALTER_TSCONFIG_ADD_MAPPING, etc */+ List *cfgname; /* qualified name (list of Value strings) */++ /*+ * dicts will be non-NIL if ADD/ALTER MAPPING was specified. If dicts is+ * NIL, but tokentype isn't, DROP MAPPING was specified.+ */+ List *tokentype; /* list of Value strings */+ List *dicts; /* list of list of Value strings */+ bool override; /* if true - remove old variant */+ bool replace; /* if true - replace dictionary by another */+ bool missing_ok; /* for DROP - skip error if missing? */+} AlterTSConfigurationStmt;++#endif /* PARSENODES_H */
+ foreign/libpg_query/src/postgres/include/nodes/pg_list.h view
@@ -0,0 +1,326 @@+/*-------------------------------------------------------------------------+ *+ * pg_list.h+ * interface for PostgreSQL generic linked list package+ *+ * This package implements singly-linked homogeneous lists.+ *+ * It is important to have constant-time length, append, and prepend+ * operations. To achieve this, we deal with two distinct data+ * structures:+ *+ * 1. A set of "list cells": each cell contains a data field and+ * a link to the next cell in the list or NULL.+ * 2. A single structure containing metadata about the list: the+ * type of the list, pointers to the head and tail cells, and+ * the length of the list.+ *+ * We support three types of lists:+ *+ * T_List: lists of pointers+ * (in practice usually pointers to Nodes, but not always;+ * declared as "void *" to minimize casting annoyances)+ * T_IntList: lists of integers+ * T_OidList: lists of Oids+ *+ * (At the moment, ints and Oids are the same size, but they may not+ * always be so; try to be careful to maintain the distinction.)+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/nodes/pg_list.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef PG_LIST_H+#define PG_LIST_H++#include "nodes/nodes.h"+++typedef struct ListCell ListCell;++typedef struct List+{+ NodeTag type; /* T_List, T_IntList, or T_OidList */+ int length;+ ListCell *head;+ ListCell *tail;+} List;++struct ListCell+{+ union+ {+ void *ptr_value;+ int int_value;+ Oid oid_value;+ } data;+ ListCell *next;+};++/*+ * The *only* valid representation of an empty list is NIL; in other+ * words, a non-NIL list is guaranteed to have length >= 1 and+ * head/tail != NULL+ */+#define NIL ((List *) NULL)++/*+ * These routines are used frequently. However, we can't implement+ * them as macros, since we want to avoid double-evaluation of macro+ * arguments. Therefore, we implement them using static inline functions+ * if supported by the compiler, or as regular functions otherwise.+ * See STATIC_IF_INLINE in c.h.+ */+#ifndef PG_USE_INLINE+extern ListCell *list_head(const List *l);+extern ListCell *list_tail(List *l);+extern int list_length(const List *l);+#endif /* PG_USE_INLINE */+#if defined(PG_USE_INLINE) || defined(PG_LIST_INCLUDE_DEFINITIONS)+STATIC_IF_INLINE ListCell *+list_head(const List *l)+{+ return l ? l->head : NULL;+}++STATIC_IF_INLINE ListCell *+list_tail(List *l)+{+ return l ? l->tail : NULL;+}++STATIC_IF_INLINE int+list_length(const List *l)+{+ return l ? l->length : 0;+}+#endif /*-- PG_USE_INLINE || PG_LIST_INCLUDE_DEFINITIONS */++/*+ * NB: There is an unfortunate legacy from a previous incarnation of+ * the List API: the macro lfirst() was used to mean "the data in this+ * cons cell". To avoid changing every usage of lfirst(), that meaning+ * has been kept. As a result, lfirst() takes a ListCell and returns+ * the data it contains; to get the data in the first cell of a+ * List, use linitial(). Worse, lsecond() is more closely related to+ * linitial() than lfirst(): given a List, lsecond() returns the data+ * in the second cons cell.+ */++#define lnext(lc) ((lc)->next)+#define lfirst(lc) ((lc)->data.ptr_value)+#define lfirst_int(lc) ((lc)->data.int_value)+#define lfirst_oid(lc) ((lc)->data.oid_value)++#define linitial(l) lfirst(list_head(l))+#define linitial_int(l) lfirst_int(list_head(l))+#define linitial_oid(l) lfirst_oid(list_head(l))++#define lsecond(l) lfirst(lnext(list_head(l)))+#define lsecond_int(l) lfirst_int(lnext(list_head(l)))+#define lsecond_oid(l) lfirst_oid(lnext(list_head(l)))++#define lthird(l) lfirst(lnext(lnext(list_head(l))))+#define lthird_int(l) lfirst_int(lnext(lnext(list_head(l))))+#define lthird_oid(l) lfirst_oid(lnext(lnext(list_head(l))))++#define lfourth(l) lfirst(lnext(lnext(lnext(list_head(l)))))+#define lfourth_int(l) lfirst_int(lnext(lnext(lnext(list_head(l)))))+#define lfourth_oid(l) lfirst_oid(lnext(lnext(lnext(list_head(l)))))++#define llast(l) lfirst(list_tail(l))+#define llast_int(l) lfirst_int(list_tail(l))+#define llast_oid(l) lfirst_oid(list_tail(l))++/*+ * Convenience macros for building fixed-length lists+ */+#define list_make1(x1) lcons(x1, NIL)+#define list_make2(x1,x2) lcons(x1, list_make1(x2))+#define list_make3(x1,x2,x3) lcons(x1, list_make2(x2, x3))+#define list_make4(x1,x2,x3,x4) lcons(x1, list_make3(x2, x3, x4))++#define list_make1_int(x1) lcons_int(x1, NIL)+#define list_make2_int(x1,x2) lcons_int(x1, list_make1_int(x2))+#define list_make3_int(x1,x2,x3) lcons_int(x1, list_make2_int(x2, x3))+#define list_make4_int(x1,x2,x3,x4) lcons_int(x1, list_make3_int(x2, x3, x4))++#define list_make1_oid(x1) lcons_oid(x1, NIL)+#define list_make2_oid(x1,x2) lcons_oid(x1, list_make1_oid(x2))+#define list_make3_oid(x1,x2,x3) lcons_oid(x1, list_make2_oid(x2, x3))+#define list_make4_oid(x1,x2,x3,x4) lcons_oid(x1, list_make3_oid(x2, x3, x4))++/*+ * foreach -+ * a convenience macro which loops through the list+ */+#define foreach(cell, l) \+ for ((cell) = list_head(l); (cell) != NULL; (cell) = lnext(cell))++/*+ * for_each_cell -+ * a convenience macro which loops through a list starting from a+ * specified cell+ */+#define for_each_cell(cell, initcell) \+ for ((cell) = (initcell); (cell) != NULL; (cell) = lnext(cell))++/*+ * forboth -+ * a convenience macro for advancing through two linked lists+ * simultaneously. This macro loops through both lists at the same+ * time, stopping when either list runs out of elements. Depending+ * on the requirements of the call site, it may also be wise to+ * assert that the lengths of the two lists are equal.+ */+#define forboth(cell1, list1, cell2, list2) \+ for ((cell1) = list_head(list1), (cell2) = list_head(list2); \+ (cell1) != NULL && (cell2) != NULL; \+ (cell1) = lnext(cell1), (cell2) = lnext(cell2))++/*+ * forthree -+ * the same for three lists+ */+#define forthree(cell1, list1, cell2, list2, cell3, list3) \+ for ((cell1) = list_head(list1), (cell2) = list_head(list2), (cell3) = list_head(list3); \+ (cell1) != NULL && (cell2) != NULL && (cell3) != NULL; \+ (cell1) = lnext(cell1), (cell2) = lnext(cell2), (cell3) = lnext(cell3))++extern List *lappend(List *list, void *datum);+extern List *lappend_int(List *list, int datum);+extern List *lappend_oid(List *list, Oid datum);++extern ListCell *lappend_cell(List *list, ListCell *prev, void *datum);+extern ListCell *lappend_cell_int(List *list, ListCell *prev, int datum);+extern ListCell *lappend_cell_oid(List *list, ListCell *prev, Oid datum);++extern List *lcons(void *datum, List *list);+extern List *lcons_int(int datum, List *list);+extern List *lcons_oid(Oid datum, List *list);++extern List *list_concat(List *list1, List *list2);+extern List *list_truncate(List *list, int new_size);++extern ListCell *list_nth_cell(const List *list, int n);+extern void *list_nth(const List *list, int n);+extern int list_nth_int(const List *list, int n);+extern Oid list_nth_oid(const List *list, int n);++extern bool list_member(const List *list, const void *datum);+extern bool list_member_ptr(const List *list, const void *datum);+extern bool list_member_int(const List *list, int datum);+extern bool list_member_oid(const List *list, Oid datum);++extern List *list_delete(List *list, void *datum);+extern List *list_delete_ptr(List *list, void *datum);+extern List *list_delete_int(List *list, int datum);+extern List *list_delete_oid(List *list, Oid datum);+extern List *list_delete_first(List *list);+extern List *list_delete_cell(List *list, ListCell *cell, ListCell *prev);++extern List *list_union(const List *list1, const List *list2);+extern List *list_union_ptr(const List *list1, const List *list2);+extern List *list_union_int(const List *list1, const List *list2);+extern List *list_union_oid(const List *list1, const List *list2);++extern List *list_intersection(const List *list1, const List *list2);+extern List *list_intersection_int(const List *list1, const List *list2);++/* currently, there's no need for list_intersection_ptr etc */++extern List *list_difference(const List *list1, const List *list2);+extern List *list_difference_ptr(const List *list1, const List *list2);+extern List *list_difference_int(const List *list1, const List *list2);+extern List *list_difference_oid(const List *list1, const List *list2);++extern List *list_append_unique(List *list, void *datum);+extern List *list_append_unique_ptr(List *list, void *datum);+extern List *list_append_unique_int(List *list, int datum);+extern List *list_append_unique_oid(List *list, Oid datum);++extern List *list_concat_unique(List *list1, List *list2);+extern List *list_concat_unique_ptr(List *list1, List *list2);+extern List *list_concat_unique_int(List *list1, List *list2);+extern List *list_concat_unique_oid(List *list1, List *list2);++extern void list_free(List *list);+extern void list_free_deep(List *list);++extern List *list_copy(const List *list);+extern List *list_copy_tail(const List *list, int nskip);++/*+ * To ease migration to the new list API, a set of compatibility+ * macros are provided that reduce the impact of the list API changes+ * as far as possible. Until client code has been rewritten to use the+ * new list API, the ENABLE_LIST_COMPAT symbol can be defined before+ * including pg_list.h+ */+#ifdef ENABLE_LIST_COMPAT++#define lfirsti(lc) lfirst_int(lc)+#define lfirsto(lc) lfirst_oid(lc)++#define makeList1(x1) list_make1(x1)+#define makeList2(x1, x2) list_make2(x1, x2)+#define makeList3(x1, x2, x3) list_make3(x1, x2, x3)+#define makeList4(x1, x2, x3, x4) list_make4(x1, x2, x3, x4)++#define makeListi1(x1) list_make1_int(x1)+#define makeListi2(x1, x2) list_make2_int(x1, x2)++#define makeListo1(x1) list_make1_oid(x1)+#define makeListo2(x1, x2) list_make2_oid(x1, x2)++#define lconsi(datum, list) lcons_int(datum, list)+#define lconso(datum, list) lcons_oid(datum, list)++#define lappendi(list, datum) lappend_int(list, datum)+#define lappendo(list, datum) lappend_oid(list, datum)++#define nconc(l1, l2) list_concat(l1, l2)++#define nth(n, list) list_nth(list, n)++#define member(datum, list) list_member(list, datum)+#define ptrMember(datum, list) list_member_ptr(list, datum)+#define intMember(datum, list) list_member_int(list, datum)+#define oidMember(datum, list) list_member_oid(list, datum)++/*+ * Note that the old lremove() determined equality via pointer+ * comparison, whereas the new list_delete() uses equal(); in order to+ * keep the same behavior, we therefore need to map lremove() calls to+ * list_delete_ptr() rather than list_delete()+ */+#define lremove(elem, list) list_delete_ptr(list, elem)+#define LispRemove(elem, list) list_delete(list, elem)+#define lremovei(elem, list) list_delete_int(list, elem)+#define lremoveo(elem, list) list_delete_oid(list, elem)++#define ltruncate(n, list) list_truncate(list, n)++#define set_union(l1, l2) list_union(l1, l2)+#define set_uniono(l1, l2) list_union_oid(l1, l2)+#define set_ptrUnion(l1, l2) list_union_ptr(l1, l2)++#define set_difference(l1, l2) list_difference(l1, l2)+#define set_differenceo(l1, l2) list_difference_oid(l1, l2)+#define set_ptrDifference(l1, l2) list_difference_ptr(l1, l2)++#define equali(l1, l2) equal(l1, l2)+#define equalo(l1, l2) equal(l1, l2)++#define freeList(list) list_free(list)++#define listCopy(list) list_copy(list)++extern int length(List *list);+#endif /* ENABLE_LIST_COMPAT */++#endif /* PG_LIST_H */
+ foreign/libpg_query/src/postgres/include/nodes/plannodes.h view
@@ -0,0 +1,952 @@+/*-------------------------------------------------------------------------+ *+ * plannodes.h+ * definitions for query plan nodes+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/nodes/plannodes.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef PLANNODES_H+#define PLANNODES_H++#include "access/sdir.h"+#include "lib/stringinfo.h"+#include "nodes/bitmapset.h"+#include "nodes/lockoptions.h"+#include "nodes/primnodes.h"+++/* ----------------------------------------------------------------+ * node definitions+ * ----------------------------------------------------------------+ */++/* ----------------+ * PlannedStmt node+ *+ * The output of the planner is a Plan tree headed by a PlannedStmt node.+ * PlannedStmt holds the "one time" information needed by the executor.+ * ----------------+ */+typedef struct PlannedStmt+{+ NodeTag type;++ CmdType commandType; /* select|insert|update|delete */++ uint32 queryId; /* query identifier (copied from Query) */++ bool hasReturning; /* is it insert|update|delete RETURNING? */++ bool hasModifyingCTE; /* has insert|update|delete in WITH? */++ bool canSetTag; /* do I set the command result tag? */++ bool transientPlan; /* redo plan when TransactionXmin changes? */++ struct Plan *planTree; /* tree of Plan nodes */++ List *rtable; /* list of RangeTblEntry nodes */++ /* rtable indexes of target relations for INSERT/UPDATE/DELETE */+ List *resultRelations; /* integer list of RT indexes, or NIL */++ Node *utilityStmt; /* non-null if this is DECLARE CURSOR */++ List *subplans; /* Plan trees for SubPlan expressions */++ Bitmapset *rewindPlanIDs; /* indices of subplans that require REWIND */++ List *rowMarks; /* a list of PlanRowMark's */++ List *relationOids; /* OIDs of relations the plan depends on */++ List *invalItems; /* other dependencies, as PlanInvalItems */++ int nParamExec; /* number of PARAM_EXEC Params used */++ bool hasRowSecurity; /* row security applied? */+} PlannedStmt;++/* macro for fetching the Plan associated with a SubPlan node */+#define exec_subplan_get_plan(plannedstmt, subplan) \+ ((Plan *) list_nth((plannedstmt)->subplans, (subplan)->plan_id - 1))+++/* ----------------+ * Plan node+ *+ * All plan nodes "derive" from the Plan structure by having the+ * Plan structure as the first field. This ensures that everything works+ * when nodes are cast to Plan's. (node pointers are frequently cast to Plan*+ * when passed around generically in the executor)+ *+ * We never actually instantiate any Plan nodes; this is just the common+ * abstract superclass for all Plan-type nodes.+ * ----------------+ */+typedef struct Plan+{+ NodeTag type;++ /*+ * estimated execution costs for plan (see costsize.c for more info)+ */+ Cost startup_cost; /* cost expended before fetching any tuples */+ Cost total_cost; /* total cost (assuming all tuples fetched) */++ /*+ * planner's estimate of result size of this plan step+ */+ double plan_rows; /* number of rows plan is expected to emit */+ int plan_width; /* average row width in bytes */++ /*+ * Common structural data for all Plan types.+ */+ List *targetlist; /* target list to be computed at this node */+ List *qual; /* implicitly-ANDed qual conditions */+ struct Plan *lefttree; /* input plan tree(s) */+ struct Plan *righttree;+ List *initPlan; /* Init Plan nodes (un-correlated expr+ * subselects) */++ /*+ * Information for management of parameter-change-driven rescanning+ *+ * extParam includes the paramIDs of all external PARAM_EXEC params+ * affecting this plan node or its children. setParam params from the+ * node's initPlans are not included, but their extParams are.+ *+ * allParam includes all the extParam paramIDs, plus the IDs of local+ * params that affect the node (i.e., the setParams of its initplans).+ * These are _all_ the PARAM_EXEC params that affect this node.+ */+ Bitmapset *extParam;+ Bitmapset *allParam;+} Plan;++/* ----------------+ * these are defined to avoid confusion problems with "left"+ * and "right" and "inner" and "outer". The convention is that+ * the "left" plan is the "outer" plan and the "right" plan is+ * the inner plan, but these make the code more readable.+ * ----------------+ */+#define innerPlan(node) (((Plan *)(node))->righttree)+#define outerPlan(node) (((Plan *)(node))->lefttree)+++/* ----------------+ * Result node -+ * If no outer plan, evaluate a variable-free targetlist.+ * If outer plan, return tuples from outer plan (after a level of+ * projection as shown by targetlist).+ *+ * If resconstantqual isn't NULL, it represents a one-time qualification+ * test (i.e., one that doesn't depend on any variables from the outer plan,+ * so needs to be evaluated only once).+ * ----------------+ */+typedef struct Result+{+ Plan plan;+ Node *resconstantqual;+} Result;++/* ----------------+ * ModifyTable node -+ * Apply rows produced by subplan(s) to result table(s),+ * by inserting, updating, or deleting.+ *+ * Note that rowMarks and epqParam are presumed to be valid for all the+ * subplan(s); they can't contain any info that varies across subplans.+ * ----------------+ */+typedef struct ModifyTable+{+ Plan plan;+ CmdType operation; /* INSERT, UPDATE, or DELETE */+ bool canSetTag; /* do we set the command tag/es_processed? */+ Index nominalRelation; /* Parent RT index for use of EXPLAIN */+ List *resultRelations; /* integer list of RT indexes */+ int resultRelIndex; /* index of first resultRel in plan's list */+ List *plans; /* plan(s) producing source data */+ List *withCheckOptionLists; /* per-target-table WCO lists */+ List *returningLists; /* per-target-table RETURNING tlists */+ List *fdwPrivLists; /* per-target-table FDW private data lists */+ List *rowMarks; /* PlanRowMarks (non-locking only) */+ int epqParam; /* ID of Param for EvalPlanQual re-eval */+ OnConflictAction onConflictAction; /* ON CONFLICT action */+ List *arbiterIndexes; /* List of ON CONFLICT arbiter index OIDs */+ List *onConflictSet; /* SET for INSERT ON CONFLICT DO UPDATE */+ Node *onConflictWhere; /* WHERE for ON CONFLICT UPDATE */+ Index exclRelRTI; /* RTI of the EXCLUDED pseudo relation */+ List *exclRelTlist; /* tlist of the EXCLUDED pseudo relation */+} ModifyTable;++/* ----------------+ * Append node -+ * Generate the concatenation of the results of sub-plans.+ * ----------------+ */+typedef struct Append+{+ Plan plan;+ List *appendplans;+} Append;++/* ----------------+ * MergeAppend node -+ * Merge the results of pre-sorted sub-plans to preserve the ordering.+ * ----------------+ */+typedef struct MergeAppend+{+ Plan plan;+ List *mergeplans;+ /* remaining fields are just like the sort-key info in struct Sort */+ int numCols; /* number of sort-key columns */+ AttrNumber *sortColIdx; /* their indexes in the target list */+ Oid *sortOperators; /* OIDs of operators to sort them by */+ Oid *collations; /* OIDs of collations */+ bool *nullsFirst; /* NULLS FIRST/LAST directions */+} MergeAppend;++/* ----------------+ * RecursiveUnion node -+ * Generate a recursive union of two subplans.+ *+ * The "outer" subplan is always the non-recursive term, and the "inner"+ * subplan is the recursive term.+ * ----------------+ */+typedef struct RecursiveUnion+{+ Plan plan;+ int wtParam; /* ID of Param representing work table */+ /* Remaining fields are zero/null in UNION ALL case */+ int numCols; /* number of columns to check for+ * duplicate-ness */+ AttrNumber *dupColIdx; /* their indexes in the target list */+ Oid *dupOperators; /* equality operators to compare with */+ long numGroups; /* estimated number of groups in input */+} RecursiveUnion;++/* ----------------+ * BitmapAnd node -+ * Generate the intersection of the results of sub-plans.+ *+ * The subplans must be of types that yield tuple bitmaps. The targetlist+ * and qual fields of the plan are unused and are always NIL.+ * ----------------+ */+typedef struct BitmapAnd+{+ Plan plan;+ List *bitmapplans;+} BitmapAnd;++/* ----------------+ * BitmapOr node -+ * Generate the union of the results of sub-plans.+ *+ * The subplans must be of types that yield tuple bitmaps. The targetlist+ * and qual fields of the plan are unused and are always NIL.+ * ----------------+ */+typedef struct BitmapOr+{+ Plan plan;+ List *bitmapplans;+} BitmapOr;++/*+ * ==========+ * Scan nodes+ * ==========+ */+typedef struct Scan+{+ Plan plan;+ Index scanrelid; /* relid is index into the range table */+} Scan;++/* ----------------+ * sequential scan node+ * ----------------+ */+typedef Scan SeqScan;++/* ----------------+ * table sample scan node+ * ----------------+ */+typedef struct SampleScan+{+ Scan scan;+ /* use struct pointer to avoid including parsenodes.h here */+ struct TableSampleClause *tablesample;+} SampleScan;++/* ----------------+ * index scan node+ *+ * indexqualorig is an implicitly-ANDed list of index qual expressions, each+ * in the same form it appeared in the query WHERE condition. Each should+ * be of the form (indexkey OP comparisonval) or (comparisonval OP indexkey).+ * The indexkey is a Var or expression referencing column(s) of the index's+ * base table. The comparisonval might be any expression, but it won't use+ * any columns of the base table. The expressions are ordered by index+ * column position (but items referencing the same index column can appear+ * in any order). indexqualorig is used at runtime only if we have to recheck+ * a lossy indexqual.+ *+ * indexqual has the same form, but the expressions have been commuted if+ * necessary to put the indexkeys on the left, and the indexkeys are replaced+ * by Var nodes identifying the index columns (their varno is INDEX_VAR and+ * their varattno is the index column number).+ *+ * indexorderbyorig is similarly the original form of any ORDER BY expressions+ * that are being implemented by the index, while indexorderby is modified to+ * have index column Vars on the left-hand side. Here, multiple expressions+ * must appear in exactly the ORDER BY order, and this is not necessarily the+ * index column order. Only the expressions are provided, not the auxiliary+ * sort-order information from the ORDER BY SortGroupClauses; it's assumed+ * that the sort ordering is fully determinable from the top-level operators.+ * indexorderbyorig is used at runtime to recheck the ordering, if the index+ * cannot calculate an accurate ordering. It is also needed for EXPLAIN.+ *+ * indexorderbyops is a list of the OIDs of the operators used to sort the+ * ORDER BY expressions. This is used together with indexorderbyorig to+ * recheck ordering at run time. (Note that indexorderby, indexorderbyorig,+ * and indexorderbyops are used for amcanorderbyop cases, not amcanorder.)+ *+ * indexorderdir specifies the scan ordering, for indexscans on amcanorder+ * indexes (for other indexes it should be "don't care").+ * ----------------+ */+typedef struct IndexScan+{+ Scan scan;+ Oid indexid; /* OID of index to scan */+ List *indexqual; /* list of index quals (usually OpExprs) */+ List *indexqualorig; /* the same in original form */+ List *indexorderby; /* list of index ORDER BY exprs */+ List *indexorderbyorig; /* the same in original form */+ List *indexorderbyops; /* OIDs of sort ops for ORDER BY exprs */+ ScanDirection indexorderdir; /* forward or backward or don't care */+} IndexScan;++/* ----------------+ * index-only scan node+ *+ * IndexOnlyScan is very similar to IndexScan, but it specifies an+ * index-only scan, in which the data comes from the index not the heap.+ * Because of this, *all* Vars in the plan node's targetlist, qual, and+ * index expressions reference index columns and have varno = INDEX_VAR.+ * Hence we do not need separate indexqualorig and indexorderbyorig lists,+ * since their contents would be equivalent to indexqual and indexorderby.+ *+ * To help EXPLAIN interpret the index Vars for display, we provide+ * indextlist, which represents the contents of the index as a targetlist+ * with one TLE per index column. Vars appearing in this list reference+ * the base table, and this is the only field in the plan node that may+ * contain such Vars.+ * ----------------+ */+typedef struct IndexOnlyScan+{+ Scan scan;+ Oid indexid; /* OID of index to scan */+ List *indexqual; /* list of index quals (usually OpExprs) */+ List *indexorderby; /* list of index ORDER BY exprs */+ List *indextlist; /* TargetEntry list describing index's cols */+ ScanDirection indexorderdir; /* forward or backward or don't care */+} IndexOnlyScan;++/* ----------------+ * bitmap index scan node+ *+ * BitmapIndexScan delivers a bitmap of potential tuple locations;+ * it does not access the heap itself. The bitmap is used by an+ * ancestor BitmapHeapScan node, possibly after passing through+ * intermediate BitmapAnd and/or BitmapOr nodes to combine it with+ * the results of other BitmapIndexScans.+ *+ * The fields have the same meanings as for IndexScan, except we don't+ * store a direction flag because direction is uninteresting.+ *+ * In a BitmapIndexScan plan node, the targetlist and qual fields are+ * not used and are always NIL. The indexqualorig field is unused at+ * run time too, but is saved for the benefit of EXPLAIN.+ * ----------------+ */+typedef struct BitmapIndexScan+{+ Scan scan;+ Oid indexid; /* OID of index to scan */+ List *indexqual; /* list of index quals (OpExprs) */+ List *indexqualorig; /* the same in original form */+} BitmapIndexScan;++/* ----------------+ * bitmap sequential scan node+ *+ * This needs a copy of the qual conditions being used by the input index+ * scans because there are various cases where we need to recheck the quals;+ * for example, when the bitmap is lossy about the specific rows on a page+ * that meet the index condition.+ * ----------------+ */+typedef struct BitmapHeapScan+{+ Scan scan;+ List *bitmapqualorig; /* index quals, in standard expr form */+} BitmapHeapScan;++/* ----------------+ * tid scan node+ *+ * tidquals is an implicitly OR'ed list of qual expressions of the form+ * "CTID = pseudoconstant" or "CTID = ANY(pseudoconstant_array)".+ * ----------------+ */+typedef struct TidScan+{+ Scan scan;+ List *tidquals; /* qual(s) involving CTID = something */+} TidScan;++/* ----------------+ * subquery scan node+ *+ * SubqueryScan is for scanning the output of a sub-query in the range table.+ * We often need an extra plan node above the sub-query's plan to perform+ * expression evaluations (which we can't push into the sub-query without+ * risking changing its semantics). Although we are not scanning a physical+ * relation, we make this a descendant of Scan anyway for code-sharing+ * purposes.+ *+ * Note: we store the sub-plan in the type-specific subplan field, not in+ * the generic lefttree field as you might expect. This is because we do+ * not want plan-tree-traversal routines to recurse into the subplan without+ * knowing that they are changing Query contexts.+ * ----------------+ */+typedef struct SubqueryScan+{+ Scan scan;+ Plan *subplan;+} SubqueryScan;++/* ----------------+ * FunctionScan node+ * ----------------+ */+typedef struct FunctionScan+{+ Scan scan;+ List *functions; /* list of RangeTblFunction nodes */+ bool funcordinality; /* WITH ORDINALITY */+} FunctionScan;++/* ----------------+ * ValuesScan node+ * ----------------+ */+typedef struct ValuesScan+{+ Scan scan;+ List *values_lists; /* list of expression lists */+} ValuesScan;++/* ----------------+ * CteScan node+ * ----------------+ */+typedef struct CteScan+{+ Scan scan;+ int ctePlanId; /* ID of init SubPlan for CTE */+ int cteParam; /* ID of Param representing CTE output */+} CteScan;++/* ----------------+ * WorkTableScan node+ * ----------------+ */+typedef struct WorkTableScan+{+ Scan scan;+ int wtParam; /* ID of Param representing work table */+} WorkTableScan;++/* ----------------+ * ForeignScan node+ *+ * fdw_exprs and fdw_private are both under the control of the foreign-data+ * wrapper, but fdw_exprs is presumed to contain expression trees and will+ * be post-processed accordingly by the planner; fdw_private won't be.+ * Note that everything in both lists must be copiable by copyObject().+ * One way to store an arbitrary blob of bytes is to represent it as a bytea+ * Const. Usually, though, you'll be better off choosing a representation+ * that can be dumped usefully by nodeToString().+ *+ * fdw_scan_tlist is a targetlist describing the contents of the scan tuple+ * returned by the FDW; it can be NIL if the scan tuple matches the declared+ * rowtype of the foreign table, which is the normal case for a simple foreign+ * table scan. (If the plan node represents a foreign join, fdw_scan_tlist+ * is required since there is no rowtype available from the system catalogs.)+ * When fdw_scan_tlist is provided, Vars in the node's tlist and quals must+ * have varno INDEX_VAR, and their varattnos correspond to resnos in the+ * fdw_scan_tlist (which are also column numbers in the actual scan tuple).+ * fdw_scan_tlist is never actually executed; it just holds expression trees+ * describing what is in the scan tuple's columns.+ *+ * fdw_recheck_quals should contain any quals which the core system passed to+ * the FDW but which were not added to scan.plan.qual; that is, it should+ * contain the quals being checked remotely. This is needed for correct+ * behavior during EvalPlanQual rechecks.+ *+ * When the plan node represents a foreign join, scan.scanrelid is zero and+ * fs_relids must be consulted to identify the join relation. (fs_relids+ * is valid for simple scans as well, but will always match scan.scanrelid.)+ * ----------------+ */+typedef struct ForeignScan+{+ Scan scan;+ Oid fs_server; /* OID of foreign server */+ List *fdw_exprs; /* expressions that FDW may evaluate */+ List *fdw_private; /* private data for FDW */+ List *fdw_scan_tlist; /* optional tlist describing scan tuple */+ List *fdw_recheck_quals; /* original quals not in scan.plan.qual */+ Bitmapset *fs_relids; /* RTIs generated by this scan */+ bool fsSystemCol; /* true if any "system column" is needed */+} ForeignScan;++/* ----------------+ * CustomScan node+ *+ * The comments for ForeignScan's fdw_exprs, fdw_private, fdw_scan_tlist,+ * and fs_relids fields apply equally to CustomScan's custom_exprs,+ * custom_private, custom_scan_tlist, and custom_relids fields. The+ * convention of setting scan.scanrelid to zero for joins applies as well.+ *+ * Note that since Plan trees can be copied, custom scan providers *must*+ * fit all plan data they need into those fields; embedding CustomScan in+ * a larger struct will not work.+ * ----------------+ */+struct CustomScan;++typedef struct CustomScanMethods+{+ const char *CustomName;++ /* Create execution state (CustomScanState) from a CustomScan plan node */+ Node *(*CreateCustomScanState) (struct CustomScan *cscan);+ /* Optional: print custom_xxx fields in some special way */+ void (*TextOutCustomScan) (StringInfo str,+ const struct CustomScan *node);+} CustomScanMethods;++typedef struct CustomScan+{+ Scan scan;+ uint32 flags; /* mask of CUSTOMPATH_* flags, see relation.h */+ List *custom_plans; /* list of Plan nodes, if any */+ List *custom_exprs; /* expressions that custom code may evaluate */+ List *custom_private; /* private data for custom code */+ List *custom_scan_tlist; /* optional tlist describing scan+ * tuple */+ Bitmapset *custom_relids; /* RTIs generated by this scan */+ const CustomScanMethods *methods;+} CustomScan;++/*+ * ==========+ * Join nodes+ * ==========+ */++/* ----------------+ * Join node+ *+ * jointype: rule for joining tuples from left and right subtrees+ * joinqual: qual conditions that came from JOIN/ON or JOIN/USING+ * (plan.qual contains conditions that came from WHERE)+ *+ * When jointype is INNER, joinqual and plan.qual are semantically+ * interchangeable. For OUTER jointypes, the two are *not* interchangeable;+ * only joinqual is used to determine whether a match has been found for+ * the purpose of deciding whether to generate null-extended tuples.+ * (But plan.qual is still applied before actually returning a tuple.)+ * For an outer join, only joinquals are allowed to be used as the merge+ * or hash condition of a merge or hash join.+ * ----------------+ */+typedef struct Join+{+ Plan plan;+ JoinType jointype;+ List *joinqual; /* JOIN quals (in addition to plan.qual) */+} Join;++/* ----------------+ * nest loop join node+ *+ * The nestParams list identifies any executor Params that must be passed+ * into execution of the inner subplan carrying values from the current row+ * of the outer subplan. Currently we restrict these values to be simple+ * Vars, but perhaps someday that'd be worth relaxing. (Note: during plan+ * creation, the paramval can actually be a PlaceHolderVar expression; but it+ * must be a Var with varno OUTER_VAR by the time it gets to the executor.)+ * ----------------+ */+typedef struct NestLoop+{+ Join join;+ List *nestParams; /* list of NestLoopParam nodes */+} NestLoop;++typedef struct NestLoopParam+{+ NodeTag type;+ int paramno; /* number of the PARAM_EXEC Param to set */+ Var *paramval; /* outer-relation Var to assign to Param */+} NestLoopParam;++/* ----------------+ * merge join node+ *+ * The expected ordering of each mergeable column is described by a btree+ * opfamily OID, a collation OID, a direction (BTLessStrategyNumber or+ * BTGreaterStrategyNumber) and a nulls-first flag. Note that the two sides+ * of each mergeclause may be of different datatypes, but they are ordered the+ * same way according to the common opfamily and collation. The operator in+ * each mergeclause must be an equality operator of the indicated opfamily.+ * ----------------+ */+typedef struct MergeJoin+{+ Join join;+ List *mergeclauses; /* mergeclauses as expression trees */+ /* these are arrays, but have the same length as the mergeclauses list: */+ Oid *mergeFamilies; /* per-clause OIDs of btree opfamilies */+ Oid *mergeCollations; /* per-clause OIDs of collations */+ int *mergeStrategies; /* per-clause ordering (ASC or DESC) */+ bool *mergeNullsFirst; /* per-clause nulls ordering */+} MergeJoin;++/* ----------------+ * hash join node+ * ----------------+ */+typedef struct HashJoin+{+ Join join;+ List *hashclauses;+} HashJoin;++/* ----------------+ * materialization node+ * ----------------+ */+typedef struct Material+{+ Plan plan;+} Material;++/* ----------------+ * sort node+ * ----------------+ */+typedef struct Sort+{+ Plan plan;+ int numCols; /* number of sort-key columns */+ AttrNumber *sortColIdx; /* their indexes in the target list */+ Oid *sortOperators; /* OIDs of operators to sort them by */+ Oid *collations; /* OIDs of collations */+ bool *nullsFirst; /* NULLS FIRST/LAST directions */+} Sort;++/* ---------------+ * group node -+ * Used for queries with GROUP BY (but no aggregates) specified.+ * The input must be presorted according to the grouping columns.+ * ---------------+ */+typedef struct Group+{+ Plan plan;+ int numCols; /* number of grouping columns */+ AttrNumber *grpColIdx; /* their indexes in the target list */+ Oid *grpOperators; /* equality operators to compare with */+} Group;++/* ---------------+ * aggregate node+ *+ * An Agg node implements plain or grouped aggregation. For grouped+ * aggregation, we can work with presorted input or unsorted input;+ * the latter strategy uses an internal hashtable.+ *+ * Notice the lack of any direct info about the aggregate functions to be+ * computed. They are found by scanning the node's tlist and quals during+ * executor startup. (It is possible that there are no aggregate functions;+ * this could happen if they get optimized away by constant-folding, or if+ * we are using the Agg node to implement hash-based grouping.)+ * ---------------+ */+typedef enum AggStrategy+{+ AGG_PLAIN, /* simple agg across all input rows */+ AGG_SORTED, /* grouped agg, input must be sorted */+ AGG_HASHED /* grouped agg, use internal hashtable */+} AggStrategy;++typedef struct Agg+{+ Plan plan;+ AggStrategy aggstrategy;+ int numCols; /* number of grouping columns */+ AttrNumber *grpColIdx; /* their indexes in the target list */+ Oid *grpOperators; /* equality operators to compare with */+ long numGroups; /* estimated number of groups in input */+ List *groupingSets; /* grouping sets to use */+ List *chain; /* chained Agg/Sort nodes */+} Agg;++/* ----------------+ * window aggregate node+ * ----------------+ */+typedef struct WindowAgg+{+ Plan plan;+ Index winref; /* ID referenced by window functions */+ int partNumCols; /* number of columns in partition clause */+ AttrNumber *partColIdx; /* their indexes in the target list */+ Oid *partOperators; /* equality operators for partition columns */+ int ordNumCols; /* number of columns in ordering clause */+ AttrNumber *ordColIdx; /* their indexes in the target list */+ Oid *ordOperators; /* equality operators for ordering columns */+ int frameOptions; /* frame_clause options, see WindowDef */+ Node *startOffset; /* expression for starting bound, if any */+ Node *endOffset; /* expression for ending bound, if any */+} WindowAgg;++/* ----------------+ * unique node+ * ----------------+ */+typedef struct Unique+{+ Plan plan;+ int numCols; /* number of columns to check for uniqueness */+ AttrNumber *uniqColIdx; /* their indexes in the target list */+ Oid *uniqOperators; /* equality operators to compare with */+} Unique;++/* ----------------+ * hash build node+ *+ * If the executor is supposed to try to apply skew join optimization, then+ * skewTable/skewColumn/skewInherit identify the outer relation's join key+ * column, from which the relevant MCV statistics can be fetched. Also, its+ * type information is provided to save a lookup.+ * ----------------+ */+typedef struct Hash+{+ Plan plan;+ Oid skewTable; /* outer join key's table OID, or InvalidOid */+ AttrNumber skewColumn; /* outer join key's column #, or zero */+ bool skewInherit; /* is outer join rel an inheritance tree? */+ Oid skewColType; /* datatype of the outer key column */+ int32 skewColTypmod; /* typmod of the outer key column */+ /* all other info is in the parent HashJoin node */+} Hash;++/* ----------------+ * setop node+ * ----------------+ */+typedef enum SetOpCmd+{+ SETOPCMD_INTERSECT,+ SETOPCMD_INTERSECT_ALL,+ SETOPCMD_EXCEPT,+ SETOPCMD_EXCEPT_ALL+} SetOpCmd;++typedef enum SetOpStrategy+{+ SETOP_SORTED, /* input must be sorted */+ SETOP_HASHED /* use internal hashtable */+} SetOpStrategy;++typedef struct SetOp+{+ Plan plan;+ SetOpCmd cmd; /* what to do */+ SetOpStrategy strategy; /* how to do it */+ int numCols; /* number of columns to check for+ * duplicate-ness */+ AttrNumber *dupColIdx; /* their indexes in the target list */+ Oid *dupOperators; /* equality operators to compare with */+ AttrNumber flagColIdx; /* where is the flag column, if any */+ int firstFlag; /* flag value for first input relation */+ long numGroups; /* estimated number of groups in input */+} SetOp;++/* ----------------+ * lock-rows node+ *+ * rowMarks identifies the rels to be locked by this node; it should be+ * a subset of the rowMarks listed in the top-level PlannedStmt.+ * epqParam is a Param that all scan nodes below this one must depend on.+ * It is used to force re-evaluation of the plan during EvalPlanQual.+ * ----------------+ */+typedef struct LockRows+{+ Plan plan;+ List *rowMarks; /* a list of PlanRowMark's */+ int epqParam; /* ID of Param for EvalPlanQual re-eval */+} LockRows;++/* ----------------+ * limit node+ *+ * Note: as of Postgres 8.2, the offset and count expressions are expected+ * to yield int8, rather than int4 as before.+ * ----------------+ */+typedef struct Limit+{+ Plan plan;+ Node *limitOffset; /* OFFSET parameter, or NULL if none */+ Node *limitCount; /* COUNT parameter, or NULL if none */+} Limit;+++/*+ * RowMarkType -+ * enums for types of row-marking operations+ *+ * The first four of these values represent different lock strengths that+ * we can take on tuples according to SELECT FOR [KEY] UPDATE/SHARE requests.+ * We support these on regular tables, as well as on foreign tables whose FDWs+ * report support for late locking. For other foreign tables, any locking+ * that might be done for such requests must happen during the initial row+ * fetch; their FDWs provide no mechanism for going back to lock a row later.+ * This means that the semantics will be a bit different than for a local+ * table; in particular we are likely to lock more rows than would be locked+ * locally, since remote rows will be locked even if they then fail+ * locally-checked restriction or join quals. However, the prospect of+ * doing a separate remote query to lock each selected row is usually pretty+ * unappealing, so early locking remains a credible design choice for FDWs.+ *+ * When doing UPDATE, DELETE, or SELECT FOR UPDATE/SHARE, we have to uniquely+ * identify all the source rows, not only those from the target relations, so+ * that we can perform EvalPlanQual rechecking at need. For plain tables we+ * can just fetch the TID, much as for a target relation; this case is+ * represented by ROW_MARK_REFERENCE. Otherwise (for example for VALUES or+ * FUNCTION scans) we have to copy the whole row value. ROW_MARK_COPY is+ * pretty inefficient, since most of the time we'll never need the data; but+ * fortunately the overhead is usually not performance-critical in practice.+ * By default we use ROW_MARK_COPY for foreign tables, but if the FDW has+ * a concept of rowid it can request to use ROW_MARK_REFERENCE instead.+ * (Again, this probably doesn't make sense if a physical remote fetch is+ * needed, but for FDWs that map to local storage it might be credible.)+ */+typedef enum RowMarkType+{+ ROW_MARK_EXCLUSIVE, /* obtain exclusive tuple lock */+ ROW_MARK_NOKEYEXCLUSIVE, /* obtain no-key exclusive tuple lock */+ ROW_MARK_SHARE, /* obtain shared tuple lock */+ ROW_MARK_KEYSHARE, /* obtain keyshare tuple lock */+ ROW_MARK_REFERENCE, /* just fetch the TID, don't lock it */+ ROW_MARK_COPY /* physically copy the row value */+} RowMarkType;++#define RowMarkRequiresRowShareLock(marktype) ((marktype) <= ROW_MARK_KEYSHARE)++/*+ * PlanRowMark -+ * plan-time representation of FOR [KEY] UPDATE/SHARE clauses+ *+ * When doing UPDATE, DELETE, or SELECT FOR UPDATE/SHARE, we create a separate+ * PlanRowMark node for each non-target relation in the query. Relations that+ * are not specified as FOR UPDATE/SHARE are marked ROW_MARK_REFERENCE (if+ * regular tables or supported foreign tables) or ROW_MARK_COPY (if not).+ *+ * Initially all PlanRowMarks have rti == prti and isParent == false.+ * When the planner discovers that a relation is the root of an inheritance+ * tree, it sets isParent true, and adds an additional PlanRowMark to the+ * list for each child relation (including the target rel itself in its role+ * as a child). The child entries have rti == child rel's RT index and+ * prti == parent's RT index, and can therefore be recognized as children by+ * the fact that prti != rti. The parent's allMarkTypes field gets the OR+ * of (1<<markType) across all its children (this definition allows children+ * to use different markTypes).+ *+ * The planner also adds resjunk output columns to the plan that carry+ * information sufficient to identify the locked or fetched rows. When+ * markType != ROW_MARK_COPY, these columns are named+ * tableoid%u OID of table+ * ctid%u TID of row+ * The tableoid column is only present for an inheritance hierarchy.+ * When markType == ROW_MARK_COPY, there is instead a single column named+ * wholerow%u whole-row value of relation+ * (An inheritance hierarchy could have all three resjunk output columns,+ * if some children use a different markType than others.)+ * In all three cases, %u represents the rowmark ID number (rowmarkId).+ * This number is unique within a plan tree, except that child relation+ * entries copy their parent's rowmarkId. (Assigning unique numbers+ * means we needn't renumber rowmarkIds when flattening subqueries, which+ * would require finding and renaming the resjunk columns as well.)+ * Note this means that all tables in an inheritance hierarchy share the+ * same resjunk column names. However, in an inherited UPDATE/DELETE the+ * columns could have different physical column numbers in each subplan.+ */+typedef struct PlanRowMark+{+ NodeTag type;+ Index rti; /* range table index of markable relation */+ Index prti; /* range table index of parent relation */+ Index rowmarkId; /* unique identifier for resjunk columns */+ RowMarkType markType; /* see enum above */+ int allMarkTypes; /* OR of (1<<markType) for all children */+ LockClauseStrength strength; /* LockingClause's strength, or LCS_NONE */+ LockWaitPolicy waitPolicy; /* NOWAIT and SKIP LOCKED options */+ bool isParent; /* true if this is a "dummy" parent entry */+} PlanRowMark;+++/*+ * Plan invalidation info+ *+ * We track the objects on which a PlannedStmt depends in two ways:+ * relations are recorded as a simple list of OIDs, and everything else+ * is represented as a list of PlanInvalItems. A PlanInvalItem is designed+ * to be used with the syscache invalidation mechanism, so it identifies a+ * system catalog entry by cache ID and hash value.+ */+typedef struct PlanInvalItem+{+ NodeTag type;+ int cacheId; /* a syscache ID, see utils/syscache.h */+ uint32 hashValue; /* hash value of object's cache lookup key */+} PlanInvalItem;++#endif /* PLANNODES_H */
+ foreign/libpg_query/src/postgres/include/nodes/primnodes.h view
@@ -0,0 +1,1400 @@+/*-------------------------------------------------------------------------+ *+ * primnodes.h+ * Definitions for "primitive" node types, those that are used in more+ * than one of the parse/plan/execute stages of the query pipeline.+ * Currently, these are mostly nodes for executable expressions+ * and join trees.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/nodes/primnodes.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef PRIMNODES_H+#define PRIMNODES_H++#include "access/attnum.h"+#include "nodes/pg_list.h"+++/* ----------------------------------------------------------------+ * node definitions+ * ----------------------------------------------------------------+ */++/*+ * Alias -+ * specifies an alias for a range variable; the alias might also+ * specify renaming of columns within the table.+ *+ * Note: colnames is a list of Value nodes (always strings). In Alias structs+ * associated with RTEs, there may be entries corresponding to dropped+ * columns; these are normally empty strings (""). See parsenodes.h for info.+ */+typedef struct Alias+{+ NodeTag type;+ char *aliasname; /* aliased rel name (never qualified) */+ List *colnames; /* optional list of column aliases */+} Alias;++typedef enum InhOption+{+ INH_NO, /* Do NOT scan child tables */+ INH_YES, /* DO scan child tables */+ INH_DEFAULT /* Use current SQL_inheritance option */+} InhOption;++/* What to do at commit time for temporary relations */+typedef enum OnCommitAction+{+ ONCOMMIT_NOOP, /* No ON COMMIT clause (do nothing) */+ ONCOMMIT_PRESERVE_ROWS, /* ON COMMIT PRESERVE ROWS (do nothing) */+ ONCOMMIT_DELETE_ROWS, /* ON COMMIT DELETE ROWS */+ ONCOMMIT_DROP /* ON COMMIT DROP */+} OnCommitAction;++/*+ * RangeVar - range variable, used in FROM clauses+ *+ * Also used to represent table names in utility statements; there, the alias+ * field is not used, and inhOpt shows whether to apply the operation+ * recursively to child tables. In some contexts it is also useful to carry+ * a TEMP table indication here.+ */+typedef struct RangeVar+{+ NodeTag type;+ char *catalogname; /* the catalog (database) name, or NULL */+ char *schemaname; /* the schema name, or NULL */+ char *relname; /* the relation/sequence name */+ InhOption inhOpt; /* expand rel by inheritance? recursively act+ * on children? */+ char relpersistence; /* see RELPERSISTENCE_* in pg_class.h */+ Alias *alias; /* table alias & optional column aliases */+ int location; /* token location, or -1 if unknown */+} RangeVar;++/*+ * IntoClause - target information for SELECT INTO, CREATE TABLE AS, and+ * CREATE MATERIALIZED VIEW+ *+ * For CREATE MATERIALIZED VIEW, viewQuery is the parsed-but-not-rewritten+ * SELECT Query for the view; otherwise it's NULL. (Although it's actually+ * Query*, we declare it as Node* to avoid a forward reference.)+ */+typedef struct IntoClause+{+ NodeTag type;++ RangeVar *rel; /* target relation name */+ List *colNames; /* column names to assign, or NIL */+ List *options; /* options from WITH clause */+ OnCommitAction onCommit; /* what do we do at COMMIT? */+ char *tableSpaceName; /* table space to use, or NULL */+ Node *viewQuery; /* materialized view's SELECT query */+ bool skipData; /* true for WITH NO DATA */+} IntoClause;+++/* ----------------------------------------------------------------+ * node types for executable expressions+ * ----------------------------------------------------------------+ */++/*+ * Expr - generic superclass for executable-expression nodes+ *+ * All node types that are used in executable expression trees should derive+ * from Expr (that is, have Expr as their first field). Since Expr only+ * contains NodeTag, this is a formality, but it is an easy form of+ * documentation. See also the ExprState node types in execnodes.h.+ */+typedef struct Expr+{+ NodeTag type;+} Expr;++/*+ * Var - expression node representing a variable (ie, a table column)+ *+ * Note: during parsing/planning, varnoold/varoattno are always just copies+ * of varno/varattno. At the tail end of planning, Var nodes appearing in+ * upper-level plan nodes are reassigned to point to the outputs of their+ * subplans; for example, in a join node varno becomes INNER_VAR or OUTER_VAR+ * and varattno becomes the index of the proper element of that subplan's+ * target list. Similarly, INDEX_VAR is used to identify Vars that reference+ * an index column rather than a heap column. (In ForeignScan and CustomScan+ * plan nodes, INDEX_VAR is abused to signify references to columns of a+ * custom scan tuple type.) In all these cases, varnoold/varoattno hold the+ * original values. The code doesn't really need varnoold/varoattno, but they+ * are very useful for debugging and interpreting completed plans, so we keep+ * them around.+ */+#define INNER_VAR 65000 /* reference to inner subplan */+#define OUTER_VAR 65001 /* reference to outer subplan */+#define INDEX_VAR 65002 /* reference to index column */++#define IS_SPECIAL_VARNO(varno) ((varno) >= INNER_VAR)++/* Symbols for the indexes of the special RTE entries in rules */+#define PRS2_OLD_VARNO 1+#define PRS2_NEW_VARNO 2++typedef struct Var+{+ Expr xpr;+ Index varno; /* index of this var's relation in the range+ * table, or INNER_VAR/OUTER_VAR/INDEX_VAR */+ AttrNumber varattno; /* attribute number of this var, or zero for+ * all */+ Oid vartype; /* pg_type OID for the type of this var */+ int32 vartypmod; /* pg_attribute typmod value */+ Oid varcollid; /* OID of collation, or InvalidOid if none */+ Index varlevelsup; /* for subquery variables referencing outer+ * relations; 0 in a normal var, >0 means N+ * levels up */+ Index varnoold; /* original value of varno, for debugging */+ AttrNumber varoattno; /* original value of varattno */+ int location; /* token location, or -1 if unknown */+} Var;++/*+ * Const+ *+ * Note: for varlena data types, we make a rule that a Const node's value+ * must be in non-extended form (4-byte header, no compression or external+ * references). This ensures that the Const node is self-contained and makes+ * it more likely that equal() will see logically identical values as equal.+ */+typedef struct Const+{+ Expr xpr;+ Oid consttype; /* pg_type OID of the constant's datatype */+ int32 consttypmod; /* typmod value, if any */+ Oid constcollid; /* OID of collation, or InvalidOid if none */+ int constlen; /* typlen of the constant's datatype */+ Datum constvalue; /* the constant's value */+ bool constisnull; /* whether the constant is null (if true,+ * constvalue is undefined) */+ bool constbyval; /* whether this datatype is passed by value.+ * If true, then all the information is stored+ * in the Datum. If false, then the Datum+ * contains a pointer to the information. */+ int location; /* token location, or -1 if unknown */+} Const;++/*+ * Param+ *+ * paramkind specifies the kind of parameter. The possible values+ * for this field are:+ *+ * PARAM_EXTERN: The parameter value is supplied from outside the plan.+ * Such parameters are numbered from 1 to n.+ *+ * PARAM_EXEC: The parameter is an internal executor parameter, used+ * for passing values into and out of sub-queries or from+ * nestloop joins to their inner scans.+ * For historical reasons, such parameters are numbered from 0.+ * These numbers are independent of PARAM_EXTERN numbers.+ *+ * PARAM_SUBLINK: The parameter represents an output column of a SubLink+ * node's sub-select. The column number is contained in the+ * `paramid' field. (This type of Param is converted to+ * PARAM_EXEC during planning.)+ *+ * PARAM_MULTIEXPR: Like PARAM_SUBLINK, the parameter represents an+ * output column of a SubLink node's sub-select, but here, the+ * SubLink is always a MULTIEXPR SubLink. The high-order 16 bits+ * of the `paramid' field contain the SubLink's subLinkId, and+ * the low-order 16 bits contain the column number. (This type+ * of Param is also converted to PARAM_EXEC during planning.)+ */+typedef enum ParamKind+{+ PARAM_EXTERN,+ PARAM_EXEC,+ PARAM_SUBLINK,+ PARAM_MULTIEXPR+} ParamKind;++typedef struct Param+{+ Expr xpr;+ ParamKind paramkind; /* kind of parameter. See above */+ int paramid; /* numeric ID for parameter */+ Oid paramtype; /* pg_type OID of parameter's datatype */+ int32 paramtypmod; /* typmod value, if known */+ Oid paramcollid; /* OID of collation, or InvalidOid if none */+ int location; /* token location, or -1 if unknown */+} Param;++/*+ * Aggref+ *+ * The aggregate's args list is a targetlist, ie, a list of TargetEntry nodes.+ *+ * For a normal (non-ordered-set) aggregate, the non-resjunk TargetEntries+ * represent the aggregate's regular arguments (if any) and resjunk TLEs can+ * be added at the end to represent ORDER BY expressions that are not also+ * arguments. As in a top-level Query, the TLEs can be marked with+ * ressortgroupref indexes to let them be referenced by SortGroupClause+ * entries in the aggorder and/or aggdistinct lists. This represents ORDER BY+ * and DISTINCT operations to be applied to the aggregate input rows before+ * they are passed to the transition function. The grammar only allows a+ * simple "DISTINCT" specifier for the arguments, but we use the full+ * query-level representation to allow more code sharing.+ *+ * For an ordered-set aggregate, the args list represents the WITHIN GROUP+ * (aggregated) arguments, all of which will be listed in the aggorder list.+ * DISTINCT is not supported in this case, so aggdistinct will be NIL.+ * The direct arguments appear in aggdirectargs (as a list of plain+ * expressions, not TargetEntry nodes).+ */+typedef struct Aggref+{+ Expr xpr;+ Oid aggfnoid; /* pg_proc Oid of the aggregate */+ Oid aggtype; /* type Oid of result of the aggregate */+ Oid aggcollid; /* OID of collation of result */+ Oid inputcollid; /* OID of collation that function should use */+ List *aggdirectargs; /* direct arguments, if an ordered-set agg */+ List *args; /* aggregated arguments and sort expressions */+ List *aggorder; /* ORDER BY (list of SortGroupClause) */+ List *aggdistinct; /* DISTINCT (list of SortGroupClause) */+ Expr *aggfilter; /* FILTER expression, if any */+ bool aggstar; /* TRUE if argument list was really '*' */+ bool aggvariadic; /* true if variadic arguments have been+ * combined into an array last argument */+ char aggkind; /* aggregate kind (see pg_aggregate.h) */+ Index agglevelsup; /* > 0 if agg belongs to outer query */+ int location; /* token location, or -1 if unknown */+} Aggref;++/*+ * GroupingFunc+ *+ * A GroupingFunc is a GROUPING(...) expression, which behaves in many ways+ * like an aggregate function (e.g. it "belongs" to a specific query level,+ * which might not be the one immediately containing it), but also differs in+ * an important respect: it never evaluates its arguments, they merely+ * designate expressions from the GROUP BY clause of the query level to which+ * it belongs.+ *+ * The spec defines the evaluation of GROUPING() purely by syntactic+ * replacement, but we make it a real expression for optimization purposes so+ * that one Agg node can handle multiple grouping sets at once. Evaluating the+ * result only needs the column positions to check against the grouping set+ * being projected. However, for EXPLAIN to produce meaningful output, we have+ * to keep the original expressions around, since expression deparse does not+ * give us any feasible way to get at the GROUP BY clause.+ *+ * Also, we treat two GroupingFunc nodes as equal if they have equal arguments+ * lists and agglevelsup, without comparing the refs and cols annotations.+ *+ * In raw parse output we have only the args list; parse analysis fills in the+ * refs list, and the planner fills in the cols list.+ */+typedef struct GroupingFunc+{+ Expr xpr;+ List *args; /* arguments, not evaluated but kept for+ * benefit of EXPLAIN etc. */+ List *refs; /* ressortgrouprefs of arguments */+ List *cols; /* actual column positions set by planner */+ Index agglevelsup; /* same as Aggref.agglevelsup */+ int location; /* token location */+} GroupingFunc;++/*+ * WindowFunc+ */+typedef struct WindowFunc+{+ Expr xpr;+ Oid winfnoid; /* pg_proc Oid of the function */+ Oid wintype; /* type Oid of result of the window function */+ Oid wincollid; /* OID of collation of result */+ Oid inputcollid; /* OID of collation that function should use */+ List *args; /* arguments to the window function */+ Expr *aggfilter; /* FILTER expression, if any */+ Index winref; /* index of associated WindowClause */+ bool winstar; /* TRUE if argument list was really '*' */+ bool winagg; /* is function a simple aggregate? */+ int location; /* token location, or -1 if unknown */+} WindowFunc;++/* ----------------+ * ArrayRef: describes an array subscripting operation+ *+ * An ArrayRef can describe fetching a single element from an array,+ * fetching a subarray (array slice), storing a single element into+ * an array, or storing a slice. The "store" cases work with an+ * initial array value and a source value that is inserted into the+ * appropriate part of the array; the result of the operation is an+ * entire new modified array value.+ *+ * If reflowerindexpr = NIL, then we are fetching or storing a single array+ * element at the subscripts given by refupperindexpr. Otherwise we are+ * fetching or storing an array slice, that is a rectangular subarray+ * with lower and upper bounds given by the index expressions.+ * reflowerindexpr must be the same length as refupperindexpr when it+ * is not NIL.+ *+ * Note: the result datatype is the element type when fetching a single+ * element; but it is the array type when doing subarray fetch or either+ * type of store.+ *+ * Note: for the cases where an array is returned, if refexpr yields a R/W+ * expanded array, then the implementation is allowed to modify that object+ * in-place and return the same object.)+ * ----------------+ */+typedef struct ArrayRef+{+ Expr xpr;+ Oid refarraytype; /* type of the array proper */+ Oid refelemtype; /* type of the array elements */+ int32 reftypmod; /* typmod of the array (and elements too) */+ Oid refcollid; /* OID of collation, or InvalidOid if none */+ List *refupperindexpr;/* expressions that evaluate to upper array+ * indexes */+ List *reflowerindexpr;/* expressions that evaluate to lower array+ * indexes */+ Expr *refexpr; /* the expression that evaluates to an array+ * value */+ Expr *refassgnexpr; /* expression for the source value, or NULL if+ * fetch */+} ArrayRef;++/*+ * CoercionContext - distinguishes the allowed set of type casts+ *+ * NB: ordering of the alternatives is significant; later (larger) values+ * allow more casts than earlier ones.+ */+typedef enum CoercionContext+{+ COERCION_IMPLICIT, /* coercion in context of expression */+ COERCION_ASSIGNMENT, /* coercion in context of assignment */+ COERCION_EXPLICIT /* explicit cast operation */+} CoercionContext;++/*+ * CoercionForm - how to display a node that could have come from a cast+ *+ * NB: equal() ignores CoercionForm fields, therefore this *must* not carry+ * any semantically significant information. We need that behavior so that+ * the planner will consider equivalent implicit and explicit casts to be+ * equivalent. In cases where those actually behave differently, the coercion+ * function's arguments will be different.+ */+typedef enum CoercionForm+{+ COERCE_EXPLICIT_CALL, /* display as a function call */+ COERCE_EXPLICIT_CAST, /* display as an explicit cast */+ COERCE_IMPLICIT_CAST /* implicit cast, so hide it */+} CoercionForm;++/*+ * FuncExpr - expression node for a function call+ */+typedef struct FuncExpr+{+ Expr xpr;+ Oid funcid; /* PG_PROC OID of the function */+ Oid funcresulttype; /* PG_TYPE OID of result value */+ bool funcretset; /* true if function returns set */+ bool funcvariadic; /* true if variadic arguments have been+ * combined into an array last argument */+ CoercionForm funcformat; /* how to display this function call */+ Oid funccollid; /* OID of collation of result */+ Oid inputcollid; /* OID of collation that function should use */+ List *args; /* arguments to the function */+ int location; /* token location, or -1 if unknown */+} FuncExpr;++/*+ * NamedArgExpr - a named argument of a function+ *+ * This node type can only appear in the args list of a FuncCall or FuncExpr+ * node. We support pure positional call notation (no named arguments),+ * named notation (all arguments are named), and mixed notation (unnamed+ * arguments followed by named ones).+ *+ * Parse analysis sets argnumber to the positional index of the argument,+ * but doesn't rearrange the argument list.+ *+ * The planner will convert argument lists to pure positional notation+ * during expression preprocessing, so execution never sees a NamedArgExpr.+ */+typedef struct NamedArgExpr+{+ Expr xpr;+ Expr *arg; /* the argument expression */+ char *name; /* the name */+ int argnumber; /* argument's number in positional notation */+ int location; /* argument name location, or -1 if unknown */+} NamedArgExpr;++/*+ * OpExpr - expression node for an operator invocation+ *+ * Semantically, this is essentially the same as a function call.+ *+ * Note that opfuncid is not necessarily filled in immediately on creation+ * of the node. The planner makes sure it is valid before passing the node+ * tree to the executor, but during parsing/planning opfuncid can be 0.+ */+typedef struct OpExpr+{+ Expr xpr;+ Oid opno; /* PG_OPERATOR OID of the operator */+ Oid opfuncid; /* PG_PROC OID of underlying function */+ Oid opresulttype; /* PG_TYPE OID of result value */+ bool opretset; /* true if operator returns set */+ Oid opcollid; /* OID of collation of result */+ Oid inputcollid; /* OID of collation that operator should use */+ List *args; /* arguments to the operator (1 or 2) */+ int location; /* token location, or -1 if unknown */+} OpExpr;++/*+ * DistinctExpr - expression node for "x IS DISTINCT FROM y"+ *+ * Except for the nodetag, this is represented identically to an OpExpr+ * referencing the "=" operator for x and y.+ * We use "=", not the more obvious "<>", because more datatypes have "="+ * than "<>". This means the executor must invert the operator result.+ * Note that the operator function won't be called at all if either input+ * is NULL, since then the result can be determined directly.+ */+typedef OpExpr DistinctExpr;++/*+ * NullIfExpr - a NULLIF expression+ *+ * Like DistinctExpr, this is represented the same as an OpExpr referencing+ * the "=" operator for x and y.+ */+typedef OpExpr NullIfExpr;++/*+ * ScalarArrayOpExpr - expression node for "scalar op ANY/ALL (array)"+ *+ * The operator must yield boolean. It is applied to the left operand+ * and each element of the righthand array, and the results are combined+ * with OR or AND (for ANY or ALL respectively). The node representation+ * is almost the same as for the underlying operator, but we need a useOr+ * flag to remember whether it's ANY or ALL, and we don't have to store+ * the result type (or the collation) because it must be boolean.+ */+typedef struct ScalarArrayOpExpr+{+ Expr xpr;+ Oid opno; /* PG_OPERATOR OID of the operator */+ Oid opfuncid; /* PG_PROC OID of underlying function */+ bool useOr; /* true for ANY, false for ALL */+ Oid inputcollid; /* OID of collation that operator should use */+ List *args; /* the scalar and array operands */+ int location; /* token location, or -1 if unknown */+} ScalarArrayOpExpr;++/*+ * BoolExpr - expression node for the basic Boolean operators AND, OR, NOT+ *+ * Notice the arguments are given as a List. For NOT, of course the list+ * must always have exactly one element. For AND and OR, there can be two+ * or more arguments.+ */+typedef enum BoolExprType+{+ AND_EXPR, OR_EXPR, NOT_EXPR+} BoolExprType;++typedef struct BoolExpr+{+ Expr xpr;+ BoolExprType boolop;+ List *args; /* arguments to this expression */+ int location; /* token location, or -1 if unknown */+} BoolExpr;++/*+ * SubLink+ *+ * A SubLink represents a subselect appearing in an expression, and in some+ * cases also the combining operator(s) just above it. The subLinkType+ * indicates the form of the expression represented:+ * EXISTS_SUBLINK EXISTS(SELECT ...)+ * ALL_SUBLINK (lefthand) op ALL (SELECT ...)+ * ANY_SUBLINK (lefthand) op ANY (SELECT ...)+ * ROWCOMPARE_SUBLINK (lefthand) op (SELECT ...)+ * EXPR_SUBLINK (SELECT with single targetlist item ...)+ * MULTIEXPR_SUBLINK (SELECT with multiple targetlist items ...)+ * ARRAY_SUBLINK ARRAY(SELECT with single targetlist item ...)+ * CTE_SUBLINK WITH query (never actually part of an expression)+ * For ALL, ANY, and ROWCOMPARE, the lefthand is a list of expressions of the+ * same length as the subselect's targetlist. ROWCOMPARE will *always* have+ * a list with more than one entry; if the subselect has just one target+ * then the parser will create an EXPR_SUBLINK instead (and any operator+ * above the subselect will be represented separately).+ * ROWCOMPARE, EXPR, and MULTIEXPR require the subselect to deliver at most+ * one row (if it returns no rows, the result is NULL).+ * ALL, ANY, and ROWCOMPARE require the combining operators to deliver boolean+ * results. ALL and ANY combine the per-row results using AND and OR+ * semantics respectively.+ * ARRAY requires just one target column, and creates an array of the target+ * column's type using any number of rows resulting from the subselect.+ *+ * SubLink is classed as an Expr node, but it is not actually executable;+ * it must be replaced in the expression tree by a SubPlan node during+ * planning.+ *+ * NOTE: in the raw output of gram.y, testexpr contains just the raw form+ * of the lefthand expression (if any), and operName is the String name of+ * the combining operator. Also, subselect is a raw parsetree. During parse+ * analysis, the parser transforms testexpr into a complete boolean expression+ * that compares the lefthand value(s) to PARAM_SUBLINK nodes representing the+ * output columns of the subselect. And subselect is transformed to a Query.+ * This is the representation seen in saved rules and in the rewriter.+ *+ * In EXISTS, EXPR, MULTIEXPR, and ARRAY SubLinks, testexpr and operName+ * are unused and are always null.+ *+ * subLinkId is currently used only for MULTIEXPR SubLinks, and is zero in+ * other SubLinks. This number identifies different multiple-assignment+ * subqueries within an UPDATE statement's SET list. It is unique only+ * within a particular targetlist. The output column(s) of the MULTIEXPR+ * are referenced by PARAM_MULTIEXPR Params appearing elsewhere in the tlist.+ *+ * The CTE_SUBLINK case never occurs in actual SubLink nodes, but it is used+ * in SubPlans generated for WITH subqueries.+ */+typedef enum SubLinkType+{+ EXISTS_SUBLINK,+ ALL_SUBLINK,+ ANY_SUBLINK,+ ROWCOMPARE_SUBLINK,+ EXPR_SUBLINK,+ MULTIEXPR_SUBLINK,+ ARRAY_SUBLINK,+ CTE_SUBLINK /* for SubPlans only */+} SubLinkType;+++typedef struct SubLink+{+ Expr xpr;+ SubLinkType subLinkType; /* see above */+ int subLinkId; /* ID (1..n); 0 if not MULTIEXPR */+ Node *testexpr; /* outer-query test for ALL/ANY/ROWCOMPARE */+ List *operName; /* originally specified operator name */+ Node *subselect; /* subselect as Query* or raw parsetree */+ int location; /* token location, or -1 if unknown */+} SubLink;++/*+ * SubPlan - executable expression node for a subplan (sub-SELECT)+ *+ * The planner replaces SubLink nodes in expression trees with SubPlan+ * nodes after it has finished planning the subquery. SubPlan references+ * a sub-plantree stored in the subplans list of the toplevel PlannedStmt.+ * (We avoid a direct link to make it easier to copy expression trees+ * without causing multiple processing of the subplan.)+ *+ * In an ordinary subplan, testexpr points to an executable expression+ * (OpExpr, an AND/OR tree of OpExprs, or RowCompareExpr) for the combining+ * operator(s); the left-hand arguments are the original lefthand expressions,+ * and the right-hand arguments are PARAM_EXEC Param nodes representing the+ * outputs of the sub-select. (NOTE: runtime coercion functions may be+ * inserted as well.) This is just the same expression tree as testexpr in+ * the original SubLink node, but the PARAM_SUBLINK nodes are replaced by+ * suitably numbered PARAM_EXEC nodes.+ *+ * If the sub-select becomes an initplan rather than a subplan, the executable+ * expression is part of the outer plan's expression tree (and the SubPlan+ * node itself is not, but rather is found in the outer plan's initPlan+ * list). In this case testexpr is NULL to avoid duplication.+ *+ * The planner also derives lists of the values that need to be passed into+ * and out of the subplan. Input values are represented as a list "args" of+ * expressions to be evaluated in the outer-query context (currently these+ * args are always just Vars, but in principle they could be any expression).+ * The values are assigned to the global PARAM_EXEC params indexed by parParam+ * (the parParam and args lists must have the same ordering). setParam is a+ * list of the PARAM_EXEC params that are computed by the sub-select, if it+ * is an initplan; they are listed in order by sub-select output column+ * position. (parParam and setParam are integer Lists, not Bitmapsets,+ * because their ordering is significant.)+ *+ * Also, the planner computes startup and per-call costs for use of the+ * SubPlan. Note that these include the cost of the subquery proper,+ * evaluation of the testexpr if any, and any hashtable management overhead.+ */+typedef struct SubPlan+{+ Expr xpr;+ /* Fields copied from original SubLink: */+ SubLinkType subLinkType; /* see above */+ /* The combining operators, transformed to an executable expression: */+ Node *testexpr; /* OpExpr or RowCompareExpr expression tree */+ List *paramIds; /* IDs of Params embedded in the above */+ /* Identification of the Plan tree to use: */+ int plan_id; /* Index (from 1) in PlannedStmt.subplans */+ /* Identification of the SubPlan for EXPLAIN and debugging purposes: */+ char *plan_name; /* A name assigned during planning */+ /* Extra data useful for determining subplan's output type: */+ Oid firstColType; /* Type of first column of subplan result */+ int32 firstColTypmod; /* Typmod of first column of subplan result */+ Oid firstColCollation; /* Collation of first column of+ * subplan result */+ /* Information about execution strategy: */+ bool useHashTable; /* TRUE to store subselect output in a hash+ * table (implies we are doing "IN") */+ bool unknownEqFalse; /* TRUE if it's okay to return FALSE when the+ * spec result is UNKNOWN; this allows much+ * simpler handling of null values */+ /* Information for passing params into and out of the subselect: */+ /* setParam and parParam are lists of integers (param IDs) */+ List *setParam; /* initplan subqueries have to set these+ * Params for parent plan */+ List *parParam; /* indices of input Params from parent plan */+ List *args; /* exprs to pass as parParam values */+ /* Estimated execution costs: */+ Cost startup_cost; /* one-time setup cost */+ Cost per_call_cost; /* cost for each subplan evaluation */+} SubPlan;++/*+ * AlternativeSubPlan - expression node for a choice among SubPlans+ *+ * The subplans are given as a List so that the node definition need not+ * change if there's ever more than two alternatives. For the moment,+ * though, there are always exactly two; and the first one is the fast-start+ * plan.+ */+typedef struct AlternativeSubPlan+{+ Expr xpr;+ List *subplans; /* SubPlan(s) with equivalent results */+} AlternativeSubPlan;++/* ----------------+ * FieldSelect+ *+ * FieldSelect represents the operation of extracting one field from a tuple+ * value. At runtime, the input expression is expected to yield a rowtype+ * Datum. The specified field number is extracted and returned as a Datum.+ * ----------------+ */++typedef struct FieldSelect+{+ Expr xpr;+ Expr *arg; /* input expression */+ AttrNumber fieldnum; /* attribute number of field to extract */+ Oid resulttype; /* type of the field (result type of this+ * node) */+ int32 resulttypmod; /* output typmod (usually -1) */+ Oid resultcollid; /* OID of collation of the field */+} FieldSelect;++/* ----------------+ * FieldStore+ *+ * FieldStore represents the operation of modifying one field in a tuple+ * value, yielding a new tuple value (the input is not touched!). Like+ * the assign case of ArrayRef, this is used to implement UPDATE of a+ * portion of a column.+ *+ * A single FieldStore can actually represent updates of several different+ * fields. The parser only generates FieldStores with single-element lists,+ * but the planner will collapse multiple updates of the same base column+ * into one FieldStore.+ * ----------------+ */++typedef struct FieldStore+{+ Expr xpr;+ Expr *arg; /* input tuple value */+ List *newvals; /* new value(s) for field(s) */+ List *fieldnums; /* integer list of field attnums */+ Oid resulttype; /* type of result (same as type of arg) */+ /* Like RowExpr, we deliberately omit a typmod and collation here */+} FieldStore;++/* ----------------+ * RelabelType+ *+ * RelabelType represents a "dummy" type coercion between two binary-+ * compatible datatypes, such as reinterpreting the result of an OID+ * expression as an int4. It is a no-op at runtime; we only need it+ * to provide a place to store the correct type to be attributed to+ * the expression result during type resolution. (We can't get away+ * with just overwriting the type field of the input expression node,+ * so we need a separate node to show the coercion's result type.)+ * ----------------+ */++typedef struct RelabelType+{+ Expr xpr;+ Expr *arg; /* input expression */+ Oid resulttype; /* output type of coercion expression */+ int32 resulttypmod; /* output typmod (usually -1) */+ Oid resultcollid; /* OID of collation, or InvalidOid if none */+ CoercionForm relabelformat; /* how to display this node */+ int location; /* token location, or -1 if unknown */+} RelabelType;++/* ----------------+ * CoerceViaIO+ *+ * CoerceViaIO represents a type coercion between two types whose textual+ * representations are compatible, implemented by invoking the source type's+ * typoutput function then the destination type's typinput function.+ * ----------------+ */++typedef struct CoerceViaIO+{+ Expr xpr;+ Expr *arg; /* input expression */+ Oid resulttype; /* output type of coercion */+ /* output typmod is not stored, but is presumed -1 */+ Oid resultcollid; /* OID of collation, or InvalidOid if none */+ CoercionForm coerceformat; /* how to display this node */+ int location; /* token location, or -1 if unknown */+} CoerceViaIO;++/* ----------------+ * ArrayCoerceExpr+ *+ * ArrayCoerceExpr represents a type coercion from one array type to another,+ * which is implemented by applying the indicated element-type coercion+ * function to each element of the source array. If elemfuncid is InvalidOid+ * then the element types are binary-compatible, but the coercion still+ * requires some effort (we have to fix the element type ID stored in the+ * array header).+ * ----------------+ */++typedef struct ArrayCoerceExpr+{+ Expr xpr;+ Expr *arg; /* input expression (yields an array) */+ Oid elemfuncid; /* OID of element coercion function, or 0 */+ Oid resulttype; /* output type of coercion (an array type) */+ int32 resulttypmod; /* output typmod (also element typmod) */+ Oid resultcollid; /* OID of collation, or InvalidOid if none */+ bool isExplicit; /* conversion semantics flag to pass to func */+ CoercionForm coerceformat; /* how to display this node */+ int location; /* token location, or -1 if unknown */+} ArrayCoerceExpr;++/* ----------------+ * ConvertRowtypeExpr+ *+ * ConvertRowtypeExpr represents a type coercion from one composite type+ * to another, where the source type is guaranteed to contain all the columns+ * needed for the destination type plus possibly others; the columns need not+ * be in the same positions, but are matched up by name. This is primarily+ * used to convert a whole-row value of an inheritance child table into a+ * valid whole-row value of its parent table's rowtype.+ * ----------------+ */++typedef struct ConvertRowtypeExpr+{+ Expr xpr;+ Expr *arg; /* input expression */+ Oid resulttype; /* output type (always a composite type) */+ /* Like RowExpr, we deliberately omit a typmod and collation here */+ CoercionForm convertformat; /* how to display this node */+ int location; /* token location, or -1 if unknown */+} ConvertRowtypeExpr;++/*----------+ * CollateExpr - COLLATE+ *+ * The planner replaces CollateExpr with RelabelType during expression+ * preprocessing, so execution never sees a CollateExpr.+ *----------+ */+typedef struct CollateExpr+{+ Expr xpr;+ Expr *arg; /* input expression */+ Oid collOid; /* collation's OID */+ int location; /* token location, or -1 if unknown */+} CollateExpr;++/*----------+ * CaseExpr - a CASE expression+ *+ * We support two distinct forms of CASE expression:+ * CASE WHEN boolexpr THEN expr [ WHEN boolexpr THEN expr ... ]+ * CASE testexpr WHEN compexpr THEN expr [ WHEN compexpr THEN expr ... ]+ * These are distinguishable by the "arg" field being NULL in the first case+ * and the testexpr in the second case.+ *+ * In the raw grammar output for the second form, the condition expressions+ * of the WHEN clauses are just the comparison values. Parse analysis+ * converts these to valid boolean expressions of the form+ * CaseTestExpr '=' compexpr+ * where the CaseTestExpr node is a placeholder that emits the correct+ * value at runtime. This structure is used so that the testexpr need be+ * evaluated only once. Note that after parse analysis, the condition+ * expressions always yield boolean.+ *+ * Note: we can test whether a CaseExpr has been through parse analysis+ * yet by checking whether casetype is InvalidOid or not.+ *----------+ */+typedef struct CaseExpr+{+ Expr xpr;+ Oid casetype; /* type of expression result */+ Oid casecollid; /* OID of collation, or InvalidOid if none */+ Expr *arg; /* implicit equality comparison argument */+ List *args; /* the arguments (list of WHEN clauses) */+ Expr *defresult; /* the default result (ELSE clause) */+ int location; /* token location, or -1 if unknown */+} CaseExpr;++/*+ * CaseWhen - one arm of a CASE expression+ */+typedef struct CaseWhen+{+ Expr xpr;+ Expr *expr; /* condition expression */+ Expr *result; /* substitution result */+ int location; /* token location, or -1 if unknown */+} CaseWhen;++/*+ * Placeholder node for the test value to be processed by a CASE expression.+ * This is effectively like a Param, but can be implemented more simply+ * since we need only one replacement value at a time.+ *+ * We also use this in nested UPDATE expressions.+ * See transformAssignmentIndirection().+ */+typedef struct CaseTestExpr+{+ Expr xpr;+ Oid typeId; /* type for substituted value */+ int32 typeMod; /* typemod for substituted value */+ Oid collation; /* collation for the substituted value */+} CaseTestExpr;++/*+ * ArrayExpr - an ARRAY[] expression+ *+ * Note: if multidims is false, the constituent expressions all yield the+ * scalar type identified by element_typeid. If multidims is true, the+ * constituent expressions all yield arrays of element_typeid (ie, the same+ * type as array_typeid); at runtime we must check for compatible subscripts.+ */+typedef struct ArrayExpr+{+ Expr xpr;+ Oid array_typeid; /* type of expression result */+ Oid array_collid; /* OID of collation, or InvalidOid if none */+ Oid element_typeid; /* common type of array elements */+ List *elements; /* the array elements or sub-arrays */+ bool multidims; /* true if elements are sub-arrays */+ int location; /* token location, or -1 if unknown */+} ArrayExpr;++/*+ * RowExpr - a ROW() expression+ *+ * Note: the list of fields must have a one-for-one correspondence with+ * physical fields of the associated rowtype, although it is okay for it+ * to be shorter than the rowtype. That is, the N'th list element must+ * match up with the N'th physical field. When the N'th physical field+ * is a dropped column (attisdropped) then the N'th list element can just+ * be a NULL constant. (This case can only occur for named composite types,+ * not RECORD types, since those are built from the RowExpr itself rather+ * than vice versa.) It is important not to assume that length(args) is+ * the same as the number of columns logically present in the rowtype.+ *+ * colnames provides field names in cases where the names can't easily be+ * obtained otherwise. Names *must* be provided if row_typeid is RECORDOID.+ * If row_typeid identifies a known composite type, colnames can be NIL to+ * indicate the type's cataloged field names apply. Note that colnames can+ * be non-NIL even for a composite type, and typically is when the RowExpr+ * was created by expanding a whole-row Var. This is so that we can retain+ * the column alias names of the RTE that the Var referenced (which would+ * otherwise be very difficult to extract from the parsetree). Like the+ * args list, colnames is one-for-one with physical fields of the rowtype.+ */+typedef struct RowExpr+{+ Expr xpr;+ List *args; /* the fields */+ Oid row_typeid; /* RECORDOID or a composite type's ID */++ /*+ * Note: we deliberately do NOT store a typmod. Although a typmod will be+ * associated with specific RECORD types at runtime, it will differ for+ * different backends, and so cannot safely be stored in stored+ * parsetrees. We must assume typmod -1 for a RowExpr node.+ *+ * We don't need to store a collation either. The result type is+ * necessarily composite, and composite types never have a collation.+ */+ CoercionForm row_format; /* how to display this node */+ List *colnames; /* list of String, or NIL */+ int location; /* token location, or -1 if unknown */+} RowExpr;++/*+ * RowCompareExpr - row-wise comparison, such as (a, b) <= (1, 2)+ *+ * We support row comparison for any operator that can be determined to+ * act like =, <>, <, <=, >, or >= (we determine this by looking for the+ * operator in btree opfamilies). Note that the same operator name might+ * map to a different operator for each pair of row elements, since the+ * element datatypes can vary.+ *+ * A RowCompareExpr node is only generated for the < <= > >= cases;+ * the = and <> cases are translated to simple AND or OR combinations+ * of the pairwise comparisons. However, we include = and <> in the+ * RowCompareType enum for the convenience of parser logic.+ */+typedef enum RowCompareType+{+ /* Values of this enum are chosen to match btree strategy numbers */+ ROWCOMPARE_LT = 1, /* BTLessStrategyNumber */+ ROWCOMPARE_LE = 2, /* BTLessEqualStrategyNumber */+ ROWCOMPARE_EQ = 3, /* BTEqualStrategyNumber */+ ROWCOMPARE_GE = 4, /* BTGreaterEqualStrategyNumber */+ ROWCOMPARE_GT = 5, /* BTGreaterStrategyNumber */+ ROWCOMPARE_NE = 6 /* no such btree strategy */+} RowCompareType;++typedef struct RowCompareExpr+{+ Expr xpr;+ RowCompareType rctype; /* LT LE GE or GT, never EQ or NE */+ List *opnos; /* OID list of pairwise comparison ops */+ List *opfamilies; /* OID list of containing operator families */+ List *inputcollids; /* OID list of collations for comparisons */+ List *largs; /* the left-hand input arguments */+ List *rargs; /* the right-hand input arguments */+} RowCompareExpr;++/*+ * CoalesceExpr - a COALESCE expression+ */+typedef struct CoalesceExpr+{+ Expr xpr;+ Oid coalescetype; /* type of expression result */+ Oid coalescecollid; /* OID of collation, or InvalidOid if none */+ List *args; /* the arguments */+ int location; /* token location, or -1 if unknown */+} CoalesceExpr;++/*+ * MinMaxExpr - a GREATEST or LEAST function+ */+typedef enum MinMaxOp+{+ IS_GREATEST,+ IS_LEAST+} MinMaxOp;++typedef struct MinMaxExpr+{+ Expr xpr;+ Oid minmaxtype; /* common type of arguments and result */+ Oid minmaxcollid; /* OID of collation of result */+ Oid inputcollid; /* OID of collation that function should use */+ MinMaxOp op; /* function to execute */+ List *args; /* the arguments */+ int location; /* token location, or -1 if unknown */+} MinMaxExpr;++/*+ * XmlExpr - various SQL/XML functions requiring special grammar productions+ *+ * 'name' carries the "NAME foo" argument (already XML-escaped).+ * 'named_args' and 'arg_names' represent an xml_attribute list.+ * 'args' carries all other arguments.+ *+ * Note: result type/typmod/collation are not stored, but can be deduced+ * from the XmlExprOp. The type/typmod fields are just used for display+ * purposes, and are NOT necessarily the true result type of the node.+ */+typedef enum XmlExprOp+{+ IS_XMLCONCAT, /* XMLCONCAT(args) */+ IS_XMLELEMENT, /* XMLELEMENT(name, xml_attributes, args) */+ IS_XMLFOREST, /* XMLFOREST(xml_attributes) */+ IS_XMLPARSE, /* XMLPARSE(text, is_doc, preserve_ws) */+ IS_XMLPI, /* XMLPI(name [, args]) */+ IS_XMLROOT, /* XMLROOT(xml, version, standalone) */+ IS_XMLSERIALIZE, /* XMLSERIALIZE(is_document, xmlval) */+ IS_DOCUMENT /* xmlval IS DOCUMENT */+} XmlExprOp;++typedef enum+{+ XMLOPTION_DOCUMENT,+ XMLOPTION_CONTENT+} XmlOptionType;++typedef struct XmlExpr+{+ Expr xpr;+ XmlExprOp op; /* xml function ID */+ char *name; /* name in xml(NAME foo ...) syntaxes */+ List *named_args; /* non-XML expressions for xml_attributes */+ List *arg_names; /* parallel list of Value strings */+ List *args; /* list of expressions */+ XmlOptionType xmloption; /* DOCUMENT or CONTENT */+ Oid type; /* target type/typmod for XMLSERIALIZE */+ int32 typmod;+ int location; /* token location, or -1 if unknown */+} XmlExpr;++/* ----------------+ * NullTest+ *+ * NullTest represents the operation of testing a value for NULLness.+ * The appropriate test is performed and returned as a boolean Datum.+ *+ * NOTE: the semantics of this for rowtype inputs are noticeably different+ * from the scalar case. We provide an "argisrow" flag to reflect that.+ * ----------------+ */++typedef enum NullTestType+{+ IS_NULL, IS_NOT_NULL+} NullTestType;++typedef struct NullTest+{+ Expr xpr;+ Expr *arg; /* input expression */+ NullTestType nulltesttype; /* IS NULL, IS NOT NULL */+ bool argisrow; /* T if input is of a composite type */+ int location; /* token location, or -1 if unknown */+} NullTest;++/*+ * BooleanTest+ *+ * BooleanTest represents the operation of determining whether a boolean+ * is TRUE, FALSE, or UNKNOWN (ie, NULL). All six meaningful combinations+ * are supported. Note that a NULL input does *not* cause a NULL result.+ * The appropriate test is performed and returned as a boolean Datum.+ */++typedef enum BoolTestType+{+ IS_TRUE, IS_NOT_TRUE, IS_FALSE, IS_NOT_FALSE, IS_UNKNOWN, IS_NOT_UNKNOWN+} BoolTestType;++typedef struct BooleanTest+{+ Expr xpr;+ Expr *arg; /* input expression */+ BoolTestType booltesttype; /* test type */+ int location; /* token location, or -1 if unknown */+} BooleanTest;++/*+ * CoerceToDomain+ *+ * CoerceToDomain represents the operation of coercing a value to a domain+ * type. At runtime (and not before) the precise set of constraints to be+ * checked will be determined. If the value passes, it is returned as the+ * result; if not, an error is raised. Note that this is equivalent to+ * RelabelType in the scenario where no constraints are applied.+ */+typedef struct CoerceToDomain+{+ Expr xpr;+ Expr *arg; /* input expression */+ Oid resulttype; /* domain type ID (result type) */+ int32 resulttypmod; /* output typmod (currently always -1) */+ Oid resultcollid; /* OID of collation, or InvalidOid if none */+ CoercionForm coercionformat; /* how to display this node */+ int location; /* token location, or -1 if unknown */+} CoerceToDomain;++/*+ * Placeholder node for the value to be processed by a domain's check+ * constraint. This is effectively like a Param, but can be implemented more+ * simply since we need only one replacement value at a time.+ *+ * Note: the typeId/typeMod/collation will be set from the domain's base type,+ * not the domain itself. This is because we shouldn't consider the value+ * to be a member of the domain if we haven't yet checked its constraints.+ */+typedef struct CoerceToDomainValue+{+ Expr xpr;+ Oid typeId; /* type for substituted value */+ int32 typeMod; /* typemod for substituted value */+ Oid collation; /* collation for the substituted value */+ int location; /* token location, or -1 if unknown */+} CoerceToDomainValue;++/*+ * Placeholder node for a DEFAULT marker in an INSERT or UPDATE command.+ *+ * This is not an executable expression: it must be replaced by the actual+ * column default expression during rewriting. But it is convenient to+ * treat it as an expression node during parsing and rewriting.+ */+typedef struct SetToDefault+{+ Expr xpr;+ Oid typeId; /* type for substituted value */+ int32 typeMod; /* typemod for substituted value */+ Oid collation; /* collation for the substituted value */+ int location; /* token location, or -1 if unknown */+} SetToDefault;++/*+ * Node representing [WHERE] CURRENT OF cursor_name+ *+ * CURRENT OF is a bit like a Var, in that it carries the rangetable index+ * of the target relation being constrained; this aids placing the expression+ * correctly during planning. We can assume however that its "levelsup" is+ * always zero, due to the syntactic constraints on where it can appear.+ *+ * The referenced cursor can be represented either as a hardwired string+ * or as a reference to a run-time parameter of type REFCURSOR. The latter+ * case is for the convenience of plpgsql.+ */+typedef struct CurrentOfExpr+{+ Expr xpr;+ Index cvarno; /* RT index of target relation */+ char *cursor_name; /* name of referenced cursor, or NULL */+ int cursor_param; /* refcursor parameter number, or 0 */+} CurrentOfExpr;++/*+ * InferenceElem - an element of a unique index inference specification+ *+ * This mostly matches the structure of IndexElems, but having a dedicated+ * primnode allows for a clean separation between the use of index parameters+ * by utility commands, and this node.+ */+typedef struct InferenceElem+{+ Expr xpr;+ Node *expr; /* expression to infer from, or NULL */+ Oid infercollid; /* OID of collation, or InvalidOid */+ Oid inferopclass; /* OID of att opclass, or InvalidOid */+} InferenceElem;++/*--------------------+ * TargetEntry -+ * a target entry (used in query target lists)+ *+ * Strictly speaking, a TargetEntry isn't an expression node (since it can't+ * be evaluated by ExecEvalExpr). But we treat it as one anyway, since in+ * very many places it's convenient to process a whole query targetlist as a+ * single expression tree.+ *+ * In a SELECT's targetlist, resno should always be equal to the item's+ * ordinal position (counting from 1). However, in an INSERT or UPDATE+ * targetlist, resno represents the attribute number of the destination+ * column for the item; so there may be missing or out-of-order resnos.+ * It is even legal to have duplicated resnos; consider+ * UPDATE table SET arraycol[1] = ..., arraycol[2] = ..., ...+ * The two meanings come together in the executor, because the planner+ * transforms INSERT/UPDATE tlists into a normalized form with exactly+ * one entry for each column of the destination table. Before that's+ * happened, however, it is risky to assume that resno == position.+ * Generally get_tle_by_resno() should be used rather than list_nth()+ * to fetch tlist entries by resno, and only in SELECT should you assume+ * that resno is a unique identifier.+ *+ * resname is required to represent the correct column name in non-resjunk+ * entries of top-level SELECT targetlists, since it will be used as the+ * column title sent to the frontend. In most other contexts it is only+ * a debugging aid, and may be wrong or even NULL. (In particular, it may+ * be wrong in a tlist from a stored rule, if the referenced column has been+ * renamed by ALTER TABLE since the rule was made. Also, the planner tends+ * to store NULL rather than look up a valid name for tlist entries in+ * non-toplevel plan nodes.) In resjunk entries, resname should be either+ * a specific system-generated name (such as "ctid") or NULL; anything else+ * risks confusing ExecGetJunkAttribute!+ *+ * ressortgroupref is used in the representation of ORDER BY, GROUP BY, and+ * DISTINCT items. Targetlist entries with ressortgroupref=0 are not+ * sort/group items. If ressortgroupref>0, then this item is an ORDER BY,+ * GROUP BY, and/or DISTINCT target value. No two entries in a targetlist+ * may have the same nonzero ressortgroupref --- but there is no particular+ * meaning to the nonzero values, except as tags. (For example, one must+ * not assume that lower ressortgroupref means a more significant sort key.)+ * The order of the associated SortGroupClause lists determine the semantics.+ *+ * resorigtbl/resorigcol identify the source of the column, if it is a+ * simple reference to a column of a base table (or view). If it is not+ * a simple reference, these fields are zeroes.+ *+ * If resjunk is true then the column is a working column (such as a sort key)+ * that should be removed from the final output of the query. Resjunk columns+ * must have resnos that cannot duplicate any regular column's resno. Also+ * note that there are places that assume resjunk columns come after non-junk+ * columns.+ *--------------------+ */+typedef struct TargetEntry+{+ Expr xpr;+ Expr *expr; /* expression to evaluate */+ AttrNumber resno; /* attribute number (see notes above) */+ char *resname; /* name of the column (could be NULL) */+ Index ressortgroupref;/* nonzero if referenced by a sort/group+ * clause */+ Oid resorigtbl; /* OID of column's source table */+ AttrNumber resorigcol; /* column's number in source table */+ bool resjunk; /* set to true to eliminate the attribute from+ * final target list */+} TargetEntry;+++/* ----------------------------------------------------------------+ * node types for join trees+ *+ * The leaves of a join tree structure are RangeTblRef nodes. Above+ * these, JoinExpr nodes can appear to denote a specific kind of join+ * or qualified join. Also, FromExpr nodes can appear to denote an+ * ordinary cross-product join ("FROM foo, bar, baz WHERE ...").+ * FromExpr is like a JoinExpr of jointype JOIN_INNER, except that it+ * may have any number of child nodes, not just two.+ *+ * NOTE: the top level of a Query's jointree is always a FromExpr.+ * Even if the jointree contains no rels, there will be a FromExpr.+ *+ * NOTE: the qualification expressions present in JoinExpr nodes are+ * *in addition to* the query's main WHERE clause, which appears as the+ * qual of the top-level FromExpr. The reason for associating quals with+ * specific nodes in the jointree is that the position of a qual is critical+ * when outer joins are present. (If we enforce a qual too soon or too late,+ * that may cause the outer join to produce the wrong set of NULL-extended+ * rows.) If all joins are inner joins then all the qual positions are+ * semantically interchangeable.+ *+ * NOTE: in the raw output of gram.y, a join tree contains RangeVar,+ * RangeSubselect, and RangeFunction nodes, which are all replaced by+ * RangeTblRef nodes during the parse analysis phase. Also, the top-level+ * FromExpr is added during parse analysis; the grammar regards FROM and+ * WHERE as separate.+ * ----------------------------------------------------------------+ */++/*+ * RangeTblRef - reference to an entry in the query's rangetable+ *+ * We could use direct pointers to the RT entries and skip having these+ * nodes, but multiple pointers to the same node in a querytree cause+ * lots of headaches, so it seems better to store an index into the RT.+ */+typedef struct RangeTblRef+{+ NodeTag type;+ int rtindex;+} RangeTblRef;++/*----------+ * JoinExpr - for SQL JOIN expressions+ *+ * isNatural, usingClause, and quals are interdependent. The user can write+ * only one of NATURAL, USING(), or ON() (this is enforced by the grammar).+ * If he writes NATURAL then parse analysis generates the equivalent USING()+ * list, and from that fills in "quals" with the right equality comparisons.+ * If he writes USING() then "quals" is filled with equality comparisons.+ * If he writes ON() then only "quals" is set. Note that NATURAL/USING+ * are not equivalent to ON() since they also affect the output column list.+ *+ * alias is an Alias node representing the AS alias-clause attached to the+ * join expression, or NULL if no clause. NB: presence or absence of the+ * alias has a critical impact on semantics, because a join with an alias+ * restricts visibility of the tables/columns inside it.+ *+ * During parse analysis, an RTE is created for the Join, and its index+ * is filled into rtindex. This RTE is present mainly so that Vars can+ * be created that refer to the outputs of the join. The planner sometimes+ * generates JoinExprs internally; these can have rtindex = 0 if there are+ * no join alias variables referencing such joins.+ *----------+ */+typedef struct JoinExpr+{+ NodeTag type;+ JoinType jointype; /* type of join */+ bool isNatural; /* Natural join? Will need to shape table */+ Node *larg; /* left subtree */+ Node *rarg; /* right subtree */+ List *usingClause; /* USING clause, if any (list of String) */+ Node *quals; /* qualifiers on join, if any */+ Alias *alias; /* user-written alias clause, if any */+ int rtindex; /* RT index assigned for join, or 0 */+} JoinExpr;++/*----------+ * FromExpr - represents a FROM ... WHERE ... construct+ *+ * This is both more flexible than a JoinExpr (it can have any number of+ * children, including zero) and less so --- we don't need to deal with+ * aliases and so on. The output column set is implicitly just the union+ * of the outputs of the children.+ *----------+ */+typedef struct FromExpr+{+ NodeTag type;+ List *fromlist; /* List of join subtrees */+ Node *quals; /* qualifiers on join, if any */+} FromExpr;++/*----------+ * OnConflictExpr - represents an ON CONFLICT DO ... expression+ *+ * The optimizer requires a list of inference elements, and optionally a WHERE+ * clause to infer a unique index. The unique index (or, occasionally,+ * indexes) inferred are used to arbitrate whether or not the alternative ON+ * CONFLICT path is taken.+ *----------+ */+typedef struct OnConflictExpr+{+ NodeTag type;+ OnConflictAction action; /* DO NOTHING or UPDATE? */++ /* Arbiter */+ List *arbiterElems; /* unique index arbiter list (of+ * InferenceElem's) */+ Node *arbiterWhere; /* unique index arbiter WHERE clause */+ Oid constraint; /* pg_constraint OID for arbiter */++ /* ON CONFLICT UPDATE */+ List *onConflictSet; /* List of ON CONFLICT SET TargetEntrys */+ Node *onConflictWhere; /* qualifiers to restrict UPDATE to */+ int exclRelIndex; /* RT index of 'excluded' relation */+ List *exclRelTlist; /* tlist of the EXCLUDED pseudo relation */+} OnConflictExpr;++#endif /* PRIMNODES_H */
+ foreign/libpg_query/src/postgres/include/nodes/print.h view
@@ -0,0 +1,34 @@+/*-------------------------------------------------------------------------+ *+ * print.h+ * definitions for nodes/print.c+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/nodes/print.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef PRINT_H+#define PRINT_H++#include "executor/tuptable.h"+++#define nodeDisplay(x) pprint(x)++extern void print(const void *obj);+extern void pprint(const void *obj);+extern void elog_node_display(int lev, const char *title,+ const void *obj, bool pretty);+extern char *format_node_dump(const char *dump);+extern char *pretty_format_node_dump(const char *dump);+extern void print_rt(const List *rtable);+extern void print_expr(const Node *expr, const List *rtable);+extern void print_pathkeys(const List *pathkeys, const List *rtable);+extern void print_tl(const List *tlist, const List *rtable);+extern void print_slot(TupleTableSlot *slot);++#endif /* PRINT_H */
+ foreign/libpg_query/src/postgres/include/nodes/relation.h view
@@ -0,0 +1,1706 @@+/*-------------------------------------------------------------------------+ *+ * relation.h+ * Definitions for planner's internal data structures.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/nodes/relation.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef RELATION_H+#define RELATION_H++#include "access/sdir.h"+#include "lib/stringinfo.h"+#include "nodes/params.h"+#include "nodes/parsenodes.h"+#include "storage/block.h"+++/*+ * Relids+ * Set of relation identifiers (indexes into the rangetable).+ */+typedef Bitmapset *Relids;++/*+ * When looking for a "cheapest path", this enum specifies whether we want+ * cheapest startup cost or cheapest total cost.+ */+typedef enum CostSelector+{+ STARTUP_COST, TOTAL_COST+} CostSelector;++/*+ * The cost estimate produced by cost_qual_eval() includes both a one-time+ * (startup) cost, and a per-tuple cost.+ */+typedef struct QualCost+{+ Cost startup; /* one-time cost */+ Cost per_tuple; /* per-evaluation cost */+} QualCost;++/*+ * Costing aggregate function execution requires these statistics about+ * the aggregates to be executed by a given Agg node. Note that the costs+ * include the execution costs of the aggregates' argument expressions as+ * well as the aggregate functions themselves.+ */+typedef struct AggClauseCosts+{+ int numAggs; /* total number of aggregate functions */+ int numOrderedAggs; /* number w/ DISTINCT/ORDER BY/WITHIN GROUP */+ QualCost transCost; /* total per-input-row execution costs */+ Cost finalCost; /* total per-aggregated-row costs */+ Size transitionSpace; /* space for pass-by-ref transition data */+} AggClauseCosts;+++/*----------+ * PlannerGlobal+ * Global information for planning/optimization+ *+ * PlannerGlobal holds state for an entire planner invocation; this state+ * is shared across all levels of sub-Queries that exist in the command being+ * planned.+ *----------+ */+typedef struct PlannerGlobal+{+ NodeTag type;++ ParamListInfo boundParams; /* Param values provided to planner() */++ List *subplans; /* Plans for SubPlan nodes */++ List *subroots; /* PlannerInfos for SubPlan nodes */++ Bitmapset *rewindPlanIDs; /* indices of subplans that require REWIND */++ List *finalrtable; /* "flat" rangetable for executor */++ List *finalrowmarks; /* "flat" list of PlanRowMarks */++ List *resultRelations; /* "flat" list of integer RT indexes */++ List *relationOids; /* OIDs of relations the plan depends on */++ List *invalItems; /* other dependencies, as PlanInvalItems */++ int nParamExec; /* number of PARAM_EXEC Params used */++ Index lastPHId; /* highest PlaceHolderVar ID assigned */++ Index lastRowMarkId; /* highest PlanRowMark ID assigned */++ bool transientPlan; /* redo plan when TransactionXmin changes? */++ bool hasRowSecurity; /* row security applied? */+} PlannerGlobal;++/* macro for fetching the Plan associated with a SubPlan node */+#define planner_subplan_get_plan(root, subplan) \+ ((Plan *) list_nth((root)->glob->subplans, (subplan)->plan_id - 1))+++/*----------+ * PlannerInfo+ * Per-query information for planning/optimization+ *+ * This struct is conventionally called "root" in all the planner routines.+ * It holds links to all of the planner's working state, in addition to the+ * original Query. Note that at present the planner extensively modifies+ * the passed-in Query data structure; someday that should stop.+ *----------+ */+typedef struct PlannerInfo+{+ NodeTag type;++ Query *parse; /* the Query being planned */++ PlannerGlobal *glob; /* global info for current planner run */++ Index query_level; /* 1 at the outermost Query */++ struct PlannerInfo *parent_root; /* NULL at outermost Query */++ List *plan_params; /* list of PlannerParamItems, see below */++ /*+ * simple_rel_array holds pointers to "base rels" and "other rels" (see+ * comments for RelOptInfo for more info). It is indexed by rangetable+ * index (so entry 0 is always wasted). Entries can be NULL when an RTE+ * does not correspond to a base relation, such as a join RTE or an+ * unreferenced view RTE; or if the RelOptInfo hasn't been made yet.+ */+ struct RelOptInfo **simple_rel_array; /* All 1-rel RelOptInfos */+ int simple_rel_array_size; /* allocated size of array */++ /*+ * simple_rte_array is the same length as simple_rel_array and holds+ * pointers to the associated rangetable entries. This lets us avoid+ * rt_fetch(), which can be a bit slow once large inheritance sets have+ * been expanded.+ */+ RangeTblEntry **simple_rte_array; /* rangetable as an array */++ /*+ * all_baserels is a Relids set of all base relids (but not "other"+ * relids) in the query; that is, the Relids identifier of the final join+ * we need to form. This is computed in make_one_rel, just before we+ * start making Paths.+ */+ Relids all_baserels;++ /*+ * nullable_baserels is a Relids set of base relids that are nullable by+ * some outer join in the jointree; these are rels that are potentially+ * nullable below the WHERE clause, SELECT targetlist, etc. This is+ * computed in deconstruct_jointree.+ */+ Relids nullable_baserels;++ /*+ * join_rel_list is a list of all join-relation RelOptInfos we have+ * considered in this planning run. For small problems we just scan the+ * list to do lookups, but when there are many join relations we build a+ * hash table for faster lookups. The hash table is present and valid+ * when join_rel_hash is not NULL. Note that we still maintain the list+ * even when using the hash table for lookups; this simplifies life for+ * GEQO.+ */+ List *join_rel_list; /* list of join-relation RelOptInfos */+ struct HTAB *join_rel_hash; /* optional hashtable for join relations */++ /*+ * When doing a dynamic-programming-style join search, join_rel_level[k]+ * is a list of all join-relation RelOptInfos of level k, and+ * join_cur_level is the current level. New join-relation RelOptInfos are+ * automatically added to the join_rel_level[join_cur_level] list.+ * join_rel_level is NULL if not in use.+ */+ List **join_rel_level; /* lists of join-relation RelOptInfos */+ int join_cur_level; /* index of list being extended */++ List *init_plans; /* init SubPlans for query */++ List *cte_plan_ids; /* per-CTE-item list of subplan IDs */++ List *multiexpr_params; /* List of Lists of Params for+ * MULTIEXPR subquery outputs */++ List *eq_classes; /* list of active EquivalenceClasses */++ List *canon_pathkeys; /* list of "canonical" PathKeys */++ List *left_join_clauses; /* list of RestrictInfos for+ * mergejoinable outer join clauses+ * w/nonnullable var on left */++ List *right_join_clauses; /* list of RestrictInfos for+ * mergejoinable outer join clauses+ * w/nonnullable var on right */++ List *full_join_clauses; /* list of RestrictInfos for+ * mergejoinable full join clauses */++ List *join_info_list; /* list of SpecialJoinInfos */++ List *append_rel_list; /* list of AppendRelInfos */++ List *rowMarks; /* list of PlanRowMarks */++ List *placeholder_list; /* list of PlaceHolderInfos */++ List *query_pathkeys; /* desired pathkeys for query_planner(), and+ * actual pathkeys after planning */++ List *group_pathkeys; /* groupClause pathkeys, if any */+ List *window_pathkeys; /* pathkeys of bottom window, if any */+ List *distinct_pathkeys; /* distinctClause pathkeys, if any */+ List *sort_pathkeys; /* sortClause pathkeys, if any */++ List *minmax_aggs; /* List of MinMaxAggInfos */++ List *initial_rels; /* RelOptInfos we are now trying to join */++ MemoryContext planner_cxt; /* context holding PlannerInfo */++ double total_table_pages; /* # of pages in all tables of query */++ double tuple_fraction; /* tuple_fraction passed to query_planner */+ double limit_tuples; /* limit_tuples passed to query_planner */++ bool hasInheritedTarget; /* true if parse->resultRelation is an+ * inheritance child rel */+ bool hasJoinRTEs; /* true if any RTEs are RTE_JOIN kind */+ bool hasLateralRTEs; /* true if any RTEs are marked LATERAL */+ bool hasDeletedRTEs; /* true if any RTE was deleted from jointree */+ bool hasHavingQual; /* true if havingQual was non-null */+ bool hasPseudoConstantQuals; /* true if any RestrictInfo has+ * pseudoconstant = true */+ bool hasRecursion; /* true if planning a recursive WITH item */++ /* These fields are used only when hasRecursion is true: */+ int wt_param_id; /* PARAM_EXEC ID for the work table */+ struct Plan *non_recursive_plan; /* plan for non-recursive term */++ /* These fields are workspace for createplan.c */+ Relids curOuterRels; /* outer rels above current node */+ List *curOuterParams; /* not-yet-assigned NestLoopParams */++ /* optional private data for join_search_hook, e.g., GEQO */+ void *join_search_private;++ /* for GroupingFunc fixup in setrefs */+ AttrNumber *grouping_map;+} PlannerInfo;+++/*+ * In places where it's known that simple_rte_array[] must have been prepared+ * already, we just index into it to fetch RTEs. In code that might be+ * executed before or after entering query_planner(), use this macro.+ */+#define planner_rt_fetch(rti, root) \+ ((root)->simple_rte_array ? (root)->simple_rte_array[rti] : \+ rt_fetch(rti, (root)->parse->rtable))+++/*----------+ * RelOptInfo+ * Per-relation information for planning/optimization+ *+ * For planning purposes, a "base rel" is either a plain relation (a table)+ * or the output of a sub-SELECT or function that appears in the range table.+ * In either case it is uniquely identified by an RT index. A "joinrel"+ * is the joining of two or more base rels. A joinrel is identified by+ * the set of RT indexes for its component baserels. We create RelOptInfo+ * nodes for each baserel and joinrel, and store them in the PlannerInfo's+ * simple_rel_array and join_rel_list respectively.+ *+ * Note that there is only one joinrel for any given set of component+ * baserels, no matter what order we assemble them in; so an unordered+ * set is the right datatype to identify it with.+ *+ * We also have "other rels", which are like base rels in that they refer to+ * single RT indexes; but they are not part of the join tree, and are given+ * a different RelOptKind to identify them. Lastly, there is a RelOptKind+ * for "dead" relations, which are base rels that we have proven we don't+ * need to join after all.+ *+ * Currently the only kind of otherrels are those made for member relations+ * of an "append relation", that is an inheritance set or UNION ALL subquery.+ * An append relation has a parent RTE that is a base rel, which represents+ * the entire append relation. The member RTEs are otherrels. The parent+ * is present in the query join tree but the members are not. The member+ * RTEs and otherrels are used to plan the scans of the individual tables or+ * subqueries of the append set; then the parent baserel is given Append+ * and/or MergeAppend paths comprising the best paths for the individual+ * member rels. (See comments for AppendRelInfo for more information.)+ *+ * At one time we also made otherrels to represent join RTEs, for use in+ * handling join alias Vars. Currently this is not needed because all join+ * alias Vars are expanded to non-aliased form during preprocess_expression.+ *+ * Parts of this data structure are specific to various scan and join+ * mechanisms. It didn't seem worth creating new node types for them.+ *+ * relids - Set of base-relation identifiers; it is a base relation+ * if there is just one, a join relation if more than one+ * rows - estimated number of tuples in the relation after restriction+ * clauses have been applied (ie, output rows of a plan for it)+ * width - avg. number of bytes per tuple in the relation after the+ * appropriate projections have been done (ie, output width)+ * consider_startup - true if there is any value in keeping plain paths for+ * this rel on the basis of having cheap startup cost+ * consider_param_startup - the same for parameterized paths+ * reltargetlist - List of Var and PlaceHolderVar nodes for the values+ * we need to output from this relation.+ * List is in no particular order, but all rels of an+ * appendrel set must use corresponding orders.+ * NOTE: in an appendrel child relation, may contain+ * arbitrary expressions pulled up from a subquery!+ * pathlist - List of Path nodes, one for each potentially useful+ * method of generating the relation+ * ppilist - ParamPathInfo nodes for parameterized Paths, if any+ * cheapest_startup_path - the pathlist member with lowest startup cost+ * (regardless of ordering) among the unparameterized paths;+ * or NULL if there is no unparameterized path+ * cheapest_total_path - the pathlist member with lowest total cost+ * (regardless of ordering) among the unparameterized paths;+ * or if there is no unparameterized path, the path with lowest+ * total cost among the paths with minimum parameterization+ * cheapest_unique_path - for caching cheapest path to produce unique+ * (no duplicates) output from relation; NULL if not yet requested+ * cheapest_parameterized_paths - best paths for their parameterizations;+ * always includes cheapest_total_path, even if that's unparameterized+ * direct_lateral_relids - rels this rel has direct LATERAL references to+ * lateral_relids - required outer rels for LATERAL, as a Relids set+ * (includes both direct and indirect lateral references)+ *+ * If the relation is a base relation it will have these fields set:+ *+ * relid - RTE index (this is redundant with the relids field, but+ * is provided for convenience of access)+ * rtekind - distinguishes plain relation, subquery, or function RTE+ * min_attr, max_attr - range of valid AttrNumbers for rel+ * attr_needed - array of bitmapsets indicating the highest joinrel+ * in which each attribute is needed; if bit 0 is set then+ * the attribute is needed as part of final targetlist+ * attr_widths - cache space for per-attribute width estimates;+ * zero means not computed yet+ * lateral_vars - lateral cross-references of rel, if any (list of+ * Vars and PlaceHolderVars)+ * lateral_referencers - relids of rels that reference this one laterally+ * (includes both direct and indirect lateral references)+ * indexlist - list of IndexOptInfo nodes for relation's indexes+ * (always NIL if it's not a table)+ * pages - number of disk pages in relation (zero if not a table)+ * tuples - number of tuples in relation (not considering restrictions)+ * allvisfrac - fraction of disk pages that are marked all-visible+ * subplan - plan for subquery (NULL if it's not a subquery)+ * subroot - PlannerInfo for subquery (NULL if it's not a subquery)+ * subplan_params - list of PlannerParamItems to be passed to subquery+ *+ * Note: for a subquery, tuples, subplan, subroot are not set immediately+ * upon creation of the RelOptInfo object; they are filled in when+ * set_subquery_pathlist processes the object.+ *+ * For otherrels that are appendrel members, these fields are filled+ * in just as for a baserel, except we don't bother with lateral_vars.+ *+ * If the relation is either a foreign table or a join of foreign tables that+ * all belong to the same foreign server, these fields will be set:+ *+ * serverid - OID of foreign server, if foreign table (else InvalidOid)+ * fdwroutine - function hooks for FDW, if foreign table (else NULL)+ * fdw_private - private state for FDW, if foreign table (else NULL)+ *+ * The presence of the remaining fields depends on the restrictions+ * and joins that the relation participates in:+ *+ * baserestrictinfo - List of RestrictInfo nodes, containing info about+ * each non-join qualification clause in which this relation+ * participates (only used for base rels)+ * baserestrictcost - Estimated cost of evaluating the baserestrictinfo+ * clauses at a single tuple (only used for base rels)+ * joininfo - List of RestrictInfo nodes, containing info about each+ * join clause in which this relation participates (but+ * note this excludes clauses that might be derivable from+ * EquivalenceClasses)+ * has_eclass_joins - flag that EquivalenceClass joins are possible+ *+ * Note: Keeping a restrictinfo list in the RelOptInfo is useful only for+ * base rels, because for a join rel the set of clauses that are treated as+ * restrict clauses varies depending on which sub-relations we choose to join.+ * (For example, in a 3-base-rel join, a clause relating rels 1 and 2 must be+ * treated as a restrictclause if we join {1} and {2 3} to make {1 2 3}; but+ * if we join {1 2} and {3} then that clause will be a restrictclause in {1 2}+ * and should not be processed again at the level of {1 2 3}.) Therefore,+ * the restrictinfo list in the join case appears in individual JoinPaths+ * (field joinrestrictinfo), not in the parent relation. But it's OK for+ * the RelOptInfo to store the joininfo list, because that is the same+ * for a given rel no matter how we form it.+ *+ * We store baserestrictcost in the RelOptInfo (for base relations) because+ * we know we will need it at least once (to price the sequential scan)+ * and may need it multiple times to price index scans.+ *----------+ */+typedef enum RelOptKind+{+ RELOPT_BASEREL,+ RELOPT_JOINREL,+ RELOPT_OTHER_MEMBER_REL,+ RELOPT_DEADREL+} RelOptKind;++typedef struct RelOptInfo+{+ NodeTag type;++ RelOptKind reloptkind;++ /* all relations included in this RelOptInfo */+ Relids relids; /* set of base relids (rangetable indexes) */++ /* size estimates generated by planner */+ double rows; /* estimated number of result tuples */+ int width; /* estimated avg width of result tuples */++ /* per-relation planner control flags */+ bool consider_startup; /* keep cheap-startup-cost paths? */+ bool consider_param_startup; /* ditto, for parameterized paths? */++ /* materialization information */+ List *reltargetlist; /* Vars to be output by scan of relation */+ List *pathlist; /* Path structures */+ List *ppilist; /* ParamPathInfos used in pathlist */+ struct Path *cheapest_startup_path;+ struct Path *cheapest_total_path;+ struct Path *cheapest_unique_path;+ List *cheapest_parameterized_paths;++ /* parameterization information needed for both base rels and join rels */+ /* (see also lateral_vars and lateral_referencers) */+ Relids direct_lateral_relids; /* rels directly laterally referenced */+ Relids lateral_relids; /* minimum parameterization of rel */++ /* information about a base rel (not set for join rels!) */+ Index relid;+ Oid reltablespace; /* containing tablespace */+ RTEKind rtekind; /* RELATION, SUBQUERY, or FUNCTION */+ AttrNumber min_attr; /* smallest attrno of rel (often <0) */+ AttrNumber max_attr; /* largest attrno of rel */+ Relids *attr_needed; /* array indexed [min_attr .. max_attr] */+ int32 *attr_widths; /* array indexed [min_attr .. max_attr] */+ List *lateral_vars; /* LATERAL Vars and PHVs referenced by rel */+ Relids lateral_referencers; /* rels that reference me laterally */+ List *indexlist; /* list of IndexOptInfo */+ BlockNumber pages; /* size estimates derived from pg_class */+ double tuples;+ double allvisfrac;+ /* use "struct Plan" to avoid including plannodes.h here */+ struct Plan *subplan; /* if subquery */+ PlannerInfo *subroot; /* if subquery */+ List *subplan_params; /* if subquery */++ /* Information about foreign tables and foreign joins */+ Oid serverid; /* identifies server for the table or join */+ /* use "struct FdwRoutine" to avoid including fdwapi.h here */+ struct FdwRoutine *fdwroutine;+ void *fdw_private;++ /* used by various scans and joins: */+ List *baserestrictinfo; /* RestrictInfo structures (if base+ * rel) */+ QualCost baserestrictcost; /* cost of evaluating the above */+ List *joininfo; /* RestrictInfo structures for join clauses+ * involving this rel */+ bool has_eclass_joins; /* T means joininfo is incomplete */+} RelOptInfo;++/*+ * IndexOptInfo+ * Per-index information for planning/optimization+ *+ * indexkeys[], indexcollations[], opfamily[], and opcintype[]+ * each have ncolumns entries.+ *+ * sortopfamily[], reverse_sort[], and nulls_first[] likewise have+ * ncolumns entries, if the index is ordered; but if it is unordered,+ * those pointers are NULL.+ *+ * Zeroes in the indexkeys[] array indicate index columns that are+ * expressions; there is one element in indexprs for each such column.+ *+ * For an ordered index, reverse_sort[] and nulls_first[] describe the+ * sort ordering of a forward indexscan; we can also consider a backward+ * indexscan, which will generate the reverse ordering.+ *+ * The indexprs and indpred expressions have been run through+ * prepqual.c and eval_const_expressions() for ease of matching to+ * WHERE clauses. indpred is in implicit-AND form.+ *+ * indextlist is a TargetEntry list representing the index columns.+ * It provides an equivalent base-relation Var for each simple column,+ * and links to the matching indexprs element for each expression column.+ */+typedef struct IndexOptInfo+{+ NodeTag type;++ Oid indexoid; /* OID of the index relation */+ Oid reltablespace; /* tablespace of index (not table) */+ RelOptInfo *rel; /* back-link to index's table */++ /* index-size statistics (from pg_class and elsewhere) */+ BlockNumber pages; /* number of disk pages in index */+ double tuples; /* number of index tuples in index */+ int tree_height; /* index tree height, or -1 if unknown */++ /* index descriptor information */+ int ncolumns; /* number of columns in index */+ int *indexkeys; /* column numbers of index's keys, or 0 */+ Oid *indexcollations; /* OIDs of collations of index columns */+ Oid *opfamily; /* OIDs of operator families for columns */+ Oid *opcintype; /* OIDs of opclass declared input data types */+ Oid *sortopfamily; /* OIDs of btree opfamilies, if orderable */+ bool *reverse_sort; /* is sort order descending? */+ bool *nulls_first; /* do NULLs come first in the sort order? */+ bool *canreturn; /* which index cols can be returned in an+ * index-only scan? */+ Oid relam; /* OID of the access method (in pg_am) */++ RegProcedure amcostestimate; /* OID of the access method's cost fcn */++ List *indexprs; /* expressions for non-simple index columns */+ List *indpred; /* predicate if a partial index, else NIL */++ List *indextlist; /* targetlist representing index columns */++ bool predOK; /* true if predicate matches query */+ bool unique; /* true if a unique index */+ bool immediate; /* is uniqueness enforced immediately? */+ bool hypothetical; /* true if index doesn't really exist */+ bool amcanorderbyop; /* does AM support order by operator result? */+ bool amoptionalkey; /* can query omit key for the first column? */+ bool amsearcharray; /* can AM handle ScalarArrayOpExpr quals? */+ bool amsearchnulls; /* can AM search for NULL/NOT NULL entries? */+ bool amhasgettuple; /* does AM have amgettuple interface? */+ bool amhasgetbitmap; /* does AM have amgetbitmap interface? */+} IndexOptInfo;+++/*+ * EquivalenceClasses+ *+ * Whenever we can determine that a mergejoinable equality clause A = B is+ * not delayed by any outer join, we create an EquivalenceClass containing+ * the expressions A and B to record this knowledge. If we later find another+ * equivalence B = C, we add C to the existing EquivalenceClass; this may+ * require merging two existing EquivalenceClasses. At the end of the qual+ * distribution process, we have sets of values that are known all transitively+ * equal to each other, where "equal" is according to the rules of the btree+ * operator family(s) shown in ec_opfamilies, as well as the collation shown+ * by ec_collation. (We restrict an EC to contain only equalities whose+ * operators belong to the same set of opfamilies. This could probably be+ * relaxed, but for now it's not worth the trouble, since nearly all equality+ * operators belong to only one btree opclass anyway. Similarly, we suppose+ * that all or none of the input datatypes are collatable, so that a single+ * collation value is sufficient.)+ *+ * We also use EquivalenceClasses as the base structure for PathKeys, letting+ * us represent knowledge about different sort orderings being equivalent.+ * Since every PathKey must reference an EquivalenceClass, we will end up+ * with single-member EquivalenceClasses whenever a sort key expression has+ * not been equivalenced to anything else. It is also possible that such an+ * EquivalenceClass will contain a volatile expression ("ORDER BY random()"),+ * which is a case that can't arise otherwise since clauses containing+ * volatile functions are never considered mergejoinable. We mark such+ * EquivalenceClasses specially to prevent them from being merged with+ * ordinary EquivalenceClasses. Also, for volatile expressions we have+ * to be careful to match the EquivalenceClass to the correct targetlist+ * entry: consider SELECT random() AS a, random() AS b ... ORDER BY b,a.+ * So we record the SortGroupRef of the originating sort clause.+ *+ * We allow equality clauses appearing below the nullable side of an outer join+ * to form EquivalenceClasses, but these have a slightly different meaning:+ * the included values might be all NULL rather than all the same non-null+ * values. See src/backend/optimizer/README for more on that point.+ *+ * NB: if ec_merged isn't NULL, this class has been merged into another, and+ * should be ignored in favor of using the pointed-to class.+ */+typedef struct EquivalenceClass+{+ NodeTag type;++ List *ec_opfamilies; /* btree operator family OIDs */+ Oid ec_collation; /* collation, if datatypes are collatable */+ List *ec_members; /* list of EquivalenceMembers */+ List *ec_sources; /* list of generating RestrictInfos */+ List *ec_derives; /* list of derived RestrictInfos */+ Relids ec_relids; /* all relids appearing in ec_members, except+ * for child members (see below) */+ bool ec_has_const; /* any pseudoconstants in ec_members? */+ bool ec_has_volatile; /* the (sole) member is a volatile expr */+ bool ec_below_outer_join; /* equivalence applies below an OJ */+ bool ec_broken; /* failed to generate needed clauses? */+ Index ec_sortref; /* originating sortclause label, or 0 */+ struct EquivalenceClass *ec_merged; /* set if merged into another EC */+} EquivalenceClass;++/*+ * If an EC contains a const and isn't below-outer-join, any PathKey depending+ * on it must be redundant, since there's only one possible value of the key.+ */+#define EC_MUST_BE_REDUNDANT(eclass) \+ ((eclass)->ec_has_const && !(eclass)->ec_below_outer_join)++/*+ * EquivalenceMember - one member expression of an EquivalenceClass+ *+ * em_is_child signifies that this element was built by transposing a member+ * for an appendrel parent relation to represent the corresponding expression+ * for an appendrel child. These members are used for determining the+ * pathkeys of scans on the child relation and for explicitly sorting the+ * child when necessary to build a MergeAppend path for the whole appendrel+ * tree. An em_is_child member has no impact on the properties of the EC as a+ * whole; in particular the EC's ec_relids field does NOT include the child+ * relation. An em_is_child member should never be marked em_is_const nor+ * cause ec_has_const or ec_has_volatile to be set, either. Thus, em_is_child+ * members are not really full-fledged members of the EC, but just reflections+ * or doppelgangers of real members. Most operations on EquivalenceClasses+ * should ignore em_is_child members, and those that don't should test+ * em_relids to make sure they only consider relevant members.+ *+ * em_datatype is usually the same as exprType(em_expr), but can be+ * different when dealing with a binary-compatible opfamily; in particular+ * anyarray_ops would never work without this. Use em_datatype when+ * looking up a specific btree operator to work with this expression.+ */+typedef struct EquivalenceMember+{+ NodeTag type;++ Expr *em_expr; /* the expression represented */+ Relids em_relids; /* all relids appearing in em_expr */+ Relids em_nullable_relids; /* nullable by lower outer joins */+ bool em_is_const; /* expression is pseudoconstant? */+ bool em_is_child; /* derived version for a child relation? */+ Oid em_datatype; /* the "nominal type" used by the opfamily */+} EquivalenceMember;++/*+ * PathKeys+ *+ * The sort ordering of a path is represented by a list of PathKey nodes.+ * An empty list implies no known ordering. Otherwise the first item+ * represents the primary sort key, the second the first secondary sort key,+ * etc. The value being sorted is represented by linking to an+ * EquivalenceClass containing that value and including pk_opfamily among its+ * ec_opfamilies. The EquivalenceClass tells which collation to use, too.+ * This is a convenient method because it makes it trivial to detect+ * equivalent and closely-related orderings. (See optimizer/README for more+ * information.)+ *+ * Note: pk_strategy is either BTLessStrategyNumber (for ASC) or+ * BTGreaterStrategyNumber (for DESC). We assume that all ordering-capable+ * index types will use btree-compatible strategy numbers.+ */+typedef struct PathKey+{+ NodeTag type;++ EquivalenceClass *pk_eclass; /* the value that is ordered */+ Oid pk_opfamily; /* btree opfamily defining the ordering */+ int pk_strategy; /* sort direction (ASC or DESC) */+ bool pk_nulls_first; /* do NULLs come before normal values? */+} PathKey;+++/*+ * ParamPathInfo+ *+ * All parameterized paths for a given relation with given required outer rels+ * link to a single ParamPathInfo, which stores common information such as+ * the estimated rowcount for this parameterization. We do this partly to+ * avoid recalculations, but mostly to ensure that the estimated rowcount+ * is in fact the same for every such path.+ *+ * Note: ppi_clauses is only used in ParamPathInfos for base relation paths;+ * in join cases it's NIL because the set of relevant clauses varies depending+ * on how the join is formed. The relevant clauses will appear in each+ * parameterized join path's joinrestrictinfo list, instead.+ */+typedef struct ParamPathInfo+{+ NodeTag type;++ Relids ppi_req_outer; /* rels supplying parameters used by path */+ double ppi_rows; /* estimated number of result tuples */+ List *ppi_clauses; /* join clauses available from outer rels */+} ParamPathInfo;+++/*+ * Type "Path" is used as-is for sequential-scan paths, as well as some other+ * simple plan types that we don't need any extra information in the path for.+ * For other path types it is the first component of a larger struct.+ *+ * "pathtype" is the NodeTag of the Plan node we could build from this Path.+ * It is partially redundant with the Path's NodeTag, but allows us to use+ * the same Path type for multiple Plan types when there is no need to+ * distinguish the Plan type during path processing.+ *+ * "param_info", if not NULL, links to a ParamPathInfo that identifies outer+ * relation(s) that provide parameter values to each scan of this path.+ * That means this path can only be joined to those rels by means of nestloop+ * joins with this path on the inside. Also note that a parameterized path+ * is responsible for testing all "movable" joinclauses involving this rel+ * and the specified outer rel(s).+ *+ * "rows" is the same as parent->rows in simple paths, but in parameterized+ * paths and UniquePaths it can be less than parent->rows, reflecting the+ * fact that we've filtered by extra join conditions or removed duplicates.+ *+ * "pathkeys" is a List of PathKey nodes (see above), describing the sort+ * ordering of the path's output rows.+ */+typedef struct Path+{+ NodeTag type;++ NodeTag pathtype; /* tag identifying scan/join method */++ RelOptInfo *parent; /* the relation this path can build */+ ParamPathInfo *param_info; /* parameterization info, or NULL if none */++ /* estimated size/costs for path (see costsize.c for more info) */+ double rows; /* estimated number of result tuples */+ Cost startup_cost; /* cost expended before fetching any tuples */+ Cost total_cost; /* total cost (assuming all tuples fetched) */++ List *pathkeys; /* sort ordering of path's output */+ /* pathkeys is a List of PathKey nodes; see above */+} Path;++/* Macro for extracting a path's parameterization relids; beware double eval */+#define PATH_REQ_OUTER(path) \+ ((path)->param_info ? (path)->param_info->ppi_req_outer : (Relids) NULL)++/*----------+ * IndexPath represents an index scan over a single index.+ *+ * This struct is used for both regular indexscans and index-only scans;+ * path.pathtype is T_IndexScan or T_IndexOnlyScan to show which is meant.+ *+ * 'indexinfo' is the index to be scanned.+ *+ * 'indexclauses' is a list of index qualification clauses, with implicit+ * AND semantics across the list. Each clause is a RestrictInfo node from+ * the query's WHERE or JOIN conditions. An empty list implies a full+ * index scan.+ *+ * 'indexquals' has the same structure as 'indexclauses', but it contains+ * the actual index qual conditions that can be used with the index.+ * In simple cases this is identical to 'indexclauses', but when special+ * indexable operators appear in 'indexclauses', they are replaced by the+ * derived indexscannable conditions in 'indexquals'.+ *+ * 'indexqualcols' is an integer list of index column numbers (zero-based)+ * of the same length as 'indexquals', showing which index column each qual+ * is meant to be used with. 'indexquals' is required to be ordered by+ * index column, so 'indexqualcols' must form a nondecreasing sequence.+ * (The order of multiple quals for the same index column is unspecified.)+ *+ * 'indexorderbys', if not NIL, is a list of ORDER BY expressions that have+ * been found to be usable as ordering operators for an amcanorderbyop index.+ * The list must match the path's pathkeys, ie, one expression per pathkey+ * in the same order. These are not RestrictInfos, just bare expressions,+ * since they generally won't yield booleans. Also, unlike the case for+ * quals, it's guaranteed that each expression has the index key on the left+ * side of the operator.+ *+ * 'indexorderbycols' is an integer list of index column numbers (zero-based)+ * of the same length as 'indexorderbys', showing which index column each+ * ORDER BY expression is meant to be used with. (There is no restriction+ * on which index column each ORDER BY can be used with.)+ *+ * 'indexscandir' is one of:+ * ForwardScanDirection: forward scan of an ordered index+ * BackwardScanDirection: backward scan of an ordered index+ * NoMovementScanDirection: scan of an unordered index, or don't care+ * (The executor doesn't care whether it gets ForwardScanDirection or+ * NoMovementScanDirection for an indexscan, but the planner wants to+ * distinguish ordered from unordered indexes for building pathkeys.)+ *+ * 'indextotalcost' and 'indexselectivity' are saved in the IndexPath so that+ * we need not recompute them when considering using the same index in a+ * bitmap index/heap scan (see BitmapHeapPath). The costs of the IndexPath+ * itself represent the costs of an IndexScan or IndexOnlyScan plan type.+ *----------+ */+typedef struct IndexPath+{+ Path path;+ IndexOptInfo *indexinfo;+ List *indexclauses;+ List *indexquals;+ List *indexqualcols;+ List *indexorderbys;+ List *indexorderbycols;+ ScanDirection indexscandir;+ Cost indextotalcost;+ Selectivity indexselectivity;+} IndexPath;++/*+ * BitmapHeapPath represents one or more indexscans that generate TID bitmaps+ * instead of directly accessing the heap, followed by AND/OR combinations+ * to produce a single bitmap, followed by a heap scan that uses the bitmap.+ * Note that the output is always considered unordered, since it will come+ * out in physical heap order no matter what the underlying indexes did.+ *+ * The individual indexscans are represented by IndexPath nodes, and any+ * logic on top of them is represented by a tree of BitmapAndPath and+ * BitmapOrPath nodes. Notice that we can use the same IndexPath node both+ * to represent a regular (or index-only) index scan plan, and as the child+ * of a BitmapHeapPath that represents scanning the same index using a+ * BitmapIndexScan. The startup_cost and total_cost figures of an IndexPath+ * always represent the costs to use it as a regular (or index-only)+ * IndexScan. The costs of a BitmapIndexScan can be computed using the+ * IndexPath's indextotalcost and indexselectivity.+ */+typedef struct BitmapHeapPath+{+ Path path;+ Path *bitmapqual; /* IndexPath, BitmapAndPath, BitmapOrPath */+} BitmapHeapPath;++/*+ * BitmapAndPath represents a BitmapAnd plan node; it can only appear as+ * part of the substructure of a BitmapHeapPath. The Path structure is+ * a bit more heavyweight than we really need for this, but for simplicity+ * we make it a derivative of Path anyway.+ */+typedef struct BitmapAndPath+{+ Path path;+ List *bitmapquals; /* IndexPaths and BitmapOrPaths */+ Selectivity bitmapselectivity;+} BitmapAndPath;++/*+ * BitmapOrPath represents a BitmapOr plan node; it can only appear as+ * part of the substructure of a BitmapHeapPath. The Path structure is+ * a bit more heavyweight than we really need for this, but for simplicity+ * we make it a derivative of Path anyway.+ */+typedef struct BitmapOrPath+{+ Path path;+ List *bitmapquals; /* IndexPaths and BitmapAndPaths */+ Selectivity bitmapselectivity;+} BitmapOrPath;++/*+ * TidPath represents a scan by TID+ *+ * tidquals is an implicitly OR'ed list of qual expressions of the form+ * "CTID = pseudoconstant" or "CTID = ANY(pseudoconstant_array)".+ * Note they are bare expressions, not RestrictInfos.+ */+typedef struct TidPath+{+ Path path;+ List *tidquals; /* qual(s) involving CTID = something */+} TidPath;++/*+ * ForeignPath represents a potential scan of a foreign table+ *+ * fdw_private stores FDW private data about the scan. While fdw_private is+ * not actually touched by the core code during normal operations, it's+ * generally a good idea to use a representation that can be dumped by+ * nodeToString(), so that you can examine the structure during debugging+ * with tools like pprint().+ */+typedef struct ForeignPath+{+ Path path;+ Path *fdw_outerpath;+ List *fdw_private;+} ForeignPath;++/*+ * CustomPath represents a table scan done by some out-of-core extension.+ *+ * We provide a set of hooks here - which the provider must take care to set+ * up correctly - to allow extensions to supply their own methods of scanning+ * a relation. For example, a provider might provide GPU acceleration, a+ * cache-based scan, or some other kind of logic we haven't dreamed up yet.+ *+ * CustomPaths can be injected into the planning process for a relation by+ * set_rel_pathlist_hook functions.+ *+ * Core code must avoid assuming that the CustomPath is only as large as+ * the structure declared here; providers are allowed to make it the first+ * element in a larger structure. (Since the planner never copies Paths,+ * this doesn't add any complication.) However, for consistency with the+ * FDW case, we provide a "custom_private" field in CustomPath; providers+ * may prefer to use that rather than define another struct type.+ */+struct CustomPath;++#define CUSTOMPATH_SUPPORT_BACKWARD_SCAN 0x0001+#define CUSTOMPATH_SUPPORT_MARK_RESTORE 0x0002++typedef struct CustomPathMethods+{+ const char *CustomName;++ /* Convert Path to a Plan */+ struct Plan *(*PlanCustomPath) (PlannerInfo *root,+ RelOptInfo *rel,+ struct CustomPath *best_path,+ List *tlist,+ List *clauses,+ List *custom_plans);+ /* Optional: print additional fields besides "private" */+ void (*TextOutCustomPath) (StringInfo str,+ const struct CustomPath *node);+} CustomPathMethods;++typedef struct CustomPath+{+ Path path;+ uint32 flags; /* mask of CUSTOMPATH_* flags, see above */+ List *custom_paths; /* list of child Path nodes, if any */+ List *custom_private;+ const CustomPathMethods *methods;+} CustomPath;++/*+ * AppendPath represents an Append plan, ie, successive execution of+ * several member plans.+ *+ * Note: it is possible for "subpaths" to contain only one, or even no,+ * elements. These cases are optimized during create_append_plan.+ * In particular, an AppendPath with no subpaths is a "dummy" path that+ * is created to represent the case that a relation is provably empty.+ */+typedef struct AppendPath+{+ Path path;+ List *subpaths; /* list of component Paths */+} AppendPath;++#define IS_DUMMY_PATH(p) \+ (IsA((p), AppendPath) && ((AppendPath *) (p))->subpaths == NIL)++/* A relation that's been proven empty will have one path that is dummy */+#define IS_DUMMY_REL(r) \+ ((r)->cheapest_total_path != NULL && \+ IS_DUMMY_PATH((r)->cheapest_total_path))++/*+ * MergeAppendPath represents a MergeAppend plan, ie, the merging of sorted+ * results from several member plans to produce similarly-sorted output.+ */+typedef struct MergeAppendPath+{+ Path path;+ List *subpaths; /* list of component Paths */+ double limit_tuples; /* hard limit on output tuples, or -1 */+} MergeAppendPath;++/*+ * ResultPath represents use of a Result plan node to compute a variable-free+ * targetlist with no underlying tables (a "SELECT expressions" query).+ * The query could have a WHERE clause, too, represented by "quals".+ *+ * Note that quals is a list of bare clauses, not RestrictInfos.+ */+typedef struct ResultPath+{+ Path path;+ List *quals;+} ResultPath;++/*+ * MaterialPath represents use of a Material plan node, i.e., caching of+ * the output of its subpath. This is used when the subpath is expensive+ * and needs to be scanned repeatedly, or when we need mark/restore ability+ * and the subpath doesn't have it.+ */+typedef struct MaterialPath+{+ Path path;+ Path *subpath;+} MaterialPath;++/*+ * UniquePath represents elimination of distinct rows from the output of+ * its subpath.+ *+ * This is unlike the other Path nodes in that it can actually generate+ * different plans: either hash-based or sort-based implementation, or a+ * no-op if the input path can be proven distinct already. The decision+ * is sufficiently localized that it's not worth having separate Path node+ * types. (Note: in the no-op case, we could eliminate the UniquePath node+ * entirely and just return the subpath; but it's convenient to have a+ * UniquePath in the path tree to signal upper-level routines that the input+ * is known distinct.)+ */+typedef enum+{+ UNIQUE_PATH_NOOP, /* input is known unique already */+ UNIQUE_PATH_HASH, /* use hashing */+ UNIQUE_PATH_SORT /* use sorting */+} UniquePathMethod;++typedef struct UniquePath+{+ Path path;+ Path *subpath;+ UniquePathMethod umethod;+ List *in_operators; /* equality operators of the IN clause */+ List *uniq_exprs; /* expressions to be made unique */+} UniquePath;++/*+ * All join-type paths share these fields.+ */++typedef struct JoinPath+{+ Path path;++ JoinType jointype;++ Path *outerjoinpath; /* path for the outer side of the join */+ Path *innerjoinpath; /* path for the inner side of the join */++ List *joinrestrictinfo; /* RestrictInfos to apply to join */++ /*+ * See the notes for RelOptInfo and ParamPathInfo to understand why+ * joinrestrictinfo is needed in JoinPath, and can't be merged into the+ * parent RelOptInfo.+ */+} JoinPath;++/*+ * A nested-loop path needs no special fields.+ */++typedef JoinPath NestPath;++/*+ * A mergejoin path has these fields.+ *+ * Unlike other path types, a MergePath node doesn't represent just a single+ * run-time plan node: it can represent up to four. Aside from the MergeJoin+ * node itself, there can be a Sort node for the outer input, a Sort node+ * for the inner input, and/or a Material node for the inner input. We could+ * represent these nodes by separate path nodes, but considering how many+ * different merge paths are investigated during a complex join problem,+ * it seems better to avoid unnecessary palloc overhead.+ *+ * path_mergeclauses lists the clauses (in the form of RestrictInfos)+ * that will be used in the merge.+ *+ * Note that the mergeclauses are a subset of the parent relation's+ * restriction-clause list. Any join clauses that are not mergejoinable+ * appear only in the parent's restrict list, and must be checked by a+ * qpqual at execution time.+ *+ * outersortkeys (resp. innersortkeys) is NIL if the outer path+ * (resp. inner path) is already ordered appropriately for the+ * mergejoin. If it is not NIL then it is a PathKeys list describing+ * the ordering that must be created by an explicit Sort node.+ *+ * materialize_inner is TRUE if a Material node should be placed atop the+ * inner input. This may appear with or without an inner Sort step.+ */++typedef struct MergePath+{+ JoinPath jpath;+ List *path_mergeclauses; /* join clauses to be used for merge */+ List *outersortkeys; /* keys for explicit sort, if any */+ List *innersortkeys; /* keys for explicit sort, if any */+ bool materialize_inner; /* add Materialize to inner? */+} MergePath;++/*+ * A hashjoin path has these fields.+ *+ * The remarks above for mergeclauses apply for hashclauses as well.+ *+ * Hashjoin does not care what order its inputs appear in, so we have+ * no need for sortkeys.+ */++typedef struct HashPath+{+ JoinPath jpath;+ List *path_hashclauses; /* join clauses used for hashing */+ int num_batches; /* number of batches expected */+} HashPath;++/*+ * Restriction clause info.+ *+ * We create one of these for each AND sub-clause of a restriction condition+ * (WHERE or JOIN/ON clause). Since the restriction clauses are logically+ * ANDed, we can use any one of them or any subset of them to filter out+ * tuples, without having to evaluate the rest. The RestrictInfo node itself+ * stores data used by the optimizer while choosing the best query plan.+ *+ * If a restriction clause references a single base relation, it will appear+ * in the baserestrictinfo list of the RelOptInfo for that base rel.+ *+ * If a restriction clause references more than one base rel, it will+ * appear in the joininfo list of every RelOptInfo that describes a strict+ * subset of the base rels mentioned in the clause. The joininfo lists are+ * used to drive join tree building by selecting plausible join candidates.+ * The clause cannot actually be applied until we have built a join rel+ * containing all the base rels it references, however.+ *+ * When we construct a join rel that includes all the base rels referenced+ * in a multi-relation restriction clause, we place that clause into the+ * joinrestrictinfo lists of paths for the join rel, if neither left nor+ * right sub-path includes all base rels referenced in the clause. The clause+ * will be applied at that join level, and will not propagate any further up+ * the join tree. (Note: the "predicate migration" code was once intended to+ * push restriction clauses up and down the plan tree based on evaluation+ * costs, but it's dead code and is unlikely to be resurrected in the+ * foreseeable future.)+ *+ * Note that in the presence of more than two rels, a multi-rel restriction+ * might reach different heights in the join tree depending on the join+ * sequence we use. So, these clauses cannot be associated directly with+ * the join RelOptInfo, but must be kept track of on a per-join-path basis.+ *+ * RestrictInfos that represent equivalence conditions (i.e., mergejoinable+ * equalities that are not outerjoin-delayed) are handled a bit differently.+ * Initially we attach them to the EquivalenceClasses that are derived from+ * them. When we construct a scan or join path, we look through all the+ * EquivalenceClasses and generate derived RestrictInfos representing the+ * minimal set of conditions that need to be checked for this particular scan+ * or join to enforce that all members of each EquivalenceClass are in fact+ * equal in all rows emitted by the scan or join.+ *+ * When dealing with outer joins we have to be very careful about pushing qual+ * clauses up and down the tree. An outer join's own JOIN/ON conditions must+ * be evaluated exactly at that join node, unless they are "degenerate"+ * conditions that reference only Vars from the nullable side of the join.+ * Quals appearing in WHERE or in a JOIN above the outer join cannot be pushed+ * down below the outer join, if they reference any nullable Vars.+ * RestrictInfo nodes contain a flag to indicate whether a qual has been+ * pushed down to a lower level than its original syntactic placement in the+ * join tree would suggest. If an outer join prevents us from pushing a qual+ * down to its "natural" semantic level (the level associated with just the+ * base rels used in the qual) then we mark the qual with a "required_relids"+ * value including more than just the base rels it actually uses. By+ * pretending that the qual references all the rels required to form the outer+ * join, we prevent it from being evaluated below the outer join's joinrel.+ * When we do form the outer join's joinrel, we still need to distinguish+ * those quals that are actually in that join's JOIN/ON condition from those+ * that appeared elsewhere in the tree and were pushed down to the join rel+ * because they used no other rels. That's what the is_pushed_down flag is+ * for; it tells us that a qual is not an OUTER JOIN qual for the set of base+ * rels listed in required_relids. A clause that originally came from WHERE+ * or an INNER JOIN condition will *always* have its is_pushed_down flag set.+ * It's possible for an OUTER JOIN clause to be marked is_pushed_down too,+ * if we decide that it can be pushed down into the nullable side of the join.+ * In that case it acts as a plain filter qual for wherever it gets evaluated.+ * (In short, is_pushed_down is only false for non-degenerate outer join+ * conditions. Possibly we should rename it to reflect that meaning?)+ *+ * RestrictInfo nodes also contain an outerjoin_delayed flag, which is true+ * if the clause's applicability must be delayed due to any outer joins+ * appearing below it (ie, it has to be postponed to some join level higher+ * than the set of relations it actually references).+ *+ * There is also an outer_relids field, which is NULL except for outer join+ * clauses; for those, it is the set of relids on the outer side of the+ * clause's outer join. (These are rels that the clause cannot be applied to+ * in parameterized scans, since pushing it into the join's outer side would+ * lead to wrong answers.)+ *+ * There is also a nullable_relids field, which is the set of rels the clause+ * references that can be forced null by some outer join below the clause.+ *+ * outerjoin_delayed = true is subtly different from nullable_relids != NULL:+ * a clause might reference some nullable rels and yet not be+ * outerjoin_delayed because it also references all the other rels of the+ * outer join(s). A clause that is not outerjoin_delayed can be enforced+ * anywhere it is computable.+ *+ * In general, the referenced clause might be arbitrarily complex. The+ * kinds of clauses we can handle as indexscan quals, mergejoin clauses,+ * or hashjoin clauses are limited (e.g., no volatile functions). The code+ * for each kind of path is responsible for identifying the restrict clauses+ * it can use and ignoring the rest. Clauses not implemented by an indexscan,+ * mergejoin, or hashjoin will be placed in the plan qual or joinqual field+ * of the finished Plan node, where they will be enforced by general-purpose+ * qual-expression-evaluation code. (But we are still entitled to count+ * their selectivity when estimating the result tuple count, if we+ * can guess what it is...)+ *+ * When the referenced clause is an OR clause, we generate a modified copy+ * in which additional RestrictInfo nodes are inserted below the top-level+ * OR/AND structure. This is a convenience for OR indexscan processing:+ * indexquals taken from either the top level or an OR subclause will have+ * associated RestrictInfo nodes.+ *+ * The can_join flag is set true if the clause looks potentially useful as+ * a merge or hash join clause, that is if it is a binary opclause with+ * nonoverlapping sets of relids referenced in the left and right sides.+ * (Whether the operator is actually merge or hash joinable isn't checked,+ * however.)+ *+ * The pseudoconstant flag is set true if the clause contains no Vars of+ * the current query level and no volatile functions. Such a clause can be+ * pulled out and used as a one-time qual in a gating Result node. We keep+ * pseudoconstant clauses in the same lists as other RestrictInfos so that+ * the regular clause-pushing machinery can assign them to the correct join+ * level, but they need to be treated specially for cost and selectivity+ * estimates. Note that a pseudoconstant clause can never be an indexqual+ * or merge or hash join clause, so it's of no interest to large parts of+ * the planner.+ *+ * When join clauses are generated from EquivalenceClasses, there may be+ * several equally valid ways to enforce join equivalence, of which we need+ * apply only one. We mark clauses of this kind by setting parent_ec to+ * point to the generating EquivalenceClass. Multiple clauses with the same+ * parent_ec in the same join are redundant.+ */++typedef struct RestrictInfo+{+ NodeTag type;++ Expr *clause; /* the represented clause of WHERE or JOIN */++ bool is_pushed_down; /* TRUE if clause was pushed down in level */++ bool outerjoin_delayed; /* TRUE if delayed by lower outer join */++ bool can_join; /* see comment above */++ bool pseudoconstant; /* see comment above */++ /* The set of relids (varnos) actually referenced in the clause: */+ Relids clause_relids;++ /* The set of relids required to evaluate the clause: */+ Relids required_relids;++ /* If an outer-join clause, the outer-side relations, else NULL: */+ Relids outer_relids;++ /* The relids used in the clause that are nullable by lower outer joins: */+ Relids nullable_relids;++ /* These fields are set for any binary opclause: */+ Relids left_relids; /* relids in left side of clause */+ Relids right_relids; /* relids in right side of clause */++ /* This field is NULL unless clause is an OR clause: */+ Expr *orclause; /* modified clause with RestrictInfos */++ /* This field is NULL unless clause is potentially redundant: */+ EquivalenceClass *parent_ec; /* generating EquivalenceClass */++ /* cache space for cost and selectivity */+ QualCost eval_cost; /* eval cost of clause; -1 if not yet set */+ Selectivity norm_selec; /* selectivity for "normal" (JOIN_INNER)+ * semantics; -1 if not yet set; >1 means a+ * redundant clause */+ Selectivity outer_selec; /* selectivity for outer join semantics; -1 if+ * not yet set */++ /* valid if clause is mergejoinable, else NIL */+ List *mergeopfamilies; /* opfamilies containing clause operator */++ /* cache space for mergeclause processing; NULL if not yet set */+ EquivalenceClass *left_ec; /* EquivalenceClass containing lefthand */+ EquivalenceClass *right_ec; /* EquivalenceClass containing righthand */+ EquivalenceMember *left_em; /* EquivalenceMember for lefthand */+ EquivalenceMember *right_em; /* EquivalenceMember for righthand */+ List *scansel_cache; /* list of MergeScanSelCache structs */++ /* transient workspace for use while considering a specific join path */+ bool outer_is_left; /* T = outer var on left, F = on right */++ /* valid if clause is hashjoinable, else InvalidOid: */+ Oid hashjoinoperator; /* copy of clause operator */++ /* cache space for hashclause processing; -1 if not yet set */+ Selectivity left_bucketsize; /* avg bucketsize of left side */+ Selectivity right_bucketsize; /* avg bucketsize of right side */+} RestrictInfo;++/*+ * Since mergejoinscansel() is a relatively expensive function, and would+ * otherwise be invoked many times while planning a large join tree,+ * we go out of our way to cache its results. Each mergejoinable+ * RestrictInfo carries a list of the specific sort orderings that have+ * been considered for use with it, and the resulting selectivities.+ */+typedef struct MergeScanSelCache+{+ /* Ordering details (cache lookup key) */+ Oid opfamily; /* btree opfamily defining the ordering */+ Oid collation; /* collation for the ordering */+ int strategy; /* sort direction (ASC or DESC) */+ bool nulls_first; /* do NULLs come before normal values? */+ /* Results */+ Selectivity leftstartsel; /* first-join fraction for clause left side */+ Selectivity leftendsel; /* last-join fraction for clause left side */+ Selectivity rightstartsel; /* first-join fraction for clause right side */+ Selectivity rightendsel; /* last-join fraction for clause right side */+} MergeScanSelCache;++/*+ * Placeholder node for an expression to be evaluated below the top level+ * of a plan tree. This is used during planning to represent the contained+ * expression. At the end of the planning process it is replaced by either+ * the contained expression or a Var referring to a lower-level evaluation of+ * the contained expression. Typically the evaluation occurs below an outer+ * join, and Var references above the outer join might thereby yield NULL+ * instead of the expression value.+ *+ * Although the planner treats this as an expression node type, it is not+ * recognized by the parser or executor, so we declare it here rather than+ * in primnodes.h.+ */++typedef struct PlaceHolderVar+{+ Expr xpr;+ Expr *phexpr; /* the represented expression */+ Relids phrels; /* base relids syntactically within expr src */+ Index phid; /* ID for PHV (unique within planner run) */+ Index phlevelsup; /* > 0 if PHV belongs to outer query */+} PlaceHolderVar;++/*+ * "Special join" info.+ *+ * One-sided outer joins constrain the order of joining partially but not+ * completely. We flatten such joins into the planner's top-level list of+ * relations to join, but record information about each outer join in a+ * SpecialJoinInfo struct. These structs are kept in the PlannerInfo node's+ * join_info_list.+ *+ * Similarly, semijoins and antijoins created by flattening IN (subselect)+ * and EXISTS(subselect) clauses create partial constraints on join order.+ * These are likewise recorded in SpecialJoinInfo structs.+ *+ * We make SpecialJoinInfos for FULL JOINs even though there is no flexibility+ * of planning for them, because this simplifies make_join_rel()'s API.+ *+ * min_lefthand and min_righthand are the sets of base relids that must be+ * available on each side when performing the special join. lhs_strict is+ * true if the special join's condition cannot succeed when the LHS variables+ * are all NULL (this means that an outer join can commute with upper-level+ * outer joins even if it appears in their RHS). We don't bother to set+ * lhs_strict for FULL JOINs, however.+ *+ * It is not valid for either min_lefthand or min_righthand to be empty sets;+ * if they were, this would break the logic that enforces join order.+ *+ * syn_lefthand and syn_righthand are the sets of base relids that are+ * syntactically below this special join. (These are needed to help compute+ * min_lefthand and min_righthand for higher joins.)+ *+ * delay_upper_joins is set TRUE if we detect a pushed-down clause that has+ * to be evaluated after this join is formed (because it references the RHS).+ * Any outer joins that have such a clause and this join in their RHS cannot+ * commute with this join, because that would leave noplace to check the+ * pushed-down clause. (We don't track this for FULL JOINs, either.)+ *+ * For a semijoin, we also extract the join operators and their RHS arguments+ * and set semi_operators, semi_rhs_exprs, semi_can_btree, and semi_can_hash.+ * This is done in support of possibly unique-ifying the RHS, so we don't+ * bother unless at least one of semi_can_btree and semi_can_hash can be set+ * true. (You might expect that this information would be computed during+ * join planning; but it's helpful to have it available during planning of+ * parameterized table scans, so we store it in the SpecialJoinInfo structs.)+ *+ * jointype is never JOIN_RIGHT; a RIGHT JOIN is handled by switching+ * the inputs to make it a LEFT JOIN. So the allowed values of jointype+ * in a join_info_list member are only LEFT, FULL, SEMI, or ANTI.+ *+ * For purposes of join selectivity estimation, we create transient+ * SpecialJoinInfo structures for regular inner joins; so it is possible+ * to have jointype == JOIN_INNER in such a structure, even though this is+ * not allowed within join_info_list. We also create transient+ * SpecialJoinInfos with jointype == JOIN_INNER for outer joins, since for+ * cost estimation purposes it is sometimes useful to know the join size under+ * plain innerjoin semantics. Note that lhs_strict, delay_upper_joins, and+ * of course the semi_xxx fields are not set meaningfully within such structs.+ */++typedef struct SpecialJoinInfo+{+ NodeTag type;+ Relids min_lefthand; /* base relids in minimum LHS for join */+ Relids min_righthand; /* base relids in minimum RHS for join */+ Relids syn_lefthand; /* base relids syntactically within LHS */+ Relids syn_righthand; /* base relids syntactically within RHS */+ JoinType jointype; /* always INNER, LEFT, FULL, SEMI, or ANTI */+ bool lhs_strict; /* joinclause is strict for some LHS rel */+ bool delay_upper_joins; /* can't commute with upper RHS */+ /* Remaining fields are set only for JOIN_SEMI jointype: */+ bool semi_can_btree; /* true if semi_operators are all btree */+ bool semi_can_hash; /* true if semi_operators are all hash */+ List *semi_operators; /* OIDs of equality join operators */+ List *semi_rhs_exprs; /* righthand-side expressions of these ops */+} SpecialJoinInfo;++/*+ * Append-relation info.+ *+ * When we expand an inheritable table or a UNION-ALL subselect into an+ * "append relation" (essentially, a list of child RTEs), we build an+ * AppendRelInfo for each child RTE. The list of AppendRelInfos indicates+ * which child RTEs must be included when expanding the parent, and each+ * node carries information needed to translate Vars referencing the parent+ * into Vars referencing that child.+ *+ * These structs are kept in the PlannerInfo node's append_rel_list.+ * Note that we just throw all the structs into one list, and scan the+ * whole list when desiring to expand any one parent. We could have used+ * a more complex data structure (eg, one list per parent), but this would+ * be harder to update during operations such as pulling up subqueries,+ * and not really any easier to scan. Considering that typical queries+ * will not have many different append parents, it doesn't seem worthwhile+ * to complicate things.+ *+ * Note: after completion of the planner prep phase, any given RTE is an+ * append parent having entries in append_rel_list if and only if its+ * "inh" flag is set. We clear "inh" for plain tables that turn out not+ * to have inheritance children, and (in an abuse of the original meaning+ * of the flag) we set "inh" for subquery RTEs that turn out to be+ * flattenable UNION ALL queries. This lets us avoid useless searches+ * of append_rel_list.+ *+ * Note: the data structure assumes that append-rel members are single+ * baserels. This is OK for inheritance, but it prevents us from pulling+ * up a UNION ALL member subquery if it contains a join. While that could+ * be fixed with a more complex data structure, at present there's not much+ * point because no improvement in the plan could result.+ */++typedef struct AppendRelInfo+{+ NodeTag type;++ /*+ * These fields uniquely identify this append relationship. There can be+ * (in fact, always should be) multiple AppendRelInfos for the same+ * parent_relid, but never more than one per child_relid, since a given+ * RTE cannot be a child of more than one append parent.+ */+ Index parent_relid; /* RT index of append parent rel */+ Index child_relid; /* RT index of append child rel */++ /*+ * For an inheritance appendrel, the parent and child are both regular+ * relations, and we store their rowtype OIDs here for use in translating+ * whole-row Vars. For a UNION-ALL appendrel, the parent and child are+ * both subqueries with no named rowtype, and we store InvalidOid here.+ */+ Oid parent_reltype; /* OID of parent's composite type */+ Oid child_reltype; /* OID of child's composite type */++ /*+ * The N'th element of this list is a Var or expression representing the+ * child column corresponding to the N'th column of the parent. This is+ * used to translate Vars referencing the parent rel into references to+ * the child. A list element is NULL if it corresponds to a dropped+ * column of the parent (this is only possible for inheritance cases, not+ * UNION ALL). The list elements are always simple Vars for inheritance+ * cases, but can be arbitrary expressions in UNION ALL cases.+ *+ * Notice we only store entries for user columns (attno > 0). Whole-row+ * Vars are special-cased, and system columns (attno < 0) need no special+ * translation since their attnos are the same for all tables.+ *+ * Caution: the Vars have varlevelsup = 0. Be careful to adjust as needed+ * when copying into a subquery.+ */+ List *translated_vars; /* Expressions in the child's Vars */++ /*+ * We store the parent table's OID here for inheritance, or InvalidOid for+ * UNION ALL. This is only needed to help in generating error messages if+ * an attempt is made to reference a dropped parent column.+ */+ Oid parent_reloid; /* OID of parent relation */+} AppendRelInfo;++/*+ * For each distinct placeholder expression generated during planning, we+ * store a PlaceHolderInfo node in the PlannerInfo node's placeholder_list.+ * This stores info that is needed centrally rather than in each copy of the+ * PlaceHolderVar. The phid fields identify which PlaceHolderInfo goes with+ * each PlaceHolderVar. Note that phid is unique throughout a planner run,+ * not just within a query level --- this is so that we need not reassign ID's+ * when pulling a subquery into its parent.+ *+ * The idea is to evaluate the expression at (only) the ph_eval_at join level,+ * then allow it to bubble up like a Var until the ph_needed join level.+ * ph_needed has the same definition as attr_needed for a regular Var.+ *+ * The PlaceHolderVar's expression might contain LATERAL references to vars+ * coming from outside its syntactic scope. If so, those rels are *not*+ * included in ph_eval_at, but they are recorded in ph_lateral.+ *+ * Notice that when ph_eval_at is a join rather than a single baserel, the+ * PlaceHolderInfo may create constraints on join order: the ph_eval_at join+ * has to be formed below any outer joins that should null the PlaceHolderVar.+ *+ * We create a PlaceHolderInfo only after determining that the PlaceHolderVar+ * is actually referenced in the plan tree, so that unreferenced placeholders+ * don't result in unnecessary constraints on join order.+ */++typedef struct PlaceHolderInfo+{+ NodeTag type;++ Index phid; /* ID for PH (unique within planner run) */+ PlaceHolderVar *ph_var; /* copy of PlaceHolderVar tree */+ Relids ph_eval_at; /* lowest level we can evaluate value at */+ Relids ph_lateral; /* relids of contained lateral refs, if any */+ Relids ph_needed; /* highest level the value is needed at */+ int32 ph_width; /* estimated attribute width */+} PlaceHolderInfo;++/*+ * For each potentially index-optimizable MIN/MAX aggregate function,+ * root->minmax_aggs stores a MinMaxAggInfo describing it.+ */+typedef struct MinMaxAggInfo+{+ NodeTag type;++ Oid aggfnoid; /* pg_proc Oid of the aggregate */+ Oid aggsortop; /* Oid of its sort operator */+ Expr *target; /* expression we are aggregating on */+ PlannerInfo *subroot; /* modified "root" for planning the subquery */+ Path *path; /* access path for subquery */+ Cost pathcost; /* estimated cost to fetch first row */+ Param *param; /* param for subplan's output */+} MinMaxAggInfo;++/*+ * At runtime, PARAM_EXEC slots are used to pass values around from one plan+ * node to another. They can be used to pass values down into subqueries (for+ * outer references in subqueries), or up out of subqueries (for the results+ * of a subplan), or from a NestLoop plan node into its inner relation (when+ * the inner scan is parameterized with values from the outer relation).+ * The planner is responsible for assigning nonconflicting PARAM_EXEC IDs to+ * the PARAM_EXEC Params it generates.+ *+ * Outer references are managed via root->plan_params, which is a list of+ * PlannerParamItems. While planning a subquery, each parent query level's+ * plan_params contains the values required from it by the current subquery.+ * During create_plan(), we use plan_params to track values that must be+ * passed from outer to inner sides of NestLoop plan nodes.+ *+ * The item a PlannerParamItem represents can be one of three kinds:+ *+ * A Var: the slot represents a variable of this level that must be passed+ * down because subqueries have outer references to it, or must be passed+ * from a NestLoop node to its inner scan. The varlevelsup value in the Var+ * will always be zero.+ *+ * A PlaceHolderVar: this works much like the Var case, except that the+ * entry is a PlaceHolderVar node with a contained expression. The PHV+ * will have phlevelsup = 0, and the contained expression is adjusted+ * to match in level.+ *+ * An Aggref (with an expression tree representing its argument): the slot+ * represents an aggregate expression that is an outer reference for some+ * subquery. The Aggref itself has agglevelsup = 0, and its argument tree+ * is adjusted to match in level.+ *+ * Note: we detect duplicate Var and PlaceHolderVar parameters and coalesce+ * them into one slot, but we do not bother to do that for Aggrefs.+ * The scope of duplicate-elimination only extends across the set of+ * parameters passed from one query level into a single subquery, or for+ * nestloop parameters across the set of nestloop parameters used in a single+ * query level. So there is no possibility of a PARAM_EXEC slot being used+ * for conflicting purposes.+ *+ * In addition, PARAM_EXEC slots are assigned for Params representing outputs+ * from subplans (values that are setParam items for those subplans). These+ * IDs need not be tracked via PlannerParamItems, since we do not need any+ * duplicate-elimination nor later processing of the represented expressions.+ * Instead, we just record the assignment of the slot number by incrementing+ * root->glob->nParamExec.+ */+typedef struct PlannerParamItem+{+ NodeTag type;++ Node *item; /* the Var, PlaceHolderVar, or Aggref */+ int paramId; /* its assigned PARAM_EXEC slot number */+} PlannerParamItem;++/*+ * When making cost estimates for a SEMI or ANTI join, there are some+ * correction factors that are needed in both nestloop and hash joins+ * to account for the fact that the executor can stop scanning inner rows+ * as soon as it finds a match to the current outer row. These numbers+ * depend only on the selected outer and inner join relations, not on the+ * particular paths used for them, so it's worthwhile to calculate them+ * just once per relation pair not once per considered path. This struct+ * is filled by compute_semi_anti_join_factors and must be passed along+ * to the join cost estimation functions.+ *+ * outer_match_frac is the fraction of the outer tuples that are+ * expected to have at least one match.+ * match_count is the average number of matches expected for+ * outer tuples that have at least one match.+ */+typedef struct SemiAntiJoinFactors+{+ Selectivity outer_match_frac;+ Selectivity match_count;+} SemiAntiJoinFactors;++/*+ * Struct for extra information passed to subroutines of add_paths_to_joinrel+ *+ * restrictlist contains all of the RestrictInfo nodes for restriction+ * clauses that apply to this join+ * mergeclause_list is a list of RestrictInfo nodes for available+ * mergejoin clauses in this join+ * sjinfo is extra info about special joins for selectivity estimation+ * semifactors is as shown above (only valid for SEMI or ANTI joins)+ * param_source_rels are OK targets for parameterization of result paths+ */+typedef struct JoinPathExtraData+{+ List *restrictlist;+ List *mergeclause_list;+ SpecialJoinInfo *sjinfo;+ SemiAntiJoinFactors semifactors;+ Relids param_source_rels;+} JoinPathExtraData;++/*+ * For speed reasons, cost estimation for join paths is performed in two+ * phases: the first phase tries to quickly derive a lower bound for the+ * join cost, and then we check if that's sufficient to reject the path.+ * If not, we come back for a more refined cost estimate. The first phase+ * fills a JoinCostWorkspace struct with its preliminary cost estimates+ * and possibly additional intermediate values. The second phase takes+ * these values as inputs to avoid repeating work.+ *+ * (Ideally we'd declare this in cost.h, but it's also needed in pathnode.h,+ * so seems best to put it here.)+ */+typedef struct JoinCostWorkspace+{+ /* Preliminary cost estimates --- must not be larger than final ones! */+ Cost startup_cost; /* cost expended before fetching any tuples */+ Cost total_cost; /* total cost (assuming all tuples fetched) */++ /* Fields below here should be treated as private to costsize.c */+ Cost run_cost; /* non-startup cost components */++ /* private for cost_nestloop code */+ Cost inner_run_cost; /* also used by cost_mergejoin code */+ Cost inner_rescan_run_cost;++ /* private for cost_mergejoin code */+ double outer_rows;+ double inner_rows;+ double outer_skip_rows;+ double inner_skip_rows;++ /* private for cost_hashjoin code */+ int numbuckets;+ int numbatches;+} JoinCostWorkspace;++#endif /* RELATION_H */
+ foreign/libpg_query/src/postgres/include/nodes/tidbitmap.h view
@@ -0,0 +1,66 @@+/*-------------------------------------------------------------------------+ *+ * tidbitmap.h+ * PostgreSQL tuple-id (TID) bitmap package+ *+ * This module provides bitmap data structures that are spiritually+ * similar to Bitmapsets, but are specially adapted to store sets of+ * tuple identifiers (TIDs), or ItemPointers. In particular, the division+ * of an ItemPointer into BlockNumber and OffsetNumber is catered for.+ * Also, since we wish to be able to store very large tuple sets in+ * memory with this data structure, we support "lossy" storage, in which+ * we no longer remember individual tuple offsets on a page but only the+ * fact that a particular page needs to be visited.+ *+ *+ * Copyright (c) 2003-2015, PostgreSQL Global Development Group+ *+ * src/include/nodes/tidbitmap.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef TIDBITMAP_H+#define TIDBITMAP_H++#include "storage/itemptr.h"+++/*+ * Actual bitmap representation is private to tidbitmap.c. Callers can+ * do IsA(x, TIDBitmap) on it, but nothing else.+ */+typedef struct TIDBitmap TIDBitmap;++/* Likewise, TBMIterator is private */+typedef struct TBMIterator TBMIterator;++/* Result structure for tbm_iterate */+typedef struct+{+ BlockNumber blockno; /* page number containing tuples */+ int ntuples; /* -1 indicates lossy result */+ bool recheck; /* should the tuples be rechecked? */+ /* Note: recheck is always true if ntuples < 0 */+ OffsetNumber offsets[FLEXIBLE_ARRAY_MEMBER];+} TBMIterateResult;++/* function prototypes in nodes/tidbitmap.c */++extern TIDBitmap *tbm_create(long maxbytes);+extern void tbm_free(TIDBitmap *tbm);++extern void tbm_add_tuples(TIDBitmap *tbm,+ const ItemPointer tids, int ntids,+ bool recheck);+extern void tbm_add_page(TIDBitmap *tbm, BlockNumber pageno);++extern void tbm_union(TIDBitmap *a, const TIDBitmap *b);+extern void tbm_intersect(TIDBitmap *a, const TIDBitmap *b);++extern bool tbm_is_empty(const TIDBitmap *tbm);++extern TBMIterator *tbm_begin_iterate(TIDBitmap *tbm);+extern TBMIterateResult *tbm_iterate(TBMIterator *iterator);+extern void tbm_end_iterate(TBMIterator *iterator);++#endif /* TIDBITMAP_H */
+ foreign/libpg_query/src/postgres/include/nodes/value.h view
@@ -0,0 +1,61 @@+/*-------------------------------------------------------------------------+ *+ * value.h+ * interface for Value nodes+ *+ *+ * Copyright (c) 2003-2015, PostgreSQL Global Development Group+ *+ * src/include/nodes/value.h+ *+ *-------------------------------------------------------------------------+ */++#ifndef VALUE_H+#define VALUE_H++#include "nodes/nodes.h"++/*----------------------+ * Value node+ *+ * The same Value struct is used for five node types: T_Integer,+ * T_Float, T_String, T_BitString, T_Null.+ *+ * Integral values are actually represented by a machine integer,+ * but both floats and strings are represented as strings.+ * Using T_Float as the node type simply indicates that+ * the contents of the string look like a valid numeric literal.+ *+ * (Before Postgres 7.0, we used a double to represent T_Float,+ * but that creates loss-of-precision problems when the value is+ * ultimately destined to be converted to NUMERIC. Since Value nodes+ * are only used in the parsing process, not for runtime data, it's+ * better to use the more general representation.)+ *+ * Note that an integer-looking string will get lexed as T_Float if+ * the value is too large to fit in a 'long'.+ *+ * Nulls, of course, don't need the value part at all.+ *----------------------+ */+typedef struct Value+{+ NodeTag type; /* tag appropriately (eg. T_String) */+ union ValUnion+ {+ long ival; /* machine integer */+ char *str; /* string */+ } val;+} Value;++#define intVal(v) (((Value *)(v))->val.ival)+#define floatVal(v) atof(((Value *)(v))->val.str)+#define strVal(v) (((Value *)(v))->val.str)++extern Value *makeInteger(long i);+extern Value *makeFloat(char *numericStr);+extern Value *makeString(char *str);+extern Value *makeBitString(char *str);++#endif /* VALUE_H */
+ foreign/libpg_query/src/postgres/include/optimizer/cost.h view
@@ -0,0 +1,194 @@+/*-------------------------------------------------------------------------+ *+ * cost.h+ * prototypes for costsize.c and clausesel.c.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/optimizer/cost.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef COST_H+#define COST_H++#include "nodes/plannodes.h"+#include "nodes/relation.h"+++/* defaults for costsize.c's Cost parameters */+/* NB: cost-estimation code should use the variables, not these constants! */+/* If you change these, update backend/utils/misc/postgresql.sample.conf */+#define DEFAULT_SEQ_PAGE_COST 1.0+#define DEFAULT_RANDOM_PAGE_COST 4.0+#define DEFAULT_CPU_TUPLE_COST 0.01+#define DEFAULT_CPU_INDEX_TUPLE_COST 0.005+#define DEFAULT_CPU_OPERATOR_COST 0.0025++#define DEFAULT_EFFECTIVE_CACHE_SIZE 524288 /* measured in pages */++typedef enum+{+ CONSTRAINT_EXCLUSION_OFF, /* do not use c_e */+ CONSTRAINT_EXCLUSION_ON, /* apply c_e to all rels */+ CONSTRAINT_EXCLUSION_PARTITION /* apply c_e to otherrels only */+} ConstraintExclusionType;+++/*+ * prototypes for costsize.c+ * routines to compute costs and sizes+ */++/* parameter variables and flags */+extern PGDLLIMPORT double seq_page_cost;+extern PGDLLIMPORT double random_page_cost;+extern PGDLLIMPORT double cpu_tuple_cost;+extern PGDLLIMPORT double cpu_index_tuple_cost;+extern PGDLLIMPORT double cpu_operator_cost;+extern PGDLLIMPORT int effective_cache_size;+extern Cost disable_cost;+extern bool enable_seqscan;+extern bool enable_indexscan;+extern bool enable_indexonlyscan;+extern bool enable_bitmapscan;+extern bool enable_tidscan;+extern bool enable_sort;+extern bool enable_hashagg;+extern bool enable_nestloop;+extern bool enable_material;+extern bool enable_mergejoin;+extern bool enable_hashjoin;+extern int constraint_exclusion;++extern double clamp_row_est(double nrows);+extern double index_pages_fetched(double tuples_fetched, BlockNumber pages,+ double index_pages, PlannerInfo *root);+extern void cost_seqscan(Path *path, PlannerInfo *root, RelOptInfo *baserel,+ ParamPathInfo *param_info);+extern void cost_samplescan(Path *path, PlannerInfo *root, RelOptInfo *baserel,+ ParamPathInfo *param_info);+extern void cost_index(IndexPath *path, PlannerInfo *root,+ double loop_count);+extern void cost_bitmap_heap_scan(Path *path, PlannerInfo *root, RelOptInfo *baserel,+ ParamPathInfo *param_info,+ Path *bitmapqual, double loop_count);+extern void cost_bitmap_and_node(BitmapAndPath *path, PlannerInfo *root);+extern void cost_bitmap_or_node(BitmapOrPath *path, PlannerInfo *root);+extern void cost_bitmap_tree_node(Path *path, Cost *cost, Selectivity *selec);+extern void cost_tidscan(Path *path, PlannerInfo *root,+ RelOptInfo *baserel, List *tidquals, ParamPathInfo *param_info);+extern void cost_subqueryscan(Path *path, PlannerInfo *root,+ RelOptInfo *baserel, ParamPathInfo *param_info);+extern void cost_functionscan(Path *path, PlannerInfo *root,+ RelOptInfo *baserel, ParamPathInfo *param_info);+extern void cost_valuesscan(Path *path, PlannerInfo *root,+ RelOptInfo *baserel, ParamPathInfo *param_info);+extern void cost_ctescan(Path *path, PlannerInfo *root,+ RelOptInfo *baserel, ParamPathInfo *param_info);+extern void cost_recursive_union(Plan *runion, Plan *nrterm, Plan *rterm);+extern void cost_sort(Path *path, PlannerInfo *root,+ List *pathkeys, Cost input_cost, double tuples, int width,+ Cost comparison_cost, int sort_mem,+ double limit_tuples);+extern void cost_merge_append(Path *path, PlannerInfo *root,+ List *pathkeys, int n_streams,+ Cost input_startup_cost, Cost input_total_cost,+ double tuples);+extern void cost_material(Path *path,+ Cost input_startup_cost, Cost input_total_cost,+ double tuples, int width);+extern void cost_agg(Path *path, PlannerInfo *root,+ AggStrategy aggstrategy, const AggClauseCosts *aggcosts,+ int numGroupCols, double numGroups,+ Cost input_startup_cost, Cost input_total_cost,+ double input_tuples);+extern void cost_windowagg(Path *path, PlannerInfo *root,+ List *windowFuncs, int numPartCols, int numOrderCols,+ Cost input_startup_cost, Cost input_total_cost,+ double input_tuples);+extern void cost_group(Path *path, PlannerInfo *root,+ int numGroupCols, double numGroups,+ Cost input_startup_cost, Cost input_total_cost,+ double input_tuples);+extern void initial_cost_nestloop(PlannerInfo *root,+ JoinCostWorkspace *workspace,+ JoinType jointype,+ Path *outer_path, Path *inner_path,+ SpecialJoinInfo *sjinfo,+ SemiAntiJoinFactors *semifactors);+extern void final_cost_nestloop(PlannerInfo *root, NestPath *path,+ JoinCostWorkspace *workspace,+ SpecialJoinInfo *sjinfo,+ SemiAntiJoinFactors *semifactors);+extern void initial_cost_mergejoin(PlannerInfo *root,+ JoinCostWorkspace *workspace,+ JoinType jointype,+ List *mergeclauses,+ Path *outer_path, Path *inner_path,+ List *outersortkeys, List *innersortkeys,+ SpecialJoinInfo *sjinfo);+extern void final_cost_mergejoin(PlannerInfo *root, MergePath *path,+ JoinCostWorkspace *workspace,+ SpecialJoinInfo *sjinfo);+extern void initial_cost_hashjoin(PlannerInfo *root,+ JoinCostWorkspace *workspace,+ JoinType jointype,+ List *hashclauses,+ Path *outer_path, Path *inner_path,+ SpecialJoinInfo *sjinfo,+ SemiAntiJoinFactors *semifactors);+extern void final_cost_hashjoin(PlannerInfo *root, HashPath *path,+ JoinCostWorkspace *workspace,+ SpecialJoinInfo *sjinfo,+ SemiAntiJoinFactors *semifactors);+extern void cost_subplan(PlannerInfo *root, SubPlan *subplan, Plan *plan);+extern void cost_qual_eval(QualCost *cost, List *quals, PlannerInfo *root);+extern void cost_qual_eval_node(QualCost *cost, Node *qual, PlannerInfo *root);+extern void compute_semi_anti_join_factors(PlannerInfo *root,+ RelOptInfo *outerrel,+ RelOptInfo *innerrel,+ JoinType jointype,+ SpecialJoinInfo *sjinfo,+ List *restrictlist,+ SemiAntiJoinFactors *semifactors);+extern void set_baserel_size_estimates(PlannerInfo *root, RelOptInfo *rel);+extern double get_parameterized_baserel_size(PlannerInfo *root,+ RelOptInfo *rel,+ List *param_clauses);+extern double get_parameterized_joinrel_size(PlannerInfo *root,+ RelOptInfo *rel,+ double outer_rows,+ double inner_rows,+ SpecialJoinInfo *sjinfo,+ List *restrict_clauses);+extern void set_joinrel_size_estimates(PlannerInfo *root, RelOptInfo *rel,+ RelOptInfo *outer_rel,+ RelOptInfo *inner_rel,+ SpecialJoinInfo *sjinfo,+ List *restrictlist);+extern void set_subquery_size_estimates(PlannerInfo *root, RelOptInfo *rel);+extern void set_function_size_estimates(PlannerInfo *root, RelOptInfo *rel);+extern void set_values_size_estimates(PlannerInfo *root, RelOptInfo *rel);+extern void set_cte_size_estimates(PlannerInfo *root, RelOptInfo *rel,+ Plan *cteplan);+extern void set_foreign_size_estimates(PlannerInfo *root, RelOptInfo *rel);++/*+ * prototypes for clausesel.c+ * routines to compute clause selectivities+ */+extern Selectivity clauselist_selectivity(PlannerInfo *root,+ List *clauses,+ int varRelid,+ JoinType jointype,+ SpecialJoinInfo *sjinfo);+extern Selectivity clause_selectivity(PlannerInfo *root,+ Node *clause,+ int varRelid,+ JoinType jointype,+ SpecialJoinInfo *sjinfo);++#endif /* COST_H */
+ foreign/libpg_query/src/postgres/include/optimizer/geqo.h view
@@ -0,0 +1,88 @@+/*-------------------------------------------------------------------------+ *+ * geqo.h+ * prototypes for various files in optimizer/geqo+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/optimizer/geqo.h+ *+ *-------------------------------------------------------------------------+ */++/* contributed by:+ =*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=+ * Martin Utesch * Institute of Automatic Control *+ = = University of Mining and Technology =+ * utesch@aut.tu-freiberg.de * Freiberg, Germany *+ =*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=+ */++#ifndef GEQO_H+#define GEQO_H++#include "nodes/relation.h"+#include "optimizer/geqo_gene.h"+++/* GEQO debug flag */+/*+ #define GEQO_DEBUG+ */++/* recombination mechanism */+/*+ #define ERX+ #define PMX+ #define CX+ #define PX+ #define OX1+ #define OX2+ */+#define ERX+++/*+ * Configuration options+ *+ * If you change these, update backend/utils/misc/postgresql.conf.sample+ */+extern int Geqo_effort; /* 1 .. 10, knob for adjustment of defaults */++#define DEFAULT_GEQO_EFFORT 5+#define MIN_GEQO_EFFORT 1+#define MAX_GEQO_EFFORT 10++extern int Geqo_pool_size; /* 2 .. inf, or 0 to use default */++extern int Geqo_generations; /* 1 .. inf, or 0 to use default */++extern double Geqo_selection_bias;++#define DEFAULT_GEQO_SELECTION_BIAS 2.0+#define MIN_GEQO_SELECTION_BIAS 1.5+#define MAX_GEQO_SELECTION_BIAS 2.0++extern double Geqo_seed; /* 0 .. 1 */+++/*+ * Private state for a GEQO run --- accessible via root->join_search_private+ */+typedef struct+{+ List *initial_rels; /* the base relations we are joining */+ unsigned short random_state[3]; /* state for pg_erand48() */+} GeqoPrivateData;+++/* routines in geqo_main.c */+extern RelOptInfo *geqo(PlannerInfo *root,+ int number_of_rels, List *initial_rels);++/* routines in geqo_eval.c */+extern Cost geqo_eval(PlannerInfo *root, Gene *tour, int num_gene);+extern RelOptInfo *gimme_tree(PlannerInfo *root, Gene *tour, int num_gene);++#endif /* GEQO_H */
+ foreign/libpg_query/src/postgres/include/optimizer/geqo_gene.h view
@@ -0,0 +1,45 @@+/*-------------------------------------------------------------------------+ *+ * geqo_gene.h+ * genome representation in optimizer/geqo+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/optimizer/geqo_gene.h+ *+ *-------------------------------------------------------------------------+ */++/* contributed by:+ =*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=+ * Martin Utesch * Institute of Automatic Control *+ = = University of Mining and Technology =+ * utesch@aut.tu-freiberg.de * Freiberg, Germany *+ =*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=+ */+++#ifndef GEQO_GENE_H+#define GEQO_GENE_H++#include "nodes/nodes.h"++/* we presume that int instead of Relid+ is o.k. for Gene; so don't change it! */+typedef int Gene;++typedef struct Chromosome+{+ Gene *string;+ Cost worth;+} Chromosome;++typedef struct Pool+{+ Chromosome *data;+ int size;+ int string_length;+} Pool;++#endif /* GEQO_GENE_H */
+ foreign/libpg_query/src/postgres/include/optimizer/paths.h view
@@ -0,0 +1,215 @@+/*-------------------------------------------------------------------------+ *+ * paths.h+ * prototypes for various files in optimizer/path+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/optimizer/paths.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef PATHS_H+#define PATHS_H++#include "nodes/relation.h"+++/*+ * allpaths.c+ */+extern bool enable_geqo;+extern int geqo_threshold;++/* Hook for plugins to get control in set_rel_pathlist() */+typedef void (*set_rel_pathlist_hook_type) (PlannerInfo *root,+ RelOptInfo *rel,+ Index rti,+ RangeTblEntry *rte);+extern PGDLLIMPORT set_rel_pathlist_hook_type set_rel_pathlist_hook;++/* Hook for plugins to get control in add_paths_to_joinrel() */+typedef void (*set_join_pathlist_hook_type) (PlannerInfo *root,+ RelOptInfo *joinrel,+ RelOptInfo *outerrel,+ RelOptInfo *innerrel,+ JoinType jointype,+ JoinPathExtraData *extra);+extern PGDLLIMPORT set_join_pathlist_hook_type set_join_pathlist_hook;++/* Hook for plugins to replace standard_join_search() */+typedef RelOptInfo *(*join_search_hook_type) (PlannerInfo *root,+ int levels_needed,+ List *initial_rels);+extern PGDLLIMPORT join_search_hook_type join_search_hook;+++extern RelOptInfo *make_one_rel(PlannerInfo *root, List *joinlist);+extern RelOptInfo *standard_join_search(PlannerInfo *root, int levels_needed,+ List *initial_rels);++#ifdef OPTIMIZER_DEBUG+extern void debug_print_rel(PlannerInfo *root, RelOptInfo *rel);+#endif++/*+ * indxpath.c+ * routines to generate index paths+ */+extern void create_index_paths(PlannerInfo *root, RelOptInfo *rel);+extern bool relation_has_unique_index_for(PlannerInfo *root, RelOptInfo *rel,+ List *restrictlist,+ List *exprlist, List *oprlist);+extern bool match_index_to_operand(Node *operand, int indexcol,+ IndexOptInfo *index);+extern void expand_indexqual_conditions(IndexOptInfo *index,+ List *indexclauses, List *indexclausecols,+ List **indexquals_p, List **indexqualcols_p);+extern void check_partial_indexes(PlannerInfo *root, RelOptInfo *rel);+extern Expr *adjust_rowcompare_for_index(RowCompareExpr *clause,+ IndexOptInfo *index,+ int indexcol,+ List **indexcolnos,+ bool *var_on_left_p);++/*+ * tidpath.h+ * routines to generate tid paths+ */+extern void create_tidscan_paths(PlannerInfo *root, RelOptInfo *rel);++/*+ * joinpath.c+ * routines to create join paths+ */+extern void add_paths_to_joinrel(PlannerInfo *root, RelOptInfo *joinrel,+ RelOptInfo *outerrel, RelOptInfo *innerrel,+ JoinType jointype, SpecialJoinInfo *sjinfo,+ List *restrictlist);++/*+ * joinrels.c+ * routines to determine which relations to join+ */+extern void join_search_one_level(PlannerInfo *root, int level);+extern RelOptInfo *make_join_rel(PlannerInfo *root,+ RelOptInfo *rel1, RelOptInfo *rel2);+extern bool have_join_order_restriction(PlannerInfo *root,+ RelOptInfo *rel1, RelOptInfo *rel2);+extern bool have_dangerous_phv(PlannerInfo *root,+ Relids outer_relids, Relids inner_params);++/*+ * equivclass.c+ * routines for managing EquivalenceClasses+ */+typedef bool (*ec_matches_callback_type) (PlannerInfo *root,+ RelOptInfo *rel,+ EquivalenceClass *ec,+ EquivalenceMember *em,+ void *arg);++extern bool process_equivalence(PlannerInfo *root, RestrictInfo *restrictinfo,+ bool below_outer_join);+extern Expr *canonicalize_ec_expression(Expr *expr,+ Oid req_type, Oid req_collation);+extern void reconsider_outer_join_clauses(PlannerInfo *root);+extern EquivalenceClass *get_eclass_for_sort_expr(PlannerInfo *root,+ Expr *expr,+ Relids nullable_relids,+ List *opfamilies,+ Oid opcintype,+ Oid collation,+ Index sortref,+ Relids rel,+ bool create_it);+extern void generate_base_implied_equalities(PlannerInfo *root);+extern List *generate_join_implied_equalities(PlannerInfo *root,+ Relids join_relids,+ Relids outer_relids,+ RelOptInfo *inner_rel);+extern List *generate_join_implied_equalities_for_ecs(PlannerInfo *root,+ List *eclasses,+ Relids join_relids,+ Relids outer_relids,+ RelOptInfo *inner_rel);+extern bool exprs_known_equal(PlannerInfo *root, Node *item1, Node *item2);+extern void add_child_rel_equivalences(PlannerInfo *root,+ AppendRelInfo *appinfo,+ RelOptInfo *parent_rel,+ RelOptInfo *child_rel);+extern void mutate_eclass_expressions(PlannerInfo *root,+ Node *(*mutator) (),+ void *context,+ bool include_child_exprs);+extern List *generate_implied_equalities_for_column(PlannerInfo *root,+ RelOptInfo *rel,+ ec_matches_callback_type callback,+ void *callback_arg,+ Relids prohibited_rels);+extern bool have_relevant_eclass_joinclause(PlannerInfo *root,+ RelOptInfo *rel1, RelOptInfo *rel2);+extern bool has_relevant_eclass_joinclause(PlannerInfo *root,+ RelOptInfo *rel1);+extern bool eclass_useful_for_merging(PlannerInfo *root,+ EquivalenceClass *eclass,+ RelOptInfo *rel);+extern bool is_redundant_derived_clause(RestrictInfo *rinfo, List *clauselist);++/*+ * pathkeys.c+ * utilities for matching and building path keys+ */+typedef enum+{+ PATHKEYS_EQUAL, /* pathkeys are identical */+ PATHKEYS_BETTER1, /* pathkey 1 is a superset of pathkey 2 */+ PATHKEYS_BETTER2, /* vice versa */+ PATHKEYS_DIFFERENT /* neither pathkey includes the other */+} PathKeysComparison;++extern PathKeysComparison compare_pathkeys(List *keys1, List *keys2);+extern bool pathkeys_contained_in(List *keys1, List *keys2);+extern Path *get_cheapest_path_for_pathkeys(List *paths, List *pathkeys,+ Relids required_outer,+ CostSelector cost_criterion);+extern Path *get_cheapest_fractional_path_for_pathkeys(List *paths,+ List *pathkeys,+ Relids required_outer,+ double fraction);+extern List *build_index_pathkeys(PlannerInfo *root, IndexOptInfo *index,+ ScanDirection scandir);+extern List *build_expression_pathkey(PlannerInfo *root, Expr *expr,+ Relids nullable_relids, Oid opno,+ Relids rel, bool create_it);+extern List *convert_subquery_pathkeys(PlannerInfo *root, RelOptInfo *rel,+ List *subquery_pathkeys);+extern List *build_join_pathkeys(PlannerInfo *root,+ RelOptInfo *joinrel,+ JoinType jointype,+ List *outer_pathkeys);+extern List *make_pathkeys_for_sortclauses(PlannerInfo *root,+ List *sortclauses,+ List *tlist);+extern void initialize_mergeclause_eclasses(PlannerInfo *root,+ RestrictInfo *restrictinfo);+extern void update_mergeclause_eclasses(PlannerInfo *root,+ RestrictInfo *restrictinfo);+extern List *find_mergeclauses_for_pathkeys(PlannerInfo *root,+ List *pathkeys,+ bool outer_keys,+ List *restrictinfos);+extern List *select_outer_pathkeys_for_merge(PlannerInfo *root,+ List *mergeclauses,+ RelOptInfo *joinrel);+extern List *make_inner_pathkeys_for_merge(PlannerInfo *root,+ List *mergeclauses,+ List *outer_pathkeys);+extern List *truncate_useless_pathkeys(PlannerInfo *root,+ RelOptInfo *rel,+ List *pathkeys);+extern bool has_useful_pathkeys(PlannerInfo *root, RelOptInfo *rel);++#endif /* PATHS_H */
+ foreign/libpg_query/src/postgres/include/optimizer/planmain.h view
@@ -0,0 +1,145 @@+/*-------------------------------------------------------------------------+ *+ * planmain.h+ * prototypes for various files in optimizer/plan+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/optimizer/planmain.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef PLANMAIN_H+#define PLANMAIN_H++#include "nodes/plannodes.h"+#include "nodes/relation.h"++/* GUC parameters */+#define DEFAULT_CURSOR_TUPLE_FRACTION 0.1+extern double cursor_tuple_fraction;++/* query_planner callback to compute query_pathkeys */+typedef void (*query_pathkeys_callback) (PlannerInfo *root, void *extra);++/*+ * prototypes for plan/planmain.c+ */+extern RelOptInfo *query_planner(PlannerInfo *root, List *tlist,+ query_pathkeys_callback qp_callback, void *qp_extra);++/*+ * prototypes for plan/planagg.c+ */+extern void preprocess_minmax_aggregates(PlannerInfo *root, List *tlist);+extern Plan *optimize_minmax_aggregates(PlannerInfo *root, List *tlist,+ const AggClauseCosts *aggcosts, Path *best_path);++/*+ * prototypes for plan/createplan.c+ */+extern Plan *create_plan(PlannerInfo *root, Path *best_path);+extern SubqueryScan *make_subqueryscan(List *qptlist, List *qpqual,+ Index scanrelid, Plan *subplan);+extern ForeignScan *make_foreignscan(List *qptlist, List *qpqual,+ Index scanrelid, List *fdw_exprs, List *fdw_private,+ List *fdw_scan_tlist, List *fdw_recheck_quals,+ Plan *outer_plan);+extern Append *make_append(List *appendplans, List *tlist);+extern RecursiveUnion *make_recursive_union(List *tlist,+ Plan *lefttree, Plan *righttree, int wtParam,+ List *distinctList, long numGroups);+extern Sort *make_sort_from_pathkeys(PlannerInfo *root, Plan *lefttree,+ List *pathkeys, double limit_tuples);+extern Sort *make_sort_from_sortclauses(PlannerInfo *root, List *sortcls,+ Plan *lefttree);+extern Sort *make_sort_from_groupcols(PlannerInfo *root, List *groupcls,+ AttrNumber *grpColIdx, Plan *lefttree);+extern Agg *make_agg(PlannerInfo *root, List *tlist, List *qual,+ AggStrategy aggstrategy, const AggClauseCosts *aggcosts,+ int numGroupCols, AttrNumber *grpColIdx, Oid *grpOperators,+ List *groupingSets,+ long numGroups,+ Plan *lefttree);+extern WindowAgg *make_windowagg(PlannerInfo *root, List *tlist,+ List *windowFuncs, Index winref,+ int partNumCols, AttrNumber *partColIdx, Oid *partOperators,+ int ordNumCols, AttrNumber *ordColIdx, Oid *ordOperators,+ int frameOptions, Node *startOffset, Node *endOffset,+ Plan *lefttree);+extern Group *make_group(PlannerInfo *root, List *tlist, List *qual,+ int numGroupCols, AttrNumber *grpColIdx, Oid *grpOperators,+ double numGroups,+ Plan *lefttree);+extern Plan *materialize_finished_plan(Plan *subplan);+extern Unique *make_unique(Plan *lefttree, List *distinctList);+extern LockRows *make_lockrows(Plan *lefttree, List *rowMarks, int epqParam);+extern Limit *make_limit(Plan *lefttree, Node *limitOffset, Node *limitCount,+ int64 offset_est, int64 count_est);+extern SetOp *make_setop(SetOpCmd cmd, SetOpStrategy strategy, Plan *lefttree,+ List *distinctList, AttrNumber flagColIdx, int firstFlag,+ long numGroups, double outputRows);+extern Result *make_result(PlannerInfo *root, List *tlist,+ Node *resconstantqual, Plan *subplan);+extern ModifyTable *make_modifytable(PlannerInfo *root,+ CmdType operation, bool canSetTag,+ Index nominalRelation,+ List *resultRelations, List *subplans,+ List *withCheckOptionLists, List *returningLists,+ List *rowMarks, OnConflictExpr *onconflict, int epqParam);+extern bool is_projection_capable_plan(Plan *plan);++/*+ * prototypes for plan/initsplan.c+ */+extern int from_collapse_limit;+extern int join_collapse_limit;++extern void add_base_rels_to_query(PlannerInfo *root, Node *jtnode);+extern void build_base_rel_tlists(PlannerInfo *root, List *final_tlist);+extern void add_vars_to_targetlist(PlannerInfo *root, List *vars,+ Relids where_needed, bool create_new_ph);+extern void find_lateral_references(PlannerInfo *root);+extern void create_lateral_join_info(PlannerInfo *root);+extern List *deconstruct_jointree(PlannerInfo *root);+extern void distribute_restrictinfo_to_rels(PlannerInfo *root,+ RestrictInfo *restrictinfo);+extern void process_implied_equality(PlannerInfo *root,+ Oid opno,+ Oid collation,+ Expr *item1,+ Expr *item2,+ Relids qualscope,+ Relids nullable_relids,+ bool below_outer_join,+ bool both_const);+extern RestrictInfo *build_implied_join_equality(Oid opno,+ Oid collation,+ Expr *item1,+ Expr *item2,+ Relids qualscope,+ Relids nullable_relids);++/*+ * prototypes for plan/analyzejoins.c+ */+extern List *remove_useless_joins(PlannerInfo *root, List *joinlist);+extern bool query_supports_distinctness(Query *query);+extern bool query_is_distinct_for(Query *query, List *colnos, List *opids);++/*+ * prototypes for plan/setrefs.c+ */+extern Plan *set_plan_references(PlannerInfo *root, Plan *plan);+extern void fix_opfuncids(Node *node);+extern void set_opfuncid(OpExpr *opexpr);+extern void set_sa_opfuncid(ScalarArrayOpExpr *opexpr);+extern void record_plan_function_dependency(PlannerInfo *root, Oid funcid);+extern void extract_query_dependencies(Node *query,+ List **relationOids,+ List **invalItems,+ bool *hasRowSecurity);++#endif /* PLANMAIN_H */
+ foreign/libpg_query/src/postgres/include/optimizer/planner.h view
@@ -0,0 +1,52 @@+/*-------------------------------------------------------------------------+ *+ * planner.h+ * prototypes for planner.c.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/optimizer/planner.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef PLANNER_H+#define PLANNER_H++#include "nodes/plannodes.h"+#include "nodes/relation.h"+++/* Hook for plugins to get control in planner() */+typedef PlannedStmt *(*planner_hook_type) (Query *parse,+ int cursorOptions,+ ParamListInfo boundParams);+extern PGDLLIMPORT planner_hook_type planner_hook;+++extern PlannedStmt *planner(Query *parse, int cursorOptions,+ ParamListInfo boundParams);+extern PlannedStmt *standard_planner(Query *parse, int cursorOptions,+ ParamListInfo boundParams);++extern Plan *subquery_planner(PlannerGlobal *glob, Query *parse,+ PlannerInfo *parent_root,+ bool hasRecursion, double tuple_fraction,+ PlannerInfo **subroot);++extern void add_tlist_costs_to_plan(PlannerInfo *root, Plan *plan,+ List *tlist);++extern bool is_dummy_plan(Plan *plan);++extern RowMarkType select_rowmark_type(RangeTblEntry *rte,+ LockClauseStrength strength);++extern Expr *expression_planner(Expr *expr);++extern Expr *preprocess_phv_expression(PlannerInfo *root, Expr *expr);++extern bool plan_cluster_use_sort(Oid tableOid, Oid indexOid);++#endif /* PLANNER_H */
+ foreign/libpg_query/src/postgres/include/optimizer/tlist.h view
@@ -0,0 +1,54 @@+/*-------------------------------------------------------------------------+ *+ * tlist.h+ * prototypes for tlist.c.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/optimizer/tlist.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef TLIST_H+#define TLIST_H++#include "optimizer/var.h"+++extern TargetEntry *tlist_member(Node *node, List *targetlist);+extern TargetEntry *tlist_member_ignore_relabel(Node *node, List *targetlist);+extern TargetEntry *tlist_member_match_var(Var *var, List *targetlist);++extern List *flatten_tlist(List *tlist, PVCAggregateBehavior aggbehavior,+ PVCPlaceHolderBehavior phbehavior);+extern List *add_to_flat_tlist(List *tlist, List *exprs);++extern List *get_tlist_exprs(List *tlist, bool includeJunk);++extern int count_nonjunk_tlist_entries(List *tlist);++extern bool tlist_same_exprs(List *tlist1, List *tlist2);++extern bool tlist_same_datatypes(List *tlist, List *colTypes, bool junkOK);+extern bool tlist_same_collations(List *tlist, List *colCollations, bool junkOK);++extern TargetEntry *get_sortgroupref_tle(Index sortref,+ List *targetList);+extern TargetEntry *get_sortgroupclause_tle(SortGroupClause *sgClause,+ List *targetList);+extern Node *get_sortgroupclause_expr(SortGroupClause *sgClause,+ List *targetList);+extern List *get_sortgrouplist_exprs(List *sgClauses,+ List *targetList);++extern SortGroupClause *get_sortgroupref_clause(Index sortref,+ List *clauses);++extern Oid *extract_grouping_ops(List *groupClause);+extern AttrNumber *extract_grouping_cols(List *groupClause, List *tlist);+extern bool grouping_is_sortable(List *groupClause);+extern bool grouping_is_hashable(List *groupClause);++#endif /* TLIST_H */
+ foreign/libpg_query/src/postgres/include/optimizer/var.h view
@@ -0,0 +1,44 @@+/*-------------------------------------------------------------------------+ *+ * var.h+ * prototypes for optimizer/util/var.c.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/optimizer/var.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef VAR_H+#define VAR_H++#include "nodes/relation.h"++typedef enum+{+ PVC_REJECT_AGGREGATES, /* throw error if Aggref found */+ PVC_INCLUDE_AGGREGATES, /* include Aggrefs in output list */+ PVC_RECURSE_AGGREGATES /* recurse into Aggref arguments */+} PVCAggregateBehavior;++typedef enum+{+ PVC_REJECT_PLACEHOLDERS, /* throw error if PlaceHolderVar found */+ PVC_INCLUDE_PLACEHOLDERS, /* include PlaceHolderVars in output list */+ PVC_RECURSE_PLACEHOLDERS /* recurse into PlaceHolderVar arguments */+} PVCPlaceHolderBehavior;++extern Relids pull_varnos(Node *node);+extern Relids pull_varnos_of_level(Node *node, int levelsup);+extern void pull_varattnos(Node *node, Index varno, Bitmapset **varattnos);+extern List *pull_vars_of_level(Node *node, int levelsup);+extern bool contain_var_clause(Node *node);+extern bool contain_vars_of_level(Node *node, int levelsup);+extern int locate_var_of_level(Node *node, int levelsup);+extern List *pull_var_clause(Node *node, PVCAggregateBehavior aggbehavior,+ PVCPlaceHolderBehavior phbehavior);+extern Node *flatten_join_alias_vars(PlannerInfo *root, Node *node);++#endif /* VAR_H */
+ foreign/libpg_query/src/postgres/include/parser/analyze.h view
@@ -0,0 +1,45 @@+/*-------------------------------------------------------------------------+ *+ * analyze.h+ * parse analysis for optimizable statements+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/parser/analyze.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef ANALYZE_H+#define ANALYZE_H++#include "parser/parse_node.h"++/* Hook for plugins to get control at end of parse analysis */+typedef void (*post_parse_analyze_hook_type) (ParseState *pstate,+ Query *query);+extern PGDLLIMPORT post_parse_analyze_hook_type post_parse_analyze_hook;+++extern Query *parse_analyze(Node *parseTree, const char *sourceText,+ Oid *paramTypes, int numParams);+extern Query *parse_analyze_varparams(Node *parseTree, const char *sourceText,+ Oid **paramTypes, int *numParams);++extern Query *parse_sub_analyze(Node *parseTree, ParseState *parentParseState,+ CommonTableExpr *parentCTE,+ bool locked_from_parent);++extern Query *transformTopLevelStmt(ParseState *pstate, Node *parseTree);+extern Query *transformStmt(ParseState *pstate, Node *parseTree);++extern bool analyze_requires_snapshot(Node *parseTree);++extern const char *LCS_asString(LockClauseStrength strength);+extern void CheckSelectLocking(Query *qry, LockClauseStrength strength);+extern void applyLockingClause(Query *qry, Index rtindex,+ LockClauseStrength strength,+ LockWaitPolicy waitPolicy, bool pushedDown);++#endif /* ANALYZE_H */
+ foreign/libpg_query/src/postgres/include/parser/gram.h view
@@ -0,0 +1,986 @@+/* A Bison parser, made by GNU Bison 2.3. */++/* Skeleton interface for Bison's Yacc-like parsers in C++ Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006+ Free Software Foundation, Inc.++ This program is free software; you can redistribute it and/or modify+ it under the terms of the GNU General Public License as published by+ the Free Software Foundation; either version 2, or (at your option)+ any later version.++ This program is distributed in the hope that it will be useful,+ but WITHOUT ANY WARRANTY; without even the implied warranty of+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the+ GNU General Public License for more details.++ You should have received a copy of the GNU General Public License+ along with this program; if not, write to the Free Software+ Foundation, Inc., 51 Franklin Street, Fifth Floor,+ Boston, MA 02110-1301, USA. */++/* As a special exception, you may create a larger work that contains+ part or all of the Bison parser skeleton and distribute that work+ under terms of your choice, so long as that work isn't itself a+ parser generator using the skeleton or a modified version thereof+ as a parser skeleton. Alternatively, if you modify or redistribute+ the parser skeleton itself, you may (at your option) remove this+ special exception, which will cause the skeleton and the resulting+ Bison output files to be licensed under the GNU General Public+ License without this special exception.++ This special exception was added by the Free Software Foundation in+ version 2.2 of Bison. */++/* Tokens. */+#ifndef YYTOKENTYPE+# define YYTOKENTYPE+ /* Put the tokens into the symbol table, so that GDB and other debuggers+ know about them. */+ enum yytokentype {+ IDENT = 258,+ FCONST = 259,+ SCONST = 260,+ BCONST = 261,+ XCONST = 262,+ Op = 263,+ ICONST = 264,+ PARAM = 265,+ TYPECAST = 266,+ DOT_DOT = 267,+ COLON_EQUALS = 268,+ EQUALS_GREATER = 269,+ LESS_EQUALS = 270,+ GREATER_EQUALS = 271,+ NOT_EQUALS = 272,+ ABORT_P = 273,+ ABSOLUTE_P = 274,+ ACCESS = 275,+ ACTION = 276,+ ADD_P = 277,+ ADMIN = 278,+ AFTER = 279,+ AGGREGATE = 280,+ ALL = 281,+ ALSO = 282,+ ALTER = 283,+ ALWAYS = 284,+ ANALYSE = 285,+ ANALYZE = 286,+ AND = 287,+ ANY = 288,+ ARRAY = 289,+ AS = 290,+ ASC = 291,+ ASSERTION = 292,+ ASSIGNMENT = 293,+ ASYMMETRIC = 294,+ AT = 295,+ ATTRIBUTE = 296,+ AUTHORIZATION = 297,+ BACKWARD = 298,+ BEFORE = 299,+ BEGIN_P = 300,+ BETWEEN = 301,+ BIGINT = 302,+ BINARY = 303,+ BIT = 304,+ BOOLEAN_P = 305,+ BOTH = 306,+ BY = 307,+ CACHE = 308,+ CALLED = 309,+ CASCADE = 310,+ CASCADED = 311,+ CASE = 312,+ CAST = 313,+ CATALOG_P = 314,+ CHAIN = 315,+ CHAR_P = 316,+ CHARACTER = 317,+ CHARACTERISTICS = 318,+ CHECK = 319,+ CHECKPOINT = 320,+ CLASS = 321,+ CLOSE = 322,+ CLUSTER = 323,+ COALESCE = 324,+ COLLATE = 325,+ COLLATION = 326,+ COLUMN = 327,+ COMMENT = 328,+ COMMENTS = 329,+ COMMIT = 330,+ COMMITTED = 331,+ CONCURRENTLY = 332,+ CONFIGURATION = 333,+ CONFLICT = 334,+ CONNECTION = 335,+ CONSTRAINT = 336,+ CONSTRAINTS = 337,+ CONTENT_P = 338,+ CONTINUE_P = 339,+ CONVERSION_P = 340,+ COPY = 341,+ COST = 342,+ CREATE = 343,+ CROSS = 344,+ CSV = 345,+ CUBE = 346,+ CURRENT_P = 347,+ CURRENT_CATALOG = 348,+ CURRENT_DATE = 349,+ CURRENT_ROLE = 350,+ CURRENT_SCHEMA = 351,+ CURRENT_TIME = 352,+ CURRENT_TIMESTAMP = 353,+ CURRENT_USER = 354,+ CURSOR = 355,+ CYCLE = 356,+ DATA_P = 357,+ DATABASE = 358,+ DAY_P = 359,+ DEALLOCATE = 360,+ DEC = 361,+ DECIMAL_P = 362,+ DECLARE = 363,+ DEFAULT = 364,+ DEFAULTS = 365,+ DEFERRABLE = 366,+ DEFERRED = 367,+ DEFINER = 368,+ DELETE_P = 369,+ DELIMITER = 370,+ DELIMITERS = 371,+ DESC = 372,+ DICTIONARY = 373,+ DISABLE_P = 374,+ DISCARD = 375,+ DISTINCT = 376,+ DO = 377,+ DOCUMENT_P = 378,+ DOMAIN_P = 379,+ DOUBLE_P = 380,+ DROP = 381,+ EACH = 382,+ ELSE = 383,+ ENABLE_P = 384,+ ENCODING = 385,+ ENCRYPTED = 386,+ END_P = 387,+ ENUM_P = 388,+ ESCAPE = 389,+ EVENT = 390,+ EXCEPT = 391,+ EXCLUDE = 392,+ EXCLUDING = 393,+ EXCLUSIVE = 394,+ EXECUTE = 395,+ EXISTS = 396,+ EXPLAIN = 397,+ EXTENSION = 398,+ EXTERNAL = 399,+ EXTRACT = 400,+ FALSE_P = 401,+ FAMILY = 402,+ FETCH = 403,+ FILTER = 404,+ FIRST_P = 405,+ FLOAT_P = 406,+ FOLLOWING = 407,+ FOR = 408,+ FORCE = 409,+ FOREIGN = 410,+ FORWARD = 411,+ FREEZE = 412,+ FROM = 413,+ FULL = 414,+ FUNCTION = 415,+ FUNCTIONS = 416,+ GLOBAL = 417,+ GRANT = 418,+ GRANTED = 419,+ GREATEST = 420,+ GROUP_P = 421,+ GROUPING = 422,+ HANDLER = 423,+ HAVING = 424,+ HEADER_P = 425,+ HOLD = 426,+ HOUR_P = 427,+ IDENTITY_P = 428,+ IF_P = 429,+ ILIKE = 430,+ IMMEDIATE = 431,+ IMMUTABLE = 432,+ IMPLICIT_P = 433,+ IMPORT_P = 434,+ IN_P = 435,+ INCLUDING = 436,+ INCREMENT = 437,+ INDEX = 438,+ INDEXES = 439,+ INHERIT = 440,+ INHERITS = 441,+ INITIALLY = 442,+ INLINE_P = 443,+ INNER_P = 444,+ INOUT = 445,+ INPUT_P = 446,+ INSENSITIVE = 447,+ INSERT = 448,+ INSTEAD = 449,+ INT_P = 450,+ INTEGER = 451,+ INTERSECT = 452,+ INTERVAL = 453,+ INTO = 454,+ INVOKER = 455,+ IS = 456,+ ISNULL = 457,+ ISOLATION = 458,+ JOIN = 459,+ KEY = 460,+ LABEL = 461,+ LANGUAGE = 462,+ LARGE_P = 463,+ LAST_P = 464,+ LATERAL_P = 465,+ LEADING = 466,+ LEAKPROOF = 467,+ LEAST = 468,+ LEFT = 469,+ LEVEL = 470,+ LIKE = 471,+ LIMIT = 472,+ LISTEN = 473,+ LOAD = 474,+ LOCAL = 475,+ LOCALTIME = 476,+ LOCALTIMESTAMP = 477,+ LOCATION = 478,+ LOCK_P = 479,+ LOCKED = 480,+ LOGGED = 481,+ MAPPING = 482,+ MATCH = 483,+ MATERIALIZED = 484,+ MAXVALUE = 485,+ MINUTE_P = 486,+ MINVALUE = 487,+ MODE = 488,+ MONTH_P = 489,+ MOVE = 490,+ NAME_P = 491,+ NAMES = 492,+ NATIONAL = 493,+ NATURAL = 494,+ NCHAR = 495,+ NEXT = 496,+ NO = 497,+ NONE = 498,+ NOT = 499,+ NOTHING = 500,+ NOTIFY = 501,+ NOTNULL = 502,+ NOWAIT = 503,+ NULL_P = 504,+ NULLIF = 505,+ NULLS_P = 506,+ NUMERIC = 507,+ OBJECT_P = 508,+ OF = 509,+ OFF = 510,+ OFFSET = 511,+ OIDS = 512,+ ON = 513,+ ONLY = 514,+ OPERATOR = 515,+ OPTION = 516,+ OPTIONS = 517,+ OR = 518,+ ORDER = 519,+ ORDINALITY = 520,+ OUT_P = 521,+ OUTER_P = 522,+ OVER = 523,+ OVERLAPS = 524,+ OVERLAY = 525,+ OWNED = 526,+ OWNER = 527,+ PARSER = 528,+ PARTIAL = 529,+ PARTITION = 530,+ PASSING = 531,+ PASSWORD = 532,+ PLACING = 533,+ PLANS = 534,+ POLICY = 535,+ POSITION = 536,+ PRECEDING = 537,+ PRECISION = 538,+ PRESERVE = 539,+ PREPARE = 540,+ PREPARED = 541,+ PRIMARY = 542,+ PRIOR = 543,+ PRIVILEGES = 544,+ PROCEDURAL = 545,+ PROCEDURE = 546,+ PROGRAM = 547,+ QUOTE = 548,+ RANGE = 549,+ READ = 550,+ REAL = 551,+ REASSIGN = 552,+ RECHECK = 553,+ RECURSIVE = 554,+ REF = 555,+ REFERENCES = 556,+ REFRESH = 557,+ REINDEX = 558,+ RELATIVE_P = 559,+ RELEASE = 560,+ RENAME = 561,+ REPEATABLE = 562,+ REPLACE = 563,+ REPLICA = 564,+ RESET = 565,+ RESTART = 566,+ RESTRICT = 567,+ RETURNING = 568,+ RETURNS = 569,+ REVOKE = 570,+ RIGHT = 571,+ ROLE = 572,+ ROLLBACK = 573,+ ROLLUP = 574,+ ROW = 575,+ ROWS = 576,+ RULE = 577,+ SAVEPOINT = 578,+ SCHEMA = 579,+ SCROLL = 580,+ SEARCH = 581,+ SECOND_P = 582,+ SECURITY = 583,+ SELECT = 584,+ SEQUENCE = 585,+ SEQUENCES = 586,+ SERIALIZABLE = 587,+ SERVER = 588,+ SESSION = 589,+ SESSION_USER = 590,+ SET = 591,+ SETS = 592,+ SETOF = 593,+ SHARE = 594,+ SHOW = 595,+ SIMILAR = 596,+ SIMPLE = 597,+ SKIP = 598,+ SMALLINT = 599,+ SNAPSHOT = 600,+ SOME = 601,+ SQL_P = 602,+ STABLE = 603,+ STANDALONE_P = 604,+ START = 605,+ STATEMENT = 606,+ STATISTICS = 607,+ STDIN = 608,+ STDOUT = 609,+ STORAGE = 610,+ STRICT_P = 611,+ STRIP_P = 612,+ SUBSTRING = 613,+ SYMMETRIC = 614,+ SYSID = 615,+ SYSTEM_P = 616,+ TABLE = 617,+ TABLES = 618,+ TABLESAMPLE = 619,+ TABLESPACE = 620,+ TEMP = 621,+ TEMPLATE = 622,+ TEMPORARY = 623,+ TEXT_P = 624,+ THEN = 625,+ TIME = 626,+ TIMESTAMP = 627,+ TO = 628,+ TRAILING = 629,+ TRANSACTION = 630,+ TRANSFORM = 631,+ TREAT = 632,+ TRIGGER = 633,+ TRIM = 634,+ TRUE_P = 635,+ TRUNCATE = 636,+ TRUSTED = 637,+ TYPE_P = 638,+ TYPES_P = 639,+ UNBOUNDED = 640,+ UNCOMMITTED = 641,+ UNENCRYPTED = 642,+ UNION = 643,+ UNIQUE = 644,+ UNKNOWN = 645,+ UNLISTEN = 646,+ UNLOGGED = 647,+ UNTIL = 648,+ UPDATE = 649,+ USER = 650,+ USING = 651,+ VACUUM = 652,+ VALID = 653,+ VALIDATE = 654,+ VALIDATOR = 655,+ VALUE_P = 656,+ VALUES = 657,+ VARCHAR = 658,+ VARIADIC = 659,+ VARYING = 660,+ VERBOSE = 661,+ VERSION_P = 662,+ VIEW = 663,+ VIEWS = 664,+ VOLATILE = 665,+ WHEN = 666,+ WHERE = 667,+ WHITESPACE_P = 668,+ WINDOW = 669,+ WITH = 670,+ WITHIN = 671,+ WITHOUT = 672,+ WORK = 673,+ WRAPPER = 674,+ WRITE = 675,+ XML_P = 676,+ XMLATTRIBUTES = 677,+ XMLCONCAT = 678,+ XMLELEMENT = 679,+ XMLEXISTS = 680,+ XMLFOREST = 681,+ XMLPARSE = 682,+ XMLPI = 683,+ XMLROOT = 684,+ XMLSERIALIZE = 685,+ YEAR_P = 686,+ YES_P = 687,+ ZONE = 688,+ NOT_LA = 689,+ NULLS_LA = 690,+ WITH_LA = 691,+ POSTFIXOP = 692,+ UMINUS = 693+ };+#endif+/* Tokens. */+#define IDENT 258+#define FCONST 259+#define SCONST 260+#define BCONST 261+#define XCONST 262+#define Op 263+#define ICONST 264+#define PARAM 265+#define TYPECAST 266+#define DOT_DOT 267+#define COLON_EQUALS 268+#define EQUALS_GREATER 269+#define LESS_EQUALS 270+#define GREATER_EQUALS 271+#define NOT_EQUALS 272+#define ABORT_P 273+#define ABSOLUTE_P 274+#define ACCESS 275+#define ACTION 276+#define ADD_P 277+#define ADMIN 278+#define AFTER 279+#define AGGREGATE 280+#define ALL 281+#define ALSO 282+#define ALTER 283+#define ALWAYS 284+#define ANALYSE 285+#define ANALYZE 286+#define AND 287+#define ANY 288+#define ARRAY 289+#define AS 290+#define ASC 291+#define ASSERTION 292+#define ASSIGNMENT 293+#define ASYMMETRIC 294+#define AT 295+#define ATTRIBUTE 296+#define AUTHORIZATION 297+#define BACKWARD 298+#define BEFORE 299+#define BEGIN_P 300+#define BETWEEN 301+#define BIGINT 302+#define BINARY 303+#define BIT 304+#define BOOLEAN_P 305+#define BOTH 306+#define BY 307+#define CACHE 308+#define CALLED 309+#define CASCADE 310+#define CASCADED 311+#define CASE 312+#define CAST 313+#define CATALOG_P 314+#define CHAIN 315+#define CHAR_P 316+#define CHARACTER 317+#define CHARACTERISTICS 318+#define CHECK 319+#define CHECKPOINT 320+#define CLASS 321+#define CLOSE 322+#define CLUSTER 323+#define COALESCE 324+#define COLLATE 325+#define COLLATION 326+#define COLUMN 327+#define COMMENT 328+#define COMMENTS 329+#define COMMIT 330+#define COMMITTED 331+#define CONCURRENTLY 332+#define CONFIGURATION 333+#define CONFLICT 334+#define CONNECTION 335+#define CONSTRAINT 336+#define CONSTRAINTS 337+#define CONTENT_P 338+#define CONTINUE_P 339+#define CONVERSION_P 340+#define COPY 341+#define COST 342+#define CREATE 343+#define CROSS 344+#define CSV 345+#define CUBE 346+#define CURRENT_P 347+#define CURRENT_CATALOG 348+#define CURRENT_DATE 349+#define CURRENT_ROLE 350+#define CURRENT_SCHEMA 351+#define CURRENT_TIME 352+#define CURRENT_TIMESTAMP 353+#define CURRENT_USER 354+#define CURSOR 355+#define CYCLE 356+#define DATA_P 357+#define DATABASE 358+#define DAY_P 359+#define DEALLOCATE 360+#define DEC 361+#define DECIMAL_P 362+#define DECLARE 363+#define DEFAULT 364+#define DEFAULTS 365+#define DEFERRABLE 366+#define DEFERRED 367+#define DEFINER 368+#define DELETE_P 369+#define DELIMITER 370+#define DELIMITERS 371+#define DESC 372+#define DICTIONARY 373+#define DISABLE_P 374+#define DISCARD 375+#define DISTINCT 376+#define DO 377+#define DOCUMENT_P 378+#define DOMAIN_P 379+#define DOUBLE_P 380+#define DROP 381+#define EACH 382+#define ELSE 383+#define ENABLE_P 384+#define ENCODING 385+#define ENCRYPTED 386+#define END_P 387+#define ENUM_P 388+#define ESCAPE 389+#define EVENT 390+#define EXCEPT 391+#define EXCLUDE 392+#define EXCLUDING 393+#define EXCLUSIVE 394+#define EXECUTE 395+#define EXISTS 396+#define EXPLAIN 397+#define EXTENSION 398+#define EXTERNAL 399+#define EXTRACT 400+#define FALSE_P 401+#define FAMILY 402+#define FETCH 403+#define FILTER 404+#define FIRST_P 405+#define FLOAT_P 406+#define FOLLOWING 407+#define FOR 408+#define FORCE 409+#define FOREIGN 410+#define FORWARD 411+#define FREEZE 412+#define FROM 413+#define FULL 414+#define FUNCTION 415+#define FUNCTIONS 416+#define GLOBAL 417+#define GRANT 418+#define GRANTED 419+#define GREATEST 420+#define GROUP_P 421+#define GROUPING 422+#define HANDLER 423+#define HAVING 424+#define HEADER_P 425+#define HOLD 426+#define HOUR_P 427+#define IDENTITY_P 428+#define IF_P 429+#define ILIKE 430+#define IMMEDIATE 431+#define IMMUTABLE 432+#define IMPLICIT_P 433+#define IMPORT_P 434+#define IN_P 435+#define INCLUDING 436+#define INCREMENT 437+#define INDEX 438+#define INDEXES 439+#define INHERIT 440+#define INHERITS 441+#define INITIALLY 442+#define INLINE_P 443+#define INNER_P 444+#define INOUT 445+#define INPUT_P 446+#define INSENSITIVE 447+#define INSERT 448+#define INSTEAD 449+#define INT_P 450+#define INTEGER 451+#define INTERSECT 452+#define INTERVAL 453+#define INTO 454+#define INVOKER 455+#define IS 456+#define ISNULL 457+#define ISOLATION 458+#define JOIN 459+#define KEY 460+#define LABEL 461+#define LANGUAGE 462+#define LARGE_P 463+#define LAST_P 464+#define LATERAL_P 465+#define LEADING 466+#define LEAKPROOF 467+#define LEAST 468+#define LEFT 469+#define LEVEL 470+#define LIKE 471+#define LIMIT 472+#define LISTEN 473+#define LOAD 474+#define LOCAL 475+#define LOCALTIME 476+#define LOCALTIMESTAMP 477+#define LOCATION 478+#define LOCK_P 479+#define LOCKED 480+#define LOGGED 481+#define MAPPING 482+#define MATCH 483+#define MATERIALIZED 484+#define MAXVALUE 485+#define MINUTE_P 486+#define MINVALUE 487+#define MODE 488+#define MONTH_P 489+#define MOVE 490+#define NAME_P 491+#define NAMES 492+#define NATIONAL 493+#define NATURAL 494+#define NCHAR 495+#define NEXT 496+#define NO 497+#define NONE 498+#define NOT 499+#define NOTHING 500+#define NOTIFY 501+#define NOTNULL 502+#define NOWAIT 503+#define NULL_P 504+#define NULLIF 505+#define NULLS_P 506+#define NUMERIC 507+#define OBJECT_P 508+#define OF 509+#define OFF 510+#define OFFSET 511+#define OIDS 512+#define ON 513+#define ONLY 514+#define OPERATOR 515+#define OPTION 516+#define OPTIONS 517+#define OR 518+#define ORDER 519+#define ORDINALITY 520+#define OUT_P 521+#define OUTER_P 522+#define OVER 523+#define OVERLAPS 524+#define OVERLAY 525+#define OWNED 526+#define OWNER 527+#define PARSER 528+#define PARTIAL 529+#define PARTITION 530+#define PASSING 531+#define PASSWORD 532+#define PLACING 533+#define PLANS 534+#define POLICY 535+#define POSITION 536+#define PRECEDING 537+#define PRECISION 538+#define PRESERVE 539+#define PREPARE 540+#define PREPARED 541+#define PRIMARY 542+#define PRIOR 543+#define PRIVILEGES 544+#define PROCEDURAL 545+#define PROCEDURE 546+#define PROGRAM 547+#define QUOTE 548+#define RANGE 549+#define READ 550+#define REAL 551+#define REASSIGN 552+#define RECHECK 553+#define RECURSIVE 554+#define REF 555+#define REFERENCES 556+#define REFRESH 557+#define REINDEX 558+#define RELATIVE_P 559+#define RELEASE 560+#define RENAME 561+#define REPEATABLE 562+#define REPLACE 563+#define REPLICA 564+#define RESET 565+#define RESTART 566+#define RESTRICT 567+#define RETURNING 568+#define RETURNS 569+#define REVOKE 570+#define RIGHT 571+#define ROLE 572+#define ROLLBACK 573+#define ROLLUP 574+#define ROW 575+#define ROWS 576+#define RULE 577+#define SAVEPOINT 578+#define SCHEMA 579+#define SCROLL 580+#define SEARCH 581+#define SECOND_P 582+#define SECURITY 583+#define SELECT 584+#define SEQUENCE 585+#define SEQUENCES 586+#define SERIALIZABLE 587+#define SERVER 588+#define SESSION 589+#define SESSION_USER 590+#define SET 591+#define SETS 592+#define SETOF 593+#define SHARE 594+#define SHOW 595+#define SIMILAR 596+#define SIMPLE 597+#define SKIP 598+#define SMALLINT 599+#define SNAPSHOT 600+#define SOME 601+#define SQL_P 602+#define STABLE 603+#define STANDALONE_P 604+#define START 605+#define STATEMENT 606+#define STATISTICS 607+#define STDIN 608+#define STDOUT 609+#define STORAGE 610+#define STRICT_P 611+#define STRIP_P 612+#define SUBSTRING 613+#define SYMMETRIC 614+#define SYSID 615+#define SYSTEM_P 616+#define TABLE 617+#define TABLES 618+#define TABLESAMPLE 619+#define TABLESPACE 620+#define TEMP 621+#define TEMPLATE 622+#define TEMPORARY 623+#define TEXT_P 624+#define THEN 625+#define TIME 626+#define TIMESTAMP 627+#define TO 628+#define TRAILING 629+#define TRANSACTION 630+#define TRANSFORM 631+#define TREAT 632+#define TRIGGER 633+#define TRIM 634+#define TRUE_P 635+#define TRUNCATE 636+#define TRUSTED 637+#define TYPE_P 638+#define TYPES_P 639+#define UNBOUNDED 640+#define UNCOMMITTED 641+#define UNENCRYPTED 642+#define UNION 643+#define UNIQUE 644+#define UNKNOWN 645+#define UNLISTEN 646+#define UNLOGGED 647+#define UNTIL 648+#define UPDATE 649+#define USER 650+#define USING 651+#define VACUUM 652+#define VALID 653+#define VALIDATE 654+#define VALIDATOR 655+#define VALUE_P 656+#define VALUES 657+#define VARCHAR 658+#define VARIADIC 659+#define VARYING 660+#define VERBOSE 661+#define VERSION_P 662+#define VIEW 663+#define VIEWS 664+#define VOLATILE 665+#define WHEN 666+#define WHERE 667+#define WHITESPACE_P 668+#define WINDOW 669+#define WITH 670+#define WITHIN 671+#define WITHOUT 672+#define WORK 673+#define WRAPPER 674+#define WRITE 675+#define XML_P 676+#define XMLATTRIBUTES 677+#define XMLCONCAT 678+#define XMLELEMENT 679+#define XMLEXISTS 680+#define XMLFOREST 681+#define XMLPARSE 682+#define XMLPI 683+#define XMLROOT 684+#define XMLSERIALIZE 685+#define YEAR_P 686+#define YES_P 687+#define ZONE 688+#define NOT_LA 689+#define NULLS_LA 690+#define WITH_LA 691+#define POSTFIXOP 692+#define UMINUS 693+++++#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED+typedef union YYSTYPE+#line 194 "gram.y"+{+ core_YYSTYPE core_yystype;+ /* these fields must match core_YYSTYPE: */+ int ival;+ char *str;+ const char *keyword;++ char chr;+ bool boolean;+ JoinType jtype;+ DropBehavior dbehavior;+ OnCommitAction oncommit;+ List *list;+ Node *node;+ Value *value;+ ObjectType objtype;+ TypeName *typnam;+ FunctionParameter *fun_param;+ FunctionParameterMode fun_param_mode;+ FuncWithArgs *funwithargs;+ DefElem *defelt;+ SortBy *sortby;+ WindowDef *windef;+ JoinExpr *jexpr;+ IndexElem *ielem;+ Alias *alias;+ RangeVar *range;+ IntoClause *into;+ WithClause *with;+ InferClause *infer;+ OnConflictClause *onconflict;+ A_Indices *aind;+ ResTarget *target;+ struct PrivTarget *privtarget;+ AccessPriv *accesspriv;+ struct ImportQual *importqual;+ InsertStmt *istmt;+ VariableSetStmt *vsetstmt;+}+/* Line 1529 of yacc.c. */+#line 965 "gram.h"+ YYSTYPE;+# define yystype YYSTYPE /* obsolescent; will be withdrawn */+# define YYSTYPE_IS_DECLARED 1+# define YYSTYPE_IS_TRIVIAL 1+#endif++++#if ! defined YYLTYPE && ! defined YYLTYPE_IS_DECLARED+typedef struct YYLTYPE+{+ int first_line;+ int first_column;+ int last_line;+ int last_column;+} YYLTYPE;+# define yyltype YYLTYPE /* obsolescent; will be withdrawn */+# define YYLTYPE_IS_DECLARED 1+# define YYLTYPE_IS_TRIVIAL 1+#endif++
+ foreign/libpg_query/src/postgres/include/parser/gramparse.h view
@@ -0,0 +1,75 @@+/*-------------------------------------------------------------------------+ *+ * gramparse.h+ * Shared definitions for the "raw" parser (flex and bison phases only)+ *+ * NOTE: this file is only meant to be included in the core parsing files,+ * ie, parser.c, gram.y, scan.l, and keywords.c. Definitions that are needed+ * outside the core parser should be in parser.h.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/parser/gramparse.h+ *+ *-------------------------------------------------------------------------+ */++#ifndef GRAMPARSE_H+#define GRAMPARSE_H++#include "nodes/parsenodes.h"+#include "parser/scanner.h"++/*+ * NB: include gram.h only AFTER including scanner.h, because scanner.h+ * is what #defines YYLTYPE.+ */+#include "parser/gram.h"++/*+ * The YY_EXTRA data that a flex scanner allows us to pass around. Private+ * state needed for raw parsing/lexing goes here.+ */+typedef struct base_yy_extra_type+{+ /*+ * Fields used by the core scanner.+ */+ core_yy_extra_type core_yy_extra;++ /*+ * State variables for base_yylex().+ */+ bool have_lookahead; /* is lookahead info valid? */+ int lookahead_token; /* one-token lookahead */+ core_YYSTYPE lookahead_yylval; /* yylval for lookahead token */+ YYLTYPE lookahead_yylloc; /* yylloc for lookahead token */+ char *lookahead_end; /* end of current token */+ char lookahead_hold_char; /* to be put back at *lookahead_end */++ /*+ * State variables that belong to the grammar.+ */+ List *parsetree; /* final parse result is delivered here */+} base_yy_extra_type;++/*+ * In principle we should use yyget_extra() to fetch the yyextra field+ * from a yyscanner struct. However, flex always puts that field first,+ * and this is sufficiently performance-critical to make it seem worth+ * cheating a bit to use an inline macro.+ */+#define pg_yyget_extra(yyscanner) (*((base_yy_extra_type **) (yyscanner)))+++/* from parser.c */+extern int base_yylex(YYSTYPE *lvalp, YYLTYPE *llocp,+ core_yyscan_t yyscanner);++/* from gram.y */+extern void parser_init(base_yy_extra_type *yyext);+extern int base_yyparse(core_yyscan_t yyscanner);++#endif /* GRAMPARSE_H */
+ foreign/libpg_query/src/postgres/include/parser/keywords.h view
@@ -0,0 +1,38 @@+/*-------------------------------------------------------------------------+ *+ * keywords.h+ * lexical token lookup for key words in PostgreSQL+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/parser/keywords.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef KEYWORDS_H+#define KEYWORDS_H++/* Keyword categories --- should match lists in gram.y */+#define UNRESERVED_KEYWORD 0+#define COL_NAME_KEYWORD 1+#define TYPE_FUNC_NAME_KEYWORD 2+#define RESERVED_KEYWORD 3+++typedef struct ScanKeyword+{+ const char *name; /* in lower case */+ int16 value; /* grammar's token code */+ int16 category; /* see codes above */+} ScanKeyword;++extern PGDLLIMPORT const ScanKeyword ScanKeywords[];+extern PGDLLIMPORT const int NumScanKeywords;++extern const ScanKeyword *ScanKeywordLookup(const char *text,+ const ScanKeyword *keywords,+ int num_keywords);++#endif /* KEYWORDS_H */
+ foreign/libpg_query/src/postgres/include/parser/kwlist.h view
@@ -0,0 +1,444 @@+/*-------------------------------------------------------------------------+ *+ * kwlist.h+ *+ * The keyword list is kept in its own source file for possible use by+ * automatic tools. The exact representation of a keyword is determined+ * by the PG_KEYWORD macro, which is not defined in this file; it can+ * be defined by the caller for special purposes.+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * IDENTIFICATION+ * src/include/parser/kwlist.h+ *+ *-------------------------------------------------------------------------+ */++/* there is deliberately not an #ifndef KWLIST_H here */++/*+ * List of keyword (name, token-value, category) entries.+ *+ * !!WARNING!!: This list must be sorted by ASCII name, because binary+ * search is used to locate entries.+ */++/* name, value, category */+PG_KEYWORD("abort", ABORT_P, UNRESERVED_KEYWORD)+PG_KEYWORD("absolute", ABSOLUTE_P, UNRESERVED_KEYWORD)+PG_KEYWORD("access", ACCESS, UNRESERVED_KEYWORD)+PG_KEYWORD("action", ACTION, UNRESERVED_KEYWORD)+PG_KEYWORD("add", ADD_P, UNRESERVED_KEYWORD)+PG_KEYWORD("admin", ADMIN, UNRESERVED_KEYWORD)+PG_KEYWORD("after", AFTER, UNRESERVED_KEYWORD)+PG_KEYWORD("aggregate", AGGREGATE, UNRESERVED_KEYWORD)+PG_KEYWORD("all", ALL, RESERVED_KEYWORD)+PG_KEYWORD("also", ALSO, UNRESERVED_KEYWORD)+PG_KEYWORD("alter", ALTER, UNRESERVED_KEYWORD)+PG_KEYWORD("always", ALWAYS, UNRESERVED_KEYWORD)+PG_KEYWORD("analyse", ANALYSE, RESERVED_KEYWORD) /* British spelling */+PG_KEYWORD("analyze", ANALYZE, RESERVED_KEYWORD)+PG_KEYWORD("and", AND, RESERVED_KEYWORD)+PG_KEYWORD("any", ANY, RESERVED_KEYWORD)+PG_KEYWORD("array", ARRAY, RESERVED_KEYWORD)+PG_KEYWORD("as", AS, RESERVED_KEYWORD)+PG_KEYWORD("asc", ASC, RESERVED_KEYWORD)+PG_KEYWORD("assertion", ASSERTION, UNRESERVED_KEYWORD)+PG_KEYWORD("assignment", ASSIGNMENT, UNRESERVED_KEYWORD)+PG_KEYWORD("asymmetric", ASYMMETRIC, RESERVED_KEYWORD)+PG_KEYWORD("at", AT, UNRESERVED_KEYWORD)+PG_KEYWORD("attribute", ATTRIBUTE, UNRESERVED_KEYWORD)+PG_KEYWORD("authorization", AUTHORIZATION, TYPE_FUNC_NAME_KEYWORD)+PG_KEYWORD("backward", BACKWARD, UNRESERVED_KEYWORD)+PG_KEYWORD("before", BEFORE, UNRESERVED_KEYWORD)+PG_KEYWORD("begin", BEGIN_P, UNRESERVED_KEYWORD)+PG_KEYWORD("between", BETWEEN, COL_NAME_KEYWORD)+PG_KEYWORD("bigint", BIGINT, COL_NAME_KEYWORD)+PG_KEYWORD("binary", BINARY, TYPE_FUNC_NAME_KEYWORD)+PG_KEYWORD("bit", BIT, COL_NAME_KEYWORD)+PG_KEYWORD("boolean", BOOLEAN_P, COL_NAME_KEYWORD)+PG_KEYWORD("both", BOTH, RESERVED_KEYWORD)+PG_KEYWORD("by", BY, UNRESERVED_KEYWORD)+PG_KEYWORD("cache", CACHE, UNRESERVED_KEYWORD)+PG_KEYWORD("called", CALLED, UNRESERVED_KEYWORD)+PG_KEYWORD("cascade", CASCADE, UNRESERVED_KEYWORD)+PG_KEYWORD("cascaded", CASCADED, UNRESERVED_KEYWORD)+PG_KEYWORD("case", CASE, RESERVED_KEYWORD)+PG_KEYWORD("cast", CAST, RESERVED_KEYWORD)+PG_KEYWORD("catalog", CATALOG_P, UNRESERVED_KEYWORD)+PG_KEYWORD("chain", CHAIN, UNRESERVED_KEYWORD)+PG_KEYWORD("char", CHAR_P, COL_NAME_KEYWORD)+PG_KEYWORD("character", CHARACTER, COL_NAME_KEYWORD)+PG_KEYWORD("characteristics", CHARACTERISTICS, UNRESERVED_KEYWORD)+PG_KEYWORD("check", CHECK, RESERVED_KEYWORD)+PG_KEYWORD("checkpoint", CHECKPOINT, UNRESERVED_KEYWORD)+PG_KEYWORD("class", CLASS, UNRESERVED_KEYWORD)+PG_KEYWORD("close", CLOSE, UNRESERVED_KEYWORD)+PG_KEYWORD("cluster", CLUSTER, UNRESERVED_KEYWORD)+PG_KEYWORD("coalesce", COALESCE, COL_NAME_KEYWORD)+PG_KEYWORD("collate", COLLATE, RESERVED_KEYWORD)+PG_KEYWORD("collation", COLLATION, TYPE_FUNC_NAME_KEYWORD)+PG_KEYWORD("column", COLUMN, RESERVED_KEYWORD)+PG_KEYWORD("comment", COMMENT, UNRESERVED_KEYWORD)+PG_KEYWORD("comments", COMMENTS, UNRESERVED_KEYWORD)+PG_KEYWORD("commit", COMMIT, UNRESERVED_KEYWORD)+PG_KEYWORD("committed", COMMITTED, UNRESERVED_KEYWORD)+PG_KEYWORD("concurrently", CONCURRENTLY, TYPE_FUNC_NAME_KEYWORD)+PG_KEYWORD("configuration", CONFIGURATION, UNRESERVED_KEYWORD)+PG_KEYWORD("conflict", CONFLICT, UNRESERVED_KEYWORD)+PG_KEYWORD("connection", CONNECTION, UNRESERVED_KEYWORD)+PG_KEYWORD("constraint", CONSTRAINT, RESERVED_KEYWORD)+PG_KEYWORD("constraints", CONSTRAINTS, UNRESERVED_KEYWORD)+PG_KEYWORD("content", CONTENT_P, UNRESERVED_KEYWORD)+PG_KEYWORD("continue", CONTINUE_P, UNRESERVED_KEYWORD)+PG_KEYWORD("conversion", CONVERSION_P, UNRESERVED_KEYWORD)+PG_KEYWORD("copy", COPY, UNRESERVED_KEYWORD)+PG_KEYWORD("cost", COST, UNRESERVED_KEYWORD)+PG_KEYWORD("create", CREATE, RESERVED_KEYWORD)+PG_KEYWORD("cross", CROSS, TYPE_FUNC_NAME_KEYWORD)+PG_KEYWORD("csv", CSV, UNRESERVED_KEYWORD)+PG_KEYWORD("cube", CUBE, UNRESERVED_KEYWORD)+PG_KEYWORD("current", CURRENT_P, UNRESERVED_KEYWORD)+PG_KEYWORD("current_catalog", CURRENT_CATALOG, RESERVED_KEYWORD)+PG_KEYWORD("current_date", CURRENT_DATE, RESERVED_KEYWORD)+PG_KEYWORD("current_role", CURRENT_ROLE, RESERVED_KEYWORD)+PG_KEYWORD("current_schema", CURRENT_SCHEMA, TYPE_FUNC_NAME_KEYWORD)+PG_KEYWORD("current_time", CURRENT_TIME, RESERVED_KEYWORD)+PG_KEYWORD("current_timestamp", CURRENT_TIMESTAMP, RESERVED_KEYWORD)+PG_KEYWORD("current_user", CURRENT_USER, RESERVED_KEYWORD)+PG_KEYWORD("cursor", CURSOR, UNRESERVED_KEYWORD)+PG_KEYWORD("cycle", CYCLE, UNRESERVED_KEYWORD)+PG_KEYWORD("data", DATA_P, UNRESERVED_KEYWORD)+PG_KEYWORD("database", DATABASE, UNRESERVED_KEYWORD)+PG_KEYWORD("day", DAY_P, UNRESERVED_KEYWORD)+PG_KEYWORD("deallocate", DEALLOCATE, UNRESERVED_KEYWORD)+PG_KEYWORD("dec", DEC, COL_NAME_KEYWORD)+PG_KEYWORD("decimal", DECIMAL_P, COL_NAME_KEYWORD)+PG_KEYWORD("declare", DECLARE, UNRESERVED_KEYWORD)+PG_KEYWORD("default", DEFAULT, RESERVED_KEYWORD)+PG_KEYWORD("defaults", DEFAULTS, UNRESERVED_KEYWORD)+PG_KEYWORD("deferrable", DEFERRABLE, RESERVED_KEYWORD)+PG_KEYWORD("deferred", DEFERRED, UNRESERVED_KEYWORD)+PG_KEYWORD("definer", DEFINER, UNRESERVED_KEYWORD)+PG_KEYWORD("delete", DELETE_P, UNRESERVED_KEYWORD)+PG_KEYWORD("delimiter", DELIMITER, UNRESERVED_KEYWORD)+PG_KEYWORD("delimiters", DELIMITERS, UNRESERVED_KEYWORD)+PG_KEYWORD("desc", DESC, RESERVED_KEYWORD)+PG_KEYWORD("dictionary", DICTIONARY, UNRESERVED_KEYWORD)+PG_KEYWORD("disable", DISABLE_P, UNRESERVED_KEYWORD)+PG_KEYWORD("discard", DISCARD, UNRESERVED_KEYWORD)+PG_KEYWORD("distinct", DISTINCT, RESERVED_KEYWORD)+PG_KEYWORD("do", DO, RESERVED_KEYWORD)+PG_KEYWORD("document", DOCUMENT_P, UNRESERVED_KEYWORD)+PG_KEYWORD("domain", DOMAIN_P, UNRESERVED_KEYWORD)+PG_KEYWORD("double", DOUBLE_P, UNRESERVED_KEYWORD)+PG_KEYWORD("drop", DROP, UNRESERVED_KEYWORD)+PG_KEYWORD("each", EACH, UNRESERVED_KEYWORD)+PG_KEYWORD("else", ELSE, RESERVED_KEYWORD)+PG_KEYWORD("enable", ENABLE_P, UNRESERVED_KEYWORD)+PG_KEYWORD("encoding", ENCODING, UNRESERVED_KEYWORD)+PG_KEYWORD("encrypted", ENCRYPTED, UNRESERVED_KEYWORD)+PG_KEYWORD("end", END_P, RESERVED_KEYWORD)+PG_KEYWORD("enum", ENUM_P, UNRESERVED_KEYWORD)+PG_KEYWORD("escape", ESCAPE, UNRESERVED_KEYWORD)+PG_KEYWORD("event", EVENT, UNRESERVED_KEYWORD)+PG_KEYWORD("except", EXCEPT, RESERVED_KEYWORD)+PG_KEYWORD("exclude", EXCLUDE, UNRESERVED_KEYWORD)+PG_KEYWORD("excluding", EXCLUDING, UNRESERVED_KEYWORD)+PG_KEYWORD("exclusive", EXCLUSIVE, UNRESERVED_KEYWORD)+PG_KEYWORD("execute", EXECUTE, UNRESERVED_KEYWORD)+PG_KEYWORD("exists", EXISTS, COL_NAME_KEYWORD)+PG_KEYWORD("explain", EXPLAIN, UNRESERVED_KEYWORD)+PG_KEYWORD("extension", EXTENSION, UNRESERVED_KEYWORD)+PG_KEYWORD("external", EXTERNAL, UNRESERVED_KEYWORD)+PG_KEYWORD("extract", EXTRACT, COL_NAME_KEYWORD)+PG_KEYWORD("false", FALSE_P, RESERVED_KEYWORD)+PG_KEYWORD("family", FAMILY, UNRESERVED_KEYWORD)+PG_KEYWORD("fetch", FETCH, RESERVED_KEYWORD)+PG_KEYWORD("filter", FILTER, UNRESERVED_KEYWORD)+PG_KEYWORD("first", FIRST_P, UNRESERVED_KEYWORD)+PG_KEYWORD("float", FLOAT_P, COL_NAME_KEYWORD)+PG_KEYWORD("following", FOLLOWING, UNRESERVED_KEYWORD)+PG_KEYWORD("for", FOR, RESERVED_KEYWORD)+PG_KEYWORD("force", FORCE, UNRESERVED_KEYWORD)+PG_KEYWORD("foreign", FOREIGN, RESERVED_KEYWORD)+PG_KEYWORD("forward", FORWARD, UNRESERVED_KEYWORD)+PG_KEYWORD("freeze", FREEZE, TYPE_FUNC_NAME_KEYWORD)+PG_KEYWORD("from", FROM, RESERVED_KEYWORD)+PG_KEYWORD("full", FULL, TYPE_FUNC_NAME_KEYWORD)+PG_KEYWORD("function", FUNCTION, UNRESERVED_KEYWORD)+PG_KEYWORD("functions", FUNCTIONS, UNRESERVED_KEYWORD)+PG_KEYWORD("global", GLOBAL, UNRESERVED_KEYWORD)+PG_KEYWORD("grant", GRANT, RESERVED_KEYWORD)+PG_KEYWORD("granted", GRANTED, UNRESERVED_KEYWORD)+PG_KEYWORD("greatest", GREATEST, COL_NAME_KEYWORD)+PG_KEYWORD("group", GROUP_P, RESERVED_KEYWORD)+PG_KEYWORD("grouping", GROUPING, COL_NAME_KEYWORD)+PG_KEYWORD("handler", HANDLER, UNRESERVED_KEYWORD)+PG_KEYWORD("having", HAVING, RESERVED_KEYWORD)+PG_KEYWORD("header", HEADER_P, UNRESERVED_KEYWORD)+PG_KEYWORD("hold", HOLD, UNRESERVED_KEYWORD)+PG_KEYWORD("hour", HOUR_P, UNRESERVED_KEYWORD)+PG_KEYWORD("identity", IDENTITY_P, UNRESERVED_KEYWORD)+PG_KEYWORD("if", IF_P, UNRESERVED_KEYWORD)+PG_KEYWORD("ilike", ILIKE, TYPE_FUNC_NAME_KEYWORD)+PG_KEYWORD("immediate", IMMEDIATE, UNRESERVED_KEYWORD)+PG_KEYWORD("immutable", IMMUTABLE, UNRESERVED_KEYWORD)+PG_KEYWORD("implicit", IMPLICIT_P, UNRESERVED_KEYWORD)+PG_KEYWORD("import", IMPORT_P, UNRESERVED_KEYWORD)+PG_KEYWORD("in", IN_P, RESERVED_KEYWORD)+PG_KEYWORD("including", INCLUDING, UNRESERVED_KEYWORD)+PG_KEYWORD("increment", INCREMENT, UNRESERVED_KEYWORD)+PG_KEYWORD("index", INDEX, UNRESERVED_KEYWORD)+PG_KEYWORD("indexes", INDEXES, UNRESERVED_KEYWORD)+PG_KEYWORD("inherit", INHERIT, UNRESERVED_KEYWORD)+PG_KEYWORD("inherits", INHERITS, UNRESERVED_KEYWORD)+PG_KEYWORD("initially", INITIALLY, RESERVED_KEYWORD)+PG_KEYWORD("inline", INLINE_P, UNRESERVED_KEYWORD)+PG_KEYWORD("inner", INNER_P, TYPE_FUNC_NAME_KEYWORD)+PG_KEYWORD("inout", INOUT, COL_NAME_KEYWORD)+PG_KEYWORD("input", INPUT_P, UNRESERVED_KEYWORD)+PG_KEYWORD("insensitive", INSENSITIVE, UNRESERVED_KEYWORD)+PG_KEYWORD("insert", INSERT, UNRESERVED_KEYWORD)+PG_KEYWORD("instead", INSTEAD, UNRESERVED_KEYWORD)+PG_KEYWORD("int", INT_P, COL_NAME_KEYWORD)+PG_KEYWORD("integer", INTEGER, COL_NAME_KEYWORD)+PG_KEYWORD("intersect", INTERSECT, RESERVED_KEYWORD)+PG_KEYWORD("interval", INTERVAL, COL_NAME_KEYWORD)+PG_KEYWORD("into", INTO, RESERVED_KEYWORD)+PG_KEYWORD("invoker", INVOKER, UNRESERVED_KEYWORD)+PG_KEYWORD("is", IS, TYPE_FUNC_NAME_KEYWORD)+PG_KEYWORD("isnull", ISNULL, TYPE_FUNC_NAME_KEYWORD)+PG_KEYWORD("isolation", ISOLATION, UNRESERVED_KEYWORD)+PG_KEYWORD("join", JOIN, TYPE_FUNC_NAME_KEYWORD)+PG_KEYWORD("key", KEY, UNRESERVED_KEYWORD)+PG_KEYWORD("label", LABEL, UNRESERVED_KEYWORD)+PG_KEYWORD("language", LANGUAGE, UNRESERVED_KEYWORD)+PG_KEYWORD("large", LARGE_P, UNRESERVED_KEYWORD)+PG_KEYWORD("last", LAST_P, UNRESERVED_KEYWORD)+PG_KEYWORD("lateral", LATERAL_P, RESERVED_KEYWORD)+PG_KEYWORD("leading", LEADING, RESERVED_KEYWORD)+PG_KEYWORD("leakproof", LEAKPROOF, UNRESERVED_KEYWORD)+PG_KEYWORD("least", LEAST, COL_NAME_KEYWORD)+PG_KEYWORD("left", LEFT, TYPE_FUNC_NAME_KEYWORD)+PG_KEYWORD("level", LEVEL, UNRESERVED_KEYWORD)+PG_KEYWORD("like", LIKE, TYPE_FUNC_NAME_KEYWORD)+PG_KEYWORD("limit", LIMIT, RESERVED_KEYWORD)+PG_KEYWORD("listen", LISTEN, UNRESERVED_KEYWORD)+PG_KEYWORD("load", LOAD, UNRESERVED_KEYWORD)+PG_KEYWORD("local", LOCAL, UNRESERVED_KEYWORD)+PG_KEYWORD("localtime", LOCALTIME, RESERVED_KEYWORD)+PG_KEYWORD("localtimestamp", LOCALTIMESTAMP, RESERVED_KEYWORD)+PG_KEYWORD("location", LOCATION, UNRESERVED_KEYWORD)+PG_KEYWORD("lock", LOCK_P, UNRESERVED_KEYWORD)+PG_KEYWORD("locked", LOCKED, UNRESERVED_KEYWORD)+PG_KEYWORD("logged", LOGGED, UNRESERVED_KEYWORD)+PG_KEYWORD("mapping", MAPPING, UNRESERVED_KEYWORD)+PG_KEYWORD("match", MATCH, UNRESERVED_KEYWORD)+PG_KEYWORD("materialized", MATERIALIZED, UNRESERVED_KEYWORD)+PG_KEYWORD("maxvalue", MAXVALUE, UNRESERVED_KEYWORD)+PG_KEYWORD("minute", MINUTE_P, UNRESERVED_KEYWORD)+PG_KEYWORD("minvalue", MINVALUE, UNRESERVED_KEYWORD)+PG_KEYWORD("mode", MODE, UNRESERVED_KEYWORD)+PG_KEYWORD("month", MONTH_P, UNRESERVED_KEYWORD)+PG_KEYWORD("move", MOVE, UNRESERVED_KEYWORD)+PG_KEYWORD("name", NAME_P, UNRESERVED_KEYWORD)+PG_KEYWORD("names", NAMES, UNRESERVED_KEYWORD)+PG_KEYWORD("national", NATIONAL, COL_NAME_KEYWORD)+PG_KEYWORD("natural", NATURAL, TYPE_FUNC_NAME_KEYWORD)+PG_KEYWORD("nchar", NCHAR, COL_NAME_KEYWORD)+PG_KEYWORD("next", NEXT, UNRESERVED_KEYWORD)+PG_KEYWORD("no", NO, UNRESERVED_KEYWORD)+PG_KEYWORD("none", NONE, COL_NAME_KEYWORD)+PG_KEYWORD("not", NOT, RESERVED_KEYWORD)+PG_KEYWORD("nothing", NOTHING, UNRESERVED_KEYWORD)+PG_KEYWORD("notify", NOTIFY, UNRESERVED_KEYWORD)+PG_KEYWORD("notnull", NOTNULL, TYPE_FUNC_NAME_KEYWORD)+PG_KEYWORD("nowait", NOWAIT, UNRESERVED_KEYWORD)+PG_KEYWORD("null", NULL_P, RESERVED_KEYWORD)+PG_KEYWORD("nullif", NULLIF, COL_NAME_KEYWORD)+PG_KEYWORD("nulls", NULLS_P, UNRESERVED_KEYWORD)+PG_KEYWORD("numeric", NUMERIC, COL_NAME_KEYWORD)+PG_KEYWORD("object", OBJECT_P, UNRESERVED_KEYWORD)+PG_KEYWORD("of", OF, UNRESERVED_KEYWORD)+PG_KEYWORD("off", OFF, UNRESERVED_KEYWORD)+PG_KEYWORD("offset", OFFSET, RESERVED_KEYWORD)+PG_KEYWORD("oids", OIDS, UNRESERVED_KEYWORD)+PG_KEYWORD("on", ON, RESERVED_KEYWORD)+PG_KEYWORD("only", ONLY, RESERVED_KEYWORD)+PG_KEYWORD("operator", OPERATOR, UNRESERVED_KEYWORD)+PG_KEYWORD("option", OPTION, UNRESERVED_KEYWORD)+PG_KEYWORD("options", OPTIONS, UNRESERVED_KEYWORD)+PG_KEYWORD("or", OR, RESERVED_KEYWORD)+PG_KEYWORD("order", ORDER, RESERVED_KEYWORD)+PG_KEYWORD("ordinality", ORDINALITY, UNRESERVED_KEYWORD)+PG_KEYWORD("out", OUT_P, COL_NAME_KEYWORD)+PG_KEYWORD("outer", OUTER_P, TYPE_FUNC_NAME_KEYWORD)+PG_KEYWORD("over", OVER, UNRESERVED_KEYWORD)+PG_KEYWORD("overlaps", OVERLAPS, TYPE_FUNC_NAME_KEYWORD)+PG_KEYWORD("overlay", OVERLAY, COL_NAME_KEYWORD)+PG_KEYWORD("owned", OWNED, UNRESERVED_KEYWORD)+PG_KEYWORD("owner", OWNER, UNRESERVED_KEYWORD)+PG_KEYWORD("parser", PARSER, UNRESERVED_KEYWORD)+PG_KEYWORD("partial", PARTIAL, UNRESERVED_KEYWORD)+PG_KEYWORD("partition", PARTITION, UNRESERVED_KEYWORD)+PG_KEYWORD("passing", PASSING, UNRESERVED_KEYWORD)+PG_KEYWORD("password", PASSWORD, UNRESERVED_KEYWORD)+PG_KEYWORD("placing", PLACING, RESERVED_KEYWORD)+PG_KEYWORD("plans", PLANS, UNRESERVED_KEYWORD)+PG_KEYWORD("policy", POLICY, UNRESERVED_KEYWORD)+PG_KEYWORD("position", POSITION, COL_NAME_KEYWORD)+PG_KEYWORD("preceding", PRECEDING, UNRESERVED_KEYWORD)+PG_KEYWORD("precision", PRECISION, COL_NAME_KEYWORD)+PG_KEYWORD("prepare", PREPARE, UNRESERVED_KEYWORD)+PG_KEYWORD("prepared", PREPARED, UNRESERVED_KEYWORD)+PG_KEYWORD("preserve", PRESERVE, UNRESERVED_KEYWORD)+PG_KEYWORD("primary", PRIMARY, RESERVED_KEYWORD)+PG_KEYWORD("prior", PRIOR, UNRESERVED_KEYWORD)+PG_KEYWORD("privileges", PRIVILEGES, UNRESERVED_KEYWORD)+PG_KEYWORD("procedural", PROCEDURAL, UNRESERVED_KEYWORD)+PG_KEYWORD("procedure", PROCEDURE, UNRESERVED_KEYWORD)+PG_KEYWORD("program", PROGRAM, UNRESERVED_KEYWORD)+PG_KEYWORD("quote", QUOTE, UNRESERVED_KEYWORD)+PG_KEYWORD("range", RANGE, UNRESERVED_KEYWORD)+PG_KEYWORD("read", READ, UNRESERVED_KEYWORD)+PG_KEYWORD("real", REAL, COL_NAME_KEYWORD)+PG_KEYWORD("reassign", REASSIGN, UNRESERVED_KEYWORD)+PG_KEYWORD("recheck", RECHECK, UNRESERVED_KEYWORD)+PG_KEYWORD("recursive", RECURSIVE, UNRESERVED_KEYWORD)+PG_KEYWORD("ref", REF, UNRESERVED_KEYWORD)+PG_KEYWORD("references", REFERENCES, RESERVED_KEYWORD)+PG_KEYWORD("refresh", REFRESH, UNRESERVED_KEYWORD)+PG_KEYWORD("reindex", REINDEX, UNRESERVED_KEYWORD)+PG_KEYWORD("relative", RELATIVE_P, UNRESERVED_KEYWORD)+PG_KEYWORD("release", RELEASE, UNRESERVED_KEYWORD)+PG_KEYWORD("rename", RENAME, UNRESERVED_KEYWORD)+PG_KEYWORD("repeatable", REPEATABLE, UNRESERVED_KEYWORD)+PG_KEYWORD("replace", REPLACE, UNRESERVED_KEYWORD)+PG_KEYWORD("replica", REPLICA, UNRESERVED_KEYWORD)+PG_KEYWORD("reset", RESET, UNRESERVED_KEYWORD)+PG_KEYWORD("restart", RESTART, UNRESERVED_KEYWORD)+PG_KEYWORD("restrict", RESTRICT, UNRESERVED_KEYWORD)+PG_KEYWORD("returning", RETURNING, RESERVED_KEYWORD)+PG_KEYWORD("returns", RETURNS, UNRESERVED_KEYWORD)+PG_KEYWORD("revoke", REVOKE, UNRESERVED_KEYWORD)+PG_KEYWORD("right", RIGHT, TYPE_FUNC_NAME_KEYWORD)+PG_KEYWORD("role", ROLE, UNRESERVED_KEYWORD)+PG_KEYWORD("rollback", ROLLBACK, UNRESERVED_KEYWORD)+PG_KEYWORD("rollup", ROLLUP, UNRESERVED_KEYWORD)+PG_KEYWORD("row", ROW, COL_NAME_KEYWORD)+PG_KEYWORD("rows", ROWS, UNRESERVED_KEYWORD)+PG_KEYWORD("rule", RULE, UNRESERVED_KEYWORD)+PG_KEYWORD("savepoint", SAVEPOINT, UNRESERVED_KEYWORD)+PG_KEYWORD("schema", SCHEMA, UNRESERVED_KEYWORD)+PG_KEYWORD("scroll", SCROLL, UNRESERVED_KEYWORD)+PG_KEYWORD("search", SEARCH, UNRESERVED_KEYWORD)+PG_KEYWORD("second", SECOND_P, UNRESERVED_KEYWORD)+PG_KEYWORD("security", SECURITY, UNRESERVED_KEYWORD)+PG_KEYWORD("select", SELECT, RESERVED_KEYWORD)+PG_KEYWORD("sequence", SEQUENCE, UNRESERVED_KEYWORD)+PG_KEYWORD("sequences", SEQUENCES, UNRESERVED_KEYWORD)+PG_KEYWORD("serializable", SERIALIZABLE, UNRESERVED_KEYWORD)+PG_KEYWORD("server", SERVER, UNRESERVED_KEYWORD)+PG_KEYWORD("session", SESSION, UNRESERVED_KEYWORD)+PG_KEYWORD("session_user", SESSION_USER, RESERVED_KEYWORD)+PG_KEYWORD("set", SET, UNRESERVED_KEYWORD)+PG_KEYWORD("setof", SETOF, COL_NAME_KEYWORD)+PG_KEYWORD("sets", SETS, UNRESERVED_KEYWORD)+PG_KEYWORD("share", SHARE, UNRESERVED_KEYWORD)+PG_KEYWORD("show", SHOW, UNRESERVED_KEYWORD)+PG_KEYWORD("similar", SIMILAR, TYPE_FUNC_NAME_KEYWORD)+PG_KEYWORD("simple", SIMPLE, UNRESERVED_KEYWORD)+PG_KEYWORD("skip", SKIP, UNRESERVED_KEYWORD)+PG_KEYWORD("smallint", SMALLINT, COL_NAME_KEYWORD)+PG_KEYWORD("snapshot", SNAPSHOT, UNRESERVED_KEYWORD)+PG_KEYWORD("some", SOME, RESERVED_KEYWORD)+PG_KEYWORD("sql", SQL_P, UNRESERVED_KEYWORD)+PG_KEYWORD("stable", STABLE, UNRESERVED_KEYWORD)+PG_KEYWORD("standalone", STANDALONE_P, UNRESERVED_KEYWORD)+PG_KEYWORD("start", START, UNRESERVED_KEYWORD)+PG_KEYWORD("statement", STATEMENT, UNRESERVED_KEYWORD)+PG_KEYWORD("statistics", STATISTICS, UNRESERVED_KEYWORD)+PG_KEYWORD("stdin", STDIN, UNRESERVED_KEYWORD)+PG_KEYWORD("stdout", STDOUT, UNRESERVED_KEYWORD)+PG_KEYWORD("storage", STORAGE, UNRESERVED_KEYWORD)+PG_KEYWORD("strict", STRICT_P, UNRESERVED_KEYWORD)+PG_KEYWORD("strip", STRIP_P, UNRESERVED_KEYWORD)+PG_KEYWORD("substring", SUBSTRING, COL_NAME_KEYWORD)+PG_KEYWORD("symmetric", SYMMETRIC, RESERVED_KEYWORD)+PG_KEYWORD("sysid", SYSID, UNRESERVED_KEYWORD)+PG_KEYWORD("system", SYSTEM_P, UNRESERVED_KEYWORD)+PG_KEYWORD("table", TABLE, RESERVED_KEYWORD)+PG_KEYWORD("tables", TABLES, UNRESERVED_KEYWORD)+PG_KEYWORD("tablesample", TABLESAMPLE, TYPE_FUNC_NAME_KEYWORD)+PG_KEYWORD("tablespace", TABLESPACE, UNRESERVED_KEYWORD)+PG_KEYWORD("temp", TEMP, UNRESERVED_KEYWORD)+PG_KEYWORD("template", TEMPLATE, UNRESERVED_KEYWORD)+PG_KEYWORD("temporary", TEMPORARY, UNRESERVED_KEYWORD)+PG_KEYWORD("text", TEXT_P, UNRESERVED_KEYWORD)+PG_KEYWORD("then", THEN, RESERVED_KEYWORD)+PG_KEYWORD("time", TIME, COL_NAME_KEYWORD)+PG_KEYWORD("timestamp", TIMESTAMP, COL_NAME_KEYWORD)+PG_KEYWORD("to", TO, RESERVED_KEYWORD)+PG_KEYWORD("trailing", TRAILING, RESERVED_KEYWORD)+PG_KEYWORD("transaction", TRANSACTION, UNRESERVED_KEYWORD)+PG_KEYWORD("transform", TRANSFORM, UNRESERVED_KEYWORD)+PG_KEYWORD("treat", TREAT, COL_NAME_KEYWORD)+PG_KEYWORD("trigger", TRIGGER, UNRESERVED_KEYWORD)+PG_KEYWORD("trim", TRIM, COL_NAME_KEYWORD)+PG_KEYWORD("true", TRUE_P, RESERVED_KEYWORD)+PG_KEYWORD("truncate", TRUNCATE, UNRESERVED_KEYWORD)+PG_KEYWORD("trusted", TRUSTED, UNRESERVED_KEYWORD)+PG_KEYWORD("type", TYPE_P, UNRESERVED_KEYWORD)+PG_KEYWORD("types", TYPES_P, UNRESERVED_KEYWORD)+PG_KEYWORD("unbounded", UNBOUNDED, UNRESERVED_KEYWORD)+PG_KEYWORD("uncommitted", UNCOMMITTED, UNRESERVED_KEYWORD)+PG_KEYWORD("unencrypted", UNENCRYPTED, UNRESERVED_KEYWORD)+PG_KEYWORD("union", UNION, RESERVED_KEYWORD)+PG_KEYWORD("unique", UNIQUE, RESERVED_KEYWORD)+PG_KEYWORD("unknown", UNKNOWN, UNRESERVED_KEYWORD)+PG_KEYWORD("unlisten", UNLISTEN, UNRESERVED_KEYWORD)+PG_KEYWORD("unlogged", UNLOGGED, UNRESERVED_KEYWORD)+PG_KEYWORD("until", UNTIL, UNRESERVED_KEYWORD)+PG_KEYWORD("update", UPDATE, UNRESERVED_KEYWORD)+PG_KEYWORD("user", USER, RESERVED_KEYWORD)+PG_KEYWORD("using", USING, RESERVED_KEYWORD)+PG_KEYWORD("vacuum", VACUUM, UNRESERVED_KEYWORD)+PG_KEYWORD("valid", VALID, UNRESERVED_KEYWORD)+PG_KEYWORD("validate", VALIDATE, UNRESERVED_KEYWORD)+PG_KEYWORD("validator", VALIDATOR, UNRESERVED_KEYWORD)+PG_KEYWORD("value", VALUE_P, UNRESERVED_KEYWORD)+PG_KEYWORD("values", VALUES, COL_NAME_KEYWORD)+PG_KEYWORD("varchar", VARCHAR, COL_NAME_KEYWORD)+PG_KEYWORD("variadic", VARIADIC, RESERVED_KEYWORD)+PG_KEYWORD("varying", VARYING, UNRESERVED_KEYWORD)+PG_KEYWORD("verbose", VERBOSE, TYPE_FUNC_NAME_KEYWORD)+PG_KEYWORD("version", VERSION_P, UNRESERVED_KEYWORD)+PG_KEYWORD("view", VIEW, UNRESERVED_KEYWORD)+PG_KEYWORD("views", VIEWS, UNRESERVED_KEYWORD)+PG_KEYWORD("volatile", VOLATILE, UNRESERVED_KEYWORD)+PG_KEYWORD("when", WHEN, RESERVED_KEYWORD)+PG_KEYWORD("where", WHERE, RESERVED_KEYWORD)+PG_KEYWORD("whitespace", WHITESPACE_P, UNRESERVED_KEYWORD)+PG_KEYWORD("window", WINDOW, RESERVED_KEYWORD)+PG_KEYWORD("with", WITH, RESERVED_KEYWORD)+PG_KEYWORD("within", WITHIN, UNRESERVED_KEYWORD)+PG_KEYWORD("without", WITHOUT, UNRESERVED_KEYWORD)+PG_KEYWORD("work", WORK, UNRESERVED_KEYWORD)+PG_KEYWORD("wrapper", WRAPPER, UNRESERVED_KEYWORD)+PG_KEYWORD("write", WRITE, UNRESERVED_KEYWORD)+PG_KEYWORD("xml", XML_P, UNRESERVED_KEYWORD)+PG_KEYWORD("xmlattributes", XMLATTRIBUTES, COL_NAME_KEYWORD)+PG_KEYWORD("xmlconcat", XMLCONCAT, COL_NAME_KEYWORD)+PG_KEYWORD("xmlelement", XMLELEMENT, COL_NAME_KEYWORD)+PG_KEYWORD("xmlexists", XMLEXISTS, COL_NAME_KEYWORD)+PG_KEYWORD("xmlforest", XMLFOREST, COL_NAME_KEYWORD)+PG_KEYWORD("xmlparse", XMLPARSE, COL_NAME_KEYWORD)+PG_KEYWORD("xmlpi", XMLPI, COL_NAME_KEYWORD)+PG_KEYWORD("xmlroot", XMLROOT, COL_NAME_KEYWORD)+PG_KEYWORD("xmlserialize", XMLSERIALIZE, COL_NAME_KEYWORD)+PG_KEYWORD("year", YEAR_P, UNRESERVED_KEYWORD)+PG_KEYWORD("yes", YES_P, UNRESERVED_KEYWORD)+PG_KEYWORD("zone", ZONE, UNRESERVED_KEYWORD)
+ foreign/libpg_query/src/postgres/include/parser/parse_agg.h view
@@ -0,0 +1,53 @@+/*-------------------------------------------------------------------------+ *+ * parse_agg.h+ * handle aggregates and window functions in parser+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/parser/parse_agg.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef PARSE_AGG_H+#define PARSE_AGG_H++#include "parser/parse_node.h"++extern void transformAggregateCall(ParseState *pstate, Aggref *agg,+ List *args, List *aggorder,+ bool agg_distinct);++extern Node *transformGroupingFunc(ParseState *pstate, GroupingFunc *g);++extern void transformWindowFuncCall(ParseState *pstate, WindowFunc *wfunc,+ WindowDef *windef);++extern void parseCheckAggregates(ParseState *pstate, Query *qry);++extern List *expand_grouping_sets(List *groupingSets, int limit);++extern int get_aggregate_argtypes(Aggref *aggref, Oid *inputTypes);++extern Oid resolve_aggregate_transtype(Oid aggfuncid,+ Oid aggtranstype,+ Oid *inputTypes,+ int numArguments);++extern void build_aggregate_fnexprs(Oid *agg_input_types,+ int agg_num_inputs,+ int agg_num_direct_inputs,+ int num_finalfn_inputs,+ bool agg_variadic,+ Oid agg_state_type,+ Oid agg_result_type,+ Oid agg_input_collation,+ Oid transfn_oid,+ Oid invtransfn_oid,+ Oid finalfn_oid,+ Expr **transfnexpr,+ Expr **invtransfnexpr,+ Expr **finalfnexpr);++#endif /* PARSE_AGG_H */
+ foreign/libpg_query/src/postgres/include/parser/parse_clause.h view
@@ -0,0 +1,56 @@+/*-------------------------------------------------------------------------+ *+ * parse_clause.h+ * handle clauses in parser+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/parser/parse_clause.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef PARSE_CLAUSE_H+#define PARSE_CLAUSE_H++#include "parser/parse_node.h"++extern void transformFromClause(ParseState *pstate, List *frmList);+extern int setTargetTable(ParseState *pstate, RangeVar *relation,+ bool inh, bool alsoSource, AclMode requiredPerms);+extern bool interpretInhOption(InhOption inhOpt);+extern bool interpretOidsOption(List *defList, bool allowOids);++extern Node *transformWhereClause(ParseState *pstate, Node *clause,+ ParseExprKind exprKind, const char *constructName);+extern Node *transformLimitClause(ParseState *pstate, Node *clause,+ ParseExprKind exprKind, const char *constructName);+extern List *transformGroupClause(ParseState *pstate, List *grouplist,+ List **groupingSets,+ List **targetlist, List *sortClause,+ ParseExprKind exprKind, bool useSQL99);+extern List *transformSortClause(ParseState *pstate, List *orderlist,+ List **targetlist, ParseExprKind exprKind,+ bool resolveUnknown, bool useSQL99);++extern List *transformWindowDefinitions(ParseState *pstate,+ List *windowdefs,+ List **targetlist);++extern List *transformDistinctClause(ParseState *pstate,+ List **targetlist, List *sortClause, bool is_agg);+extern List *transformDistinctOnClause(ParseState *pstate, List *distinctlist,+ List **targetlist, List *sortClause);+extern void transformOnConflictArbiter(ParseState *pstate,+ OnConflictClause *onConflictClause,+ List **arbiterExpr, Node **arbiterWhere,+ Oid *constraint);++extern List *addTargetToSortList(ParseState *pstate, TargetEntry *tle,+ List *sortlist, List *targetlist, SortBy *sortby,+ bool resolveUnknown);+extern Index assignSortGroupRef(TargetEntry *tle, List *tlist);+extern bool targetIsInSortList(TargetEntry *tle, Oid sortop, List *sortList);++#endif /* PARSE_CLAUSE_H */
+ foreign/libpg_query/src/postgres/include/parser/parse_coerce.h view
@@ -0,0 +1,90 @@+/*-------------------------------------------------------------------------+ *+ * parse_coerce.h+ * Routines for type coercion.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/parser/parse_coerce.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef PARSE_COERCE_H+#define PARSE_COERCE_H++#include "parser/parse_node.h"+++/* Type categories (see TYPCATEGORY_xxx symbols in catalog/pg_type.h) */+typedef char TYPCATEGORY;++/* Result codes for find_coercion_pathway */+typedef enum CoercionPathType+{+ COERCION_PATH_NONE, /* failed to find any coercion pathway */+ COERCION_PATH_FUNC, /* apply the specified coercion function */+ COERCION_PATH_RELABELTYPE, /* binary-compatible cast, no function */+ COERCION_PATH_ARRAYCOERCE, /* need an ArrayCoerceExpr node */+ COERCION_PATH_COERCEVIAIO /* need a CoerceViaIO node */+} CoercionPathType;+++extern bool IsBinaryCoercible(Oid srctype, Oid targettype);+extern bool IsPreferredType(TYPCATEGORY category, Oid type);+extern TYPCATEGORY TypeCategory(Oid type);++extern Node *coerce_to_target_type(ParseState *pstate,+ Node *expr, Oid exprtype,+ Oid targettype, int32 targettypmod,+ CoercionContext ccontext,+ CoercionForm cformat,+ int location);+extern bool can_coerce_type(int nargs, Oid *input_typeids, Oid *target_typeids,+ CoercionContext ccontext);+extern Node *coerce_type(ParseState *pstate, Node *node,+ Oid inputTypeId, Oid targetTypeId, int32 targetTypeMod,+ CoercionContext ccontext, CoercionForm cformat, int location);+extern Node *coerce_to_domain(Node *arg, Oid baseTypeId, int32 baseTypeMod,+ Oid typeId,+ CoercionForm cformat, int location,+ bool hideInputCoercion,+ bool lengthCoercionDone);++extern Node *coerce_to_boolean(ParseState *pstate, Node *node,+ const char *constructName);+extern Node *coerce_to_specific_type(ParseState *pstate, Node *node,+ Oid targetTypeId,+ const char *constructName);++extern int parser_coercion_errposition(ParseState *pstate,+ int coerce_location,+ Node *input_expr);++extern Oid select_common_type(ParseState *pstate, List *exprs,+ const char *context, Node **which_expr);+extern Node *coerce_to_common_type(ParseState *pstate, Node *node,+ Oid targetTypeId,+ const char *context);++extern bool check_generic_type_consistency(Oid *actual_arg_types,+ Oid *declared_arg_types,+ int nargs);+extern Oid enforce_generic_type_consistency(Oid *actual_arg_types,+ Oid *declared_arg_types,+ int nargs,+ Oid rettype,+ bool allow_poly);+extern Oid resolve_generic_type(Oid declared_type,+ Oid context_actual_type,+ Oid context_declared_type);++extern CoercionPathType find_coercion_pathway(Oid targetTypeId,+ Oid sourceTypeId,+ CoercionContext ccontext,+ Oid *funcid);+extern CoercionPathType find_typmod_coercion_function(Oid typeId,+ Oid *funcid);++#endif /* PARSE_COERCE_H */
+ foreign/libpg_query/src/postgres/include/parser/parse_collate.h view
@@ -0,0 +1,27 @@+/*-------------------------------------------------------------------------+ *+ * parse_collate.h+ * Routines for assigning collation information.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/parser/parse_collate.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef PARSE_COLLATE_H+#define PARSE_COLLATE_H++#include "parser/parse_node.h"++extern void assign_query_collations(ParseState *pstate, Query *query);++extern void assign_list_collations(ParseState *pstate, List *exprs);++extern void assign_expr_collations(ParseState *pstate, Node *expr);++extern Oid select_common_collation(ParseState *pstate, List *exprs, bool none_ok);++#endif /* PARSE_COLLATE_H */
+ foreign/libpg_query/src/postgres/include/parser/parse_expr.h view
@@ -0,0 +1,26 @@+/*-------------------------------------------------------------------------+ *+ * parse_expr.h+ * handle expressions in parser+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/parser/parse_expr.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef PARSE_EXPR_H+#define PARSE_EXPR_H++#include "parser/parse_node.h"++/* GUC parameters */+extern __thread bool operator_precedence_warning;+extern bool Transform_null_equals;++extern Node *transformExpr(ParseState *pstate, Node *expr, ParseExprKind exprKind);++extern const char *ParseExprKindName(ParseExprKind exprKind);++#endif /* PARSE_EXPR_H */
+ foreign/libpg_query/src/postgres/include/parser/parse_func.h view
@@ -0,0 +1,70 @@+/*-------------------------------------------------------------------------+ *+ * parse_func.h+ *+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/parser/parse_func.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef PARSER_FUNC_H+#define PARSER_FUNC_H++#include "catalog/namespace.h"+#include "parser/parse_node.h"+++/* Result codes for func_get_detail */+typedef enum+{+ FUNCDETAIL_NOTFOUND, /* no matching function */+ FUNCDETAIL_MULTIPLE, /* too many matching functions */+ FUNCDETAIL_NORMAL, /* found a matching regular function */+ FUNCDETAIL_AGGREGATE, /* found a matching aggregate function */+ FUNCDETAIL_WINDOWFUNC, /* found a matching window function */+ FUNCDETAIL_COERCION /* it's a type coercion request */+} FuncDetailCode;+++extern Node *ParseFuncOrColumn(ParseState *pstate, List *funcname, List *fargs,+ FuncCall *fn, int location);++extern FuncDetailCode func_get_detail(List *funcname,+ List *fargs, List *fargnames,+ int nargs, Oid *argtypes,+ bool expand_variadic, bool expand_defaults,+ Oid *funcid, Oid *rettype,+ bool *retset, int *nvargs, Oid *vatype,+ Oid **true_typeids, List **argdefaults);++extern int func_match_argtypes(int nargs,+ Oid *input_typeids,+ FuncCandidateList raw_candidates,+ FuncCandidateList *candidates);++extern FuncCandidateList func_select_candidate(int nargs,+ Oid *input_typeids,+ FuncCandidateList candidates);++extern void make_fn_arguments(ParseState *pstate,+ List *fargs,+ Oid *actual_arg_types,+ Oid *declared_arg_types);++extern const char *funcname_signature_string(const char *funcname, int nargs,+ List *argnames, const Oid *argtypes);+extern const char *func_signature_string(List *funcname, int nargs,+ List *argnames, const Oid *argtypes);++extern Oid LookupFuncName(List *funcname, int nargs, const Oid *argtypes,+ bool noError);+extern Oid LookupFuncNameTypeNames(List *funcname, List *argtypes,+ bool noError);+extern Oid LookupAggNameTypeNames(List *aggname, List *argtypes,+ bool noError);++#endif /* PARSE_FUNC_H */
+ foreign/libpg_query/src/postgres/include/parser/parse_node.h view
@@ -0,0 +1,236 @@+/*-------------------------------------------------------------------------+ *+ * parse_node.h+ * Internal definitions for parser+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/parser/parse_node.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef PARSE_NODE_H+#define PARSE_NODE_H++#include "nodes/parsenodes.h"+#include "utils/relcache.h"+++/*+ * Expression kinds distinguished by transformExpr(). Many of these are not+ * semantically distinct so far as expression transformation goes; rather,+ * we distinguish them so that context-specific error messages can be printed.+ *+ * Note: EXPR_KIND_OTHER is not used in the core code, but is left for use+ * by extension code that might need to call transformExpr(). The core code+ * will not enforce any context-driven restrictions on EXPR_KIND_OTHER+ * expressions, so the caller would have to check for sub-selects, aggregates,+ * and window functions if those need to be disallowed.+ */+typedef enum ParseExprKind+{+ EXPR_KIND_NONE = 0, /* "not in an expression" */+ EXPR_KIND_OTHER, /* reserved for extensions */+ EXPR_KIND_JOIN_ON, /* JOIN ON */+ EXPR_KIND_JOIN_USING, /* JOIN USING */+ EXPR_KIND_FROM_SUBSELECT, /* sub-SELECT in FROM clause */+ EXPR_KIND_FROM_FUNCTION, /* function in FROM clause */+ EXPR_KIND_WHERE, /* WHERE */+ EXPR_KIND_HAVING, /* HAVING */+ EXPR_KIND_FILTER, /* FILTER */+ EXPR_KIND_WINDOW_PARTITION, /* window definition PARTITION BY */+ EXPR_KIND_WINDOW_ORDER, /* window definition ORDER BY */+ EXPR_KIND_WINDOW_FRAME_RANGE, /* window frame clause with RANGE */+ EXPR_KIND_WINDOW_FRAME_ROWS, /* window frame clause with ROWS */+ EXPR_KIND_SELECT_TARGET, /* SELECT target list item */+ EXPR_KIND_INSERT_TARGET, /* INSERT target list item */+ EXPR_KIND_UPDATE_SOURCE, /* UPDATE assignment source item */+ EXPR_KIND_UPDATE_TARGET, /* UPDATE assignment target item */+ EXPR_KIND_GROUP_BY, /* GROUP BY */+ EXPR_KIND_ORDER_BY, /* ORDER BY */+ EXPR_KIND_DISTINCT_ON, /* DISTINCT ON */+ EXPR_KIND_LIMIT, /* LIMIT */+ EXPR_KIND_OFFSET, /* OFFSET */+ EXPR_KIND_RETURNING, /* RETURNING */+ EXPR_KIND_VALUES, /* VALUES */+ EXPR_KIND_CHECK_CONSTRAINT, /* CHECK constraint for a table */+ EXPR_KIND_DOMAIN_CHECK, /* CHECK constraint for a domain */+ EXPR_KIND_COLUMN_DEFAULT, /* default value for a table column */+ EXPR_KIND_FUNCTION_DEFAULT, /* default parameter value for function */+ EXPR_KIND_INDEX_EXPRESSION, /* index expression */+ EXPR_KIND_INDEX_PREDICATE, /* index predicate */+ EXPR_KIND_ALTER_COL_TRANSFORM, /* transform expr in ALTER COLUMN TYPE */+ EXPR_KIND_EXECUTE_PARAMETER, /* parameter value in EXECUTE */+ EXPR_KIND_TRIGGER_WHEN, /* WHEN condition in CREATE TRIGGER */+ EXPR_KIND_POLICY /* USING or WITH CHECK expr in policy */+} ParseExprKind;+++/*+ * Function signatures for parser hooks+ */+typedef struct ParseState ParseState;++typedef Node *(*PreParseColumnRefHook) (ParseState *pstate, ColumnRef *cref);+typedef Node *(*PostParseColumnRefHook) (ParseState *pstate, ColumnRef *cref, Node *var);+typedef Node *(*ParseParamRefHook) (ParseState *pstate, ParamRef *pref);+typedef Node *(*CoerceParamHook) (ParseState *pstate, Param *param,+ Oid targetTypeId, int32 targetTypeMod,+ int location);+++/*+ * State information used during parse analysis+ *+ * parentParseState: NULL in a top-level ParseState. When parsing a subquery,+ * links to current parse state of outer query.+ *+ * p_sourcetext: source string that generated the raw parsetree being+ * analyzed, or NULL if not available. (The string is used only to+ * generate cursor positions in error messages: we need it to convert+ * byte-wise locations in parse structures to character-wise cursor+ * positions.)+ *+ * p_rtable: list of RTEs that will become the rangetable of the query.+ * Note that neither relname nor refname of these entries are necessarily+ * unique; searching the rtable by name is a bad idea.+ *+ * p_joinexprs: list of JoinExpr nodes associated with p_rtable entries.+ * This is one-for-one with p_rtable, but contains NULLs for non-join+ * RTEs, and may be shorter than p_rtable if the last RTE(s) aren't joins.+ *+ * p_joinlist: list of join items (RangeTblRef and JoinExpr nodes) that+ * will become the fromlist of the query's top-level FromExpr node.+ *+ * p_namespace: list of ParseNamespaceItems that represents the current+ * namespace for table and column lookup. (The RTEs listed here may be just+ * a subset of the whole rtable. See ParseNamespaceItem comments below.)+ *+ * p_lateral_active: TRUE if we are currently parsing a LATERAL subexpression+ * of this parse level. This makes p_lateral_only namespace items visible,+ * whereas they are not visible when p_lateral_active is FALSE.+ *+ * p_ctenamespace: list of CommonTableExprs (WITH items) that are visible+ * at the moment. This is entirely different from p_namespace because a CTE+ * is not an RTE, rather "visibility" means you could make an RTE from it.+ *+ * p_future_ctes: list of CommonTableExprs (WITH items) that are not yet+ * visible due to scope rules. This is used to help improve error messages.+ *+ * p_parent_cte: CommonTableExpr that immediately contains the current query,+ * if any.+ *+ * p_windowdefs: list of WindowDefs representing WINDOW and OVER clauses.+ * We collect these while transforming expressions and then transform them+ * afterwards (so that any resjunk tlist items needed for the sort/group+ * clauses end up at the end of the query tlist). A WindowDef's location in+ * this list, counting from 1, is the winref number to use to reference it.+ */+struct ParseState+{+ struct ParseState *parentParseState; /* stack link */+ const char *p_sourcetext; /* source text, or NULL if not available */+ List *p_rtable; /* range table so far */+ List *p_joinexprs; /* JoinExprs for RTE_JOIN p_rtable entries */+ List *p_joinlist; /* join items so far (will become FromExpr+ * node's fromlist) */+ List *p_namespace; /* currently-referenceable RTEs (List of+ * ParseNamespaceItem) */+ bool p_lateral_active; /* p_lateral_only items visible? */+ List *p_ctenamespace; /* current namespace for common table exprs */+ List *p_future_ctes; /* common table exprs not yet in namespace */+ CommonTableExpr *p_parent_cte; /* this query's containing CTE */+ List *p_windowdefs; /* raw representations of window clauses */+ ParseExprKind p_expr_kind; /* what kind of expression we're parsing */+ int p_next_resno; /* next targetlist resno to assign */+ List *p_multiassign_exprs; /* junk tlist entries for multiassign */+ List *p_locking_clause; /* raw FOR UPDATE/FOR SHARE info */+ Node *p_value_substitute; /* what to replace VALUE with, if any */+ bool p_hasAggs;+ bool p_hasWindowFuncs;+ bool p_hasSubLinks;+ bool p_hasModifyingCTE;+ bool p_is_insert;+ bool p_locked_from_parent;+ Relation p_target_relation;+ RangeTblEntry *p_target_rangetblentry;++ /*+ * Optional hook functions for parser callbacks. These are null unless+ * set up by the caller of make_parsestate.+ */+ PreParseColumnRefHook p_pre_columnref_hook;+ PostParseColumnRefHook p_post_columnref_hook;+ ParseParamRefHook p_paramref_hook;+ CoerceParamHook p_coerce_param_hook;+ void *p_ref_hook_state; /* common passthrough link for above */+};++/*+ * An element of a namespace list.+ *+ * Namespace items with p_rel_visible set define which RTEs are accessible by+ * qualified names, while those with p_cols_visible set define which RTEs are+ * accessible by unqualified names. These sets are different because a JOIN+ * without an alias does not hide the contained tables (so they must be+ * visible for qualified references) but it does hide their columns+ * (unqualified references to the columns refer to the JOIN, not the member+ * tables, so we must not complain that such a reference is ambiguous).+ * Various special RTEs such as NEW/OLD for rules may also appear with only+ * one flag set.+ *+ * While processing the FROM clause, namespace items may appear with+ * p_lateral_only set, meaning they are visible only to LATERAL+ * subexpressions. (The pstate's p_lateral_active flag tells whether we are+ * inside such a subexpression at the moment.) If p_lateral_ok is not set,+ * it's an error to actually use such a namespace item. One might think it+ * would be better to just exclude such items from visibility, but the wording+ * of SQL:2008 requires us to do it this way. We also use p_lateral_ok to+ * forbid LATERAL references to an UPDATE/DELETE target table.+ *+ * At no time should a namespace list contain two entries that conflict+ * according to the rules in checkNameSpaceConflicts; but note that those+ * are more complicated than "must have different alias names", so in practice+ * code searching a namespace list has to check for ambiguous references.+ */+typedef struct ParseNamespaceItem+{+ RangeTblEntry *p_rte; /* The relation's rangetable entry */+ bool p_rel_visible; /* Relation name is visible? */+ bool p_cols_visible; /* Column names visible as unqualified refs? */+ bool p_lateral_only; /* Is only visible to LATERAL expressions? */+ bool p_lateral_ok; /* If so, does join type allow use? */+} ParseNamespaceItem;++/* Support for parser_errposition_callback function */+typedef struct ParseCallbackState+{+ ParseState *pstate;+ int location;+ ErrorContextCallback errcallback;+} ParseCallbackState;+++extern ParseState *make_parsestate(ParseState *parentParseState);+extern void free_parsestate(ParseState *pstate);+extern int parser_errposition(ParseState *pstate, int location);++extern void setup_parser_errposition_callback(ParseCallbackState *pcbstate,+ ParseState *pstate, int location);+extern void cancel_parser_errposition_callback(ParseCallbackState *pcbstate);++extern Var *make_var(ParseState *pstate, RangeTblEntry *rte, int attrno,+ int location);+extern Oid transformArrayType(Oid *arrayType, int32 *arrayTypmod);+extern ArrayRef *transformArraySubscripts(ParseState *pstate,+ Node *arrayBase,+ Oid arrayType,+ Oid elementType,+ int32 arrayTypMod,+ List *indirection,+ Node *assignFrom);+extern Const *make_const(ParseState *pstate, Value *value, int location);++#endif /* PARSE_NODE_H */
+ foreign/libpg_query/src/postgres/include/parser/parse_oper.h view
@@ -0,0 +1,68 @@+/*-------------------------------------------------------------------------+ *+ * parse_oper.h+ * handle operator things for parser+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/parser/parse_oper.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef PARSE_OPER_H+#define PARSE_OPER_H++#include "access/htup.h"+#include "parser/parse_node.h"+++typedef HeapTuple Operator;++/* Routines to look up an operator given name and exact input type(s) */+extern Oid LookupOperName(ParseState *pstate, List *opername,+ Oid oprleft, Oid oprright,+ bool noError, int location);+extern Oid LookupOperNameTypeNames(ParseState *pstate, List *opername,+ TypeName *oprleft, TypeName *oprright,+ bool noError, int location);++/* Routines to find operators matching a name and given input types */+/* NB: the selected operator may require coercion of the input types! */+extern Operator oper(ParseState *pstate, List *op, Oid arg1, Oid arg2,+ bool noError, int location);+extern Operator right_oper(ParseState *pstate, List *op, Oid arg,+ bool noError, int location);+extern Operator left_oper(ParseState *pstate, List *op, Oid arg,+ bool noError, int location);++/* Routines to find operators that DO NOT require coercion --- ie, their */+/* input types are either exactly as given, or binary-compatible */+extern Operator compatible_oper(ParseState *pstate, List *op,+ Oid arg1, Oid arg2,+ bool noError, int location);++/* currently no need for compatible_left_oper/compatible_right_oper */++/* Routines for identifying "<", "=", ">" operators for a type */+extern void get_sort_group_operators(Oid argtype,+ bool needLT, bool needEQ, bool needGT,+ Oid *ltOpr, Oid *eqOpr, Oid *gtOpr,+ bool *isHashable);++/* Convenience routines for common calls on the above */+extern Oid compatible_oper_opid(List *op, Oid arg1, Oid arg2, bool noError);++/* Extract operator OID or underlying-function OID from an Operator tuple */+extern Oid oprid(Operator op);+extern Oid oprfuncid(Operator op);++/* Build expression tree for an operator invocation */+extern Expr *make_op(ParseState *pstate, List *opname,+ Node *ltree, Node *rtree, int location);+extern Expr *make_scalar_array_op(ParseState *pstate, List *opname,+ bool useOr,+ Node *ltree, Node *rtree, int location);++#endif /* PARSE_OPER_H */
+ foreign/libpg_query/src/postgres/include/parser/parse_relation.h view
@@ -0,0 +1,121 @@+/*-------------------------------------------------------------------------+ *+ * parse_relation.h+ * prototypes for parse_relation.c.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/parser/parse_relation.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef PARSE_RELATION_H+#define PARSE_RELATION_H++#include "parser/parse_node.h"+++/*+ * Support for fuzzily matching column.+ *+ * This is for building diagnostic messages, where non-exact matching+ * attributes are suggested to the user. The struct's fields may be facets of+ * a particular RTE, or of an entire range table, depending on context.+ */+typedef struct+{+ int distance; /* Weighted distance (lowest so far) */+ RangeTblEntry *rfirst; /* RTE of first */+ AttrNumber first; /* Closest attribute so far */+ RangeTblEntry *rsecond; /* RTE of second */+ AttrNumber second; /* Second closest attribute so far */+} FuzzyAttrMatchState;+++extern RangeTblEntry *refnameRangeTblEntry(ParseState *pstate,+ const char *schemaname,+ const char *refname,+ int location,+ int *sublevels_up);+extern CommonTableExpr *scanNameSpaceForCTE(ParseState *pstate,+ const char *refname,+ Index *ctelevelsup);+extern void checkNameSpaceConflicts(ParseState *pstate, List *namespace1,+ List *namespace2);+extern int RTERangeTablePosn(ParseState *pstate,+ RangeTblEntry *rte,+ int *sublevels_up);+extern RangeTblEntry *GetRTEByRangeTablePosn(ParseState *pstate,+ int varno,+ int sublevels_up);+extern CommonTableExpr *GetCTEForRTE(ParseState *pstate, RangeTblEntry *rte,+ int rtelevelsup);+extern Node *scanRTEForColumn(ParseState *pstate, RangeTblEntry *rte,+ char *colname, int location,+ int fuzzy_rte_penalty, FuzzyAttrMatchState *fuzzystate);+extern Node *colNameToVar(ParseState *pstate, char *colname, bool localonly,+ int location);+extern void markVarForSelectPriv(ParseState *pstate, Var *var,+ RangeTblEntry *rte);+extern Relation parserOpenTable(ParseState *pstate, const RangeVar *relation,+ int lockmode);+extern RangeTblEntry *addRangeTableEntry(ParseState *pstate,+ RangeVar *relation,+ Alias *alias,+ bool inh,+ bool inFromCl);+extern RangeTblEntry *addRangeTableEntryForRelation(ParseState *pstate,+ Relation rel,+ Alias *alias,+ bool inh,+ bool inFromCl);+extern RangeTblEntry *addRangeTableEntryForSubquery(ParseState *pstate,+ Query *subquery,+ Alias *alias,+ bool lateral,+ bool inFromCl);+extern RangeTblEntry *addRangeTableEntryForFunction(ParseState *pstate,+ List *funcnames,+ List *funcexprs,+ List *coldeflists,+ RangeFunction *rangefunc,+ bool lateral,+ bool inFromCl);+extern RangeTblEntry *addRangeTableEntryForValues(ParseState *pstate,+ List *exprs,+ List *collations,+ Alias *alias,+ bool lateral,+ bool inFromCl);+extern RangeTblEntry *addRangeTableEntryForJoin(ParseState *pstate,+ List *colnames,+ JoinType jointype,+ List *aliasvars,+ Alias *alias,+ bool inFromCl);+extern RangeTblEntry *addRangeTableEntryForCTE(ParseState *pstate,+ CommonTableExpr *cte,+ Index levelsup,+ RangeVar *rv,+ bool inFromCl);+extern bool isLockedRefname(ParseState *pstate, const char *refname);+extern void addRTEtoQuery(ParseState *pstate, RangeTblEntry *rte,+ bool addToJoinList,+ bool addToRelNameSpace, bool addToVarNameSpace);+extern void errorMissingRTE(ParseState *pstate, RangeVar *relation) pg_attribute_noreturn();+extern void errorMissingColumn(ParseState *pstate,+ char *relname, char *colname, int location) pg_attribute_noreturn();+extern void expandRTE(RangeTblEntry *rte, int rtindex, int sublevels_up,+ int location, bool include_dropped,+ List **colnames, List **colvars);+extern List *expandRelAttrs(ParseState *pstate, RangeTblEntry *rte,+ int rtindex, int sublevels_up, int location);+extern int attnameAttNum(Relation rd, const char *attname, bool sysColOK);+extern Name attnumAttName(Relation rd, int attid);+extern Oid attnumTypeId(Relation rd, int attid);+extern Oid attnumCollationId(Relation rd, int attid);+extern bool isQueryUsingTempRelation(Query *query);++#endif /* PARSE_RELATION_H */
+ foreign/libpg_query/src/postgres/include/parser/parse_target.h view
@@ -0,0 +1,45 @@+/*-------------------------------------------------------------------------+ *+ * parse_target.h+ * handle target lists+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/parser/parse_target.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef PARSE_TARGET_H+#define PARSE_TARGET_H++#include "parser/parse_node.h"+++extern List *transformTargetList(ParseState *pstate, List *targetlist,+ ParseExprKind exprKind);+extern List *transformExpressionList(ParseState *pstate, List *exprlist,+ ParseExprKind exprKind);+extern void markTargetListOrigins(ParseState *pstate, List *targetlist);+extern TargetEntry *transformTargetEntry(ParseState *pstate,+ Node *node, Node *expr, ParseExprKind exprKind,+ char *colname, bool resjunk);+extern Expr *transformAssignedExpr(ParseState *pstate, Expr *expr,+ ParseExprKind exprKind,+ char *colname,+ int attrno,+ List *indirection,+ int location);+extern void updateTargetListEntry(ParseState *pstate, TargetEntry *tle,+ char *colname, int attrno,+ List *indirection,+ int location);+extern List *checkInsertTargets(ParseState *pstate, List *cols,+ List **attrnos);+extern TupleDesc expandRecordVariable(ParseState *pstate, Var *var,+ int levelsup);+extern char *FigureColname(Node *node);+extern char *FigureIndexColname(Node *node);++#endif /* PARSE_TARGET_H */
+ foreign/libpg_query/src/postgres/include/parser/parse_type.h view
@@ -0,0 +1,55 @@+/*-------------------------------------------------------------------------+ *+ * parse_type.h+ * handle type operations for parser+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/parser/parse_type.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef PARSE_TYPE_H+#define PARSE_TYPE_H++#include "access/htup.h"+#include "parser/parse_node.h"+++typedef HeapTuple Type;++extern Type LookupTypeName(ParseState *pstate, const TypeName *typeName,+ int32 *typmod_p, bool missing_ok);+extern Oid LookupTypeNameOid(ParseState *pstate, const TypeName *typeName,+ bool missing_ok);+extern Type typenameType(ParseState *pstate, const TypeName *typeName,+ int32 *typmod_p);+extern Oid typenameTypeId(ParseState *pstate, const TypeName *typeName);+extern void typenameTypeIdAndMod(ParseState *pstate, const TypeName *typeName,+ Oid *typeid_p, int32 *typmod_p);++extern char *TypeNameToString(const TypeName *typeName);+extern char *TypeNameListToString(List *typenames);++extern Oid LookupCollation(ParseState *pstate, List *collnames, int location);+extern Oid GetColumnDefCollation(ParseState *pstate, ColumnDef *coldef, Oid typeOid);++extern Type typeidType(Oid id);++extern Oid typeTypeId(Type tp);+extern int16 typeLen(Type t);+extern bool typeByVal(Type t);+extern char *typeTypeName(Type t);+extern Oid typeTypeRelid(Type typ);+extern Oid typeTypeCollation(Type typ);+extern Datum stringTypeDatum(Type tp, char *string, int32 atttypmod);++extern Oid typeidTypeRelid(Oid type_id);++extern TypeName *typeStringToTypeName(const char *str);+extern void parseTypeString(const char *str, Oid *typeid_p, int32 *typmod_p, bool missing_ok);++#define ISCOMPLEX(typeid) (typeidTypeRelid(typeid) != InvalidOid)++#endif /* PARSE_TYPE_H */
+ foreign/libpg_query/src/postgres/include/parser/parser.h view
@@ -0,0 +1,41 @@+/*-------------------------------------------------------------------------+ *+ * parser.h+ * Definitions for the "raw" parser (flex and bison phases only)+ *+ * This is the external API for the raw lexing/parsing functions.+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/parser/parser.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef PARSER_H+#define PARSER_H++#include "nodes/parsenodes.h"+++typedef enum+{+ BACKSLASH_QUOTE_OFF,+ BACKSLASH_QUOTE_ON,+ BACKSLASH_QUOTE_SAFE_ENCODING+} BackslashQuoteType;++/* GUC variables in scan.l (every one of these is a bad idea :-() */+extern __thread int backslash_quote;+extern __thread bool escape_string_warning;+extern PGDLLIMPORT __thread bool standard_conforming_strings;+++/* Primary entry point for the raw parsing functions */+extern List *raw_parser(const char *str);++/* Utility functions exported by gram.y (perhaps these should be elsewhere) */+extern List *SystemFuncName(char *name);+extern TypeName *SystemTypeName(char *name);++#endif /* PARSER_H */
+ foreign/libpg_query/src/postgres/include/parser/parsetree.h view
@@ -0,0 +1,79 @@+/*-------------------------------------------------------------------------+ *+ * parsetree.h+ * Routines to access various components and subcomponents of+ * parse trees.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/parser/parsetree.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef PARSETREE_H+#define PARSETREE_H++#include "nodes/parsenodes.h"+++/* ----------------+ * range table operations+ * ----------------+ */++/*+ * rt_fetch+ *+ * NB: this will crash and burn if handed an out-of-range RT index+ */+#define rt_fetch(rangetable_index, rangetable) \+ ((RangeTblEntry *) list_nth(rangetable, (rangetable_index)-1))++/*+ * getrelid+ *+ * Given the range index of a relation, return the corresponding+ * relation OID. Note that InvalidOid will be returned if the+ * RTE is for a non-relation-type RTE.+ */+#define getrelid(rangeindex,rangetable) \+ (rt_fetch(rangeindex, rangetable)->relid)++/*+ * Given an RTE and an attribute number, return the appropriate+ * variable name or alias for that attribute of that RTE.+ */+extern char *get_rte_attribute_name(RangeTblEntry *rte, AttrNumber attnum);++/*+ * Given an RTE and an attribute number, return the appropriate+ * type and typemod info for that attribute of that RTE.+ */+extern void get_rte_attribute_type(RangeTblEntry *rte, AttrNumber attnum,+ Oid *vartype, int32 *vartypmod, Oid *varcollid);++/*+ * Check whether an attribute of an RTE has been dropped (note that+ * get_rte_attribute_type will fail on such an attr)+ */+extern bool get_rte_attribute_is_dropped(RangeTblEntry *rte,+ AttrNumber attnum);+++/* ----------------+ * target list operations+ * ----------------+ */++extern TargetEntry *get_tle_by_resno(List *tlist, AttrNumber resno);++/* ----------------+ * FOR UPDATE/SHARE info+ * ----------------+ */++extern RowMarkClause *get_parse_rowmark(Query *qry, Index rtindex);++#endif /* PARSETREE_H */
+ foreign/libpg_query/src/postgres/include/parser/scanner.h view
@@ -0,0 +1,130 @@+/*-------------------------------------------------------------------------+ *+ * scanner.h+ * API for the core scanner (flex machine)+ *+ * The core scanner is also used by PL/pgsql, so we provide a public API+ * for it. However, the rest of the backend is only expected to use the+ * higher-level API provided by parser.h.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/parser/scanner.h+ *+ *-------------------------------------------------------------------------+ */++#ifndef SCANNER_H+#define SCANNER_H++#include "parser/keywords.h"++/*+ * The scanner returns extra data about scanned tokens in this union type.+ * Note that this is a subset of the fields used in YYSTYPE of the bison+ * parsers built atop the scanner.+ */+typedef union core_YYSTYPE+{+ int ival; /* for integer literals */+ char *str; /* for identifiers and non-integer literals */+ const char *keyword; /* canonical spelling of keywords */+} core_YYSTYPE;++/*+ * We track token locations in terms of byte offsets from the start of the+ * source string, not the column number/line number representation that+ * bison uses by default. Also, to minimize overhead we track only one+ * location (usually the first token location) for each construct, not+ * the beginning and ending locations as bison does by default. It's+ * therefore sufficient to make YYLTYPE an int.+ */+#define YYLTYPE int++/*+ * Another important component of the scanner's API is the token code numbers.+ * However, those are not defined in this file, because bison insists on+ * defining them for itself. The token codes used by the core scanner are+ * the ASCII characters plus these:+ * %token <str> IDENT FCONST SCONST BCONST XCONST Op+ * %token <ival> ICONST PARAM+ * %token TYPECAST DOT_DOT COLON_EQUALS EQUALS_GREATER+ * %token LESS_EQUALS GREATER_EQUALS NOT_EQUALS+ * The above token definitions *must* be the first ones declared in any+ * bison parser built atop this scanner, so that they will have consistent+ * numbers assigned to them (specifically, IDENT = 258 and so on).+ */++/*+ * The YY_EXTRA data that a flex scanner allows us to pass around.+ * Private state needed by the core scanner goes here. Note that the actual+ * yy_extra struct may be larger and have this as its first component, thus+ * allowing the calling parser to keep some fields of its own in YY_EXTRA.+ */+typedef struct core_yy_extra_type+{+ /*+ * The string the scanner is physically scanning. We keep this mainly so+ * that we can cheaply compute the offset of the current token (yytext).+ */+ char *scanbuf;+ Size scanbuflen;++ /*+ * The keyword list to use.+ */+ const ScanKeyword *keywords;+ int num_keywords;++ /*+ * Scanner settings to use. These are initialized from the corresponding+ * GUC variables by scanner_init(). Callers can modify them after+ * scanner_init() if they don't want the scanner's behavior to follow the+ * prevailing GUC settings.+ */+ int backslash_quote;+ bool escape_string_warning;+ bool standard_conforming_strings;++ /*+ * literalbuf is used to accumulate literal values when multiple rules are+ * needed to parse a single literal. Call startlit() to reset buffer to+ * empty, addlit() to add text. NOTE: the string in literalbuf is NOT+ * necessarily null-terminated, but there always IS room to add a trailing+ * null at offset literallen. We store a null only when we need it.+ */+ char *literalbuf; /* palloc'd expandable buffer */+ int literallen; /* actual current string length */+ int literalalloc; /* current allocated buffer size */++ int xcdepth; /* depth of nesting in slash-star comments */+ char *dolqstart; /* current $foo$ quote start string */++ /* first part of UTF16 surrogate pair for Unicode escapes */+ int32 utf16_first_part;++ /* state variables for literal-lexing warnings */+ bool warn_on_first_escape;+ bool saw_non_ascii;+} core_yy_extra_type;++/*+ * The type of yyscanner is opaque outside scan.l.+ */+typedef void *core_yyscan_t;+++/* Entry points in parser/scan.l */+extern core_yyscan_t scanner_init(const char *str,+ core_yy_extra_type *yyext,+ const ScanKeyword *keywords,+ int num_keywords);+extern void scanner_finish(core_yyscan_t yyscanner);+extern int core_yylex(core_YYSTYPE *lvalp, YYLTYPE *llocp,+ core_yyscan_t yyscanner);+extern int scanner_errposition(int location, core_yyscan_t yyscanner);+extern void scanner_yyerror(const char *message, core_yyscan_t yyscanner) pg_attribute_noreturn();++#endif /* SCANNER_H */
+ foreign/libpg_query/src/postgres/include/parser/scansup.h view
@@ -0,0 +1,27 @@+/*-------------------------------------------------------------------------+ *+ * scansup.h+ * scanner support routines. used by both the bootstrap lexer+ * as well as the normal lexer+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/parser/scansup.h+ *+ *-------------------------------------------------------------------------+ */++#ifndef SCANSUP_H+#define SCANSUP_H++extern char *scanstr(const char *s);++extern char *downcase_truncate_identifier(const char *ident, int len,+ bool warn);++extern void truncate_identifier(char *ident, int len, bool warn);++extern bool scanner_isspace(char ch);++#endif /* SCANSUP_H */
+ foreign/libpg_query/src/postgres/include/pg_config.h view
@@ -0,0 +1,911 @@+/* src/include/pg_config.h. Generated from pg_config.h.in by configure. */+/* src/include/pg_config.h.in. Generated from configure.in by autoheader. */++/* Define to the type of arg 1 of 'accept' */+#define ACCEPT_TYPE_ARG1 int++/* Define to the type of arg 2 of 'accept' */+#define ACCEPT_TYPE_ARG2 struct sockaddr *++/* Define to the type of arg 3 of 'accept' */+#define ACCEPT_TYPE_ARG3 socklen_t++/* Define to the return type of 'accept' */+#define ACCEPT_TYPE_RETURN int++/* Define if building universal (internal helper macro) */+/* #undef AC_APPLE_UNIVERSAL_BUILD */++/* The normal alignment of `double', in bytes. */+#define ALIGNOF_DOUBLE 8++/* The normal alignment of `int', in bytes. */+#define ALIGNOF_INT 4++/* The normal alignment of `long', in bytes. */+#define ALIGNOF_LONG 8++/* The normal alignment of `long long int', in bytes. */+/* #undef ALIGNOF_LONG_LONG_INT */++/* The normal alignment of `short', in bytes. */+#define ALIGNOF_SHORT 2++/* Size of a disk block --- this also limits the size of a tuple. You can set+ it bigger if you need bigger tuples (although TOAST should reduce the need+ to have large tuples, since fields can be spread across multiple tuples).+ BLCKSZ must be a power of 2. The maximum possible value of BLCKSZ is+ currently 2^15 (32768). This is determined by the 15-bit widths of the+ lp_off and lp_len fields in ItemIdData (see include/storage/itemid.h).+ Changing BLCKSZ requires an initdb. */+#define BLCKSZ 8192++/* Define to the default TCP port number on which the server listens and to+ which clients will try to connect. This can be overridden at run-time, but+ it's convenient if your clients have the right default compiled in.+ (--with-pgport=PORTNUM) */+#define DEF_PGPORT 5432++/* Define to the default TCP port number as a string constant. */+#define DEF_PGPORT_STR "5432"++/* Define to build with GSSAPI support. (--with-gssapi) */+/* #undef ENABLE_GSS */++/* Define to 1 if you want National Language Support. (--enable-nls) */+/* #undef ENABLE_NLS */++/* Define to 1 to build client libraries as thread-safe code.+ (--enable-thread-safety) */+#define ENABLE_THREAD_SAFETY 1++/* Define to nothing if C supports flexible array members, and to 1 if it does+ not. That way, with a declaration like `struct s { int n; double+ d[FLEXIBLE_ARRAY_MEMBER]; };', the struct hack can be used with pre-C99+ compilers. When computing the size of such an object, don't use 'sizeof+ (struct s)' as it overestimates the size. Use 'offsetof (struct s, d)'+ instead. Don't use 'offsetof (struct s, d[0])', as this doesn't work with+ MSVC and with C++ compilers. */+#define FLEXIBLE_ARRAY_MEMBER /**/++/* float4 values are passed by value if 'true', by reference if 'false' */+#define FLOAT4PASSBYVAL true++/* float8, int8, and related values are passed by value if 'true', by+ reference if 'false' */+#define FLOAT8PASSBYVAL true++/* Define to 1 if gettimeofday() takes only 1 argument. */+/* #undef GETTIMEOFDAY_1ARG */++#ifdef GETTIMEOFDAY_1ARG+# define gettimeofday(a,b) gettimeofday(a)+#endif++/* Define to 1 if you have the `append_history' function. */+/* #undef HAVE_APPEND_HISTORY */++/* Define to 1 if you want to use atomics if available. */+#define HAVE_ATOMICS 1++/* Define to 1 if you have the <atomic.h> header file. */+/* #undef HAVE_ATOMIC_H */++/* Define to 1 if you have the `cbrt' function. */+#define HAVE_CBRT 1++/* Define to 1 if you have the `class' function. */+/* #undef HAVE_CLASS */++/* Define to 1 if you have the <crtdefs.h> header file. */+/* #undef HAVE_CRTDEFS_H */++/* Define to 1 if you have the `crypt' function. */+#define HAVE_CRYPT 1++/* Define to 1 if you have the <crypt.h> header file. */+/* #undef HAVE_CRYPT_H */++/* Define to 1 if you have the declaration of `fdatasync', and to 0 if you+ don't. */+#define HAVE_DECL_FDATASYNC 0++/* Define to 1 if you have the declaration of `F_FULLFSYNC', and to 0 if you+ don't. */+#define HAVE_DECL_F_FULLFSYNC 1++/* Define to 1 if you have the declaration of `posix_fadvise', and to 0 if you+ don't. */+#define HAVE_DECL_POSIX_FADVISE 0++/* Define to 1 if you have the declaration of `snprintf', and to 0 if you+ don't. */+#define HAVE_DECL_SNPRINTF 1++/* Define to 1 if you have the declaration of `strlcat', and to 0 if you+ don't. */+#define HAVE_DECL_STRLCAT 1++/* Define to 1 if you have the declaration of `strlcpy', and to 0 if you+ don't. */+#define HAVE_DECL_STRLCPY 1++/* Define to 1 if you have the declaration of `sys_siglist', and to 0 if you+ don't. */+#define HAVE_DECL_SYS_SIGLIST 1++/* Define to 1 if you have the declaration of `vsnprintf', and to 0 if you+ don't. */+#define HAVE_DECL_VSNPRINTF 1++/* Define to 1 if you have the <dld.h> header file. */+/* #undef HAVE_DLD_H */++/* Define to 1 if you have the `dlopen' function. */+#define HAVE_DLOPEN 1++/* Define to 1 if you have the <editline/history.h> header file. */+/* #undef HAVE_EDITLINE_HISTORY_H */++/* Define to 1 if you have the <editline/readline.h> header file. */+/* #undef HAVE_EDITLINE_READLINE_H */++/* Define to 1 if you have the `fdatasync' function. */+#define HAVE_FDATASYNC 1++/* Define to 1 if you have the `fls' function. */+#define HAVE_FLS 1++/* Define to 1 if you have the `fpclass' function. */+/* #undef HAVE_FPCLASS */++/* Define to 1 if you have the `fp_class' function. */+/* #undef HAVE_FP_CLASS */++/* Define to 1 if you have the `fp_class_d' function. */+/* #undef HAVE_FP_CLASS_D */++/* Define to 1 if you have the <fp_class.h> header file. */+/* #undef HAVE_FP_CLASS_H */++/* Define to 1 if fseeko (and presumably ftello) exists and is declared. */+#define HAVE_FSEEKO 1++/* Define to 1 if your compiler understands __func__. */+#define HAVE_FUNCNAME__FUNC 1++/* Define to 1 if your compiler understands __FUNCTION__. */+/* #undef HAVE_FUNCNAME__FUNCTION */++/* Define to 1 if you have __atomic_compare_exchange_n(int *, int *, int). */+#define HAVE_GCC__ATOMIC_INT32_CAS 1++/* Define to 1 if you have __atomic_compare_exchange_n(int64 *, int *, int64).+ */+#define HAVE_GCC__ATOMIC_INT64_CAS 1++/* Define to 1 if you have __sync_lock_test_and_set(char *) and friends. */+#define HAVE_GCC__SYNC_CHAR_TAS 1++/* Define to 1 if you have __sync_compare_and_swap(int *, int, int). */+#define HAVE_GCC__SYNC_INT32_CAS 1++/* Define to 1 if you have __sync_lock_test_and_set(int *) and friends. */+#define HAVE_GCC__SYNC_INT32_TAS 1++/* Define to 1 if you have __sync_compare_and_swap(int64 *, int64, int64). */+#define HAVE_GCC__SYNC_INT64_CAS 1++/* Define to 1 if you have the `getaddrinfo' function. */+#define HAVE_GETADDRINFO 1++/* Define to 1 if you have the `gethostbyname_r' function. */+/* #undef HAVE_GETHOSTBYNAME_R */++/* Define to 1 if you have the `getifaddrs' function. */+#define HAVE_GETIFADDRS 1++/* Define to 1 if you have the `getopt' function. */+#define HAVE_GETOPT 1++/* Define to 1 if you have the <getopt.h> header file. */+#define HAVE_GETOPT_H 1++/* Define to 1 if you have the `getopt_long' function. */+#define HAVE_GETOPT_LONG 1++/* Define to 1 if you have the `getpeereid' function. */+#define HAVE_GETPEEREID 1++/* Define to 1 if you have the `getpeerucred' function. */+/* #undef HAVE_GETPEERUCRED */++/* Define to 1 if you have the `getpwuid_r' function. */+#define HAVE_GETPWUID_R 1++/* Define to 1 if you have the `getrlimit' function. */+#define HAVE_GETRLIMIT 1++/* Define to 1 if you have the `getrusage' function. */+#define HAVE_GETRUSAGE 1++/* Define to 1 if you have the `gettimeofday' function. */+/* #undef HAVE_GETTIMEOFDAY */++/* Define to 1 if you have the <gssapi/gssapi.h> header file. */+/* #undef HAVE_GSSAPI_GSSAPI_H */++/* Define to 1 if you have the <gssapi.h> header file. */+/* #undef HAVE_GSSAPI_H */++/* Define to 1 if you have the <history.h> header file. */+/* #undef HAVE_HISTORY_H */++/* Define to 1 if you have the `history_truncate_file' function. */+/* #undef HAVE_HISTORY_TRUNCATE_FILE */++/* Define to 1 if you have the <ieeefp.h> header file. */+/* #undef HAVE_IEEEFP_H */++/* Define to 1 if you have the <ifaddrs.h> header file. */+#define HAVE_IFADDRS_H 1++/* Define to 1 if you have the `inet_aton' function. */+#define HAVE_INET_ATON 1++/* Define to 1 if the system has the type `int64'. */+/* #undef HAVE_INT64 */++/* Define to 1 if the system has the type `int8'. */+/* #undef HAVE_INT8 */++/* Define to 1 if the system has the type `intptr_t'. */+#define HAVE_INTPTR_T 1++/* Define to 1 if you have the <inttypes.h> header file. */+#define HAVE_INTTYPES_H 1++/* Define to 1 if you have the global variable 'int opterr'. */+#define HAVE_INT_OPTERR 1++/* Define to 1 if you have the global variable 'int optreset'. */+#define HAVE_INT_OPTRESET 1++/* Define to 1 if you have the global variable 'int timezone'. */+#define HAVE_INT_TIMEZONE 1++/* Define to 1 if you have support for IPv6. */+#define HAVE_IPV6 1++/* Define to 1 if you have isinf(). */+#define HAVE_ISINF 1++/* Define to 1 if you have the <langinfo.h> header file. */+#define HAVE_LANGINFO_H 1++/* Define to 1 if you have the <ldap.h> header file. */+/* #undef HAVE_LDAP_H */++/* Define to 1 if you have the `crypto' library (-lcrypto). */+/* #undef HAVE_LIBCRYPTO */++/* Define to 1 if you have the `ldap' library (-lldap). */+/* #undef HAVE_LIBLDAP */++/* Define to 1 if you have the `ldap_r' library (-lldap_r). */+/* #undef HAVE_LIBLDAP_R */++/* Define to 1 if you have the `m' library (-lm). */+#define HAVE_LIBM 1++/* Define to 1 if you have the `pam' library (-lpam). */+/* #undef HAVE_LIBPAM */++/* Define if you have a function readline library */+/* #undef HAVE_LIBREADLINE */++/* Define to 1 if you have the `selinux' library (-lselinux). */+/* #undef HAVE_LIBSELINUX */++/* Define to 1 if you have the `ssl' library (-lssl). */+/* #undef HAVE_LIBSSL */++/* Define to 1 if you have the `wldap32' library (-lwldap32). */+/* #undef HAVE_LIBWLDAP32 */++/* Define to 1 if you have the `xml2' library (-lxml2). */+/* #undef HAVE_LIBXML2 */++/* Define to 1 if you have the `xslt' library (-lxslt). */+/* #undef HAVE_LIBXSLT */++/* Define to 1 if you have the `z' library (-lz). */+/* #undef HAVE_LIBZ */++/* Define to 1 if constants of type 'long long int' should have the suffix LL.+ */+/* #undef HAVE_LL_CONSTANTS */++/* Define to 1 if the system has the type `locale_t'. */+#define HAVE_LOCALE_T 1++/* Define to 1 if `long int' works and is 64 bits. */+#define HAVE_LONG_INT_64 1++/* Define to 1 if the system has the type `long long int'. */+#define HAVE_LONG_LONG_INT 1++/* Define to 1 if `long long int' works and is 64 bits. */+/* #undef HAVE_LONG_LONG_INT_64 */++/* Define to 1 if you have the <mbarrier.h> header file. */+/* #undef HAVE_MBARRIER_H */++/* Define to 1 if you have the `mbstowcs_l' function. */+#define HAVE_MBSTOWCS_L 1++/* Define to 1 if you have the `memmove' function. */+#define HAVE_MEMMOVE 1++/* Define to 1 if you have the <memory.h> header file. */+#define HAVE_MEMORY_H 1++/* Define to 1 if the system has the type `MINIDUMP_TYPE'. */+/* #undef HAVE_MINIDUMP_TYPE */++/* Define to 1 if you have the `mkdtemp' function. */+#define HAVE_MKDTEMP 1++/* Define to 1 if you have the <netinet/in.h> header file. */+#define HAVE_NETINET_IN_H 1++/* Define to 1 if you have the <netinet/tcp.h> header file. */+#define HAVE_NETINET_TCP_H 1++/* Define to 1 if you have the <net/if.h> header file. */+#define HAVE_NET_IF_H 1++/* Define to 1 if you have the <ossp/uuid.h> header file. */+/* #undef HAVE_OSSP_UUID_H */++/* Define to 1 if you have the <pam/pam_appl.h> header file. */+/* #undef HAVE_PAM_PAM_APPL_H */++/* Define to 1 if you have the `poll' function. */+#define HAVE_POLL 1++/* Define to 1 if you have the <poll.h> header file. */+#define HAVE_POLL_H 1++/* Define to 1 if you have the `posix_fadvise' function. */+/* #undef HAVE_POSIX_FADVISE */++/* Define to 1 if you have the POSIX signal interface. */+#define HAVE_POSIX_SIGNALS 1++/* Define to 1 if the assembler supports PPC's LWARX mutex hint bit. */+/* #undef HAVE_PPC_LWARX_MUTEX_HINT */++/* Define to 1 if you have the `pstat' function. */+/* #undef HAVE_PSTAT */++/* Define to 1 if the PS_STRINGS thing exists. */+/* #undef HAVE_PS_STRINGS */++/* Define to 1 if you have the `pthread_is_threaded_np' function. */+#define HAVE_PTHREAD_IS_THREADED_NP 1++/* Define to 1 if you have the <pwd.h> header file. */+#define HAVE_PWD_H 1++/* Define to 1 if you have the `random' function. */+#define HAVE_RANDOM 1++/* Define to 1 if you have the <readline.h> header file. */+/* #undef HAVE_READLINE_H */++/* Define to 1 if you have the <readline/history.h> header file. */+/* #undef HAVE_READLINE_HISTORY_H */++/* Define to 1 if you have the <readline/readline.h> header file. */+/* #undef HAVE_READLINE_READLINE_H */++/* Define to 1 if you have the `readlink' function. */+#define HAVE_READLINK 1++/* Define to 1 if you have the `rint' function. */+#define HAVE_RINT 1++/* Define to 1 if you have the global variable+ 'rl_completion_append_character'. */+/* #undef HAVE_RL_COMPLETION_APPEND_CHARACTER */++/* Define to 1 if you have the `rl_completion_matches' function. */+/* #undef HAVE_RL_COMPLETION_MATCHES */++/* Define to 1 if you have the `rl_filename_completion_function' function. */+/* #undef HAVE_RL_FILENAME_COMPLETION_FUNCTION */++/* Define to 1 if you have the `rl_reset_screen_size' function. */+/* #undef HAVE_RL_RESET_SCREEN_SIZE */++/* Define to 1 if you have the <security/pam_appl.h> header file. */+/* #undef HAVE_SECURITY_PAM_APPL_H */++/* Define to 1 if you have the `setproctitle' function. */+/* #undef HAVE_SETPROCTITLE */++/* Define to 1 if you have the `setsid' function. */+#define HAVE_SETSID 1++/* Define to 1 if you have the `shm_open' function. */+#define HAVE_SHM_OPEN 1++/* Define to 1 if you have the `sigprocmask' function. */+#define HAVE_SIGPROCMASK 1++/* Define to 1 if you have sigsetjmp(). */+#define HAVE_SIGSETJMP 1++/* Define to 1 if the system has the type `sig_atomic_t'. */+#define HAVE_SIG_ATOMIC_T 1++/* Define to 1 if you have the `snprintf' function. */+#define HAVE_SNPRINTF 1++/* Define to 1 if you have spinlocks. */+#define HAVE_SPINLOCKS 1++/* Define to 1 if you have the `srandom' function. */+#define HAVE_SRANDOM 1++/* Define to 1 if you have the `SSL_get_current_compression' function. */+/* #undef HAVE_SSL_GET_CURRENT_COMPRESSION */++/* Define to 1 if you have the <stdint.h> header file. */+#define HAVE_STDINT_H 1++/* Define to 1 if you have the <stdlib.h> header file. */+#define HAVE_STDLIB_H 1++/* Define to 1 if you have the `strerror' function. */+#define HAVE_STRERROR 1++/* Define to 1 if you have the `strerror_r' function. */+#define HAVE_STRERROR_R 1++/* Define to 1 if you have the <strings.h> header file. */+#define HAVE_STRINGS_H 1++/* Define to 1 if you have the <string.h> header file. */+#define HAVE_STRING_H 1++/* Define to 1 if you have the `strlcat' function. */+#define HAVE_STRLCAT 1++/* Define to 1 if you have the `strlcpy' function. */+#define HAVE_STRLCPY 1++/* Define to 1 if you have the `strtoll' function. */+#define HAVE_STRTOLL 1++/* Define to 1 if you have the `strtoq' function. */+/* #undef HAVE_STRTOQ */++/* Define to 1 if you have the `strtoull' function. */+#define HAVE_STRTOULL 1++/* Define to 1 if you have the `strtouq' function. */+/* #undef HAVE_STRTOUQ */++/* Define to 1 if the system has the type `struct addrinfo'. */+#define HAVE_STRUCT_ADDRINFO 1++/* Define to 1 if the system has the type `struct cmsgcred'. */+/* #undef HAVE_STRUCT_CMSGCRED */++/* Define to 1 if the system has the type `struct option'. */+#define HAVE_STRUCT_OPTION 1++/* Define to 1 if `sa_len' is a member of `struct sockaddr'. */+#define HAVE_STRUCT_SOCKADDR_SA_LEN 1++/* Define to 1 if the system has the type `struct sockaddr_storage'. */+#define HAVE_STRUCT_SOCKADDR_STORAGE 1++/* Define to 1 if `ss_family' is a member of `struct sockaddr_storage'. */+#define HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY 1++/* Define to 1 if `ss_len' is a member of `struct sockaddr_storage'. */+#define HAVE_STRUCT_SOCKADDR_STORAGE_SS_LEN 1++/* Define to 1 if `__ss_family' is a member of `struct sockaddr_storage'. */+/* #undef HAVE_STRUCT_SOCKADDR_STORAGE___SS_FAMILY */++/* Define to 1 if `__ss_len' is a member of `struct sockaddr_storage'. */+/* #undef HAVE_STRUCT_SOCKADDR_STORAGE___SS_LEN */++/* Define to 1 if `tm_zone' is a member of `struct tm'. */+#define HAVE_STRUCT_TM_TM_ZONE 1++/* Define to 1 if you have the `symlink' function. */+#define HAVE_SYMLINK 1++/* Define to 1 if you have the `sync_file_range' function. */+/* #undef HAVE_SYNC_FILE_RANGE */++/* Define to 1 if you have the syslog interface. */+#define HAVE_SYSLOG 1++/* Define to 1 if you have the <sys/ioctl.h> header file. */+#define HAVE_SYS_IOCTL_H 1++/* Define to 1 if you have the <sys/ipc.h> header file. */+#define HAVE_SYS_IPC_H 1++/* Define to 1 if you have the <sys/poll.h> header file. */+#define HAVE_SYS_POLL_H 1++/* Define to 1 if you have the <sys/pstat.h> header file. */+/* #undef HAVE_SYS_PSTAT_H */++/* Define to 1 if you have the <sys/resource.h> header file. */+#define HAVE_SYS_RESOURCE_H 1++/* Define to 1 if you have the <sys/select.h> header file. */+#define HAVE_SYS_SELECT_H 1++/* Define to 1 if you have the <sys/sem.h> header file. */+#define HAVE_SYS_SEM_H 1++/* Define to 1 if you have the <sys/shm.h> header file. */+#define HAVE_SYS_SHM_H 1++/* Define to 1 if you have the <sys/socket.h> header file. */+#define HAVE_SYS_SOCKET_H 1++/* Define to 1 if you have the <sys/sockio.h> header file. */+#define HAVE_SYS_SOCKIO_H 1++/* Define to 1 if you have the <sys/stat.h> header file. */+#define HAVE_SYS_STAT_H 1++/* Define to 1 if you have the <sys/tas.h> header file. */+/* #undef HAVE_SYS_TAS_H */++/* Define to 1 if you have the <sys/time.h> header file. */+#define HAVE_SYS_TIME_H 1++/* Define to 1 if you have the <sys/types.h> header file. */+#define HAVE_SYS_TYPES_H 1++/* Define to 1 if you have the <sys/ucred.h> header file. */+#define HAVE_SYS_UCRED_H 1++/* Define to 1 if you have the <sys/un.h> header file. */+#define HAVE_SYS_UN_H 1++/* Define to 1 if you have the <termios.h> header file. */+#define HAVE_TERMIOS_H 1++/* Define to 1 if your `struct tm' has `tm_zone'. Deprecated, use+ `HAVE_STRUCT_TM_TM_ZONE' instead. */+#define HAVE_TM_ZONE 1++/* Define to 1 if you have the `towlower' function. */+#define HAVE_TOWLOWER 1++/* Define to 1 if you have the external array `tzname'. */+#define HAVE_TZNAME 1++/* Define to 1 if you have the <ucred.h> header file. */+/* #undef HAVE_UCRED_H */++/* Define to 1 if the system has the type `uint64'. */+/* #undef HAVE_UINT64 */++/* Define to 1 if the system has the type `uint8'. */+/* #undef HAVE_UINT8 */++/* Define to 1 if the system has the type `uintptr_t'. */+#define HAVE_UINTPTR_T 1++/* Define to 1 if the system has the type `union semun'. */+#define HAVE_UNION_SEMUN 1++/* Define to 1 if you have the <unistd.h> header file. */+#define HAVE_UNISTD_H 1++/* Define to 1 if you have unix sockets. */+#define HAVE_UNIX_SOCKETS 1++/* Define to 1 if you have the `unsetenv' function. */+#define HAVE_UNSETENV 1++/* Define to 1 if the system has the type `unsigned long long int'. */+#define HAVE_UNSIGNED_LONG_LONG_INT 1++/* Define to 1 if you have the `utime' function. */+#define HAVE_UTIME 1++/* Define to 1 if you have the `utimes' function. */+#define HAVE_UTIMES 1++/* Define to 1 if you have the <utime.h> header file. */+#define HAVE_UTIME_H 1++/* Define to 1 if you have BSD UUID support. */+/* #undef HAVE_UUID_BSD */++/* Define to 1 if you have E2FS UUID support. */+/* #undef HAVE_UUID_E2FS */++/* Define to 1 if you have the <uuid.h> header file. */+/* #undef HAVE_UUID_H */++/* Define to 1 if you have OSSP UUID support. */+/* #undef HAVE_UUID_OSSP */++/* Define to 1 if you have the <uuid/uuid.h> header file. */+/* #undef HAVE_UUID_UUID_H */++/* Define to 1 if you have the `vsnprintf' function. */+#define HAVE_VSNPRINTF 1++/* Define to 1 if you have the <wchar.h> header file. */+#define HAVE_WCHAR_H 1++/* Define to 1 if you have the `wcstombs' function. */+#define HAVE_WCSTOMBS 1++/* Define to 1 if you have the `wcstombs_l' function. */+#define HAVE_WCSTOMBS_L 1++/* Define to 1 if you have the <wctype.h> header file. */+#define HAVE_WCTYPE_H 1++/* Define to 1 if you have the <winldap.h> header file. */+/* #undef HAVE_WINLDAP_H */++/* Define to 1 if your compiler understands __builtin_bswap32. */+#define HAVE__BUILTIN_BSWAP32 1++/* Define to 1 if your compiler understands __builtin_constant_p. */+#define HAVE__BUILTIN_CONSTANT_P 1++/* Define to 1 if your compiler understands __builtin_types_compatible_p. */+#define HAVE__BUILTIN_TYPES_COMPATIBLE_P 1++/* Define to 1 if your compiler understands __builtin_unreachable. */+#define HAVE__BUILTIN_UNREACHABLE 1++/* Define to 1 if you have __cpuid. */+/* #undef HAVE__CPUID */++/* Define to 1 if you have __get_cpuid. */+#define HAVE__GET_CPUID 1++/* Define to 1 if your compiler understands _Static_assert. */+#define HAVE__STATIC_ASSERT 1++/* Define to 1 if your compiler understands __VA_ARGS__ in macros. */+#define HAVE__VA_ARGS 1++/* Define to the appropriate snprintf length modifier for 64-bit ints. */+#define INT64_MODIFIER "l"++/* Define to 1 if `locale_t' requires <xlocale.h>. */+#define LOCALE_T_IN_XLOCALE 1++/* Define as the maximum alignment requirement of any C data type. */+#define MAXIMUM_ALIGNOF 8++/* Define bytes to use libc memset(). */+#define MEMSET_LOOP_LIMIT 1024++/* Define to the address where bug reports for this package should be sent. */+#define PACKAGE_BUGREPORT "pgsql-bugs@postgresql.org"++/* Define to the full name of this package. */+#define PACKAGE_NAME "PostgreSQL"++/* Define to the full name and version of this package. */+#define PACKAGE_STRING "PostgreSQL 9.5.3"++/* Define to the one symbol short name of this package. */+#define PACKAGE_TARNAME "postgresql"++/* Define to the home page for this package. */+#define PACKAGE_URL ""++/* Define to the version of this package. */+#define PACKAGE_VERSION "9.5.3"++/* Define to the name of a signed 128-bit integer type. */+#define PG_INT128_TYPE __int128++/* Define to the name of a signed 64-bit integer type. */+#define PG_INT64_TYPE long int++/* Define to the name of the default PostgreSQL service principal in Kerberos+ (GSSAPI). (--with-krb-srvnam=NAME) */+#define PG_KRB_SRVNAM "postgres"++/* PostgreSQL major version as a string */+#define PG_MAJORVERSION "9.5"++/* Define to gnu_printf if compiler supports it, else printf. */+#define PG_PRINTF_ATTRIBUTE printf++/* Define to 1 if "static inline" works without unwanted warnings from+ compilations where static inline functions are defined but not called. */+#define PG_USE_INLINE 1++/* PostgreSQL version as a string */+#define PG_VERSION "9.5.3"++/* PostgreSQL version as a number */+#define PG_VERSION_NUM 90503++/* A string containing the version number, platform, and C compiler */+#define PG_VERSION_STR "PostgreSQL 9.5.3 on x86_64-apple-darwin14.5.0, compiled by Apple LLVM version 7.0.2 (clang-700.1.81), 64-bit"++/* Define to 1 to allow profiling output to be saved separately for each+ process. */+/* #undef PROFILE_PID_DIR */++/* RELSEG_SIZE is the maximum number of blocks allowed in one disk file. Thus,+ the maximum size of a single file is RELSEG_SIZE * BLCKSZ; relations bigger+ than that are divided into multiple files. RELSEG_SIZE * BLCKSZ must be+ less than your OS' limit on file size. This is often 2 GB or 4GB in a+ 32-bit operating system, unless you have large file support enabled. By+ default, we make the limit 1 GB to avoid any possible integer-overflow+ problems within the OS. A limit smaller than necessary only means we divide+ a large relation into more chunks than necessary, so it seems best to err+ in the direction of a small limit. A power-of-2 value is recommended to+ save a few cycles in md.c, but is not absolutely required. Changing+ RELSEG_SIZE requires an initdb. */+#define RELSEG_SIZE 131072++/* The size of `long', as computed by sizeof. */+#define SIZEOF_LONG 8++/* The size of `off_t', as computed by sizeof. */+#define SIZEOF_OFF_T 8++/* The size of `size_t', as computed by sizeof. */+#define SIZEOF_SIZE_T 8++/* The size of `void *', as computed by sizeof. */+#define SIZEOF_VOID_P 8++/* Define to 1 if you have the ANSI C header files. */+#define STDC_HEADERS 1++/* Define to 1 if strerror_r() returns a int. */+#define STRERROR_R_INT 1++/* Define to 1 if your <sys/time.h> declares `struct tm'. */+/* #undef TM_IN_SYS_TIME */++/* Define to 1 to build with assertion checks. (--enable-cassert) */+/* #undef USE_ASSERT_CHECKING */++/* Define to 1 to build with Bonjour support. (--with-bonjour) */+/* #undef USE_BONJOUR */++/* Define to 1 if you want float4 values to be passed by value.+ (--enable-float4-byval) */+#define USE_FLOAT4_BYVAL 1++/* Define to 1 if you want float8, int8, etc values to be passed by value.+ (--enable-float8-byval) */+#define USE_FLOAT8_BYVAL 1++/* Define to 1 if you want 64-bit integer timestamp and interval support.+ (--enable-integer-datetimes) */+#define USE_INTEGER_DATETIMES 1++/* Define to 1 to build with LDAP support. (--with-ldap) */+/* #undef USE_LDAP */++/* Define to 1 to build with XML support. (--with-libxml) */+/* #undef USE_LIBXML */++/* Define to 1 to use XSLT support when building contrib/xml2.+ (--with-libxslt) */+/* #undef USE_LIBXSLT */++/* Define to select named POSIX semaphores. */+/* #undef USE_NAMED_POSIX_SEMAPHORES */++/* Define to build with OpenSSL support. (--with-openssl) */+/* #undef USE_OPENSSL */++/* Define to 1 to build with PAM support. (--with-pam) */+/* #undef USE_PAM */++/* Use replacement snprintf() functions. */+/* #undef USE_REPL_SNPRINTF */++/* Define to 1 to use Intel SSE 4.2 CRC instructions with a runtime check. */+/* #undef USE_SLICING_BY_8_CRC32C */++/* Define to 1 use Intel SSE 4.2 CRC instructions. */+/* #undef USE_SSE42_CRC32C */++/* Define to 1 to use Intel SSSE 4.2 CRC instructions with a runtime check. */+#define USE_SSE42_CRC32C_WITH_RUNTIME_CHECK 1++/* Define to select SysV-style semaphores. */+#define USE_SYSV_SEMAPHORES 1++/* Define to select SysV-style shared memory. */+#define USE_SYSV_SHARED_MEMORY 1++/* Define to select unnamed POSIX semaphores. */+/* #undef USE_UNNAMED_POSIX_SEMAPHORES */++/* Define to select Win32-style semaphores. */+/* #undef USE_WIN32_SEMAPHORES */++/* Define to select Win32-style shared memory. */+/* #undef USE_WIN32_SHARED_MEMORY */++/* Define to 1 if `wcstombs_l' requires <xlocale.h>. */+#define WCSTOMBS_L_IN_XLOCALE 1++/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most+ significant byte first (like Motorola and SPARC, unlike Intel). */+#if defined AC_APPLE_UNIVERSAL_BUILD+# if defined __BIG_ENDIAN__+# define WORDS_BIGENDIAN 1+# endif+#else+# ifndef WORDS_BIGENDIAN+/* # undef WORDS_BIGENDIAN */+# endif+#endif++/* Size of a WAL file block. This need have no particular relation to BLCKSZ.+ XLOG_BLCKSZ must be a power of 2, and if your system supports O_DIRECT I/O,+ XLOG_BLCKSZ must be a multiple of the alignment requirement for direct-I/O+ buffers, else direct I/O may fail. Changing XLOG_BLCKSZ requires an initdb.+ */+#define XLOG_BLCKSZ 8192++/* XLOG_SEG_SIZE is the size of a single WAL file. This must be a power of 2+ and larger than XLOG_BLCKSZ (preferably, a great deal larger than+ XLOG_BLCKSZ). Changing XLOG_SEG_SIZE requires an initdb. */+#define XLOG_SEG_SIZE (16 * 1024 * 1024)++++/* Number of bits in a file offset, on hosts where this is settable. */+/* #undef _FILE_OFFSET_BITS */++/* Define to 1 to make fseeko visible on some hosts (e.g. glibc 2.2). */+/* #undef _LARGEFILE_SOURCE */++/* Define for large files, on AIX-style hosts. */+/* #undef _LARGE_FILES */++/* Define to `__inline__' or `__inline' if that's what the C compiler+ calls it, or to nothing if 'inline' is not supported under any name. */+#ifndef __cplusplus+/* #undef inline */+#endif++/* Define to the type of a signed integer type wide enough to hold a pointer,+ if such a type exists, and if the system does not define it. */+/* #undef intptr_t */++/* Define to empty if the C compiler does not understand signed types. */+/* #undef signed */++/* Define to the type of an unsigned integer type wide enough to hold a+ pointer, if such a type exists, and if the system does not define it. */+/* #undef uintptr_t */+#undef HAVE_LOCALE_T+#undef LOCALE_T_IN_XLOCALE+#undef WCSTOMBS_L_IN_XLOCALE
+ foreign/libpg_query/src/postgres/include/pg_config_ext.h view
@@ -0,0 +1,8 @@+/* src/include/pg_config_ext.h. Generated from pg_config_ext.h.in by configure. */+/*+ * src/include/pg_config_ext.h.in. This is generated manually, not by+ * autoheader, since we want to limit which symbols get defined here.+ */++/* Define to the name of a signed 64-bit integer type. */+#define PG_INT64_TYPE long int
+ foreign/libpg_query/src/postgres/include/pg_config_manual.h view
@@ -0,0 +1,307 @@+/*------------------------------------------------------------------------+ * PostgreSQL manual configuration settings+ *+ * This file contains various configuration symbols and limits. In+ * all cases, changing them is only useful in very rare situations or+ * for developers. If you edit any of these, be sure to do a *full*+ * rebuild (and an initdb if noted).+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/pg_config_manual.h+ *------------------------------------------------------------------------+ */++/*+ * Maximum length for identifiers (e.g. table names, column names,+ * function names). Names actually are limited to one less byte than this,+ * because the length must include a trailing zero byte.+ *+ * Changing this requires an initdb.+ */+#define NAMEDATALEN 64++/*+ * Maximum number of arguments to a function.+ *+ * The minimum value is 8 (GIN indexes use 8-argument support functions).+ * The maximum possible value is around 600 (limited by index tuple size in+ * pg_proc's index; BLCKSZ larger than 8K would allow more). Values larger+ * than needed will waste memory and processing time, but do not directly+ * cost disk space.+ *+ * Changing this does not require an initdb, but it does require a full+ * backend recompile (including any user-defined C functions).+ */+#define FUNC_MAX_ARGS 100++/*+ * Maximum number of columns in an index. There is little point in making+ * this anything but a multiple of 32, because the main cost is associated+ * with index tuple header size (see access/itup.h).+ *+ * Changing this requires an initdb.+ */+#define INDEX_MAX_KEYS 32++/*+ * Set the upper and lower bounds of sequence values.+ */+#define SEQ_MAXVALUE PG_INT64_MAX+#define SEQ_MINVALUE (-SEQ_MAXVALUE)++/*+ * Number of spare LWLocks to allocate for user-defined add-on code.+ */+#define NUM_USER_DEFINED_LWLOCKS 4++/*+ * When we don't have native spinlocks, we use semaphores to simulate them.+ * Decreasing this value reduces consumption of OS resources; increasing it+ * may improve performance, but supplying a real spinlock implementation is+ * probably far better.+ */+#define NUM_SPINLOCK_SEMAPHORES 128++/*+ * When we have neither spinlocks nor atomic operations support we're+ * implementing atomic operations on top of spinlock on top of semaphores. To+ * be safe against atomic operations while holding a spinlock separate+ * semaphores have to be used.+ */+#define NUM_ATOMICS_SEMAPHORES 64++/*+ * Define this if you want to allow the lo_import and lo_export SQL+ * functions to be executed by ordinary users. By default these+ * functions are only available to the Postgres superuser. CAUTION:+ * These functions are SECURITY HOLES since they can read and write+ * any file that the PostgreSQL server has permission to access. If+ * you turn this on, don't say we didn't warn you.+ */+/* #define ALLOW_DANGEROUS_LO_FUNCTIONS */++/*+ * MAXPGPATH: standard size of a pathname buffer in PostgreSQL (hence,+ * maximum usable pathname length is one less).+ *+ * We'd use a standard system header symbol for this, if there weren't+ * so many to choose from: MAXPATHLEN, MAX_PATH, PATH_MAX are all+ * defined by different "standards", and often have different values+ * on the same platform! So we just punt and use a reasonably+ * generous setting here.+ */+#define MAXPGPATH 1024++/*+ * PG_SOMAXCONN: maximum accept-queue length limit passed to+ * listen(2). You'd think we should use SOMAXCONN from+ * <sys/socket.h>, but on many systems that symbol is much smaller+ * than the kernel's actual limit. In any case, this symbol need be+ * twiddled only if you have a kernel that refuses large limit values,+ * rather than silently reducing the value to what it can handle+ * (which is what most if not all Unixen do).+ */+#define PG_SOMAXCONN 10000++/*+ * You can try changing this if you have a machine with bytes of+ * another size, but no guarantee...+ */+#define BITS_PER_BYTE 8++/*+ * Preferred alignment for disk I/O buffers. On some CPUs, copies between+ * user space and kernel space are significantly faster if the user buffer+ * is aligned on a larger-than-MAXALIGN boundary. Ideally this should be+ * a platform-dependent value, but for now we just hard-wire it.+ */+#define ALIGNOF_BUFFER 32++/*+ * Disable UNIX sockets for certain operating systems.+ */+#if defined(WIN32)+#undef HAVE_UNIX_SOCKETS+#endif++/*+ * Define this if your operating system supports link()+ */+#if !defined(WIN32) && !defined(__CYGWIN__)+#define HAVE_WORKING_LINK 1+#endif++/*+ * USE_POSIX_FADVISE controls whether Postgres will attempt to use the+ * posix_fadvise() kernel call. Usually the automatic configure tests are+ * sufficient, but some older Linux distributions had broken versions of+ * posix_fadvise(). If necessary you can remove the #define here.+ */+#if HAVE_DECL_POSIX_FADVISE && defined(HAVE_POSIX_FADVISE)+#define USE_POSIX_FADVISE+#endif++/*+ * USE_PREFETCH code should be compiled only if we have a way to implement+ * prefetching. (This is decoupled from USE_POSIX_FADVISE because there+ * might in future be support for alternative low-level prefetch APIs.)+ */+#ifdef USE_POSIX_FADVISE+#define USE_PREFETCH+#endif++/*+ * USE_SSL code should be compiled only when compiling with an SSL+ * implementation. (Currently, only OpenSSL is supported, but we might add+ * more implementations in the future.)+ */+#ifdef USE_OPENSSL+#define USE_SSL+#endif++/*+ * This is the default directory in which AF_UNIX socket files are+ * placed. Caution: changing this risks breaking your existing client+ * applications, which are likely to continue to look in the old+ * directory. But if you just hate the idea of sockets in /tmp,+ * here's where to twiddle it. You can also override this at runtime+ * with the postmaster's -k switch.+ */+#define DEFAULT_PGSOCKET_DIR "/tmp"++/*+ * This is the default event source for Windows event log.+ */+#define DEFAULT_EVENT_SOURCE "PostgreSQL"++/*+ * The random() function is expected to yield values between 0 and+ * MAX_RANDOM_VALUE. Currently, all known implementations yield+ * 0..2^31-1, so we just hardwire this constant. We could do a+ * configure test if it proves to be necessary. CAUTION: Think not to+ * replace this with RAND_MAX. RAND_MAX defines the maximum value of+ * the older rand() function, which is often different from --- and+ * considerably inferior to --- random().+ */+#define MAX_RANDOM_VALUE PG_INT32_MAX++/*+ * On PPC machines, decide whether to use the mutex hint bit in LWARX+ * instructions. Setting the hint bit will slightly improve spinlock+ * performance on POWER6 and later machines, but does nothing before that,+ * and will result in illegal-instruction failures on some pre-POWER4+ * machines. By default we use the hint bit when building for 64-bit PPC,+ * which should be safe in nearly all cases. You might want to override+ * this if you are building 32-bit code for a known-recent PPC machine.+ */+#ifdef HAVE_PPC_LWARX_MUTEX_HINT /* must have assembler support in any case */+#if defined(__ppc64__) || defined(__powerpc64__)+#define USE_PPC_LWARX_MUTEX_HINT+#endif+#endif++/*+ * On PPC machines, decide whether to use LWSYNC instructions in place of+ * ISYNC and SYNC. This provides slightly better performance, but will+ * result in illegal-instruction failures on some pre-POWER4 machines.+ * By default we use LWSYNC when building for 64-bit PPC, which should be+ * safe in nearly all cases.+ */+#if defined(__ppc64__) || defined(__powerpc64__)+#define USE_PPC_LWSYNC+#endif++/*+ * Assumed cache line size. This doesn't affect correctness, but can be used+ * for low-level optimizations. Currently, this is used to pad some data+ * structures in xlog.c, to ensure that highly-contended fields are on+ * different cache lines. Too small a value can hurt performance due to false+ * sharing, while the only downside of too large a value is a few bytes of+ * wasted memory. The default is 128, which should be large enough for all+ * supported platforms.+ */+#define PG_CACHE_LINE_SIZE 128++/*+ *------------------------------------------------------------------------+ * The following symbols are for enabling debugging code, not for+ * controlling user-visible features or resource limits.+ *------------------------------------------------------------------------+ */++/*+ * Include Valgrind "client requests", mostly in the memory allocator, so+ * Valgrind understands PostgreSQL memory contexts. This permits detecting+ * memory errors that Valgrind would not detect on a vanilla build. See also+ * src/tools/valgrind.supp. "make installcheck" runs 20-30x longer under+ * Valgrind. Note that USE_VALGRIND slowed older versions of Valgrind by an+ * additional order of magnitude; Valgrind 3.8.1 does not have this problem.+ * The client requests fall in hot code paths, so USE_VALGRIND also slows+ * native execution by a few percentage points.+ *+ * You should normally use MEMORY_CONTEXT_CHECKING with USE_VALGRIND;+ * instrumentation of repalloc() is inferior without it.+ */+/* #define USE_VALGRIND */++/*+ * Define this to cause pfree()'d memory to be cleared immediately, to+ * facilitate catching bugs that refer to already-freed values.+ * Right now, this gets defined automatically if --enable-cassert.+ */+#ifdef USE_ASSERT_CHECKING+#define CLOBBER_FREED_MEMORY+#endif++/*+ * Define this to check memory allocation errors (scribbling on more+ * bytes than were allocated). Right now, this gets defined+ * automatically if --enable-cassert or USE_VALGRIND.+ */+#if defined(USE_ASSERT_CHECKING) || defined(USE_VALGRIND)+#define MEMORY_CONTEXT_CHECKING+#endif++/*+ * Define this to cause palloc()'d memory to be filled with random data, to+ * facilitate catching code that depends on the contents of uninitialized+ * memory. Caution: this is horrendously expensive.+ */+/* #define RANDOMIZE_ALLOCATED_MEMORY */++/*+ * Define this to force all parse and plan trees to be passed through+ * copyObject(), to facilitate catching errors and omissions in+ * copyObject().+ */+/* #define COPY_PARSE_PLAN_TREES */++/*+ * Enable debugging print statements for lock-related operations.+ */+/* #define LOCK_DEBUG */++/*+ * Enable debugging print statements for WAL-related operations; see+ * also the wal_debug GUC var.+ */+/* #define WAL_DEBUG */++/*+ * Enable tracing of resource consumption during sort operations;+ * see also the trace_sort GUC var. For 8.1 this is enabled by default.+ */+#define TRACE_SORT 1++/*+ * Enable tracing of syncscan operations (see also the trace_syncscan GUC var).+ */+/* #define TRACE_SYNCSCAN */++/*+ * Other debug #defines (documentation, anyone?)+ */+/* #define HEAPDEBUGALL */+/* #define ACLDEBUG */
+ foreign/libpg_query/src/postgres/include/pg_config_os.h view
@@ -0,0 +1,8 @@+/* src/include/port/darwin.h */++#define __darwin__ 1++#if HAVE_DECL_F_FULLFSYNC /* not present before OS X 10.3 */+#define HAVE_FSYNC_WRITETHROUGH++#endif
+ foreign/libpg_query/src/postgres/include/pg_getopt.h view
@@ -0,0 +1,46 @@+/*+ * Portions Copyright (c) 1987, 1993, 1994+ * The Regents of the University of California. All rights reserved.+ *+ * Portions Copyright (c) 2003-2015, PostgreSQL Global Development Group+ *+ * src/include/pg_getopt.h+ */+#ifndef PG_GETOPT_H+#define PG_GETOPT_H++/* POSIX says getopt() is provided by unistd.h */+#include <unistd.h>++/* rely on the system's getopt.h if present */+#ifdef HAVE_GETOPT_H+#include <getopt.h>+#endif++/*+ * If we have <getopt.h>, assume it declares these variables, else do that+ * ourselves. (We used to just declare them unconditionally, but Cygwin+ * doesn't like that.)+ */+#ifndef HAVE_GETOPT_H++extern char *optarg;+extern int optind;+extern int opterr;+extern int optopt;++#endif /* HAVE_GETOPT_H */++/*+ * Some platforms have optreset but fail to declare it in <getopt.h>, so cope.+ * Cygwin, however, doesn't like this either.+ */+#if defined(HAVE_INT_OPTRESET) && !defined(__CYGWIN__)+extern int optreset;+#endif++#ifndef HAVE_GETOPT+extern int getopt(int nargc, char *const * nargv, const char *ostr);+#endif++#endif /* PG_GETOPT_H */
+ foreign/libpg_query/src/postgres/include/pg_trace.h view
@@ -0,0 +1,17 @@+/* ----------+ * pg_trace.h+ *+ * Definitions for the PostgreSQL tracing framework+ *+ * Copyright (c) 2006-2015, PostgreSQL Global Development Group+ *+ * src/include/pg_trace.h+ * ----------+ */++#ifndef PG_TRACE_H+#define PG_TRACE_H++#include "utils/probes.h" /* pgrminclude ignore */++#endif /* PG_TRACE_H */
+ foreign/libpg_query/src/postgres/include/pgstat.h view
@@ -0,0 +1,1025 @@+/* ----------+ * pgstat.h+ *+ * Definitions for the PostgreSQL statistics collector daemon.+ *+ * Copyright (c) 2001-2015, PostgreSQL Global Development Group+ *+ * src/include/pgstat.h+ * ----------+ */+#ifndef PGSTAT_H+#define PGSTAT_H++#include "datatype/timestamp.h"+#include "fmgr.h"+#include "libpq/pqcomm.h"+#include "portability/instr_time.h"+#include "postmaster/pgarch.h"+#include "storage/barrier.h"+#include "utils/hsearch.h"+#include "utils/relcache.h"+++/* ----------+ * Paths for the statistics files (relative to installation's $PGDATA).+ * ----------+ */+#define PGSTAT_STAT_PERMANENT_DIRECTORY "pg_stat"+#define PGSTAT_STAT_PERMANENT_FILENAME "pg_stat/global.stat"+#define PGSTAT_STAT_PERMANENT_TMPFILE "pg_stat/global.tmp"++/* Default directory to store temporary statistics data in */+#define PG_STAT_TMP_DIR "pg_stat_tmp"++/* Values for track_functions GUC variable --- order is significant! */+typedef enum TrackFunctionsLevel+{+ TRACK_FUNC_OFF,+ TRACK_FUNC_PL,+ TRACK_FUNC_ALL+} TrackFunctionsLevel;++/* ----------+ * The types of backend -> collector messages+ * ----------+ */+typedef enum StatMsgType+{+ PGSTAT_MTYPE_DUMMY,+ PGSTAT_MTYPE_INQUIRY,+ PGSTAT_MTYPE_TABSTAT,+ PGSTAT_MTYPE_TABPURGE,+ PGSTAT_MTYPE_DROPDB,+ PGSTAT_MTYPE_RESETCOUNTER,+ PGSTAT_MTYPE_RESETSHAREDCOUNTER,+ PGSTAT_MTYPE_RESETSINGLECOUNTER,+ PGSTAT_MTYPE_AUTOVAC_START,+ PGSTAT_MTYPE_VACUUM,+ PGSTAT_MTYPE_ANALYZE,+ PGSTAT_MTYPE_ARCHIVER,+ PGSTAT_MTYPE_BGWRITER,+ PGSTAT_MTYPE_FUNCSTAT,+ PGSTAT_MTYPE_FUNCPURGE,+ PGSTAT_MTYPE_RECOVERYCONFLICT,+ PGSTAT_MTYPE_TEMPFILE,+ PGSTAT_MTYPE_DEADLOCK+} StatMsgType;++/* ----------+ * The data type used for counters.+ * ----------+ */+typedef int64 PgStat_Counter;++/* ----------+ * PgStat_TableCounts The actual per-table counts kept by a backend+ *+ * This struct should contain only actual event counters, because we memcmp+ * it against zeroes to detect whether there are any counts to transmit.+ * It is a component of PgStat_TableStatus (within-backend state) and+ * PgStat_TableEntry (the transmitted message format).+ *+ * Note: for a table, tuples_returned is the number of tuples successfully+ * fetched by heap_getnext, while tuples_fetched is the number of tuples+ * successfully fetched by heap_fetch under the control of bitmap indexscans.+ * For an index, tuples_returned is the number of index entries returned by+ * the index AM, while tuples_fetched is the number of tuples successfully+ * fetched by heap_fetch under the control of simple indexscans for this index.+ *+ * tuples_inserted/updated/deleted/hot_updated count attempted actions,+ * regardless of whether the transaction committed. delta_live_tuples,+ * delta_dead_tuples, and changed_tuples are set depending on commit or abort.+ * Note that delta_live_tuples and delta_dead_tuples can be negative!+ * ----------+ */+typedef struct PgStat_TableCounts+{+ PgStat_Counter t_numscans;++ PgStat_Counter t_tuples_returned;+ PgStat_Counter t_tuples_fetched;++ PgStat_Counter t_tuples_inserted;+ PgStat_Counter t_tuples_updated;+ PgStat_Counter t_tuples_deleted;+ PgStat_Counter t_tuples_hot_updated;+ bool t_truncated;++ PgStat_Counter t_delta_live_tuples;+ PgStat_Counter t_delta_dead_tuples;+ PgStat_Counter t_changed_tuples;++ PgStat_Counter t_blocks_fetched;+ PgStat_Counter t_blocks_hit;+} PgStat_TableCounts;++/* Possible targets for resetting cluster-wide shared values */+typedef enum PgStat_Shared_Reset_Target+{+ RESET_ARCHIVER,+ RESET_BGWRITER+} PgStat_Shared_Reset_Target;++/* Possible object types for resetting single counters */+typedef enum PgStat_Single_Reset_Type+{+ RESET_TABLE,+ RESET_FUNCTION+} PgStat_Single_Reset_Type;++/* ------------------------------------------------------------+ * Structures kept in backend local memory while accumulating counts+ * ------------------------------------------------------------+ */+++/* ----------+ * PgStat_TableStatus Per-table status within a backend+ *+ * Many of the event counters are nontransactional, ie, we count events+ * in committed and aborted transactions alike. For these, we just count+ * directly in the PgStat_TableStatus. However, delta_live_tuples,+ * delta_dead_tuples, and changed_tuples must be derived from event counts+ * with awareness of whether the transaction or subtransaction committed or+ * aborted. Hence, we also keep a stack of per-(sub)transaction status+ * records for every table modified in the current transaction. At commit+ * or abort, we propagate tuples_inserted/updated/deleted up to the+ * parent subtransaction level, or out to the parent PgStat_TableStatus,+ * as appropriate.+ * ----------+ */+typedef struct PgStat_TableStatus+{+ Oid t_id; /* table's OID */+ bool t_shared; /* is it a shared catalog? */+ struct PgStat_TableXactStatus *trans; /* lowest subxact's counts */+ PgStat_TableCounts t_counts; /* event counts to be sent */+} PgStat_TableStatus;++/* ----------+ * PgStat_TableXactStatus Per-table, per-subtransaction status+ * ----------+ */+typedef struct PgStat_TableXactStatus+{+ PgStat_Counter tuples_inserted; /* tuples inserted in (sub)xact */+ PgStat_Counter tuples_updated; /* tuples updated in (sub)xact */+ PgStat_Counter tuples_deleted; /* tuples deleted in (sub)xact */+ bool truncated; /* relation truncated in this (sub)xact */+ PgStat_Counter inserted_pre_trunc; /* tuples inserted prior to truncate */+ PgStat_Counter updated_pre_trunc; /* tuples updated prior to truncate */+ PgStat_Counter deleted_pre_trunc; /* tuples deleted prior to truncate */+ int nest_level; /* subtransaction nest level */+ /* links to other structs for same relation: */+ struct PgStat_TableXactStatus *upper; /* next higher subxact if any */+ PgStat_TableStatus *parent; /* per-table status */+ /* structs of same subxact level are linked here: */+ struct PgStat_TableXactStatus *next; /* next of same subxact */+} PgStat_TableXactStatus;+++/* ------------------------------------------------------------+ * Message formats follow+ * ------------------------------------------------------------+ */+++/* ----------+ * PgStat_MsgHdr The common message header+ * ----------+ */+typedef struct PgStat_MsgHdr+{+ StatMsgType m_type;+ int m_size;+} PgStat_MsgHdr;++/* ----------+ * Space available in a message. This will keep the UDP packets below 1K,+ * which should fit unfragmented into the MTU of the loopback interface.+ * (Larger values of PGSTAT_MAX_MSG_SIZE would work for that on most+ * platforms, but we're being conservative here.)+ * ----------+ */+#define PGSTAT_MAX_MSG_SIZE 1000+#define PGSTAT_MSG_PAYLOAD (PGSTAT_MAX_MSG_SIZE - sizeof(PgStat_MsgHdr))+++/* ----------+ * PgStat_MsgDummy A dummy message, ignored by the collector+ * ----------+ */+typedef struct PgStat_MsgDummy+{+ PgStat_MsgHdr m_hdr;+} PgStat_MsgDummy;+++/* ----------+ * PgStat_MsgInquiry Sent by a backend to ask the collector+ * to write the stats file.+ * ----------+ */++typedef struct PgStat_MsgInquiry+{+ PgStat_MsgHdr m_hdr;+ TimestampTz clock_time; /* observed local clock time */+ TimestampTz cutoff_time; /* minimum acceptable file timestamp */+ Oid databaseid; /* requested DB (InvalidOid => all DBs) */+} PgStat_MsgInquiry;+++/* ----------+ * PgStat_TableEntry Per-table info in a MsgTabstat+ * ----------+ */+typedef struct PgStat_TableEntry+{+ Oid t_id;+ PgStat_TableCounts t_counts;+} PgStat_TableEntry;++/* ----------+ * PgStat_MsgTabstat Sent by the backend to report table+ * and buffer access statistics.+ * ----------+ */+#define PGSTAT_NUM_TABENTRIES \+ ((PGSTAT_MSG_PAYLOAD - sizeof(Oid) - 3 * sizeof(int) - 2 * sizeof(PgStat_Counter)) \+ / sizeof(PgStat_TableEntry))++typedef struct PgStat_MsgTabstat+{+ PgStat_MsgHdr m_hdr;+ Oid m_databaseid;+ int m_nentries;+ int m_xact_commit;+ int m_xact_rollback;+ PgStat_Counter m_block_read_time; /* times in microseconds */+ PgStat_Counter m_block_write_time;+ PgStat_TableEntry m_entry[PGSTAT_NUM_TABENTRIES];+} PgStat_MsgTabstat;+++/* ----------+ * PgStat_MsgTabpurge Sent by the backend to tell the collector+ * about dead tables.+ * ----------+ */+#define PGSTAT_NUM_TABPURGE \+ ((PGSTAT_MSG_PAYLOAD - sizeof(Oid) - sizeof(int)) \+ / sizeof(Oid))++typedef struct PgStat_MsgTabpurge+{+ PgStat_MsgHdr m_hdr;+ Oid m_databaseid;+ int m_nentries;+ Oid m_tableid[PGSTAT_NUM_TABPURGE];+} PgStat_MsgTabpurge;+++/* ----------+ * PgStat_MsgDropdb Sent by the backend to tell the collector+ * about a dropped database+ * ----------+ */+typedef struct PgStat_MsgDropdb+{+ PgStat_MsgHdr m_hdr;+ Oid m_databaseid;+} PgStat_MsgDropdb;+++/* ----------+ * PgStat_MsgResetcounter Sent by the backend to tell the collector+ * to reset counters+ * ----------+ */+typedef struct PgStat_MsgResetcounter+{+ PgStat_MsgHdr m_hdr;+ Oid m_databaseid;+} PgStat_MsgResetcounter;++/* ----------+ * PgStat_MsgResetsharedcounter Sent by the backend to tell the collector+ * to reset a shared counter+ * ----------+ */+typedef struct PgStat_MsgResetsharedcounter+{+ PgStat_MsgHdr m_hdr;+ PgStat_Shared_Reset_Target m_resettarget;+} PgStat_MsgResetsharedcounter;++/* ----------+ * PgStat_MsgResetsinglecounter Sent by the backend to tell the collector+ * to reset a single counter+ * ----------+ */+typedef struct PgStat_MsgResetsinglecounter+{+ PgStat_MsgHdr m_hdr;+ Oid m_databaseid;+ PgStat_Single_Reset_Type m_resettype;+ Oid m_objectid;+} PgStat_MsgResetsinglecounter;++/* ----------+ * PgStat_MsgAutovacStart Sent by the autovacuum daemon to signal+ * that a database is going to be processed+ * ----------+ */+typedef struct PgStat_MsgAutovacStart+{+ PgStat_MsgHdr m_hdr;+ Oid m_databaseid;+ TimestampTz m_start_time;+} PgStat_MsgAutovacStart;+++/* ----------+ * PgStat_MsgVacuum Sent by the backend or autovacuum daemon+ * after VACUUM+ * ----------+ */+typedef struct PgStat_MsgVacuum+{+ PgStat_MsgHdr m_hdr;+ Oid m_databaseid;+ Oid m_tableoid;+ bool m_autovacuum;+ TimestampTz m_vacuumtime;+ PgStat_Counter m_live_tuples;+ PgStat_Counter m_dead_tuples;+} PgStat_MsgVacuum;+++/* ----------+ * PgStat_MsgAnalyze Sent by the backend or autovacuum daemon+ * after ANALYZE+ * ----------+ */+typedef struct PgStat_MsgAnalyze+{+ PgStat_MsgHdr m_hdr;+ Oid m_databaseid;+ Oid m_tableoid;+ bool m_autovacuum;+ TimestampTz m_analyzetime;+ PgStat_Counter m_live_tuples;+ PgStat_Counter m_dead_tuples;+} PgStat_MsgAnalyze;+++/* ----------+ * PgStat_MsgArchiver Sent by the archiver to update statistics.+ * ----------+ */+typedef struct PgStat_MsgArchiver+{+ PgStat_MsgHdr m_hdr;+ bool m_failed; /* Failed attempt */+ char m_xlog[MAX_XFN_CHARS + 1];+ TimestampTz m_timestamp;+} PgStat_MsgArchiver;++/* ----------+ * PgStat_MsgBgWriter Sent by the bgwriter to update statistics.+ * ----------+ */+typedef struct PgStat_MsgBgWriter+{+ PgStat_MsgHdr m_hdr;++ PgStat_Counter m_timed_checkpoints;+ PgStat_Counter m_requested_checkpoints;+ PgStat_Counter m_buf_written_checkpoints;+ PgStat_Counter m_buf_written_clean;+ PgStat_Counter m_maxwritten_clean;+ PgStat_Counter m_buf_written_backend;+ PgStat_Counter m_buf_fsync_backend;+ PgStat_Counter m_buf_alloc;+ PgStat_Counter m_checkpoint_write_time; /* times in milliseconds */+ PgStat_Counter m_checkpoint_sync_time;+} PgStat_MsgBgWriter;++/* ----------+ * PgStat_MsgRecoveryConflict Sent by the backend upon recovery conflict+ * ----------+ */+typedef struct PgStat_MsgRecoveryConflict+{+ PgStat_MsgHdr m_hdr;++ Oid m_databaseid;+ int m_reason;+} PgStat_MsgRecoveryConflict;++/* ----------+ * PgStat_MsgTempFile Sent by the backend upon creating a temp file+ * ----------+ */+typedef struct PgStat_MsgTempFile+{+ PgStat_MsgHdr m_hdr;++ Oid m_databaseid;+ size_t m_filesize;+} PgStat_MsgTempFile;++/* ----------+ * PgStat_FunctionCounts The actual per-function counts kept by a backend+ *+ * This struct should contain only actual event counters, because we memcmp+ * it against zeroes to detect whether there are any counts to transmit.+ *+ * Note that the time counters are in instr_time format here. We convert to+ * microseconds in PgStat_Counter format when transmitting to the collector.+ * ----------+ */+typedef struct PgStat_FunctionCounts+{+ PgStat_Counter f_numcalls;+ instr_time f_total_time;+ instr_time f_self_time;+} PgStat_FunctionCounts;++/* ----------+ * PgStat_BackendFunctionEntry Entry in backend's per-function hash table+ * ----------+ */+typedef struct PgStat_BackendFunctionEntry+{+ Oid f_id;+ PgStat_FunctionCounts f_counts;+} PgStat_BackendFunctionEntry;++/* ----------+ * PgStat_FunctionEntry Per-function info in a MsgFuncstat+ * ----------+ */+typedef struct PgStat_FunctionEntry+{+ Oid f_id;+ PgStat_Counter f_numcalls;+ PgStat_Counter f_total_time; /* times in microseconds */+ PgStat_Counter f_self_time;+} PgStat_FunctionEntry;++/* ----------+ * PgStat_MsgFuncstat Sent by the backend to report function+ * usage statistics.+ * ----------+ */+#define PGSTAT_NUM_FUNCENTRIES \+ ((PGSTAT_MSG_PAYLOAD - sizeof(Oid) - sizeof(int)) \+ / sizeof(PgStat_FunctionEntry))++typedef struct PgStat_MsgFuncstat+{+ PgStat_MsgHdr m_hdr;+ Oid m_databaseid;+ int m_nentries;+ PgStat_FunctionEntry m_entry[PGSTAT_NUM_FUNCENTRIES];+} PgStat_MsgFuncstat;++/* ----------+ * PgStat_MsgFuncpurge Sent by the backend to tell the collector+ * about dead functions.+ * ----------+ */+#define PGSTAT_NUM_FUNCPURGE \+ ((PGSTAT_MSG_PAYLOAD - sizeof(Oid) - sizeof(int)) \+ / sizeof(Oid))++typedef struct PgStat_MsgFuncpurge+{+ PgStat_MsgHdr m_hdr;+ Oid m_databaseid;+ int m_nentries;+ Oid m_functionid[PGSTAT_NUM_FUNCPURGE];+} PgStat_MsgFuncpurge;++/* ----------+ * PgStat_MsgDeadlock Sent by the backend to tell the collector+ * about a deadlock that occurred.+ * ----------+ */+typedef struct PgStat_MsgDeadlock+{+ PgStat_MsgHdr m_hdr;+ Oid m_databaseid;+} PgStat_MsgDeadlock;+++/* ----------+ * PgStat_Msg Union over all possible messages.+ * ----------+ */+typedef union PgStat_Msg+{+ PgStat_MsgHdr msg_hdr;+ PgStat_MsgDummy msg_dummy;+ PgStat_MsgInquiry msg_inquiry;+ PgStat_MsgTabstat msg_tabstat;+ PgStat_MsgTabpurge msg_tabpurge;+ PgStat_MsgDropdb msg_dropdb;+ PgStat_MsgResetcounter msg_resetcounter;+ PgStat_MsgResetsharedcounter msg_resetsharedcounter;+ PgStat_MsgResetsinglecounter msg_resetsinglecounter;+ PgStat_MsgAutovacStart msg_autovacuum;+ PgStat_MsgVacuum msg_vacuum;+ PgStat_MsgAnalyze msg_analyze;+ PgStat_MsgArchiver msg_archiver;+ PgStat_MsgBgWriter msg_bgwriter;+ PgStat_MsgFuncstat msg_funcstat;+ PgStat_MsgFuncpurge msg_funcpurge;+ PgStat_MsgRecoveryConflict msg_recoveryconflict;+ PgStat_MsgDeadlock msg_deadlock;+} PgStat_Msg;+++/* ------------------------------------------------------------+ * Statistic collector data structures follow+ *+ * PGSTAT_FILE_FORMAT_ID should be changed whenever any of these+ * data structures change.+ * ------------------------------------------------------------+ */++#define PGSTAT_FILE_FORMAT_ID 0x01A5BC9D++/* ----------+ * PgStat_StatDBEntry The collector's data per database+ * ----------+ */+typedef struct PgStat_StatDBEntry+{+ Oid databaseid;+ PgStat_Counter n_xact_commit;+ PgStat_Counter n_xact_rollback;+ PgStat_Counter n_blocks_fetched;+ PgStat_Counter n_blocks_hit;+ PgStat_Counter n_tuples_returned;+ PgStat_Counter n_tuples_fetched;+ PgStat_Counter n_tuples_inserted;+ PgStat_Counter n_tuples_updated;+ PgStat_Counter n_tuples_deleted;+ TimestampTz last_autovac_time;+ PgStat_Counter n_conflict_tablespace;+ PgStat_Counter n_conflict_lock;+ PgStat_Counter n_conflict_snapshot;+ PgStat_Counter n_conflict_bufferpin;+ PgStat_Counter n_conflict_startup_deadlock;+ PgStat_Counter n_temp_files;+ PgStat_Counter n_temp_bytes;+ PgStat_Counter n_deadlocks;+ PgStat_Counter n_block_read_time; /* times in microseconds */+ PgStat_Counter n_block_write_time;++ TimestampTz stat_reset_timestamp;+ TimestampTz stats_timestamp; /* time of db stats file update */++ /*+ * tables and functions must be last in the struct, because we don't write+ * the pointers out to the stats file.+ */+ HTAB *tables;+ HTAB *functions;+} PgStat_StatDBEntry;+++/* ----------+ * PgStat_StatTabEntry The collector's data per table (or index)+ * ----------+ */+typedef struct PgStat_StatTabEntry+{+ Oid tableid;++ PgStat_Counter numscans;++ PgStat_Counter tuples_returned;+ PgStat_Counter tuples_fetched;++ PgStat_Counter tuples_inserted;+ PgStat_Counter tuples_updated;+ PgStat_Counter tuples_deleted;+ PgStat_Counter tuples_hot_updated;++ PgStat_Counter n_live_tuples;+ PgStat_Counter n_dead_tuples;+ PgStat_Counter changes_since_analyze;++ PgStat_Counter blocks_fetched;+ PgStat_Counter blocks_hit;++ TimestampTz vacuum_timestamp; /* user initiated vacuum */+ PgStat_Counter vacuum_count;+ TimestampTz autovac_vacuum_timestamp; /* autovacuum initiated */+ PgStat_Counter autovac_vacuum_count;+ TimestampTz analyze_timestamp; /* user initiated */+ PgStat_Counter analyze_count;+ TimestampTz autovac_analyze_timestamp; /* autovacuum initiated */+ PgStat_Counter autovac_analyze_count;+} PgStat_StatTabEntry;+++/* ----------+ * PgStat_StatFuncEntry The collector's data per function+ * ----------+ */+typedef struct PgStat_StatFuncEntry+{+ Oid functionid;++ PgStat_Counter f_numcalls;++ PgStat_Counter f_total_time; /* times in microseconds */+ PgStat_Counter f_self_time;+} PgStat_StatFuncEntry;+++/*+ * Archiver statistics kept in the stats collector+ */+typedef struct PgStat_ArchiverStats+{+ PgStat_Counter archived_count; /* archival successes */+ char last_archived_wal[MAX_XFN_CHARS + 1]; /* last WAL file+ * archived */+ TimestampTz last_archived_timestamp; /* last archival success time */+ PgStat_Counter failed_count; /* failed archival attempts */+ char last_failed_wal[MAX_XFN_CHARS + 1]; /* WAL file involved in+ * last failure */+ TimestampTz last_failed_timestamp; /* last archival failure time */+ TimestampTz stat_reset_timestamp;+} PgStat_ArchiverStats;++/*+ * Global statistics kept in the stats collector+ */+typedef struct PgStat_GlobalStats+{+ TimestampTz stats_timestamp; /* time of stats file update */+ PgStat_Counter timed_checkpoints;+ PgStat_Counter requested_checkpoints;+ PgStat_Counter checkpoint_write_time; /* times in milliseconds */+ PgStat_Counter checkpoint_sync_time;+ PgStat_Counter buf_written_checkpoints;+ PgStat_Counter buf_written_clean;+ PgStat_Counter maxwritten_clean;+ PgStat_Counter buf_written_backend;+ PgStat_Counter buf_fsync_backend;+ PgStat_Counter buf_alloc;+ TimestampTz stat_reset_timestamp;+} PgStat_GlobalStats;+++/* ----------+ * Backend states+ * ----------+ */+typedef enum BackendState+{+ STATE_UNDEFINED,+ STATE_IDLE,+ STATE_RUNNING,+ STATE_IDLEINTRANSACTION,+ STATE_FASTPATH,+ STATE_IDLEINTRANSACTION_ABORTED,+ STATE_DISABLED+} BackendState;++/* ----------+ * Shared-memory data structures+ * ----------+ */+++/*+ * PgBackendSSLStatus+ *+ * For each backend, we keep the SSL status in a separate struct, that+ * is only filled in if SSL is enabled.+ */+typedef struct PgBackendSSLStatus+{+ /* Information about SSL connection */+ int ssl_bits;+ bool ssl_compression;+ char ssl_version[NAMEDATALEN]; /* MUST be null-terminated */+ char ssl_cipher[NAMEDATALEN]; /* MUST be null-terminated */+ char ssl_clientdn[NAMEDATALEN]; /* MUST be null-terminated */+} PgBackendSSLStatus;+++/* ----------+ * PgBackendStatus+ *+ * Each live backend maintains a PgBackendStatus struct in shared memory+ * showing its current activity. (The structs are allocated according to+ * BackendId, but that is not critical.) Note that the collector process+ * has no involvement in, or even access to, these structs.+ * ----------+ */+typedef struct PgBackendStatus+{+ /*+ * To avoid locking overhead, we use the following protocol: a backend+ * increments st_changecount before modifying its entry, and again after+ * finishing a modification. A would-be reader should note the value of+ * st_changecount, copy the entry into private memory, then check+ * st_changecount again. If the value hasn't changed, and if it's even,+ * the copy is valid; otherwise start over. This makes updates cheap+ * while reads are potentially expensive, but that's the tradeoff we want.+ *+ * The above protocol needs the memory barriers to ensure that the+ * apparent order of execution is as it desires. Otherwise, for example,+ * the CPU might rearrange the code so that st_changecount is incremented+ * twice before the modification on a machine with weak memory ordering.+ * This surprising result can lead to bugs.+ */+ int st_changecount;++ /* The entry is valid iff st_procpid > 0, unused if st_procpid == 0 */+ int st_procpid;++ /* Times when current backend, transaction, and activity started */+ TimestampTz st_proc_start_timestamp;+ TimestampTz st_xact_start_timestamp;+ TimestampTz st_activity_start_timestamp;+ TimestampTz st_state_start_timestamp;++ /* Database OID, owning user's OID, connection client address */+ Oid st_databaseid;+ Oid st_userid;+ SockAddr st_clientaddr;+ char *st_clienthostname; /* MUST be null-terminated */++ /* Information about SSL connection */+ bool st_ssl;+ PgBackendSSLStatus *st_sslstatus;++ /* Is backend currently waiting on an lmgr lock? */+ bool st_waiting;++ /* current state */+ BackendState st_state;++ /* application name; MUST be null-terminated */+ char *st_appname;++ /* current command string; MUST be null-terminated */+ char *st_activity;+} PgBackendStatus;++/*+ * Macros to load and store st_changecount with the memory barriers.+ *+ * pgstat_increment_changecount_before() and+ * pgstat_increment_changecount_after() need to be called before and after+ * PgBackendStatus entries are modified, respectively. This makes sure that+ * st_changecount is incremented around the modification.+ *+ * Also pgstat_save_changecount_before() and pgstat_save_changecount_after()+ * need to be called before and after PgBackendStatus entries are copied into+ * private memory, respectively.+ */+#define pgstat_increment_changecount_before(beentry) \+ do { \+ beentry->st_changecount++; \+ pg_write_barrier(); \+ } while (0)++#define pgstat_increment_changecount_after(beentry) \+ do { \+ pg_write_barrier(); \+ beentry->st_changecount++; \+ Assert((beentry->st_changecount & 1) == 0); \+ } while (0)++#define pgstat_save_changecount_before(beentry, save_changecount) \+ do { \+ save_changecount = beentry->st_changecount; \+ pg_read_barrier(); \+ } while (0)++#define pgstat_save_changecount_after(beentry, save_changecount) \+ do { \+ pg_read_barrier(); \+ save_changecount = beentry->st_changecount; \+ } while (0)++/* ----------+ * LocalPgBackendStatus+ *+ * When we build the backend status array, we use LocalPgBackendStatus to be+ * able to add new values to the struct when needed without adding new fields+ * to the shared memory. It contains the backend status as a first member.+ * ----------+ */+typedef struct LocalPgBackendStatus+{+ /*+ * Local version of the backend status entry.+ */+ PgBackendStatus backendStatus;++ /*+ * The xid of the current transaction if available, InvalidTransactionId+ * if not.+ */+ TransactionId backend_xid;++ /*+ * The xmin of the current session if available, InvalidTransactionId if+ * not.+ */+ TransactionId backend_xmin;+} LocalPgBackendStatus;++/*+ * Working state needed to accumulate per-function-call timing statistics.+ */+typedef struct PgStat_FunctionCallUsage+{+ /* Link to function's hashtable entry (must still be there at exit!) */+ /* NULL means we are not tracking the current function call */+ PgStat_FunctionCounts *fs;+ /* Total time previously charged to function, as of function start */+ instr_time save_f_total_time;+ /* Backend-wide total time as of function start */+ instr_time save_total;+ /* system clock as of function start */+ instr_time f_start;+} PgStat_FunctionCallUsage;+++/* ----------+ * GUC parameters+ * ----------+ */+extern bool pgstat_track_activities;+extern bool pgstat_track_counts;+extern int pgstat_track_functions;+extern PGDLLIMPORT int pgstat_track_activity_query_size;+extern char *pgstat_stat_directory;+extern char *pgstat_stat_tmpname;+extern char *pgstat_stat_filename;++/*+ * BgWriter statistics counters are updated directly by bgwriter and bufmgr+ */+extern PgStat_MsgBgWriter BgWriterStats;++/*+ * Updated by pgstat_count_buffer_*_time macros+ */+extern PgStat_Counter pgStatBlockReadTime;+extern PgStat_Counter pgStatBlockWriteTime;++/* ----------+ * Functions called from postmaster+ * ----------+ */+extern Size BackendStatusShmemSize(void);+extern void CreateSharedBackendStatus(void);++extern void pgstat_init(void);+extern int pgstat_start(void);+extern void pgstat_reset_all(void);+extern void allow_immediate_pgstat_restart(void);++#ifdef EXEC_BACKEND+extern void PgstatCollectorMain(int argc, char *argv[]) pg_attribute_noreturn();+#endif+++/* ----------+ * Functions called from backends+ * ----------+ */+extern void pgstat_ping(void);++extern void pgstat_report_stat(bool force);+extern void pgstat_vacuum_stat(void);+extern void pgstat_drop_database(Oid databaseid);++extern void pgstat_clear_snapshot(void);+extern void pgstat_reset_counters(void);+extern void pgstat_reset_shared_counters(const char *);+extern void pgstat_reset_single_counter(Oid objectid, PgStat_Single_Reset_Type type);++extern void pgstat_report_autovac(Oid dboid);+extern void pgstat_report_vacuum(Oid tableoid, bool shared,+ PgStat_Counter livetuples, PgStat_Counter deadtuples);+extern void pgstat_report_analyze(Relation rel,+ PgStat_Counter livetuples, PgStat_Counter deadtuples);++extern void pgstat_report_recovery_conflict(int reason);+extern void pgstat_report_deadlock(void);++extern void pgstat_initialize(void);+extern void pgstat_bestart(void);++extern void pgstat_report_activity(BackendState state, const char *cmd_str);+extern void pgstat_report_tempfile(size_t filesize);+extern void pgstat_report_appname(const char *appname);+extern void pgstat_report_xact_timestamp(TimestampTz tstamp);+extern void pgstat_report_waiting(bool waiting);+extern const char *pgstat_get_backend_current_activity(int pid, bool checkUser);+extern const char *pgstat_get_crashed_backend_activity(int pid, char *buffer,+ int buflen);++extern PgStat_TableStatus *find_tabstat_entry(Oid rel_id);+extern PgStat_BackendFunctionEntry *find_funcstat_entry(Oid func_id);++extern void pgstat_initstats(Relation rel);++/* nontransactional event counts are simple enough to inline */++#define pgstat_count_heap_scan(rel) \+ do { \+ if ((rel)->pgstat_info != NULL) \+ (rel)->pgstat_info->t_counts.t_numscans++; \+ } while (0)+#define pgstat_count_heap_getnext(rel) \+ do { \+ if ((rel)->pgstat_info != NULL) \+ (rel)->pgstat_info->t_counts.t_tuples_returned++; \+ } while (0)+#define pgstat_count_heap_fetch(rel) \+ do { \+ if ((rel)->pgstat_info != NULL) \+ (rel)->pgstat_info->t_counts.t_tuples_fetched++; \+ } while (0)+#define pgstat_count_index_scan(rel) \+ do { \+ if ((rel)->pgstat_info != NULL) \+ (rel)->pgstat_info->t_counts.t_numscans++; \+ } while (0)+#define pgstat_count_index_tuples(rel, n) \+ do { \+ if ((rel)->pgstat_info != NULL) \+ (rel)->pgstat_info->t_counts.t_tuples_returned += (n); \+ } while (0)+#define pgstat_count_buffer_read(rel) \+ do { \+ if ((rel)->pgstat_info != NULL) \+ (rel)->pgstat_info->t_counts.t_blocks_fetched++; \+ } while (0)+#define pgstat_count_buffer_hit(rel) \+ do { \+ if ((rel)->pgstat_info != NULL) \+ (rel)->pgstat_info->t_counts.t_blocks_hit++; \+ } while (0)+#define pgstat_count_buffer_read_time(n) \+ (pgStatBlockReadTime += (n))+#define pgstat_count_buffer_write_time(n) \+ (pgStatBlockWriteTime += (n))++extern void pgstat_count_heap_insert(Relation rel, int n);+extern void pgstat_count_heap_update(Relation rel, bool hot);+extern void pgstat_count_heap_delete(Relation rel);+extern void pgstat_count_truncate(Relation rel);+extern void pgstat_update_heap_dead_tuples(Relation rel, int delta);++extern void pgstat_init_function_usage(FunctionCallInfoData *fcinfo,+ PgStat_FunctionCallUsage *fcu);+extern void pgstat_end_function_usage(PgStat_FunctionCallUsage *fcu,+ bool finalize);++extern void AtEOXact_PgStat(bool isCommit);+extern void AtEOSubXact_PgStat(bool isCommit, int nestDepth);++extern void AtPrepare_PgStat(void);+extern void PostPrepare_PgStat(void);++extern void pgstat_twophase_postcommit(TransactionId xid, uint16 info,+ void *recdata, uint32 len);+extern void pgstat_twophase_postabort(TransactionId xid, uint16 info,+ void *recdata, uint32 len);++extern void pgstat_send_archiver(const char *xlog, bool failed);+extern void pgstat_send_bgwriter(void);++/* ----------+ * Support functions for the SQL-callable functions to+ * generate the pgstat* views.+ * ----------+ */+extern PgStat_StatDBEntry *pgstat_fetch_stat_dbentry(Oid dbid);+extern PgStat_StatTabEntry *pgstat_fetch_stat_tabentry(Oid relid);+extern PgBackendStatus *pgstat_fetch_stat_beentry(int beid);+extern LocalPgBackendStatus *pgstat_fetch_stat_local_beentry(int beid);+extern PgStat_StatFuncEntry *pgstat_fetch_stat_funcentry(Oid funcid);+extern int pgstat_fetch_stat_numbackends(void);+extern PgStat_ArchiverStats *pgstat_fetch_stat_archiver(void);+extern PgStat_GlobalStats *pgstat_fetch_global(void);++#endif /* PGSTAT_H */
+ foreign/libpg_query/src/postgres/include/pgtime.h view
@@ -0,0 +1,84 @@+/*-------------------------------------------------------------------------+ *+ * pgtime.h+ * PostgreSQL internal timezone library+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ *+ * IDENTIFICATION+ * src/include/pgtime.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef _PGTIME_H+#define _PGTIME_H+++/*+ * The API of this library is generally similar to the corresponding+ * C library functions, except that we use pg_time_t which (we hope) is+ * 64 bits wide, and which is most definitely signed not unsigned.+ */++typedef int64 pg_time_t;++struct pg_tm+{+ int tm_sec;+ int tm_min;+ int tm_hour;+ int tm_mday;+ int tm_mon; /* origin 0, not 1 */+ int tm_year; /* relative to 1900 */+ int tm_wday;+ int tm_yday;+ int tm_isdst;+ long int tm_gmtoff;+ const char *tm_zone;+};++typedef struct pg_tz pg_tz;+typedef struct pg_tzenum pg_tzenum;++/* Maximum length of a timezone name (not including trailing null) */+#define TZ_STRLEN_MAX 255++/* these functions are in localtime.c */++extern struct pg_tm *pg_localtime(const pg_time_t *timep, const pg_tz *tz);+extern struct pg_tm *pg_gmtime(const pg_time_t *timep);+extern int pg_next_dst_boundary(const pg_time_t *timep,+ long int *before_gmtoff,+ int *before_isdst,+ pg_time_t *boundary,+ long int *after_gmtoff,+ int *after_isdst,+ const pg_tz *tz);+extern bool pg_interpret_timezone_abbrev(const char *abbrev,+ const pg_time_t *timep,+ long int *gmtoff,+ int *isdst,+ const pg_tz *tz);+extern bool pg_get_timezone_offset(const pg_tz *tz, long int *gmtoff);+extern const char *pg_get_timezone_name(pg_tz *tz);+extern bool pg_tz_acceptable(pg_tz *tz);++/* these functions are in strftime.c */++extern size_t pg_strftime(char *s, size_t max, const char *format,+ const struct pg_tm * tm);++/* these functions and variables are in pgtz.c */++extern pg_tz *session_timezone;+extern pg_tz *log_timezone;++extern void pg_timezone_initialize(void);+extern pg_tz *pg_tzset(const char *tzname);+extern pg_tz *pg_tzset_offset(long gmtoffset);++extern pg_tzenum *pg_tzenumerate_start(void);+extern pg_tz *pg_tzenumerate_next(pg_tzenum *dir);+extern void pg_tzenumerate_end(pg_tzenum *dir);++#endif /* _PGTIME_H */
+ foreign/libpg_query/src/postgres/include/pl_gram.h view
@@ -0,0 +1,251 @@+/* A Bison parser, made by GNU Bison 3.0.2. */++/* Bison interface for Yacc-like parsers in C++ Copyright (C) 1984, 1989-1990, 2000-2013 Free Software Foundation, Inc.++ This program is free software: you can redistribute it and/or modify+ it under the terms of the GNU General Public License as published by+ the Free Software Foundation, either version 3 of the License, or+ (at your option) any later version.++ This program is distributed in the hope that it will be useful,+ but WITHOUT ANY WARRANTY; without even the implied warranty of+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the+ GNU General Public License for more details.++ You should have received a copy of the GNU General Public License+ along with this program. If not, see <http://www.gnu.org/licenses/>. */++/* As a special exception, you may create a larger work that contains+ part or all of the Bison parser skeleton and distribute that work+ under terms of your choice, so long as that work isn't itself a+ parser generator using the skeleton or a modified version thereof+ as a parser skeleton. Alternatively, if you modify or redistribute+ the parser skeleton itself, you may (at your option) remove this+ special exception, which will cause the skeleton and the resulting+ Bison output files to be licensed under the GNU General Public+ License without this special exception.++ This special exception was added by the Free Software Foundation in+ version 2.2 of Bison. */++#ifndef YY_PLPGSQL_YY_PL_GRAM_H_INCLUDED+# define YY_PLPGSQL_YY_PL_GRAM_H_INCLUDED+/* Debug traces. */+#ifndef YYDEBUG+# define YYDEBUG 0+#endif+#if YYDEBUG+extern int plpgsql_yydebug;+#endif++/* Token type. */+#ifndef YYTOKENTYPE+# define YYTOKENTYPE+ enum yytokentype+ {+ IDENT = 258,+ FCONST = 259,+ SCONST = 260,+ BCONST = 261,+ XCONST = 262,+ Op = 263,+ ICONST = 264,+ PARAM = 265,+ TYPECAST = 266,+ DOT_DOT = 267,+ COLON_EQUALS = 268,+ EQUALS_GREATER = 269,+ LESS_EQUALS = 270,+ GREATER_EQUALS = 271,+ NOT_EQUALS = 272,+ T_WORD = 273,+ T_CWORD = 274,+ T_DATUM = 275,+ LESS_LESS = 276,+ GREATER_GREATER = 277,+ K_ABSOLUTE = 278,+ K_ALIAS = 279,+ K_ALL = 280,+ K_ARRAY = 281,+ K_ASSERT = 282,+ K_BACKWARD = 283,+ K_BEGIN = 284,+ K_BY = 285,+ K_CASE = 286,+ K_CLOSE = 287,+ K_COLLATE = 288,+ K_COLUMN = 289,+ K_COLUMN_NAME = 290,+ K_CONSTANT = 291,+ K_CONSTRAINT = 292,+ K_CONSTRAINT_NAME = 293,+ K_CONTINUE = 294,+ K_CURRENT = 295,+ K_CURSOR = 296,+ K_DATATYPE = 297,+ K_DEBUG = 298,+ K_DECLARE = 299,+ K_DEFAULT = 300,+ K_DETAIL = 301,+ K_DIAGNOSTICS = 302,+ K_DUMP = 303,+ K_ELSE = 304,+ K_ELSIF = 305,+ K_END = 306,+ K_ERRCODE = 307,+ K_ERROR = 308,+ K_EXCEPTION = 309,+ K_EXECUTE = 310,+ K_EXIT = 311,+ K_FETCH = 312,+ K_FIRST = 313,+ K_FOR = 314,+ K_FOREACH = 315,+ K_FORWARD = 316,+ K_FROM = 317,+ K_GET = 318,+ K_HINT = 319,+ K_IF = 320,+ K_IN = 321,+ K_INFO = 322,+ K_INSERT = 323,+ K_INTO = 324,+ K_IS = 325,+ K_LAST = 326,+ K_LOG = 327,+ K_LOOP = 328,+ K_MESSAGE = 329,+ K_MESSAGE_TEXT = 330,+ K_MOVE = 331,+ K_NEXT = 332,+ K_NO = 333,+ K_NOT = 334,+ K_NOTICE = 335,+ K_NULL = 336,+ K_OPEN = 337,+ K_OPTION = 338,+ K_OR = 339,+ K_PERFORM = 340,+ K_PG_CONTEXT = 341,+ K_PG_DATATYPE_NAME = 342,+ K_PG_EXCEPTION_CONTEXT = 343,+ K_PG_EXCEPTION_DETAIL = 344,+ K_PG_EXCEPTION_HINT = 345,+ K_PRINT_STRICT_PARAMS = 346,+ K_PRIOR = 347,+ K_QUERY = 348,+ K_RAISE = 349,+ K_RELATIVE = 350,+ K_RESULT_OID = 351,+ K_RETURN = 352,+ K_RETURNED_SQLSTATE = 353,+ K_REVERSE = 354,+ K_ROW_COUNT = 355,+ K_ROWTYPE = 356,+ K_SCHEMA = 357,+ K_SCHEMA_NAME = 358,+ K_SCROLL = 359,+ K_SLICE = 360,+ K_SQLSTATE = 361,+ K_STACKED = 362,+ K_STRICT = 363,+ K_TABLE = 364,+ K_TABLE_NAME = 365,+ K_THEN = 366,+ K_TO = 367,+ K_TYPE = 368,+ K_USE_COLUMN = 369,+ K_USE_VARIABLE = 370,+ K_USING = 371,+ K_VARIABLE_CONFLICT = 372,+ K_WARNING = 373,+ K_WHEN = 374,+ K_WHILE = 375+ };+#endif++/* Value type. */+#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED+typedef union YYSTYPE YYSTYPE;+union YYSTYPE+{+#line 117 "pl_gram.y" /* yacc.c:1909 */++ core_YYSTYPE core_yystype;+ /* these fields must match core_YYSTYPE: */+ int ival;+ char *str;+ const char *keyword;++ PLword word;+ PLcword cword;+ PLwdatum wdatum;+ bool boolean;+ Oid oid;+ struct+ {+ char *name;+ int lineno;+ } varname;+ struct+ {+ char *name;+ int lineno;+ PLpgSQL_datum *scalar;+ PLpgSQL_rec *rec;+ PLpgSQL_row *row;+ } forvariable;+ struct+ {+ char *label;+ int n_initvars;+ int *initvarnos;+ } declhdr;+ struct+ {+ List *stmts;+ char *end_label;+ int end_label_location;+ } loop_body;+ List *list;+ PLpgSQL_type *dtype;+ PLpgSQL_datum *datum;+ PLpgSQL_var *var;+ PLpgSQL_expr *expr;+ PLpgSQL_stmt *stmt;+ PLpgSQL_condition *condition;+ PLpgSQL_exception *exception;+ PLpgSQL_exception_block *exception_block;+ PLpgSQL_nsitem *nsitem;+ PLpgSQL_diag_item *diagitem;+ PLpgSQL_stmt_fetch *fetch;+ PLpgSQL_case_when *casewhen;++#line 227 "pl_gram.h" /* yacc.c:1909 */+};+# define YYSTYPE_IS_TRIVIAL 1+# define YYSTYPE_IS_DECLARED 1+#endif++/* Location type. */+#if ! defined YYLTYPE && ! defined YYLTYPE_IS_DECLARED+typedef struct YYLTYPE YYLTYPE;+struct YYLTYPE+{+ int first_line;+ int first_column;+ int last_line;+ int last_column;+};+# define YYLTYPE_IS_DECLARED 1+# define YYLTYPE_IS_TRIVIAL 1+#endif+++extern __thread YYSTYPE plpgsql_yylval;+extern __thread YYLTYPE plpgsql_yylloc;+int plpgsql_yyparse (void);++#endif /* !YY_PLPGSQL_YY_PL_GRAM_H_INCLUDED */
+ foreign/libpg_query/src/postgres/include/plerrcodes.h view
@@ -0,0 +1,902 @@+/* autogenerated from src/backend/utils/errcodes.txt, do not edit */+/* there is deliberately not an #ifndef PLERRCODES_H here */+{+ "sql_statement_not_yet_complete", ERRCODE_SQL_STATEMENT_NOT_YET_COMPLETE+},++{+ "connection_exception", ERRCODE_CONNECTION_EXCEPTION+},++{+ "connection_does_not_exist", ERRCODE_CONNECTION_DOES_NOT_EXIST+},++{+ "connection_failure", ERRCODE_CONNECTION_FAILURE+},++{+ "sqlclient_unable_to_establish_sqlconnection", ERRCODE_SQLCLIENT_UNABLE_TO_ESTABLISH_SQLCONNECTION+},++{+ "sqlserver_rejected_establishment_of_sqlconnection", ERRCODE_SQLSERVER_REJECTED_ESTABLISHMENT_OF_SQLCONNECTION+},++{+ "transaction_resolution_unknown", ERRCODE_TRANSACTION_RESOLUTION_UNKNOWN+},++{+ "protocol_violation", ERRCODE_PROTOCOL_VIOLATION+},++{+ "triggered_action_exception", ERRCODE_TRIGGERED_ACTION_EXCEPTION+},++{+ "feature_not_supported", ERRCODE_FEATURE_NOT_SUPPORTED+},++{+ "invalid_transaction_initiation", ERRCODE_INVALID_TRANSACTION_INITIATION+},++{+ "locator_exception", ERRCODE_LOCATOR_EXCEPTION+},++{+ "invalid_locator_specification", ERRCODE_L_E_INVALID_SPECIFICATION+},++{+ "invalid_grantor", ERRCODE_INVALID_GRANTOR+},++{+ "invalid_grant_operation", ERRCODE_INVALID_GRANT_OPERATION+},++{+ "invalid_role_specification", ERRCODE_INVALID_ROLE_SPECIFICATION+},++{+ "diagnostics_exception", ERRCODE_DIAGNOSTICS_EXCEPTION+},++{+ "stacked_diagnostics_accessed_without_active_handler", ERRCODE_STACKED_DIAGNOSTICS_ACCESSED_WITHOUT_ACTIVE_HANDLER+},++{+ "case_not_found", ERRCODE_CASE_NOT_FOUND+},++{+ "cardinality_violation", ERRCODE_CARDINALITY_VIOLATION+},++{+ "data_exception", ERRCODE_DATA_EXCEPTION+},++{+ "array_subscript_error", ERRCODE_ARRAY_SUBSCRIPT_ERROR+},++{+ "character_not_in_repertoire", ERRCODE_CHARACTER_NOT_IN_REPERTOIRE+},++{+ "datetime_field_overflow", ERRCODE_DATETIME_FIELD_OVERFLOW+},++{+ "division_by_zero", ERRCODE_DIVISION_BY_ZERO+},++{+ "error_in_assignment", ERRCODE_ERROR_IN_ASSIGNMENT+},++{+ "escape_character_conflict", ERRCODE_ESCAPE_CHARACTER_CONFLICT+},++{+ "indicator_overflow", ERRCODE_INDICATOR_OVERFLOW+},++{+ "interval_field_overflow", ERRCODE_INTERVAL_FIELD_OVERFLOW+},++{+ "invalid_argument_for_logarithm", ERRCODE_INVALID_ARGUMENT_FOR_LOG+},++{+ "invalid_argument_for_ntile_function", ERRCODE_INVALID_ARGUMENT_FOR_NTILE+},++{+ "invalid_argument_for_nth_value_function", ERRCODE_INVALID_ARGUMENT_FOR_NTH_VALUE+},++{+ "invalid_argument_for_power_function", ERRCODE_INVALID_ARGUMENT_FOR_POWER_FUNCTION+},++{+ "invalid_argument_for_width_bucket_function", ERRCODE_INVALID_ARGUMENT_FOR_WIDTH_BUCKET_FUNCTION+},++{+ "invalid_character_value_for_cast", ERRCODE_INVALID_CHARACTER_VALUE_FOR_CAST+},++{+ "invalid_datetime_format", ERRCODE_INVALID_DATETIME_FORMAT+},++{+ "invalid_escape_character", ERRCODE_INVALID_ESCAPE_CHARACTER+},++{+ "invalid_escape_octet", ERRCODE_INVALID_ESCAPE_OCTET+},++{+ "invalid_escape_sequence", ERRCODE_INVALID_ESCAPE_SEQUENCE+},++{+ "nonstandard_use_of_escape_character", ERRCODE_NONSTANDARD_USE_OF_ESCAPE_CHARACTER+},++{+ "invalid_indicator_parameter_value", ERRCODE_INVALID_INDICATOR_PARAMETER_VALUE+},++{+ "invalid_parameter_value", ERRCODE_INVALID_PARAMETER_VALUE+},++{+ "invalid_regular_expression", ERRCODE_INVALID_REGULAR_EXPRESSION+},++{+ "invalid_row_count_in_limit_clause", ERRCODE_INVALID_ROW_COUNT_IN_LIMIT_CLAUSE+},++{+ "invalid_row_count_in_result_offset_clause", ERRCODE_INVALID_ROW_COUNT_IN_RESULT_OFFSET_CLAUSE+},++{+ "invalid_tablesample_argument", ERRCODE_INVALID_TABLESAMPLE_ARGUMENT+},++{+ "invalid_tablesample_repeat", ERRCODE_INVALID_TABLESAMPLE_REPEAT+},++{+ "invalid_time_zone_displacement_value", ERRCODE_INVALID_TIME_ZONE_DISPLACEMENT_VALUE+},++{+ "invalid_use_of_escape_character", ERRCODE_INVALID_USE_OF_ESCAPE_CHARACTER+},++{+ "most_specific_type_mismatch", ERRCODE_MOST_SPECIFIC_TYPE_MISMATCH+},++{+ "null_value_not_allowed", ERRCODE_NULL_VALUE_NOT_ALLOWED+},++{+ "null_value_no_indicator_parameter", ERRCODE_NULL_VALUE_NO_INDICATOR_PARAMETER+},++{+ "numeric_value_out_of_range", ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE+},++{+ "string_data_length_mismatch", ERRCODE_STRING_DATA_LENGTH_MISMATCH+},++{+ "string_data_right_truncation", ERRCODE_STRING_DATA_RIGHT_TRUNCATION+},++{+ "substring_error", ERRCODE_SUBSTRING_ERROR+},++{+ "trim_error", ERRCODE_TRIM_ERROR+},++{+ "unterminated_c_string", ERRCODE_UNTERMINATED_C_STRING+},++{+ "zero_length_character_string", ERRCODE_ZERO_LENGTH_CHARACTER_STRING+},++{+ "floating_point_exception", ERRCODE_FLOATING_POINT_EXCEPTION+},++{+ "invalid_text_representation", ERRCODE_INVALID_TEXT_REPRESENTATION+},++{+ "invalid_binary_representation", ERRCODE_INVALID_BINARY_REPRESENTATION+},++{+ "bad_copy_file_format", ERRCODE_BAD_COPY_FILE_FORMAT+},++{+ "untranslatable_character", ERRCODE_UNTRANSLATABLE_CHARACTER+},++{+ "not_an_xml_document", ERRCODE_NOT_AN_XML_DOCUMENT+},++{+ "invalid_xml_document", ERRCODE_INVALID_XML_DOCUMENT+},++{+ "invalid_xml_content", ERRCODE_INVALID_XML_CONTENT+},++{+ "invalid_xml_comment", ERRCODE_INVALID_XML_COMMENT+},++{+ "invalid_xml_processing_instruction", ERRCODE_INVALID_XML_PROCESSING_INSTRUCTION+},++{+ "integrity_constraint_violation", ERRCODE_INTEGRITY_CONSTRAINT_VIOLATION+},++{+ "restrict_violation", ERRCODE_RESTRICT_VIOLATION+},++{+ "not_null_violation", ERRCODE_NOT_NULL_VIOLATION+},++{+ "foreign_key_violation", ERRCODE_FOREIGN_KEY_VIOLATION+},++{+ "unique_violation", ERRCODE_UNIQUE_VIOLATION+},++{+ "check_violation", ERRCODE_CHECK_VIOLATION+},++{+ "exclusion_violation", ERRCODE_EXCLUSION_VIOLATION+},++{+ "invalid_cursor_state", ERRCODE_INVALID_CURSOR_STATE+},++{+ "invalid_transaction_state", ERRCODE_INVALID_TRANSACTION_STATE+},++{+ "active_sql_transaction", ERRCODE_ACTIVE_SQL_TRANSACTION+},++{+ "branch_transaction_already_active", ERRCODE_BRANCH_TRANSACTION_ALREADY_ACTIVE+},++{+ "held_cursor_requires_same_isolation_level", ERRCODE_HELD_CURSOR_REQUIRES_SAME_ISOLATION_LEVEL+},++{+ "inappropriate_access_mode_for_branch_transaction", ERRCODE_INAPPROPRIATE_ACCESS_MODE_FOR_BRANCH_TRANSACTION+},++{+ "inappropriate_isolation_level_for_branch_transaction", ERRCODE_INAPPROPRIATE_ISOLATION_LEVEL_FOR_BRANCH_TRANSACTION+},++{+ "no_active_sql_transaction_for_branch_transaction", ERRCODE_NO_ACTIVE_SQL_TRANSACTION_FOR_BRANCH_TRANSACTION+},++{+ "read_only_sql_transaction", ERRCODE_READ_ONLY_SQL_TRANSACTION+},++{+ "schema_and_data_statement_mixing_not_supported", ERRCODE_SCHEMA_AND_DATA_STATEMENT_MIXING_NOT_SUPPORTED+},++{+ "no_active_sql_transaction", ERRCODE_NO_ACTIVE_SQL_TRANSACTION+},++{+ "in_failed_sql_transaction", ERRCODE_IN_FAILED_SQL_TRANSACTION+},++{+ "invalid_sql_statement_name", ERRCODE_INVALID_SQL_STATEMENT_NAME+},++{+ "triggered_data_change_violation", ERRCODE_TRIGGERED_DATA_CHANGE_VIOLATION+},++{+ "invalid_authorization_specification", ERRCODE_INVALID_AUTHORIZATION_SPECIFICATION+},++{+ "invalid_password", ERRCODE_INVALID_PASSWORD+},++{+ "dependent_privilege_descriptors_still_exist", ERRCODE_DEPENDENT_PRIVILEGE_DESCRIPTORS_STILL_EXIST+},++{+ "dependent_objects_still_exist", ERRCODE_DEPENDENT_OBJECTS_STILL_EXIST+},++{+ "invalid_transaction_termination", ERRCODE_INVALID_TRANSACTION_TERMINATION+},++{+ "sql_routine_exception", ERRCODE_SQL_ROUTINE_EXCEPTION+},++{+ "function_executed_no_return_statement", ERRCODE_S_R_E_FUNCTION_EXECUTED_NO_RETURN_STATEMENT+},++{+ "modifying_sql_data_not_permitted", ERRCODE_S_R_E_MODIFYING_SQL_DATA_NOT_PERMITTED+},++{+ "prohibited_sql_statement_attempted", ERRCODE_S_R_E_PROHIBITED_SQL_STATEMENT_ATTEMPTED+},++{+ "reading_sql_data_not_permitted", ERRCODE_S_R_E_READING_SQL_DATA_NOT_PERMITTED+},++{+ "invalid_cursor_name", ERRCODE_INVALID_CURSOR_NAME+},++{+ "external_routine_exception", ERRCODE_EXTERNAL_ROUTINE_EXCEPTION+},++{+ "containing_sql_not_permitted", ERRCODE_E_R_E_CONTAINING_SQL_NOT_PERMITTED+},++{+ "modifying_sql_data_not_permitted", ERRCODE_E_R_E_MODIFYING_SQL_DATA_NOT_PERMITTED+},++{+ "prohibited_sql_statement_attempted", ERRCODE_E_R_E_PROHIBITED_SQL_STATEMENT_ATTEMPTED+},++{+ "reading_sql_data_not_permitted", ERRCODE_E_R_E_READING_SQL_DATA_NOT_PERMITTED+},++{+ "external_routine_invocation_exception", ERRCODE_EXTERNAL_ROUTINE_INVOCATION_EXCEPTION+},++{+ "invalid_sqlstate_returned", ERRCODE_E_R_I_E_INVALID_SQLSTATE_RETURNED+},++{+ "null_value_not_allowed", ERRCODE_E_R_I_E_NULL_VALUE_NOT_ALLOWED+},++{+ "trigger_protocol_violated", ERRCODE_E_R_I_E_TRIGGER_PROTOCOL_VIOLATED+},++{+ "srf_protocol_violated", ERRCODE_E_R_I_E_SRF_PROTOCOL_VIOLATED+},++{+ "event_trigger_protocol_violated", ERRCODE_E_R_I_E_EVENT_TRIGGER_PROTOCOL_VIOLATED+},++{+ "savepoint_exception", ERRCODE_SAVEPOINT_EXCEPTION+},++{+ "invalid_savepoint_specification", ERRCODE_S_E_INVALID_SPECIFICATION+},++{+ "invalid_catalog_name", ERRCODE_INVALID_CATALOG_NAME+},++{+ "invalid_schema_name", ERRCODE_INVALID_SCHEMA_NAME+},++{+ "transaction_rollback", ERRCODE_TRANSACTION_ROLLBACK+},++{+ "transaction_integrity_constraint_violation", ERRCODE_T_R_INTEGRITY_CONSTRAINT_VIOLATION+},++{+ "serialization_failure", ERRCODE_T_R_SERIALIZATION_FAILURE+},++{+ "statement_completion_unknown", ERRCODE_T_R_STATEMENT_COMPLETION_UNKNOWN+},++{+ "deadlock_detected", ERRCODE_T_R_DEADLOCK_DETECTED+},++{+ "syntax_error_or_access_rule_violation", ERRCODE_SYNTAX_ERROR_OR_ACCESS_RULE_VIOLATION+},++{+ "syntax_error", ERRCODE_SYNTAX_ERROR+},++{+ "insufficient_privilege", ERRCODE_INSUFFICIENT_PRIVILEGE+},++{+ "cannot_coerce", ERRCODE_CANNOT_COERCE+},++{+ "grouping_error", ERRCODE_GROUPING_ERROR+},++{+ "windowing_error", ERRCODE_WINDOWING_ERROR+},++{+ "invalid_recursion", ERRCODE_INVALID_RECURSION+},++{+ "invalid_foreign_key", ERRCODE_INVALID_FOREIGN_KEY+},++{+ "invalid_name", ERRCODE_INVALID_NAME+},++{+ "name_too_long", ERRCODE_NAME_TOO_LONG+},++{+ "reserved_name", ERRCODE_RESERVED_NAME+},++{+ "datatype_mismatch", ERRCODE_DATATYPE_MISMATCH+},++{+ "indeterminate_datatype", ERRCODE_INDETERMINATE_DATATYPE+},++{+ "collation_mismatch", ERRCODE_COLLATION_MISMATCH+},++{+ "indeterminate_collation", ERRCODE_INDETERMINATE_COLLATION+},++{+ "wrong_object_type", ERRCODE_WRONG_OBJECT_TYPE+},++{+ "undefined_column", ERRCODE_UNDEFINED_COLUMN+},++{+ "undefined_function", ERRCODE_UNDEFINED_FUNCTION+},++{+ "undefined_table", ERRCODE_UNDEFINED_TABLE+},++{+ "undefined_parameter", ERRCODE_UNDEFINED_PARAMETER+},++{+ "undefined_object", ERRCODE_UNDEFINED_OBJECT+},++{+ "duplicate_column", ERRCODE_DUPLICATE_COLUMN+},++{+ "duplicate_cursor", ERRCODE_DUPLICATE_CURSOR+},++{+ "duplicate_database", ERRCODE_DUPLICATE_DATABASE+},++{+ "duplicate_function", ERRCODE_DUPLICATE_FUNCTION+},++{+ "duplicate_prepared_statement", ERRCODE_DUPLICATE_PSTATEMENT+},++{+ "duplicate_schema", ERRCODE_DUPLICATE_SCHEMA+},++{+ "duplicate_table", ERRCODE_DUPLICATE_TABLE+},++{+ "duplicate_alias", ERRCODE_DUPLICATE_ALIAS+},++{+ "duplicate_object", ERRCODE_DUPLICATE_OBJECT+},++{+ "ambiguous_column", ERRCODE_AMBIGUOUS_COLUMN+},++{+ "ambiguous_function", ERRCODE_AMBIGUOUS_FUNCTION+},++{+ "ambiguous_parameter", ERRCODE_AMBIGUOUS_PARAMETER+},++{+ "ambiguous_alias", ERRCODE_AMBIGUOUS_ALIAS+},++{+ "invalid_column_reference", ERRCODE_INVALID_COLUMN_REFERENCE+},++{+ "invalid_column_definition", ERRCODE_INVALID_COLUMN_DEFINITION+},++{+ "invalid_cursor_definition", ERRCODE_INVALID_CURSOR_DEFINITION+},++{+ "invalid_database_definition", ERRCODE_INVALID_DATABASE_DEFINITION+},++{+ "invalid_function_definition", ERRCODE_INVALID_FUNCTION_DEFINITION+},++{+ "invalid_prepared_statement_definition", ERRCODE_INVALID_PSTATEMENT_DEFINITION+},++{+ "invalid_schema_definition", ERRCODE_INVALID_SCHEMA_DEFINITION+},++{+ "invalid_table_definition", ERRCODE_INVALID_TABLE_DEFINITION+},++{+ "invalid_object_definition", ERRCODE_INVALID_OBJECT_DEFINITION+},++{+ "with_check_option_violation", ERRCODE_WITH_CHECK_OPTION_VIOLATION+},++{+ "insufficient_resources", ERRCODE_INSUFFICIENT_RESOURCES+},++{+ "disk_full", ERRCODE_DISK_FULL+},++{+ "out_of_memory", ERRCODE_OUT_OF_MEMORY+},++{+ "too_many_connections", ERRCODE_TOO_MANY_CONNECTIONS+},++{+ "configuration_limit_exceeded", ERRCODE_CONFIGURATION_LIMIT_EXCEEDED+},++{+ "program_limit_exceeded", ERRCODE_PROGRAM_LIMIT_EXCEEDED+},++{+ "statement_too_complex", ERRCODE_STATEMENT_TOO_COMPLEX+},++{+ "too_many_columns", ERRCODE_TOO_MANY_COLUMNS+},++{+ "too_many_arguments", ERRCODE_TOO_MANY_ARGUMENTS+},++{+ "object_not_in_prerequisite_state", ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE+},++{+ "object_in_use", ERRCODE_OBJECT_IN_USE+},++{+ "cant_change_runtime_param", ERRCODE_CANT_CHANGE_RUNTIME_PARAM+},++{+ "lock_not_available", ERRCODE_LOCK_NOT_AVAILABLE+},++{+ "operator_intervention", ERRCODE_OPERATOR_INTERVENTION+},++{+ "query_canceled", ERRCODE_QUERY_CANCELED+},++{+ "admin_shutdown", ERRCODE_ADMIN_SHUTDOWN+},++{+ "crash_shutdown", ERRCODE_CRASH_SHUTDOWN+},++{+ "cannot_connect_now", ERRCODE_CANNOT_CONNECT_NOW+},++{+ "database_dropped", ERRCODE_DATABASE_DROPPED+},++{+ "system_error", ERRCODE_SYSTEM_ERROR+},++{+ "io_error", ERRCODE_IO_ERROR+},++{+ "undefined_file", ERRCODE_UNDEFINED_FILE+},++{+ "duplicate_file", ERRCODE_DUPLICATE_FILE+},++{+ "config_file_error", ERRCODE_CONFIG_FILE_ERROR+},++{+ "lock_file_exists", ERRCODE_LOCK_FILE_EXISTS+},++{+ "fdw_error", ERRCODE_FDW_ERROR+},++{+ "fdw_column_name_not_found", ERRCODE_FDW_COLUMN_NAME_NOT_FOUND+},++{+ "fdw_dynamic_parameter_value_needed", ERRCODE_FDW_DYNAMIC_PARAMETER_VALUE_NEEDED+},++{+ "fdw_function_sequence_error", ERRCODE_FDW_FUNCTION_SEQUENCE_ERROR+},++{+ "fdw_inconsistent_descriptor_information", ERRCODE_FDW_INCONSISTENT_DESCRIPTOR_INFORMATION+},++{+ "fdw_invalid_attribute_value", ERRCODE_FDW_INVALID_ATTRIBUTE_VALUE+},++{+ "fdw_invalid_column_name", ERRCODE_FDW_INVALID_COLUMN_NAME+},++{+ "fdw_invalid_column_number", ERRCODE_FDW_INVALID_COLUMN_NUMBER+},++{+ "fdw_invalid_data_type", ERRCODE_FDW_INVALID_DATA_TYPE+},++{+ "fdw_invalid_data_type_descriptors", ERRCODE_FDW_INVALID_DATA_TYPE_DESCRIPTORS+},++{+ "fdw_invalid_descriptor_field_identifier", ERRCODE_FDW_INVALID_DESCRIPTOR_FIELD_IDENTIFIER+},++{+ "fdw_invalid_handle", ERRCODE_FDW_INVALID_HANDLE+},++{+ "fdw_invalid_option_index", ERRCODE_FDW_INVALID_OPTION_INDEX+},++{+ "fdw_invalid_option_name", ERRCODE_FDW_INVALID_OPTION_NAME+},++{+ "fdw_invalid_string_length_or_buffer_length", ERRCODE_FDW_INVALID_STRING_LENGTH_OR_BUFFER_LENGTH+},++{+ "fdw_invalid_string_format", ERRCODE_FDW_INVALID_STRING_FORMAT+},++{+ "fdw_invalid_use_of_null_pointer", ERRCODE_FDW_INVALID_USE_OF_NULL_POINTER+},++{+ "fdw_too_many_handles", ERRCODE_FDW_TOO_MANY_HANDLES+},++{+ "fdw_out_of_memory", ERRCODE_FDW_OUT_OF_MEMORY+},++{+ "fdw_no_schemas", ERRCODE_FDW_NO_SCHEMAS+},++{+ "fdw_option_name_not_found", ERRCODE_FDW_OPTION_NAME_NOT_FOUND+},++{+ "fdw_reply_handle", ERRCODE_FDW_REPLY_HANDLE+},++{+ "fdw_schema_not_found", ERRCODE_FDW_SCHEMA_NOT_FOUND+},++{+ "fdw_table_not_found", ERRCODE_FDW_TABLE_NOT_FOUND+},++{+ "fdw_unable_to_create_execution", ERRCODE_FDW_UNABLE_TO_CREATE_EXECUTION+},++{+ "fdw_unable_to_create_reply", ERRCODE_FDW_UNABLE_TO_CREATE_REPLY+},++{+ "fdw_unable_to_establish_connection", ERRCODE_FDW_UNABLE_TO_ESTABLISH_CONNECTION+},++{+ "plpgsql_error", ERRCODE_PLPGSQL_ERROR+},++{+ "raise_exception", ERRCODE_RAISE_EXCEPTION+},++{+ "no_data_found", ERRCODE_NO_DATA_FOUND+},++{+ "too_many_rows", ERRCODE_TOO_MANY_ROWS+},++{+ "assert_failure", ERRCODE_ASSERT_FAILURE+},++{+ "internal_error", ERRCODE_INTERNAL_ERROR+},++{+ "data_corrupted", ERRCODE_DATA_CORRUPTED+},++{+ "index_corrupted", ERRCODE_INDEX_CORRUPTED+},+
+ foreign/libpg_query/src/postgres/include/plpgsql.h view
@@ -0,0 +1,1040 @@+/*-------------------------------------------------------------------------+ *+ * plpgsql.h - Definitions for the PL/pgSQL+ * procedural language+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ *+ * IDENTIFICATION+ * src/pl/plpgsql/src/plpgsql.h+ *+ *-------------------------------------------------------------------------+ */++#ifndef PLPGSQL_H+#define PLPGSQL_H++#include "postgres.h"++#include "access/xact.h"+#include "commands/event_trigger.h"+#include "commands/trigger.h"+#include "executor/spi.h"++/**********************************************************************+ * Definitions+ **********************************************************************/++/* define our text domain for translations */+#undef TEXTDOMAIN+#define TEXTDOMAIN PG_TEXTDOMAIN("plpgsql")++#undef _+#define _(x) dgettext(TEXTDOMAIN, x)++/* ----------+ * Compiler's namespace item types+ * ----------+ */+enum+{+ PLPGSQL_NSTYPE_LABEL,+ PLPGSQL_NSTYPE_VAR,+ PLPGSQL_NSTYPE_ROW,+ PLPGSQL_NSTYPE_REC+};++/* ----------+ * Datum array node types+ * ----------+ */+enum+{+ PLPGSQL_DTYPE_VAR,+ PLPGSQL_DTYPE_ROW,+ PLPGSQL_DTYPE_REC,+ PLPGSQL_DTYPE_RECFIELD,+ PLPGSQL_DTYPE_ARRAYELEM,+ PLPGSQL_DTYPE_EXPR+};++/* ----------+ * Variants distinguished in PLpgSQL_type structs+ * ----------+ */+enum+{+ PLPGSQL_TTYPE_SCALAR, /* scalar types and domains */+ PLPGSQL_TTYPE_ROW, /* composite types */+ PLPGSQL_TTYPE_REC, /* RECORD pseudotype */+ PLPGSQL_TTYPE_PSEUDO /* other pseudotypes */+};++/* ----------+ * Execution tree node types+ * ----------+ */+enum PLpgSQL_stmt_types+{+ PLPGSQL_STMT_BLOCK,+ PLPGSQL_STMT_ASSIGN,+ PLPGSQL_STMT_IF,+ PLPGSQL_STMT_CASE,+ PLPGSQL_STMT_LOOP,+ PLPGSQL_STMT_WHILE,+ PLPGSQL_STMT_FORI,+ PLPGSQL_STMT_FORS,+ PLPGSQL_STMT_FORC,+ PLPGSQL_STMT_FOREACH_A,+ PLPGSQL_STMT_EXIT,+ PLPGSQL_STMT_RETURN,+ PLPGSQL_STMT_RETURN_NEXT,+ PLPGSQL_STMT_RETURN_QUERY,+ PLPGSQL_STMT_RAISE,+ PLPGSQL_STMT_ASSERT,+ PLPGSQL_STMT_EXECSQL,+ PLPGSQL_STMT_DYNEXECUTE,+ PLPGSQL_STMT_DYNFORS,+ PLPGSQL_STMT_GETDIAG,+ PLPGSQL_STMT_OPEN,+ PLPGSQL_STMT_FETCH,+ PLPGSQL_STMT_CLOSE,+ PLPGSQL_STMT_PERFORM+};+++/* ----------+ * Execution node return codes+ * ----------+ */+enum+{+ PLPGSQL_RC_OK,+ PLPGSQL_RC_EXIT,+ PLPGSQL_RC_RETURN,+ PLPGSQL_RC_CONTINUE+};++/* ----------+ * GET DIAGNOSTICS information items+ * ----------+ */+enum+{+ PLPGSQL_GETDIAG_ROW_COUNT,+ PLPGSQL_GETDIAG_RESULT_OID,+ PLPGSQL_GETDIAG_CONTEXT,+ PLPGSQL_GETDIAG_ERROR_CONTEXT,+ PLPGSQL_GETDIAG_ERROR_DETAIL,+ PLPGSQL_GETDIAG_ERROR_HINT,+ PLPGSQL_GETDIAG_RETURNED_SQLSTATE,+ PLPGSQL_GETDIAG_COLUMN_NAME,+ PLPGSQL_GETDIAG_CONSTRAINT_NAME,+ PLPGSQL_GETDIAG_DATATYPE_NAME,+ PLPGSQL_GETDIAG_MESSAGE_TEXT,+ PLPGSQL_GETDIAG_TABLE_NAME,+ PLPGSQL_GETDIAG_SCHEMA_NAME+};++/* --------+ * RAISE statement options+ * --------+ */+enum+{+ PLPGSQL_RAISEOPTION_ERRCODE,+ PLPGSQL_RAISEOPTION_MESSAGE,+ PLPGSQL_RAISEOPTION_DETAIL,+ PLPGSQL_RAISEOPTION_HINT,+ PLPGSQL_RAISEOPTION_COLUMN,+ PLPGSQL_RAISEOPTION_CONSTRAINT,+ PLPGSQL_RAISEOPTION_DATATYPE,+ PLPGSQL_RAISEOPTION_TABLE,+ PLPGSQL_RAISEOPTION_SCHEMA+};++/* --------+ * Behavioral modes for plpgsql variable resolution+ * --------+ */+typedef enum+{+ PLPGSQL_RESOLVE_ERROR, /* throw error if ambiguous */+ PLPGSQL_RESOLVE_VARIABLE, /* prefer plpgsql var to table column */+ PLPGSQL_RESOLVE_COLUMN /* prefer table column to plpgsql var */+} PLpgSQL_resolve_option;+++/**********************************************************************+ * Node and structure definitions+ **********************************************************************/+++typedef struct+{ /* Postgres data type */+ char *typname; /* (simple) name of the type */+ Oid typoid; /* OID of the data type */+ int ttype; /* PLPGSQL_TTYPE_ code */+ int16 typlen; /* stuff copied from its pg_type entry */+ bool typbyval;+ char typtype;+ Oid typrelid;+ Oid collation; /* from pg_type, but can be overridden */+ bool typisarray; /* is "true" array, or domain over one */+ int32 atttypmod; /* typmod (taken from someplace else) */+} PLpgSQL_type;+++/*+ * PLpgSQL_datum is the common supertype for PLpgSQL_expr, PLpgSQL_var,+ * PLpgSQL_row, PLpgSQL_rec, PLpgSQL_recfield, and PLpgSQL_arrayelem+ */+typedef struct+{ /* Generic datum array item */+ int dtype;+ int dno;+} PLpgSQL_datum;++/*+ * The variants PLpgSQL_var, PLpgSQL_row, and PLpgSQL_rec share these+ * fields+ */+typedef struct+{ /* Scalar or composite variable */+ int dtype;+ int dno;+ char *refname;+ int lineno;+} PLpgSQL_variable;++typedef struct PLpgSQL_expr+{ /* SQL Query to plan and execute */+ int dtype;+ int dno;+ char *query;+ SPIPlanPtr plan;+ Bitmapset *paramnos; /* all dnos referenced by this query */+ int rwparam; /* dno of read/write param, or -1 if none */++ /* function containing this expr (not set until we first parse query) */+ struct PLpgSQL_function *func;++ /* namespace chain visible to this expr */+ struct PLpgSQL_nsitem *ns;++ /* fields for "simple expression" fast-path execution: */+ Expr *expr_simple_expr; /* NULL means not a simple expr */+ int expr_simple_generation; /* plancache generation we checked */+ Oid expr_simple_type; /* result type Oid, if simple */+ int32 expr_simple_typmod; /* result typmod, if simple */++ /*+ * if expr is simple AND prepared in current transaction,+ * expr_simple_state and expr_simple_in_use are valid. Test validity by+ * seeing if expr_simple_lxid matches current LXID. (If not,+ * expr_simple_state probably points at garbage!)+ */+ ExprState *expr_simple_state; /* eval tree for expr_simple_expr */+ bool expr_simple_in_use; /* true if eval tree is active */+ LocalTransactionId expr_simple_lxid;+} PLpgSQL_expr;+++typedef struct+{ /* Scalar variable */+ int dtype;+ int dno;+ char *refname;+ int lineno;++ PLpgSQL_type *datatype;+ int isconst;+ int notnull;+ PLpgSQL_expr *default_val;+ PLpgSQL_expr *cursor_explicit_expr;+ int cursor_explicit_argrow;+ int cursor_options;++ Datum value;+ bool isnull;+ bool freeval;+} PLpgSQL_var;+++typedef struct+{ /* Row variable */+ int dtype;+ int dno;+ char *refname;+ int lineno;++ TupleDesc rowtupdesc;++ /*+ * Note: TupleDesc is only set up for named rowtypes, else it is NULL.+ *+ * Note: if the underlying rowtype contains a dropped column, the+ * corresponding fieldnames[] entry will be NULL, and there is no+ * corresponding var (varnos[] will be -1).+ */+ int nfields;+ char **fieldnames;+ int *varnos;+} PLpgSQL_row;+++typedef struct+{ /* Record variable (non-fixed structure) */+ int dtype;+ int dno;+ char *refname;+ int lineno;++ HeapTuple tup;+ TupleDesc tupdesc;+ bool freetup;+ bool freetupdesc;+} PLpgSQL_rec;+++typedef struct+{ /* Field in record */+ int dtype;+ int dno;+ char *fieldname;+ int recparentno; /* dno of parent record */+} PLpgSQL_recfield;+++typedef struct+{ /* Element of array variable */+ int dtype;+ int dno;+ PLpgSQL_expr *subscript;+ int arrayparentno; /* dno of parent array variable */+ /* Remaining fields are cached info about the array variable's type */+ Oid parenttypoid; /* type of array variable; 0 if not yet set */+ int32 parenttypmod; /* typmod of array variable */+ Oid arraytypoid; /* OID of actual array type */+ int32 arraytypmod; /* typmod of array (and its elements too) */+ int16 arraytyplen; /* typlen of array type */+ Oid elemtypoid; /* OID of array element type */+ int16 elemtyplen; /* typlen of element type */+ bool elemtypbyval; /* element type is pass-by-value? */+ char elemtypalign; /* typalign of element type */+} PLpgSQL_arrayelem;+++typedef struct PLpgSQL_nsitem+{ /* Item in the compilers namespace tree */+ int itemtype;+ int itemno;+ struct PLpgSQL_nsitem *prev;+ char name[FLEXIBLE_ARRAY_MEMBER]; /* nul-terminated string */+} PLpgSQL_nsitem;+++typedef struct+{ /* Generic execution node */+ int cmd_type;+ int lineno;+} PLpgSQL_stmt;+++typedef struct PLpgSQL_condition+{ /* One EXCEPTION condition name */+ int sqlerrstate; /* SQLSTATE code */+ char *condname; /* condition name (for debugging) */+ struct PLpgSQL_condition *next;+} PLpgSQL_condition;++typedef struct+{+ int sqlstate_varno;+ int sqlerrm_varno;+ List *exc_list; /* List of WHEN clauses */+} PLpgSQL_exception_block;++typedef struct+{ /* One EXCEPTION ... WHEN clause */+ int lineno;+ PLpgSQL_condition *conditions;+ List *action; /* List of statements */+} PLpgSQL_exception;+++typedef struct+{ /* Block of statements */+ int cmd_type;+ int lineno;+ char *label;+ List *body; /* List of statements */+ int n_initvars;+ int *initvarnos;+ PLpgSQL_exception_block *exceptions;+} PLpgSQL_stmt_block;+++typedef struct+{ /* Assign statement */+ int cmd_type;+ int lineno;+ int varno;+ PLpgSQL_expr *expr;+} PLpgSQL_stmt_assign;++typedef struct+{ /* PERFORM statement */+ int cmd_type;+ int lineno;+ PLpgSQL_expr *expr;+} PLpgSQL_stmt_perform;++typedef struct+{ /* Get Diagnostics item */+ int kind; /* id for diagnostic value desired */+ int target; /* where to assign it */+} PLpgSQL_diag_item;++typedef struct+{ /* Get Diagnostics statement */+ int cmd_type;+ int lineno;+ bool is_stacked; /* STACKED or CURRENT diagnostics area? */+ List *diag_items; /* List of PLpgSQL_diag_item */+} PLpgSQL_stmt_getdiag;+++typedef struct+{ /* IF statement */+ int cmd_type;+ int lineno;+ PLpgSQL_expr *cond; /* boolean expression for THEN */+ List *then_body; /* List of statements */+ List *elsif_list; /* List of PLpgSQL_if_elsif structs */+ List *else_body; /* List of statements */+} PLpgSQL_stmt_if;++typedef struct /* one ELSIF arm of IF statement */+{+ int lineno;+ PLpgSQL_expr *cond; /* boolean expression for this case */+ List *stmts; /* List of statements */+} PLpgSQL_if_elsif;+++typedef struct /* CASE statement */+{+ int cmd_type;+ int lineno;+ PLpgSQL_expr *t_expr; /* test expression, or NULL if none */+ int t_varno; /* var to store test expression value into */+ List *case_when_list; /* List of PLpgSQL_case_when structs */+ bool have_else; /* flag needed because list could be empty */+ List *else_stmts; /* List of statements */+} PLpgSQL_stmt_case;++typedef struct /* one arm of CASE statement */+{+ int lineno;+ PLpgSQL_expr *expr; /* boolean expression for this case */+ List *stmts; /* List of statements */+} PLpgSQL_case_when;+++typedef struct+{ /* Unconditional LOOP statement */+ int cmd_type;+ int lineno;+ char *label;+ List *body; /* List of statements */+} PLpgSQL_stmt_loop;+++typedef struct+{ /* WHILE cond LOOP statement */+ int cmd_type;+ int lineno;+ char *label;+ PLpgSQL_expr *cond;+ List *body; /* List of statements */+} PLpgSQL_stmt_while;+++typedef struct+{ /* FOR statement with integer loopvar */+ int cmd_type;+ int lineno;+ char *label;+ PLpgSQL_var *var;+ PLpgSQL_expr *lower;+ PLpgSQL_expr *upper;+ PLpgSQL_expr *step; /* NULL means default (ie, BY 1) */+ int reverse;+ List *body; /* List of statements */+} PLpgSQL_stmt_fori;+++/*+ * PLpgSQL_stmt_forq represents a FOR statement running over a SQL query.+ * It is the common supertype of PLpgSQL_stmt_fors, PLpgSQL_stmt_forc+ * and PLpgSQL_dynfors.+ */+typedef struct+{+ int cmd_type;+ int lineno;+ char *label;+ PLpgSQL_rec *rec;+ PLpgSQL_row *row;+ List *body; /* List of statements */+} PLpgSQL_stmt_forq;++typedef struct+{ /* FOR statement running over SELECT */+ int cmd_type;+ int lineno;+ char *label;+ PLpgSQL_rec *rec;+ PLpgSQL_row *row;+ List *body; /* List of statements */+ /* end of fields that must match PLpgSQL_stmt_forq */+ PLpgSQL_expr *query;+} PLpgSQL_stmt_fors;++typedef struct+{ /* FOR statement running over cursor */+ int cmd_type;+ int lineno;+ char *label;+ PLpgSQL_rec *rec;+ PLpgSQL_row *row;+ List *body; /* List of statements */+ /* end of fields that must match PLpgSQL_stmt_forq */+ int curvar;+ PLpgSQL_expr *argquery; /* cursor arguments if any */+} PLpgSQL_stmt_forc;++typedef struct+{ /* FOR statement running over EXECUTE */+ int cmd_type;+ int lineno;+ char *label;+ PLpgSQL_rec *rec;+ PLpgSQL_row *row;+ List *body; /* List of statements */+ /* end of fields that must match PLpgSQL_stmt_forq */+ PLpgSQL_expr *query;+ List *params; /* USING expressions */+} PLpgSQL_stmt_dynfors;+++typedef struct+{ /* FOREACH item in array loop */+ int cmd_type;+ int lineno;+ char *label;+ int varno; /* loop target variable */+ int slice; /* slice dimension, or 0 */+ PLpgSQL_expr *expr; /* array expression */+ List *body; /* List of statements */+} PLpgSQL_stmt_foreach_a;+++typedef struct+{ /* OPEN a curvar */+ int cmd_type;+ int lineno;+ int curvar;+ int cursor_options;+ PLpgSQL_row *returntype;+ PLpgSQL_expr *argquery;+ PLpgSQL_expr *query;+ PLpgSQL_expr *dynquery;+ List *params; /* USING expressions */+} PLpgSQL_stmt_open;+++typedef struct+{ /* FETCH or MOVE statement */+ int cmd_type;+ int lineno;+ PLpgSQL_rec *rec; /* target, as record or row */+ PLpgSQL_row *row;+ int curvar; /* cursor variable to fetch from */+ FetchDirection direction; /* fetch direction */+ long how_many; /* count, if constant (expr is NULL) */+ PLpgSQL_expr *expr; /* count, if expression */+ bool is_move; /* is this a fetch or move? */+ bool returns_multiple_rows; /* can return more than one row? */+} PLpgSQL_stmt_fetch;+++typedef struct+{ /* CLOSE curvar */+ int cmd_type;+ int lineno;+ int curvar;+} PLpgSQL_stmt_close;+++typedef struct+{ /* EXIT or CONTINUE statement */+ int cmd_type;+ int lineno;+ bool is_exit; /* Is this an exit or a continue? */+ char *label; /* NULL if it's an unlabelled EXIT/CONTINUE */+ PLpgSQL_expr *cond;+} PLpgSQL_stmt_exit;+++typedef struct+{ /* RETURN statement */+ int cmd_type;+ int lineno;+ PLpgSQL_expr *expr;+ int retvarno;+} PLpgSQL_stmt_return;++typedef struct+{ /* RETURN NEXT statement */+ int cmd_type;+ int lineno;+ PLpgSQL_expr *expr;+ int retvarno;+} PLpgSQL_stmt_return_next;++typedef struct+{ /* RETURN QUERY statement */+ int cmd_type;+ int lineno;+ PLpgSQL_expr *query; /* if static query */+ PLpgSQL_expr *dynquery; /* if dynamic query (RETURN QUERY EXECUTE) */+ List *params; /* USING arguments for dynamic query */+} PLpgSQL_stmt_return_query;++typedef struct+{ /* RAISE statement */+ int cmd_type;+ int lineno;+ int elog_level;+ char *condname; /* condition name, SQLSTATE, or NULL */+ char *message; /* old-style message format literal, or NULL */+ List *params; /* list of expressions for old-style message */+ List *options; /* list of PLpgSQL_raise_option */+} PLpgSQL_stmt_raise;++typedef struct+{ /* RAISE statement option */+ int opt_type;+ PLpgSQL_expr *expr;+} PLpgSQL_raise_option;++typedef struct+{ /* ASSERT statement */+ int cmd_type;+ int lineno;+ PLpgSQL_expr *cond;+ PLpgSQL_expr *message;+} PLpgSQL_stmt_assert;++typedef struct+{ /* Generic SQL statement to execute */+ int cmd_type;+ int lineno;+ PLpgSQL_expr *sqlstmt;+ bool mod_stmt; /* is the stmt INSERT/UPDATE/DELETE? */+ /* note: mod_stmt is set when we plan the query */+ bool into; /* INTO supplied? */+ bool strict; /* INTO STRICT flag */+ PLpgSQL_rec *rec; /* INTO target, if record */+ PLpgSQL_row *row; /* INTO target, if row */+} PLpgSQL_stmt_execsql;+++typedef struct+{ /* Dynamic SQL string to execute */+ int cmd_type;+ int lineno;+ PLpgSQL_expr *query; /* string expression */+ bool into; /* INTO supplied? */+ bool strict; /* INTO STRICT flag */+ PLpgSQL_rec *rec; /* INTO target, if record */+ PLpgSQL_row *row; /* INTO target, if row */+ List *params; /* USING expressions */+} PLpgSQL_stmt_dynexecute;+++typedef struct PLpgSQL_func_hashkey+{ /* Hash lookup key for functions */+ Oid funcOid;++ bool isTrigger; /* true if called as a trigger */++ /* be careful that pad bytes in this struct get zeroed! */++ /*+ * For a trigger function, the OID of the relation triggered on is part of+ * the hash key --- we want to compile the trigger separately for each+ * relation it is used with, in case the rowtype is different. Zero if+ * not called as a trigger.+ */+ Oid trigrelOid;++ /*+ * We must include the input collation as part of the hash key too,+ * because we have to generate different plans (with different Param+ * collations) for different collation settings.+ */+ Oid inputCollation;++ /*+ * We include actual argument types in the hash key to support polymorphic+ * PLpgSQL functions. Be careful that extra positions are zeroed!+ */+ Oid argtypes[FUNC_MAX_ARGS];+} PLpgSQL_func_hashkey;++typedef enum PLpgSQL_trigtype+{+ PLPGSQL_DML_TRIGGER,+ PLPGSQL_EVENT_TRIGGER,+ PLPGSQL_NOT_TRIGGER+} PLpgSQL_trigtype;++typedef struct PLpgSQL_function+{ /* Complete compiled function */+ char *fn_signature;+ Oid fn_oid;+ TransactionId fn_xmin;+ ItemPointerData fn_tid;+ PLpgSQL_trigtype fn_is_trigger;+ Oid fn_input_collation;+ PLpgSQL_func_hashkey *fn_hashkey; /* back-link to hashtable key */+ MemoryContext fn_cxt;++ Oid fn_rettype;+ int fn_rettyplen;+ bool fn_retbyval;+ bool fn_retistuple;+ bool fn_retset;+ bool fn_readonly;++ int fn_nargs;+ int fn_argvarnos[FUNC_MAX_ARGS];+ int out_param_varno;+ int found_varno;+ int new_varno;+ int old_varno;+ int tg_name_varno;+ int tg_when_varno;+ int tg_level_varno;+ int tg_op_varno;+ int tg_relid_varno;+ int tg_relname_varno;+ int tg_table_name_varno;+ int tg_table_schema_varno;+ int tg_nargs_varno;+ int tg_argv_varno;++ /* for event triggers */+ int tg_event_varno;+ int tg_tag_varno;++ PLpgSQL_resolve_option resolve_option;++ bool print_strict_params;++ /* extra checks */+ int extra_warnings;+ int extra_errors;++ int ndatums;+ PLpgSQL_datum **datums;+ PLpgSQL_stmt_block *action;++ /* these fields change when the function is used */+ struct PLpgSQL_execstate *cur_estate;+ unsigned long use_count;+} PLpgSQL_function;+++typedef struct PLpgSQL_execstate+{ /* Runtime execution data */+ PLpgSQL_function *func; /* function being executed */++ Datum retval;+ bool retisnull;+ Oid rettype; /* type of current retval */++ Oid fn_rettype; /* info about declared function rettype */+ bool retistuple;+ bool retisset;++ bool readonly_func;++ TupleDesc rettupdesc;+ char *exitlabel; /* the "target" label of the current EXIT or+ * CONTINUE stmt, if any */+ ErrorData *cur_error; /* current exception handler's error */++ Tuplestorestate *tuple_store; /* SRFs accumulate results here */+ MemoryContext tuple_store_cxt;+ ResourceOwner tuple_store_owner;+ ReturnSetInfo *rsi;++ /* the datums representing the function's local variables */+ int found_varno;+ int ndatums;+ PLpgSQL_datum **datums;++ /* we pass datums[i] to the executor, when needed, in paramLI->params[i] */+ ParamListInfo paramLI;++ /* EState to use for "simple" expression evaluation */+ EState *simple_eval_estate;++ /* Lookup table to use for executing type casts */+ HTAB *cast_hash;+ MemoryContext cast_hash_context;++ /* temporary state for results from evaluation of query or expr */+ SPITupleTable *eval_tuptable;+ uint32 eval_processed;+ Oid eval_lastoid;+ ExprContext *eval_econtext; /* for executing simple expressions */++ /* status information for error context reporting */+ PLpgSQL_stmt *err_stmt; /* current stmt */+ const char *err_text; /* additional state info */++ void *plugin_info; /* reserved for use by optional plugin */+} PLpgSQL_execstate;+++/*+ * A PLpgSQL_plugin structure represents an instrumentation plugin.+ * To instrument PL/pgSQL, a plugin library must access the rendezvous+ * variable "PLpgSQL_plugin" and set it to point to a PLpgSQL_plugin struct.+ * Typically the struct could just be static data in the plugin library.+ * We expect that a plugin would do this at library load time (_PG_init()).+ * It must also be careful to set the rendezvous variable back to NULL+ * if it is unloaded (_PG_fini()).+ *+ * This structure is basically a collection of function pointers --- at+ * various interesting points in pl_exec.c, we call these functions+ * (if the pointers are non-NULL) to give the plugin a chance to watch+ * what we are doing.+ *+ * func_setup is called when we start a function, before we've initialized+ * the local variables defined by the function.+ *+ * func_beg is called when we start a function, after we've initialized+ * the local variables.+ *+ * func_end is called at the end of a function.+ *+ * stmt_beg and stmt_end are called before and after (respectively) each+ * statement.+ *+ * Also, immediately before any call to func_setup, PL/pgSQL fills in the+ * error_callback and assign_expr fields with pointers to its own+ * plpgsql_exec_error_callback and exec_assign_expr functions. This is+ * a somewhat ad-hoc expedient to simplify life for debugger plugins.+ */++typedef struct+{+ /* Function pointers set up by the plugin */+ void (*func_setup) (PLpgSQL_execstate *estate, PLpgSQL_function *func);+ void (*func_beg) (PLpgSQL_execstate *estate, PLpgSQL_function *func);+ void (*func_end) (PLpgSQL_execstate *estate, PLpgSQL_function *func);+ void (*stmt_beg) (PLpgSQL_execstate *estate, PLpgSQL_stmt *stmt);+ void (*stmt_end) (PLpgSQL_execstate *estate, PLpgSQL_stmt *stmt);++ /* Function pointers set by PL/pgSQL itself */+ void (*error_callback) (void *arg);+ void (*assign_expr) (PLpgSQL_execstate *estate, PLpgSQL_datum *target,+ PLpgSQL_expr *expr);+} PLpgSQL_plugin;+++/* Struct types used during parsing */++typedef struct+{+ char *ident; /* palloc'd converted identifier */+ bool quoted; /* Was it double-quoted? */+} PLword;++typedef struct+{+ List *idents; /* composite identifiers (list of String) */+} PLcword;++typedef struct+{+ PLpgSQL_datum *datum; /* referenced variable */+ char *ident; /* valid if simple name */+ bool quoted;+ List *idents; /* valid if composite name */+} PLwdatum;++/**********************************************************************+ * Global variable declarations+ **********************************************************************/++typedef enum+{+ IDENTIFIER_LOOKUP_NORMAL, /* normal processing of var names */+ IDENTIFIER_LOOKUP_DECLARE, /* In DECLARE --- don't look up names */+ IDENTIFIER_LOOKUP_EXPR /* In SQL expression --- special case */+} IdentifierLookup;++extern __thread IdentifierLookup plpgsql_IdentifierLookup;++extern __thread int plpgsql_variable_conflict;++extern __thread bool plpgsql_print_strict_params;++extern bool plpgsql_check_asserts;++/* extra compile-time checks */+#define PLPGSQL_XCHECK_NONE 0+#define PLPGSQL_XCHECK_SHADOWVAR 1+#define PLPGSQL_XCHECK_ALL ((int) ~0)++extern int plpgsql_extra_warnings;+extern int plpgsql_extra_errors;++extern __thread bool plpgsql_check_syntax;+extern __thread bool plpgsql_DumpExecTree;++extern __thread PLpgSQL_stmt_block *plpgsql_parse_result;++extern __thread int plpgsql_nDatums;+extern __thread PLpgSQL_datum **plpgsql_Datums;++extern __thread char *plpgsql_error_funcname;++extern __thread PLpgSQL_function *plpgsql_curr_compile;+extern __thread MemoryContext compile_tmp_cxt;++extern PLpgSQL_plugin **plugin_ptr;++/**********************************************************************+ * Function declarations+ **********************************************************************/++/* ----------+ * Functions in pl_comp.c+ * ----------+ */+extern PLpgSQL_function *plpgsql_compile(FunctionCallInfo fcinfo,+ bool forValidator);+extern PLpgSQL_function *plpgsql_compile_inline(char *proc_source);+extern void plpgsql_parser_setup(struct ParseState *pstate,+ PLpgSQL_expr *expr);+extern bool plpgsql_parse_word(char *word1, const char *yytxt,+ PLwdatum *wdatum, PLword *word);+extern bool plpgsql_parse_dblword(char *word1, char *word2,+ PLwdatum *wdatum, PLcword *cword);+extern bool plpgsql_parse_tripword(char *word1, char *word2, char *word3,+ PLwdatum *wdatum, PLcword *cword);+extern PLpgSQL_type *plpgsql_parse_wordtype(char *ident);+extern PLpgSQL_type *plpgsql_parse_cwordtype(List *idents);+extern PLpgSQL_type *plpgsql_parse_wordrowtype(char *ident);+extern PLpgSQL_type *plpgsql_parse_cwordrowtype(List *idents);+extern PLpgSQL_type *plpgsql_build_datatype(Oid typeOid, int32 typmod,+ Oid collation);+extern PLpgSQL_variable *plpgsql_build_variable(const char *refname, int lineno,+ PLpgSQL_type *dtype,+ bool add2namespace);+extern PLpgSQL_rec *plpgsql_build_record(const char *refname, int lineno,+ bool add2namespace);+extern int plpgsql_recognize_err_condition(const char *condname,+ bool allow_sqlstate);+extern PLpgSQL_condition *plpgsql_parse_err_condition(char *condname);+extern void plpgsql_adddatum(PLpgSQL_datum *new);+extern int plpgsql_add_initdatums(int **varnos);+extern void plpgsql_HashTableInit(void);++/* ----------+ * Functions in pl_handler.c+ * ----------+ */+extern void _PG_init(void);++/* ----------+ * Functions in pl_exec.c+ * ----------+ */+extern Datum plpgsql_exec_function(PLpgSQL_function *func,+ FunctionCallInfo fcinfo,+ EState *simple_eval_estate);+extern HeapTuple plpgsql_exec_trigger(PLpgSQL_function *func,+ TriggerData *trigdata);+extern void plpgsql_exec_event_trigger(PLpgSQL_function *func,+ EventTriggerData *trigdata);+extern void plpgsql_xact_cb(XactEvent event, void *arg);+extern void plpgsql_subxact_cb(SubXactEvent event, SubTransactionId mySubid,+ SubTransactionId parentSubid, void *arg);+extern Oid exec_get_datum_type(PLpgSQL_execstate *estate,+ PLpgSQL_datum *datum);+extern void exec_get_datum_type_info(PLpgSQL_execstate *estate,+ PLpgSQL_datum *datum,+ Oid *typeid, int32 *typmod, Oid *collation);++/* ----------+ * Functions for namespace handling in pl_funcs.c+ * ----------+ */+extern void plpgsql_ns_init(void);+extern void plpgsql_ns_push(const char *label);+extern void plpgsql_ns_pop(void);+extern PLpgSQL_nsitem *plpgsql_ns_top(void);+extern void plpgsql_ns_additem(int itemtype, int itemno, const char *name);+extern PLpgSQL_nsitem *plpgsql_ns_lookup(PLpgSQL_nsitem *ns_cur, bool localmode,+ const char *name1, const char *name2,+ const char *name3, int *names_used);+extern PLpgSQL_nsitem *plpgsql_ns_lookup_label(PLpgSQL_nsitem *ns_cur,+ const char *name);++/* ----------+ * Other functions in pl_funcs.c+ * ----------+ */+extern const char *plpgsql_stmt_typename(PLpgSQL_stmt *stmt);+extern const char *plpgsql_getdiag_kindname(int kind);+extern void plpgsql_free_function_memory(PLpgSQL_function *func);+extern void plpgsql_dumptree(PLpgSQL_function *func);++/* ----------+ * Scanner functions in pl_scanner.c+ * ----------+ */+extern int plpgsql_base_yylex(void);+extern int plpgsql_yylex(void);+extern void plpgsql_push_back_token(int token);+extern bool plpgsql_token_is_unreserved_keyword(int token);+extern void plpgsql_append_source_text(StringInfo buf,+ int startlocation, int endlocation);+extern int plpgsql_peek(void);+extern void plpgsql_peek2(int *tok1_p, int *tok2_p, int *tok1_loc,+ int *tok2_loc);+extern int plpgsql_scanner_errposition(int location);+extern void plpgsql_yyerror(const char *message) pg_attribute_noreturn();+extern int plpgsql_location_to_lineno(int location);+extern int plpgsql_latest_lineno(void);+extern void plpgsql_scanner_init(const char *str);+extern void plpgsql_scanner_finish(void);++/* ----------+ * Externs in gram.y+ * ----------+ */+extern int plpgsql_yyparse(void);++#endif /* PLPGSQL_H */
+ foreign/libpg_query/src/postgres/include/port.h view
@@ -0,0 +1,471 @@+/*-------------------------------------------------------------------------+ *+ * port.h+ * Header for src/port/ compatibility functions.+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/port.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef PG_PORT_H+#define PG_PORT_H++#include <ctype.h>+#include <netdb.h>+#include <pwd.h>++/* socket has a different definition on WIN32 */+#ifndef WIN32+typedef int pgsocket;++#define PGINVALID_SOCKET (-1)+#else+typedef SOCKET pgsocket;++#define PGINVALID_SOCKET INVALID_SOCKET+#endif++/* non-blocking */+extern bool pg_set_noblock(pgsocket sock);+extern bool pg_set_block(pgsocket sock);++/* Portable path handling for Unix/Win32 (in path.c) */++extern bool has_drive_prefix(const char *filename);+extern char *first_dir_separator(const char *filename);+extern char *last_dir_separator(const char *filename);+extern char *first_path_var_separator(const char *pathlist);+extern void join_path_components(char *ret_path,+ const char *head, const char *tail);+extern void canonicalize_path(char *path);+extern void make_native_path(char *path);+extern bool path_contains_parent_reference(const char *path);+extern bool path_is_relative_and_below_cwd(const char *path);+extern bool path_is_prefix_of_path(const char *path1, const char *path2);+extern char *make_absolute_path(const char *path);+extern const char *get_progname(const char *argv0);+extern void get_share_path(const char *my_exec_path, char *ret_path);+extern void get_etc_path(const char *my_exec_path, char *ret_path);+extern void get_include_path(const char *my_exec_path, char *ret_path);+extern void get_pkginclude_path(const char *my_exec_path, char *ret_path);+extern void get_includeserver_path(const char *my_exec_path, char *ret_path);+extern void get_lib_path(const char *my_exec_path, char *ret_path);+extern void get_pkglib_path(const char *my_exec_path, char *ret_path);+extern void get_locale_path(const char *my_exec_path, char *ret_path);+extern void get_doc_path(const char *my_exec_path, char *ret_path);+extern void get_html_path(const char *my_exec_path, char *ret_path);+extern void get_man_path(const char *my_exec_path, char *ret_path);+extern bool get_home_path(char *ret_path);+extern void get_parent_directory(char *path);++/* common/pgfnames.c */+extern char **pgfnames(const char *path);+extern void pgfnames_cleanup(char **filenames);++/*+ * is_absolute_path+ *+ * By making this a macro we avoid needing to include path.c in libpq.+ */+#ifndef WIN32+#define IS_DIR_SEP(ch) ((ch) == '/')++#define is_absolute_path(filename) \+( \+ IS_DIR_SEP((filename)[0]) \+)+#else+#define IS_DIR_SEP(ch) ((ch) == '/' || (ch) == '\\')++/* See path_is_relative_and_below_cwd() for how we handle 'E:abc'. */+#define is_absolute_path(filename) \+( \+ IS_DIR_SEP((filename)[0]) || \+ (isalpha((unsigned char) ((filename)[0])) && (filename)[1] == ':' && \+ IS_DIR_SEP((filename)[2])) \+)+#endif++/* Portable locale initialization (in exec.c) */+extern void set_pglocale_pgservice(const char *argv0, const char *app);++/* Portable way to find binaries (in exec.c) */+extern int find_my_exec(const char *argv0, char *retpath);+extern int find_other_exec(const char *argv0, const char *target,+ const char *versionstr, char *retpath);++/* Windows security token manipulation (in exec.c) */+#ifdef WIN32+extern BOOL AddUserToTokenDacl(HANDLE hToken);+#endif+++#if defined(WIN32) || defined(__CYGWIN__)+#define EXE ".exe"+#else+#define EXE ""+#endif++#if defined(WIN32) && !defined(__CYGWIN__)+#define DEVNULL "nul"+#else+#define DEVNULL "/dev/null"+#endif++/* Portable delay handling */+extern void pg_usleep(long microsec);++/* Portable SQL-like case-independent comparisons and conversions */+extern int pg_strcasecmp(const char *s1, const char *s2);+extern int pg_strncasecmp(const char *s1, const char *s2, size_t n);+extern unsigned char pg_toupper(unsigned char ch);+extern unsigned char pg_tolower(unsigned char ch);+extern unsigned char pg_ascii_toupper(unsigned char ch);+extern unsigned char pg_ascii_tolower(unsigned char ch);++#ifdef USE_REPL_SNPRINTF++/*+ * Versions of libintl >= 0.13 try to replace printf() and friends with+ * macros to their own versions that understand the %$ format. We do the+ * same, so disable their macros, if they exist.+ */+#ifdef vsnprintf+#undef vsnprintf+#endif+#ifdef snprintf+#undef snprintf+#endif+#ifdef sprintf+#undef sprintf+#endif+#ifdef vfprintf+#undef vfprintf+#endif+#ifdef fprintf+#undef fprintf+#endif+#ifdef printf+#undef printf+#endif++extern int pg_vsnprintf(char *str, size_t count, const char *fmt, va_list args);+extern int pg_snprintf(char *str, size_t count, const char *fmt,...) pg_attribute_printf(3, 4);+extern int pg_sprintf(char *str, const char *fmt,...) pg_attribute_printf(2, 3);+extern int pg_vfprintf(FILE *stream, const char *fmt, va_list args);+extern int pg_fprintf(FILE *stream, const char *fmt,...) pg_attribute_printf(2, 3);+extern int pg_printf(const char *fmt,...) pg_attribute_printf(1, 2);++/*+ * The GCC-specific code below prevents the pg_attribute_printf above from+ * being replaced, and this is required because gcc doesn't know anything+ * about pg_printf.+ */+#ifdef __GNUC__+#define vsnprintf(...) pg_vsnprintf(__VA_ARGS__)+#define snprintf(...) pg_snprintf(__VA_ARGS__)+#define sprintf(...) pg_sprintf(__VA_ARGS__)+#define vfprintf(...) pg_vfprintf(__VA_ARGS__)+#define fprintf(...) pg_fprintf(__VA_ARGS__)+#define printf(...) pg_printf(__VA_ARGS__)+#else+#define vsnprintf pg_vsnprintf+#define snprintf pg_snprintf+#define sprintf pg_sprintf+#define vfprintf pg_vfprintf+#define fprintf pg_fprintf+#define printf pg_printf+#endif+#endif /* USE_REPL_SNPRINTF */++#if defined(WIN32)+/*+ * Versions of libintl >= 0.18? try to replace setlocale() with a macro+ * to their own versions. Remove the macro, if it exists, because it+ * ends up calling the wrong version when the backend and libintl use+ * different versions of msvcrt.+ */+#if defined(setlocale)+#undef setlocale+#endif++/*+ * Define our own wrapper macro around setlocale() to work around bugs in+ * Windows' native setlocale() function.+ */+extern char *pgwin32_setlocale(int category, const char *locale);++#define setlocale(a,b) pgwin32_setlocale(a,b)+#endif /* WIN32 */++/* Portable prompt handling */+extern char *simple_prompt(const char *prompt, int maxlen, bool echo);++#ifdef WIN32+#define PG_SIGNAL_COUNT 32+#define kill(pid,sig) pgkill(pid,sig)+extern int pgkill(int pid, int sig);+#endif++extern int pclose_check(FILE *stream);++/* Global variable holding time zone information. */+#ifndef __CYGWIN__+#define TIMEZONE_GLOBAL timezone+#define TZNAME_GLOBAL tzname+#else+#define TIMEZONE_GLOBAL _timezone+#define TZNAME_GLOBAL _tzname+#endif++#if defined(WIN32) || defined(__CYGWIN__)+/*+ * Win32 doesn't have reliable rename/unlink during concurrent access.+ */+extern int pgrename(const char *from, const char *to);+extern int pgunlink(const char *path);++/* Include this first so later includes don't see these defines */+#ifdef WIN32_ONLY_COMPILER+#include <io.h>+#endif++#define rename(from, to) pgrename(from, to)+#define unlink(path) pgunlink(path)+#endif /* defined(WIN32) || defined(__CYGWIN__) */++/*+ * Win32 also doesn't have symlinks, but we can emulate them with+ * junction points on newer Win32 versions.+ *+ * Cygwin has its own symlinks which work on Win95/98/ME where+ * junction points don't, so use those instead. We have no way of+ * knowing what type of system Cygwin binaries will be run on.+ * Note: Some CYGWIN includes might #define WIN32.+ */+#if defined(WIN32) && !defined(__CYGWIN__)+extern int pgsymlink(const char *oldpath, const char *newpath);+extern int pgreadlink(const char *path, char *buf, size_t size);+extern bool pgwin32_is_junction(char *path);++#define symlink(oldpath, newpath) pgsymlink(oldpath, newpath)+#define readlink(path, buf, size) pgreadlink(path, buf, size)+#endif++extern bool rmtree(const char *path, bool rmtopdir);++/*+ * stat() is not guaranteed to set the st_size field on win32, so we+ * redefine it to our own implementation that is.+ *+ * We must pull in sys/stat.h here so the system header definition+ * goes in first, and we redefine that, and not the other way around.+ *+ * Some frontends don't need the size from stat, so if UNSAFE_STAT_OK+ * is defined we don't bother with this.+ */+#if defined(WIN32) && !defined(__CYGWIN__) && !defined(UNSAFE_STAT_OK)+#include <sys/stat.h>+extern int pgwin32_safestat(const char *path, struct stat * buf);++#define stat(a,b) pgwin32_safestat(a,b)+#endif++#if defined(WIN32) && !defined(__CYGWIN__)++/*+ * open() and fopen() replacements to allow deletion of open files and+ * passing of other special options.+ */+#define O_DIRECT 0x80000000+extern int pgwin32_open(const char *, int,...);+extern FILE *pgwin32_fopen(const char *, const char *);++#ifndef FRONTEND+#define open(a,b,c) pgwin32_open(a,b,c)+#define fopen(a,b) pgwin32_fopen(a,b)+#endif++/*+ * Mingw-w64 headers #define popen and pclose to _popen and _pclose. We want+ * to use our popen wrapper, rather than plain _popen, so override that. For+ * consistency, use our version of pclose, too.+ */+#ifdef popen+#undef popen+#endif+#ifdef pclose+#undef pclose+#endif++/*+ * system() and popen() replacements to enclose the command in an extra+ * pair of quotes.+ */+extern int pgwin32_system(const char *command);+extern FILE *pgwin32_popen(const char *command, const char *type);++#define system(a) pgwin32_system(a)+#define popen(a,b) pgwin32_popen(a,b)+#define pclose(a) _pclose(a)++/* New versions of MingW have gettimeofday, old mingw and msvc don't */+#ifndef HAVE_GETTIMEOFDAY+/* Last parameter not used */+extern int gettimeofday(struct timeval * tp, struct timezone * tzp);+#endif+#else /* !WIN32 */++/*+ * Win32 requires a special close for sockets and pipes, while on Unix+ * close() does them all.+ */+#define closesocket close+#endif /* WIN32 */++/*+ * On Windows, setvbuf() does not support _IOLBF mode, and interprets that+ * as _IOFBF. To add insult to injury, setvbuf(file, NULL, _IOFBF, 0)+ * crashes outright if "parameter validation" is enabled. Therefore, in+ * places where we'd like to select line-buffered mode, we fall back to+ * unbuffered mode instead on Windows. Always use PG_IOLBF not _IOLBF+ * directly in order to implement this behavior.+ */+#ifndef WIN32+#define PG_IOLBF _IOLBF+#else+#define PG_IOLBF _IONBF+#endif++/*+ * Default "extern" declarations or macro substitutes for library routines.+ * When necessary, these routines are provided by files in src/port/.+ */+#ifndef HAVE_CRYPT+extern char *crypt(const char *key, const char *setting);+#endif++/* WIN32 handled in port/win32.h */+#ifndef WIN32+#define pgoff_t off_t+#ifdef __NetBSD__+extern int fseeko(FILE *stream, off_t offset, int whence);+extern off_t ftello(FILE *stream);+#endif+#endif++extern double pg_erand48(unsigned short xseed[3]);+extern long pg_lrand48(void);+extern void pg_srand48(long seed);++#ifndef HAVE_FLS+extern int fls(int mask);+#endif++#ifndef HAVE_FSEEKO+#define fseeko(a, b, c) fseek(a, b, c)+#define ftello(a) ftell(a)+#endif++#if !defined(HAVE_GETPEEREID) && !defined(WIN32)+extern int getpeereid(int sock, uid_t *uid, gid_t *gid);+#endif++#ifndef HAVE_ISINF+extern int isinf(double x);+#endif++#ifndef HAVE_MKDTEMP+extern char *mkdtemp(char *path);+#endif++#ifndef HAVE_RINT+extern double rint(double x);+#endif++#ifndef HAVE_INET_ATON+#include <netinet/in.h>+#include <arpa/inet.h>+extern int inet_aton(const char *cp, struct in_addr * addr);+#endif++#if !HAVE_DECL_STRLCAT+extern size_t strlcat(char *dst, const char *src, size_t siz);+#endif++#if !HAVE_DECL_STRLCPY+extern size_t strlcpy(char *dst, const char *src, size_t siz);+#endif++#if !defined(HAVE_RANDOM) && !defined(__BORLANDC__)+extern long random(void);+#endif++#ifndef HAVE_UNSETENV+extern void unsetenv(const char *name);+#endif++#ifndef HAVE_SRANDOM+extern void srandom(unsigned int seed);+#endif++#ifndef HAVE_SSL_GET_CURRENT_COMPRESSION+#define SSL_get_current_compression(x) 0+#endif++/* thread.h */+extern char *pqStrerror(int errnum, char *strerrbuf, size_t buflen);++#ifndef WIN32+extern int pqGetpwuid(uid_t uid, struct passwd * resultbuf, char *buffer,+ size_t buflen, struct passwd ** result);+#endif++extern int pqGethostbyname(const char *name,+ struct hostent * resultbuf,+ char *buffer, size_t buflen,+ struct hostent ** result,+ int *herrno);++extern void pg_qsort(void *base, size_t nel, size_t elsize,+ int (*cmp) (const void *, const void *));+extern int pg_qsort_strcmp(const void *a, const void *b);++#define qsort(a,b,c,d) pg_qsort(a,b,c,d)++typedef int (*qsort_arg_comparator) (const void *a, const void *b, void *arg);++extern void qsort_arg(void *base, size_t nel, size_t elsize,+ qsort_arg_comparator cmp, void *arg);++/* port/chklocale.c */+extern int pg_get_encoding_from_locale(const char *ctype, bool write_message);++#if defined(WIN32) && !defined(FRONTEND)+extern int pg_codepage_to_encoding(UINT cp);+#endif++/* port/inet_net_ntop.c */+extern char *inet_net_ntop(int af, const void *src, int bits,+ char *dst, size_t size);++/* port/pgcheckdir.c */+extern int pg_check_dir(const char *dir);++/* port/pgmkdirp.c */+extern int pg_mkdir_p(char *path, int omode);++/* port/pqsignal.c */+typedef void (*pqsigfunc) (int signo);+extern pqsigfunc pqsignal(int signo, pqsigfunc func);++/* port/quotes.c */+extern char *escape_single_quotes_ascii(const char *src);++/* port/wait_error.c */+extern char *wait_result_to_str(int exit_status);++#endif /* PG_PORT_H */
+ foreign/libpg_query/src/postgres/include/port/atomics.h view
@@ -0,0 +1,537 @@+/*-------------------------------------------------------------------------+ *+ * atomics.h+ * Atomic operations.+ *+ * Hardware and compiler dependent functions for manipulating memory+ * atomically and dealing with cache coherency. Used to implement locking+ * facilities and lockless algorithms/data structures.+ *+ * To bring up postgres on a platform/compiler at the very least+ * implementations for the following operations should be provided:+ * * pg_compiler_barrier(), pg_write_barrier(), pg_read_barrier()+ * * pg_atomic_compare_exchange_u32(), pg_atomic_fetch_add_u32()+ * * pg_atomic_test_set_flag(), pg_atomic_init_flag(), pg_atomic_clear_flag()+ *+ * There exist generic, hardware independent, implementations for several+ * compilers which might be sufficient, although possibly not optimal, for a+ * new platform. If no such generic implementation is available spinlocks (or+ * even OS provided semaphores) will be used to implement the API.+ *+ * Implement the _u64 variants if and only if your platform can use them+ * efficiently (and obviously correctly).+ *+ * Use higher level functionality (lwlocks, spinlocks, heavyweight locks)+ * whenever possible. Writing correct code using these facilities is hard.+ *+ * For an introduction to using memory barriers within the PostgreSQL backend,+ * see src/backend/storage/lmgr/README.barrier+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/port/atomics.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef ATOMICS_H+#define ATOMICS_H++#define INSIDE_ATOMICS_H++#include <limits.h>++/*+ * First a set of architecture specific files is included.+ *+ * These files can provide the full set of atomics or can do pretty much+ * nothing if all the compilers commonly used on these platforms provide+ * usable generics.+ *+ * Don't add an inline assembly of the actual atomic operations if all the+ * common implementations of your platform provide intrinsics. Intrinsics are+ * much easier to understand and potentially support more architectures.+ *+ * It will often make sense to define memory barrier semantics here, since+ * e.g. generic compiler intrinsics for x86 memory barriers can't know that+ * postgres doesn't need x86 read/write barriers do anything more than a+ * compiler barrier.+ *+ */+#if defined(__arm__) || defined(__arm) || \+ defined(__aarch64__) || defined(__aarch64)+#include "port/atomics/arch-arm.h"+#elif defined(__i386__) || defined(__i386) || defined(__x86_64__)+#include "port/atomics/arch-x86.h"+#elif defined(__ia64__) || defined(__ia64)+#include "port/atomics/arch-ia64.h"+#elif defined(__ppc__) || defined(__powerpc__) || defined(__ppc64__) || defined(__powerpc64__)+#include "port/atomics/arch-ppc.h"+#elif defined(__hppa) || defined(__hppa__)+#include "port/atomics/arch-hppa.h"+#endif++/*+ * Compiler specific, but architecture independent implementations.+ *+ * Provide architecture independent implementations of the atomic+ * facilities. At the very least compiler barriers should be provided, but a+ * full implementation of+ * * pg_compiler_barrier(), pg_write_barrier(), pg_read_barrier()+ * * pg_atomic_compare_exchange_u32(), pg_atomic_fetch_add_u32()+ * using compiler intrinsics are a good idea.+ */+/*+ * Given a gcc-compatible xlc compiler, prefer the xlc implementation. The+ * ppc64le "IBM XL C/C++ for Linux, V13.1.2" implements both interfaces, but+ * __sync_lock_test_and_set() of one-byte types elicits SIGSEGV.+ */+#if defined(__IBMC__) || defined(__IBMCPP__)+#include "port/atomics/generic-xlc.h"+/* gcc or compatible, including clang and icc */+#elif defined(__GNUC__) || defined(__INTEL_COMPILER)+#include "port/atomics/generic-gcc.h"+#elif defined(WIN32_ONLY_COMPILER)+#include "port/atomics/generic-msvc.h"+#elif defined(__hpux) && defined(__ia64) && !defined(__GNUC__)+#include "port/atomics/generic-acc.h"+#elif defined(__SUNPRO_C) && !defined(__GNUC__)+#include "port/atomics/generic-sunpro.h"+#else+/*+ * Unsupported compiler, we'll likely use slower fallbacks... At least+ * compiler barriers should really be provided.+ */+#endif++/*+ * Provide a full fallback of the pg_*_barrier(), pg_atomic**_flag and+ * pg_atomic_*_u32 APIs for platforms without sufficient spinlock and/or+ * atomics support. In the case of spinlock backed atomics the emulation is+ * expected to be efficient, although less so than native atomics support.+ */+#include "port/atomics/fallback.h"++/*+ * Provide additional operations using supported infrastructure. These are+ * expected to be efficient if the underlying atomic operations are efficient.+ */+#include "port/atomics/generic.h"++/*+ * Provide declarations for all functions here - on most platforms static+ * inlines are used and these aren't necessary, but when static inline is+ * unsupported these will be external functions.+ */+STATIC_IF_INLINE_DECLARE void pg_atomic_init_flag(volatile pg_atomic_flag *ptr);+STATIC_IF_INLINE_DECLARE bool pg_atomic_test_set_flag(volatile pg_atomic_flag *ptr);+STATIC_IF_INLINE_DECLARE bool pg_atomic_unlocked_test_flag(volatile pg_atomic_flag *ptr);+STATIC_IF_INLINE_DECLARE void pg_atomic_clear_flag(volatile pg_atomic_flag *ptr);++STATIC_IF_INLINE_DECLARE void pg_atomic_init_u32(volatile pg_atomic_uint32 *ptr, uint32 val);+STATIC_IF_INLINE_DECLARE uint32 pg_atomic_read_u32(volatile pg_atomic_uint32 *ptr);+STATIC_IF_INLINE_DECLARE void pg_atomic_write_u32(volatile pg_atomic_uint32 *ptr, uint32 val);+STATIC_IF_INLINE_DECLARE uint32 pg_atomic_exchange_u32(volatile pg_atomic_uint32 *ptr, uint32 newval);+STATIC_IF_INLINE_DECLARE bool pg_atomic_compare_exchange_u32(volatile pg_atomic_uint32 *ptr,+ uint32 *expected, uint32 newval);+STATIC_IF_INLINE_DECLARE uint32 pg_atomic_fetch_add_u32(volatile pg_atomic_uint32 *ptr, int32 add_);+STATIC_IF_INLINE_DECLARE uint32 pg_atomic_fetch_sub_u32(volatile pg_atomic_uint32 *ptr, int32 sub_);+STATIC_IF_INLINE_DECLARE uint32 pg_atomic_fetch_and_u32(volatile pg_atomic_uint32 *ptr, uint32 and_);+STATIC_IF_INLINE_DECLARE uint32 pg_atomic_fetch_or_u32(volatile pg_atomic_uint32 *ptr, uint32 or_);+STATIC_IF_INLINE_DECLARE uint32 pg_atomic_add_fetch_u32(volatile pg_atomic_uint32 *ptr, int32 add_);+STATIC_IF_INLINE_DECLARE uint32 pg_atomic_sub_fetch_u32(volatile pg_atomic_uint32 *ptr, int32 sub_);++#ifdef PG_HAVE_ATOMIC_U64_SUPPORT++STATIC_IF_INLINE_DECLARE void pg_atomic_init_u64(volatile pg_atomic_uint64 *ptr, uint64 val_);+STATIC_IF_INLINE_DECLARE uint64 pg_atomic_read_u64(volatile pg_atomic_uint64 *ptr);+STATIC_IF_INLINE_DECLARE void pg_atomic_write_u64(volatile pg_atomic_uint64 *ptr, uint64 val);+STATIC_IF_INLINE_DECLARE uint64 pg_atomic_exchange_u64(volatile pg_atomic_uint64 *ptr, uint64 newval);+STATIC_IF_INLINE_DECLARE bool pg_atomic_compare_exchange_u64(volatile pg_atomic_uint64 *ptr,+ uint64 *expected, uint64 newval);+STATIC_IF_INLINE_DECLARE uint64 pg_atomic_fetch_add_u64(volatile pg_atomic_uint64 *ptr, int64 add_);+STATIC_IF_INLINE_DECLARE uint64 pg_atomic_fetch_sub_u64(volatile pg_atomic_uint64 *ptr, int64 sub_);+STATIC_IF_INLINE_DECLARE uint64 pg_atomic_fetch_and_u64(volatile pg_atomic_uint64 *ptr, uint64 and_);+STATIC_IF_INLINE_DECLARE uint64 pg_atomic_fetch_or_u64(volatile pg_atomic_uint64 *ptr, uint64 or_);+STATIC_IF_INLINE_DECLARE uint64 pg_atomic_add_fetch_u64(volatile pg_atomic_uint64 *ptr, int64 add_);+STATIC_IF_INLINE_DECLARE uint64 pg_atomic_sub_fetch_u64(volatile pg_atomic_uint64 *ptr, int64 sub_);++#endif /* PG_HAVE_64_BIT_ATOMICS */+++/*+ * pg_compiler_barrier - prevent the compiler from moving code across+ *+ * A compiler barrier need not (and preferably should not) emit any actual+ * machine code, but must act as an optimization fence: the compiler must not+ * reorder loads or stores to main memory around the barrier. However, the+ * CPU may still reorder loads or stores at runtime, if the architecture's+ * memory model permits this.+ */+#define pg_compiler_barrier() pg_compiler_barrier_impl()++/*+ * pg_memory_barrier - prevent the CPU from reordering memory access+ *+ * A memory barrier must act as a compiler barrier, and in addition must+ * guarantee that all loads and stores issued prior to the barrier are+ * completed before any loads or stores issued after the barrier. Unless+ * loads and stores are totally ordered (which is not the case on most+ * architectures) this requires issuing some sort of memory fencing+ * instruction.+ */+#define pg_memory_barrier() pg_memory_barrier_impl()++/*+ * pg_(read|write)_barrier - prevent the CPU from reordering memory access+ *+ * A read barrier must act as a compiler barrier, and in addition must+ * guarantee that any loads issued prior to the barrier are completed before+ * any loads issued after the barrier. Similarly, a write barrier acts+ * as a compiler barrier, and also orders stores. Read and write barriers+ * are thus weaker than a full memory barrier, but stronger than a compiler+ * barrier. In practice, on machines with strong memory ordering, read and+ * write barriers may require nothing more than a compiler barrier.+ */+#define pg_read_barrier() pg_read_barrier_impl()+#define pg_write_barrier() pg_write_barrier_impl()++/*+ * Spinloop delay - Allow CPU to relax in busy loops+ */+#define pg_spin_delay() pg_spin_delay_impl()++/*+ * The following functions are wrapper functions around the platform specific+ * implementation of the atomic operations performing common checks.+ */+#if defined(PG_USE_INLINE) || defined(ATOMICS_INCLUDE_DEFINITIONS)++/*+ * pg_atomic_init_flag - initialize atomic flag.+ *+ * No barrier semantics.+ */+STATIC_IF_INLINE_DECLARE void+pg_atomic_init_flag(volatile pg_atomic_flag *ptr)+{+ AssertPointerAlignment(ptr, sizeof(*ptr));++ pg_atomic_init_flag_impl(ptr);+}++/*+ * pg_atomic_test_and_set_flag - TAS()+ *+ * Returns true if the flag has successfully been set, false otherwise.+ *+ * Acquire (including read barrier) semantics.+ */+STATIC_IF_INLINE_DECLARE bool+pg_atomic_test_set_flag(volatile pg_atomic_flag *ptr)+{+ AssertPointerAlignment(ptr, sizeof(*ptr));++ return pg_atomic_test_set_flag_impl(ptr);+}++/*+ * pg_atomic_unlocked_test_flag - Check if the lock is free+ *+ * Returns true if the flag currently is not set, false otherwise.+ *+ * No barrier semantics.+ */+STATIC_IF_INLINE_DECLARE bool+pg_atomic_unlocked_test_flag(volatile pg_atomic_flag *ptr)+{+ AssertPointerAlignment(ptr, sizeof(*ptr));++ return pg_atomic_unlocked_test_flag_impl(ptr);+}++/*+ * pg_atomic_clear_flag - release lock set by TAS()+ *+ * Release (including write barrier) semantics.+ */+STATIC_IF_INLINE_DECLARE void+pg_atomic_clear_flag(volatile pg_atomic_flag *ptr)+{+ AssertPointerAlignment(ptr, sizeof(*ptr));++ pg_atomic_clear_flag_impl(ptr);+}+++/*+ * pg_atomic_init_u32 - initialize atomic variable+ *+ * Has to be done before any concurrent usage..+ *+ * No barrier semantics.+ */+STATIC_IF_INLINE_DECLARE void+pg_atomic_init_u32(volatile pg_atomic_uint32 *ptr, uint32 val)+{+ AssertPointerAlignment(ptr, 4);++ pg_atomic_init_u32_impl(ptr, val);+}++/*+ * pg_atomic_read_u32 - unlocked read from atomic variable.+ *+ * The read is guaranteed to return a value as it has been written by this or+ * another process at some point in the past. There's however no cache+ * coherency interaction guaranteeing the value hasn't since been written to+ * again.+ *+ * No barrier semantics.+ */+STATIC_IF_INLINE uint32+pg_atomic_read_u32(volatile pg_atomic_uint32 *ptr)+{+ AssertPointerAlignment(ptr, 4);+ return pg_atomic_read_u32_impl(ptr);+}++/*+ * pg_atomic_write_u32 - unlocked write to atomic variable.+ *+ * The write is guaranteed to succeed as a whole, i.e. it's not possible to+ * observe a partial write for any reader.+ *+ * No barrier semantics.+ */+STATIC_IF_INLINE_DECLARE void+pg_atomic_write_u32(volatile pg_atomic_uint32 *ptr, uint32 val)+{+ AssertPointerAlignment(ptr, 4);++ pg_atomic_write_u32_impl(ptr, val);+}++/*+ * pg_atomic_exchange_u32 - exchange newval with current value+ *+ * Returns the old value of 'ptr' before the swap.+ *+ * Full barrier semantics.+ */+STATIC_IF_INLINE uint32+pg_atomic_exchange_u32(volatile pg_atomic_uint32 *ptr, uint32 newval)+{+ AssertPointerAlignment(ptr, 4);++ return pg_atomic_exchange_u32_impl(ptr, newval);+}++/*+ * pg_atomic_compare_exchange_u32 - CAS operation+ *+ * Atomically compare the current value of ptr with *expected and store newval+ * iff ptr and *expected have the same value. The current value of *ptr will+ * always be stored in *expected.+ *+ * Return true if values have been exchanged, false otherwise.+ *+ * Full barrier semantics.+ */+STATIC_IF_INLINE bool+pg_atomic_compare_exchange_u32(volatile pg_atomic_uint32 *ptr,+ uint32 *expected, uint32 newval)+{+ AssertPointerAlignment(ptr, 4);+ AssertPointerAlignment(expected, 4);++ return pg_atomic_compare_exchange_u32_impl(ptr, expected, newval);+}++/*+ * pg_atomic_fetch_add_u32 - atomically add to variable+ *+ * Returns the value of ptr before the arithmetic operation.+ *+ * Full barrier semantics.+ */+STATIC_IF_INLINE uint32+pg_atomic_fetch_add_u32(volatile pg_atomic_uint32 *ptr, int32 add_)+{+ AssertPointerAlignment(ptr, 4);+ return pg_atomic_fetch_add_u32_impl(ptr, add_);+}++/*+ * pg_atomic_fetch_sub_u32 - atomically subtract from variable+ *+ * Returns the value of ptr before the arithmetic operation. Note that sub_+ * may not be INT_MIN due to platform limitations.+ *+ * Full barrier semantics.+ */+STATIC_IF_INLINE uint32+pg_atomic_fetch_sub_u32(volatile pg_atomic_uint32 *ptr, int32 sub_)+{+ AssertPointerAlignment(ptr, 4);+ Assert(sub_ != INT_MIN);+ return pg_atomic_fetch_sub_u32_impl(ptr, sub_);+}++/*+ * pg_atomic_fetch_and_u32 - atomically bit-and and_ with variable+ *+ * Returns the value of ptr before the arithmetic operation.+ *+ * Full barrier semantics.+ */+STATIC_IF_INLINE uint32+pg_atomic_fetch_and_u32(volatile pg_atomic_uint32 *ptr, uint32 and_)+{+ AssertPointerAlignment(ptr, 4);+ return pg_atomic_fetch_and_u32_impl(ptr, and_);+}++/*+ * pg_atomic_fetch_or_u32 - atomically bit-or or_ with variable+ *+ * Returns the value of ptr before the arithmetic operation.+ *+ * Full barrier semantics.+ */+STATIC_IF_INLINE uint32+pg_atomic_fetch_or_u32(volatile pg_atomic_uint32 *ptr, uint32 or_)+{+ AssertPointerAlignment(ptr, 4);+ return pg_atomic_fetch_or_u32_impl(ptr, or_);+}++/*+ * pg_atomic_add_fetch_u32 - atomically add to variable+ *+ * Returns the value of ptr after the arithmetic operation.+ *+ * Full barrier semantics.+ */+STATIC_IF_INLINE uint32+pg_atomic_add_fetch_u32(volatile pg_atomic_uint32 *ptr, int32 add_)+{+ AssertPointerAlignment(ptr, 4);+ return pg_atomic_add_fetch_u32_impl(ptr, add_);+}++/*+ * pg_atomic_sub_fetch_u32 - atomically subtract from variable+ *+ * Returns the value of ptr after the arithmetic operation. Note that sub_ may+ * not be INT_MIN due to platform limitations.+ *+ * Full barrier semantics.+ */+STATIC_IF_INLINE uint32+pg_atomic_sub_fetch_u32(volatile pg_atomic_uint32 *ptr, int32 sub_)+{+ AssertPointerAlignment(ptr, 4);+ Assert(sub_ != INT_MIN);+ return pg_atomic_sub_fetch_u32_impl(ptr, sub_);+}++/* ----+ * The 64 bit operations have the same semantics as their 32bit counterparts+ * if they are available. Check the corresponding 32bit function for+ * documentation.+ * ----+ */+#ifdef PG_HAVE_ATOMIC_U64_SUPPORT++STATIC_IF_INLINE_DECLARE void+pg_atomic_init_u64(volatile pg_atomic_uint64 *ptr, uint64 val)+{+ AssertPointerAlignment(ptr, 8);++ pg_atomic_init_u64_impl(ptr, val);+}++STATIC_IF_INLINE uint64+pg_atomic_read_u64(volatile pg_atomic_uint64 *ptr)+{+ AssertPointerAlignment(ptr, 8);+ return pg_atomic_read_u64_impl(ptr);+}++STATIC_IF_INLINE void+pg_atomic_write_u64(volatile pg_atomic_uint64 *ptr, uint64 val)+{+ AssertPointerAlignment(ptr, 8);+ pg_atomic_write_u64_impl(ptr, val);+}++STATIC_IF_INLINE uint64+pg_atomic_exchange_u64(volatile pg_atomic_uint64 *ptr, uint64 newval)+{+ AssertPointerAlignment(ptr, 8);++ return pg_atomic_exchange_u64_impl(ptr, newval);+}++STATIC_IF_INLINE bool+pg_atomic_compare_exchange_u64(volatile pg_atomic_uint64 *ptr,+ uint64 *expected, uint64 newval)+{+ AssertPointerAlignment(ptr, 8);+ AssertPointerAlignment(expected, 8);+ return pg_atomic_compare_exchange_u64_impl(ptr, expected, newval);+}++STATIC_IF_INLINE uint64+pg_atomic_fetch_add_u64(volatile pg_atomic_uint64 *ptr, int64 add_)+{+ AssertPointerAlignment(ptr, 8);+ return pg_atomic_fetch_add_u64_impl(ptr, add_);+}++STATIC_IF_INLINE uint64+pg_atomic_fetch_sub_u64(volatile pg_atomic_uint64 *ptr, int64 sub_)+{+ AssertPointerAlignment(ptr, 8);+ Assert(sub_ != PG_INT64_MIN);+ return pg_atomic_fetch_sub_u64_impl(ptr, sub_);+}++STATIC_IF_INLINE uint64+pg_atomic_fetch_and_u64(volatile pg_atomic_uint64 *ptr, uint64 and_)+{+ AssertPointerAlignment(ptr, 8);+ return pg_atomic_fetch_and_u64_impl(ptr, and_);+}++STATIC_IF_INLINE uint64+pg_atomic_fetch_or_u64(volatile pg_atomic_uint64 *ptr, uint64 or_)+{+ AssertPointerAlignment(ptr, 8);+ return pg_atomic_fetch_or_u64_impl(ptr, or_);+}++STATIC_IF_INLINE uint64+pg_atomic_add_fetch_u64(volatile pg_atomic_uint64 *ptr, int64 add_)+{+ AssertPointerAlignment(ptr, 8);+ return pg_atomic_add_fetch_u64_impl(ptr, add_);+}++STATIC_IF_INLINE uint64+pg_atomic_sub_fetch_u64(volatile pg_atomic_uint64 *ptr, int64 sub_)+{+ AssertPointerAlignment(ptr, 8);+ Assert(sub_ != PG_INT64_MIN);+ return pg_atomic_sub_fetch_u64_impl(ptr, sub_);+}++#endif /* PG_HAVE_64_BIT_ATOMICS */++#endif /* defined(PG_USE_INLINE) ||+ * defined(ATOMICS_INCLUDE_DEFINITIONS) */++#undef INSIDE_ATOMICS_H++#endif /* ATOMICS_H */
+ foreign/libpg_query/src/postgres/include/port/atomics/arch-x86.h view
@@ -0,0 +1,255 @@+/*-------------------------------------------------------------------------+ *+ * arch-x86.h+ * Atomic operations considerations specific to intel x86+ *+ * Note that we actually require a 486 upwards because the 386 doesn't have+ * support for xadd and cmpxchg. Given that the 386 isn't supported anywhere+ * anymore that's not much of restriction luckily.+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * NOTES:+ *+ * src/include/port/atomics/arch-x86.h+ *+ *-------------------------------------------------------------------------+ */++/*+ * Both 32 and 64 bit x86 do not allow loads to be reordered with other loads,+ * or stores to be reordered with other stores, but a load can be performed+ * before a subsequent store.+ *+ * Technically, some x86-ish chips support uncached memory access and/or+ * special instructions that are weakly ordered. In those cases we'd need+ * the read and write barriers to be lfence and sfence. But since we don't+ * do those things, a compiler barrier should be enough.+ *+ * "lock; addl" has worked for longer than "mfence". It's also rumored to be+ * faster in many scenarios+ */++#if defined(__INTEL_COMPILER)+#define pg_memory_barrier_impl() _mm_mfence()+#elif defined(__GNUC__) && (defined(__i386__) || defined(__i386))+#define pg_memory_barrier_impl() \+ __asm__ __volatile__ ("lock; addl $0,0(%%esp)" : : : "memory", "cc")+#elif defined(__GNUC__) && defined(__x86_64__)+#define pg_memory_barrier_impl() \+ __asm__ __volatile__ ("lock; addl $0,0(%%rsp)" : : : "memory", "cc")+#endif++#define pg_read_barrier_impl() pg_compiler_barrier_impl()+#define pg_write_barrier_impl() pg_compiler_barrier_impl()++/*+ * Provide implementation for atomics using inline assembly on x86 gcc. It's+ * nice to support older gcc's and the compare/exchange implementation here is+ * actually more efficient than the * __sync variant.+ */+#if defined(HAVE_ATOMICS)++#if defined(__GNUC__) && !defined(__INTEL_COMPILER)++#define PG_HAVE_ATOMIC_FLAG_SUPPORT+typedef struct pg_atomic_flag+{+ volatile char value;+} pg_atomic_flag;++#define PG_HAVE_ATOMIC_U32_SUPPORT+typedef struct pg_atomic_uint32+{+ volatile uint32 value;+} pg_atomic_uint32;++/*+ * It's too complicated to write inline asm for 64bit types on 32bit and the+ * 486 can't do it.+ */+#ifdef __x86_64__+#define PG_HAVE_ATOMIC_U64_SUPPORT+typedef struct pg_atomic_uint64+{+ /* alignment guaranteed due to being on a 64bit platform */+ volatile uint64 value;+} pg_atomic_uint64;+#endif++#endif /* defined(HAVE_ATOMICS) */++#endif /* defined(__GNUC__) && !defined(__INTEL_COMPILER) */++#if defined(PG_USE_INLINE) || defined(ATOMICS_INCLUDE_DEFINITIONS)++#if !defined(PG_HAVE_SPIN_DELAY)+/*+ * This sequence is equivalent to the PAUSE instruction ("rep" is+ * ignored by old IA32 processors if the following instruction is+ * not a string operation); the IA-32 Architecture Software+ * Developer's Manual, Vol. 3, Section 7.7.2 describes why using+ * PAUSE in the inner loop of a spin lock is necessary for good+ * performance:+ *+ * The PAUSE instruction improves the performance of IA-32+ * processors supporting Hyper-Threading Technology when+ * executing spin-wait loops and other routines where one+ * thread is accessing a shared lock or semaphore in a tight+ * polling loop. When executing a spin-wait loop, the+ * processor can suffer a severe performance penalty when+ * exiting the loop because it detects a possible memory order+ * violation and flushes the core processor's pipeline. The+ * PAUSE instruction provides a hint to the processor that the+ * code sequence is a spin-wait loop. The processor uses this+ * hint to avoid the memory order violation and prevent the+ * pipeline flush. In addition, the PAUSE instruction+ * de-pipelines the spin-wait loop to prevent it from+ * consuming execution resources excessively.+ */+#if defined(__INTEL_COMPILER)+#define PG_HAVE_SPIN_DELAY+static inline+pg_spin_delay_impl(void)+{+ _mm_pause();+}+#elif defined(__GNUC__)+#define PG_HAVE_SPIN_DELAY+static __inline__ void+pg_spin_delay_impl(void)+{+ __asm__ __volatile__(+ " rep; nop \n");+}+#elif defined(WIN32_ONLY_COMPILER) && defined(__x86_64__)+#define PG_HAVE_SPIN_DELAY+static __forceinline void+pg_spin_delay_impl(void)+{+ _mm_pause();+}+#elif defined(WIN32_ONLY_COMPILER)+#define PG_HAVE_SPIN_DELAY+static __forceinline void+pg_spin_delay_impl(void)+{+ /* See comment for gcc code. Same code, MASM syntax */+ __asm rep nop;+}+#endif+#endif /* !defined(PG_HAVE_SPIN_DELAY) */+++#if defined(HAVE_ATOMICS)++/* inline assembly implementation for gcc */+#if defined(__GNUC__) && !defined(__INTEL_COMPILER)++#define PG_HAVE_ATOMIC_TEST_SET_FLAG+static inline bool+pg_atomic_test_set_flag_impl(volatile pg_atomic_flag *ptr)+{+ register char _res = 1;++ __asm__ __volatile__(+ " lock \n"+ " xchgb %0,%1 \n"+: "+q"(_res), "+m"(ptr->value)+:+: "memory");+ return _res == 0;+}++#define PG_HAVE_ATOMIC_CLEAR_FLAG+static inline void+pg_atomic_clear_flag_impl(volatile pg_atomic_flag *ptr)+{+ /*+ * On a TSO architecture like x86 it's sufficient to use a compiler+ * barrier to achieve release semantics.+ */+ __asm__ __volatile__("" ::: "memory");+ ptr->value = 0;+}++#define PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U32+static inline bool+pg_atomic_compare_exchange_u32_impl(volatile pg_atomic_uint32 *ptr,+ uint32 *expected, uint32 newval)+{+ char ret;++ /*+ * Perform cmpxchg and use the zero flag which it implicitly sets when+ * equal to measure the success.+ */+ __asm__ __volatile__(+ " lock \n"+ " cmpxchgl %4,%5 \n"+ " setz %2 \n"+: "=a" (*expected), "=m"(ptr->value), "=q" (ret)+: "a" (*expected), "r" (newval), "m"(ptr->value)+: "memory", "cc");+ return (bool) ret;+}++#define PG_HAVE_ATOMIC_FETCH_ADD_U32+static inline uint32+pg_atomic_fetch_add_u32_impl(volatile pg_atomic_uint32 *ptr, int32 add_)+{+ uint32 res;+ __asm__ __volatile__(+ " lock \n"+ " xaddl %0,%1 \n"+: "=q"(res), "=m"(ptr->value)+: "0" (add_), "m"(ptr->value)+: "memory", "cc");+ return res;+}++#ifdef __x86_64__++#define PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U64+static inline bool+pg_atomic_compare_exchange_u64_impl(volatile pg_atomic_uint64 *ptr,+ uint64 *expected, uint64 newval)+{+ char ret;++ /*+ * Perform cmpxchg and use the zero flag which it implicitly sets when+ * equal to measure the success.+ */+ __asm__ __volatile__(+ " lock \n"+ " cmpxchgq %4,%5 \n"+ " setz %2 \n"+: "=a" (*expected), "=m"(ptr->value), "=q" (ret)+: "a" (*expected), "r" (newval), "m"(ptr->value)+: "memory", "cc");+ return (bool) ret;+}++#define PG_HAVE_ATOMIC_FETCH_ADD_U64+static inline uint64+pg_atomic_fetch_add_u64_impl(volatile pg_atomic_uint64 *ptr, int64 add_)+{+ uint64 res;+ __asm__ __volatile__(+ " lock \n"+ " xaddq %0,%1 \n"+: "=q"(res), "=m"(ptr->value)+: "0" (add_), "m"(ptr->value)+: "memory", "cc");+ return res;+}++#endif /* __x86_64__ */++#endif /* defined(__GNUC__) && !defined(__INTEL_COMPILER) */++#endif /* HAVE_ATOMICS */++#endif /* defined(PG_USE_INLINE) || defined(ATOMICS_INCLUDE_DEFINITIONS) */
+ foreign/libpg_query/src/postgres/include/port/atomics/fallback.h view
@@ -0,0 +1,148 @@+/*-------------------------------------------------------------------------+ *+ * fallback.h+ * Fallback for platforms without spinlock and/or atomics support. Slower+ * than native atomics support, but not unusably slow.+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/port/atomics/fallback.h+ *+ *-------------------------------------------------------------------------+ */++/* intentionally no include guards, should only be included by atomics.h */+#ifndef INSIDE_ATOMICS_H+# error "should be included via atomics.h"+#endif++#ifndef pg_memory_barrier_impl+/*+ * If we have no memory barrier implementation for this architecture, we+ * fall back to acquiring and releasing a spinlock. This might, in turn,+ * fall back to the semaphore-based spinlock implementation, which will be+ * amazingly slow.+ *+ * It's not self-evident that every possible legal implementation of a+ * spinlock acquire-and-release would be equivalent to a full memory barrier.+ * For example, I'm not sure that Itanium's acq and rel add up to a full+ * fence. But all of our actual implementations seem OK in this regard.+ */+#define PG_HAVE_MEMORY_BARRIER_EMULATION++extern void pg_spinlock_barrier(void);+#define pg_memory_barrier_impl pg_spinlock_barrier+#endif++#ifndef pg_compiler_barrier_impl+/*+ * If the compiler/arch combination does not provide compiler barriers,+ * provide a fallback. The fallback simply consists of a function call into+ * an externally defined function. That should guarantee compiler barrier+ * semantics except for compilers that do inter translation unit/global+ * optimization - those better provide an actual compiler barrier.+ *+ * A native compiler barrier for sure is a lot faster than this...+ */+#define PG_HAVE_COMPILER_BARRIER_EMULATION+extern void pg_extern_compiler_barrier(void);+#define pg_compiler_barrier_impl pg_extern_compiler_barrier+#endif+++/*+ * If we have atomics implementation for this platform, fall back to providing+ * the atomics API using a spinlock to protect the internal state. Possibly+ * the spinlock implementation uses semaphores internally...+ *+ * We have to be a bit careful here, as it's not guaranteed that atomic+ * variables are mapped to the same address in every process (e.g. dynamic+ * shared memory segments). We can't just hash the address and use that to map+ * to a spinlock. Instead assign a spinlock on initialization of the atomic+ * variable.+ */+#if !defined(PG_HAVE_ATOMIC_FLAG_SUPPORT) && !defined(PG_HAVE_ATOMIC_U32_SUPPORT)++#define PG_HAVE_ATOMIC_FLAG_SIMULATION+#define PG_HAVE_ATOMIC_FLAG_SUPPORT++typedef struct pg_atomic_flag+{+ /*+ * To avoid circular includes we can't use s_lock as a type here. Instead+ * just reserve enough space for all spinlock types. Some platforms would+ * be content with just one byte instead of 4, but that's not too much+ * waste.+ */+#if defined(__hppa) || defined(__hppa__) /* HP PA-RISC, GCC and HP compilers */+ int sema[4];+#else+ int sema;+#endif+} pg_atomic_flag;++#endif /* PG_HAVE_ATOMIC_FLAG_SUPPORT */++#if !defined(PG_HAVE_ATOMIC_U32_SUPPORT)++#define PG_HAVE_ATOMIC_U32_SIMULATION++#define PG_HAVE_ATOMIC_U32_SUPPORT+typedef struct pg_atomic_uint32+{+ /* Check pg_atomic_flag's definition above for an explanation */+#if defined(__hppa) || defined(__hppa__) /* HP PA-RISC, GCC and HP compilers */+ int sema[4];+#else+ int sema;+#endif+ volatile uint32 value;+} pg_atomic_uint32;++#endif /* PG_HAVE_ATOMIC_U32_SUPPORT */++#if defined(PG_USE_INLINE) || defined(ATOMICS_INCLUDE_DEFINITIONS)++#ifdef PG_HAVE_ATOMIC_FLAG_SIMULATION++#define PG_HAVE_ATOMIC_INIT_FLAG+extern void pg_atomic_init_flag_impl(volatile pg_atomic_flag *ptr);++#define PG_HAVE_ATOMIC_TEST_SET_FLAG+extern bool pg_atomic_test_set_flag_impl(volatile pg_atomic_flag *ptr);++#define PG_HAVE_ATOMIC_CLEAR_FLAG+extern void pg_atomic_clear_flag_impl(volatile pg_atomic_flag *ptr);++#define PG_HAVE_ATOMIC_UNLOCKED_TEST_FLAG+static inline bool+pg_atomic_unlocked_test_flag_impl(volatile pg_atomic_flag *ptr)+{+ /*+ * Can't do this efficiently in the semaphore based implementation - we'd+ * have to try to acquire the semaphore - so always return true. That's+ * correct, because this is only an unlocked test anyway. Do this in the+ * header so compilers can optimize the test away.+ */+ return true;+}++#endif /* PG_HAVE_ATOMIC_FLAG_SIMULATION */++#ifdef PG_HAVE_ATOMIC_U32_SIMULATION++#define PG_HAVE_ATOMIC_INIT_U32+extern void pg_atomic_init_u32_impl(volatile pg_atomic_uint32 *ptr, uint32 val_);++#define PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U32+extern bool pg_atomic_compare_exchange_u32_impl(volatile pg_atomic_uint32 *ptr,+ uint32 *expected, uint32 newval);++#define PG_HAVE_ATOMIC_FETCH_ADD_U32+extern uint32 pg_atomic_fetch_add_u32_impl(volatile pg_atomic_uint32 *ptr, int32 add_);++#endif /* PG_HAVE_ATOMIC_U32_SIMULATION */+++#endif /* defined(PG_USE_INLINE) || defined(ATOMICS_INCLUDE_DEFINITIONS) */
+ foreign/libpg_query/src/postgres/include/port/atomics/generic-gcc.h view
@@ -0,0 +1,236 @@+/*-------------------------------------------------------------------------+ *+ * generic-gcc.h+ * Atomic operations, implemented using gcc (or compatible) intrinsics.+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * NOTES:+ *+ * Documentation:+ * * Legacy __sync Built-in Functions for Atomic Memory Access+ * http://gcc.gnu.org/onlinedocs/gcc-4.8.2/gcc/_005f_005fsync-Builtins.html+ * * Built-in functions for memory model aware atomic operations+ * http://gcc.gnu.org/onlinedocs/gcc-4.8.2/gcc/_005f_005fatomic-Builtins.html+ *+ * src/include/port/atomics/generic-gcc.h+ *+ *-------------------------------------------------------------------------+ */++/* intentionally no include guards, should only be included by atomics.h */+#ifndef INSIDE_ATOMICS_H+#error "should be included via atomics.h"+#endif++/*+ * icc provides all the same intrinsics but doesn't understand gcc's inline asm+ */+#if defined(__INTEL_COMPILER)+/* NB: Yes, __memory_barrier() is actually just a compiler barrier */+#define pg_compiler_barrier_impl() __memory_barrier()+#else+#define pg_compiler_barrier_impl() __asm__ __volatile__("" ::: "memory")+#endif++/*+ * If we're on GCC 4.1.0 or higher, we should be able to get a memory barrier+ * out of this compiler built-in. But we prefer to rely on platform specific+ * definitions where possible, and use this only as a fallback.+ */+#if !defined(pg_memory_barrier_impl)+# if defined(HAVE_GCC__ATOMIC_INT32_CAS)+# define pg_memory_barrier_impl() __atomic_thread_fence(__ATOMIC_SEQ_CST)+# elif (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 1))+# define pg_memory_barrier_impl() __sync_synchronize()+# endif+#endif /* !defined(pg_memory_barrier_impl) */++#if !defined(pg_read_barrier_impl) && defined(HAVE_GCC__ATOMIC_INT32_CAS)+/* acquire semantics include read barrier semantics */+# define pg_read_barrier_impl() __atomic_thread_fence(__ATOMIC_ACQUIRE)+#endif++#if !defined(pg_write_barrier_impl) && defined(HAVE_GCC__ATOMIC_INT32_CAS)+/* release semantics include write barrier semantics */+# define pg_write_barrier_impl() __atomic_thread_fence(__ATOMIC_RELEASE)+#endif++#ifdef HAVE_ATOMICS++/* generic gcc based atomic flag implementation */+#if !defined(PG_HAVE_ATOMIC_FLAG_SUPPORT) \+ && (defined(HAVE_GCC__SYNC_INT32_TAS) || defined(HAVE_GCC__SYNC_CHAR_TAS))++#define PG_HAVE_ATOMIC_FLAG_SUPPORT+typedef struct pg_atomic_flag+{+ /* some platforms only have a 8 bit wide TAS */+#ifdef HAVE_GCC__SYNC_CHAR_TAS+ volatile char value;+#else+ /* but an int works on more platforms */+ volatile int value;+#endif+} pg_atomic_flag;++#endif /* !ATOMIC_FLAG_SUPPORT && SYNC_INT32_TAS */++/* generic gcc based atomic uint32 implementation */+#if !defined(PG_HAVE_ATOMIC_U32_SUPPORT) \+ && (defined(HAVE_GCC__ATOMIC_INT32_CAS) || defined(HAVE_GCC__SYNC_INT32_CAS))++#define PG_HAVE_ATOMIC_U32_SUPPORT+typedef struct pg_atomic_uint32+{+ volatile uint32 value;+} pg_atomic_uint32;++#endif /* defined(HAVE_GCC__ATOMIC_INT32_CAS) || defined(HAVE_GCC__SYNC_INT32_CAS) */++/* generic gcc based atomic uint64 implementation */+#if !defined(PG_HAVE_ATOMIC_U64_SUPPORT) \+ && !defined(PG_DISABLE_64_BIT_ATOMICS) \+ && (defined(HAVE_GCC__ATOMIC_INT64_CAS) || defined(HAVE_GCC__SYNC_INT64_CAS))++#define PG_HAVE_ATOMIC_U64_SUPPORT++typedef struct pg_atomic_uint64+{+ volatile uint64 value pg_attribute_aligned(8);+} pg_atomic_uint64;++#endif /* defined(HAVE_GCC__ATOMIC_INT64_CAS) || defined(HAVE_GCC__SYNC_INT64_CAS) */++/*+ * Implementation follows. Inlined or directly included from atomics.c+ */+#if defined(PG_USE_INLINE) || defined(ATOMICS_INCLUDE_DEFINITIONS)++#ifdef PG_HAVE_ATOMIC_FLAG_SUPPORT++#if defined(HAVE_GCC__SYNC_CHAR_TAS) || defined(HAVE_GCC__SYNC_INT32_TAS)++#ifndef PG_HAVE_ATOMIC_TEST_SET_FLAG+#define PG_HAVE_ATOMIC_TEST_SET_FLAG+static inline bool+pg_atomic_test_set_flag_impl(volatile pg_atomic_flag *ptr)+{+ /* NB: only an acquire barrier, not a full one */+ /* some platform only support a 1 here */+ return __sync_lock_test_and_set(&ptr->value, 1) == 0;+}+#endif++#endif /* defined(HAVE_GCC__SYNC_*_TAS) */++#ifndef PG_HAVE_ATOMIC_UNLOCKED_TEST_FLAG+#define PG_HAVE_ATOMIC_UNLOCKED_TEST_FLAG+static inline bool+pg_atomic_unlocked_test_flag_impl(volatile pg_atomic_flag *ptr)+{+ return ptr->value == 0;+}+#endif++#ifndef PG_HAVE_ATOMIC_CLEAR_FLAG+#define PG_HAVE_ATOMIC_CLEAR_FLAG+static inline void+pg_atomic_clear_flag_impl(volatile pg_atomic_flag *ptr)+{+ __sync_lock_release(&ptr->value);+}+#endif++#ifndef PG_HAVE_ATOMIC_INIT_FLAG+#define PG_HAVE_ATOMIC_INIT_FLAG+static inline void+pg_atomic_init_flag_impl(volatile pg_atomic_flag *ptr)+{+ pg_atomic_clear_flag_impl(ptr);+}+#endif++#endif /* defined(PG_HAVE_ATOMIC_FLAG_SUPPORT) */++/* prefer __atomic, it has a better API */+#if !defined(PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U32) && defined(HAVE_GCC__ATOMIC_INT32_CAS)+#define PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U32+static inline bool+pg_atomic_compare_exchange_u32_impl(volatile pg_atomic_uint32 *ptr,+ uint32 *expected, uint32 newval)+{+ /* FIXME: we can probably use a lower consistency model */+ return __atomic_compare_exchange_n(&ptr->value, expected, newval, false,+ __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST);+}+#endif++#if !defined(PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U32) && defined(HAVE_GCC__SYNC_INT32_CAS)+#define PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U32+static inline bool+pg_atomic_compare_exchange_u32_impl(volatile pg_atomic_uint32 *ptr,+ uint32 *expected, uint32 newval)+{+ bool ret;+ uint32 current;+ current = __sync_val_compare_and_swap(&ptr->value, *expected, newval);+ ret = current == *expected;+ *expected = current;+ return ret;+}+#endif++#if !defined(PG_HAVE_ATOMIC_FETCH_ADD_U32) && defined(HAVE_GCC__SYNC_INT32_CAS)+#define PG_HAVE_ATOMIC_FETCH_ADD_U32+static inline uint32+pg_atomic_fetch_add_u32_impl(volatile pg_atomic_uint32 *ptr, int32 add_)+{+ return __sync_fetch_and_add(&ptr->value, add_);+}+#endif+++#if !defined(PG_DISABLE_64_BIT_ATOMICS)++#if !defined(PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U64) && defined(HAVE_GCC__ATOMIC_INT64_CAS)+#define PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U64+static inline bool+pg_atomic_compare_exchange_u64_impl(volatile pg_atomic_uint64 *ptr,+ uint64 *expected, uint64 newval)+{+ return __atomic_compare_exchange_n(&ptr->value, expected, newval, false,+ __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST);+}+#endif++#if !defined(PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U64) && defined(HAVE_GCC__SYNC_INT64_CAS)+#define PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U64+static inline bool+pg_atomic_compare_exchange_u64_impl(volatile pg_atomic_uint64 *ptr,+ uint64 *expected, uint64 newval)+{+ bool ret;+ uint64 current;+ current = __sync_val_compare_and_swap(&ptr->value, *expected, newval);+ ret = current == *expected;+ *expected = current;+ return ret;+}+#endif++#if !defined(PG_HAVE_ATOMIC_FETCH_ADD_U64) && defined(HAVE_GCC__SYNC_INT64_CAS)+#define PG_HAVE_ATOMIC_FETCH_ADD_U64+static inline uint64+pg_atomic_fetch_add_u64_impl(volatile pg_atomic_uint64 *ptr, int64 add_)+{+ return __sync_fetch_and_add(&ptr->value, add_);+}+#endif++#endif /* !defined(PG_DISABLE_64_BIT_ATOMICS) */++#endif /* defined(PG_USE_INLINE) || defined(ATOMICS_INCLUDE_DEFINITIONS) */++#endif /* defined(HAVE_ATOMICS) */
+ foreign/libpg_query/src/postgres/include/port/atomics/generic.h view
@@ -0,0 +1,387 @@+/*-------------------------------------------------------------------------+ *+ * generic.h+ * Implement higher level operations based on some lower level tomic+ * operations.+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/port/atomics/generic.h+ *+ *-------------------------------------------------------------------------+ */++/* intentionally no include guards, should only be included by atomics.h */+#ifndef INSIDE_ATOMICS_H+# error "should be included via atomics.h"+#endif++/*+ * If read or write barriers are undefined, we upgrade them to full memory+ * barriers.+ */+#if !defined(pg_read_barrier_impl)+# define pg_read_barrier_impl pg_memory_barrier_impl+#endif+#if !defined(pg_write_barrier_impl)+# define pg_write_barrier_impl pg_memory_barrier_impl+#endif++#ifndef PG_HAVE_SPIN_DELAY+#define PG_HAVE_SPIN_DELAY+#define pg_spin_delay_impl() ((void)0)+#endif+++/* provide fallback */+#if !defined(PG_HAVE_ATOMIC_FLAG_SUPPORT) && defined(PG_HAVE_ATOMIC_U32_SUPPORT)+#define PG_HAVE_ATOMIC_FLAG_SUPPORT+typedef pg_atomic_uint32 pg_atomic_flag;+#endif++#if defined(PG_USE_INLINE) || defined(ATOMICS_INCLUDE_DEFINITIONS)++#ifndef PG_HAVE_ATOMIC_READ_U32+#define PG_HAVE_ATOMIC_READ_U32+static inline uint32+pg_atomic_read_u32_impl(volatile pg_atomic_uint32 *ptr)+{+ return *(&ptr->value);+}+#endif++#ifndef PG_HAVE_ATOMIC_WRITE_U32+#define PG_HAVE_ATOMIC_WRITE_U32+static inline void+pg_atomic_write_u32_impl(volatile pg_atomic_uint32 *ptr, uint32 val)+{+ ptr->value = val;+}+#endif++/*+ * provide fallback for test_and_set using atomic_exchange if available+ */+#if !defined(PG_HAVE_ATOMIC_TEST_SET_FLAG) && defined(PG_HAVE_ATOMIC_EXCHANGE_U32)++#define PG_HAVE_ATOMIC_INIT_FLAG+static inline void+pg_atomic_init_flag_impl(volatile pg_atomic_flag *ptr)+{+ pg_atomic_write_u32_impl(ptr, 0);+}++#define PG_HAVE_ATOMIC_TEST_SET_FLAG+static inline bool+pg_atomic_test_set_flag_impl(volatile pg_atomic_flag *ptr)+{+ return pg_atomic_exchange_u32_impl(ptr, &value, 1) == 0;+}++#define PG_HAVE_ATOMIC_UNLOCKED_TEST_FLAG+static inline bool+pg_atomic_unlocked_test_flag_impl(volatile pg_atomic_flag *ptr)+{+ return pg_atomic_read_u32_impl(ptr) == 0;+}+++#define PG_HAVE_ATOMIC_CLEAR_FLAG+static inline void+pg_atomic_clear_flag_impl(volatile pg_atomic_flag *ptr)+{+ /* XXX: release semantics suffice? */+ pg_memory_barrier_impl();+ pg_atomic_write_u32_impl(ptr, 0);+}++/*+ * provide fallback for test_and_set using atomic_compare_exchange if+ * available.+ */+#elif !defined(PG_HAVE_ATOMIC_TEST_SET_FLAG) && defined(PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U32)++#define PG_HAVE_ATOMIC_INIT_FLAG+static inline void+pg_atomic_init_flag_impl(volatile pg_atomic_flag *ptr)+{+ pg_atomic_write_u32_impl(ptr, 0);+}++#define PG_HAVE_ATOMIC_TEST_SET_FLAG+static inline bool+pg_atomic_test_set_flag_impl(volatile pg_atomic_flag *ptr)+{+ uint32 value = 0;+ return pg_atomic_compare_exchange_u32_impl(ptr, &value, 1);+}++#define PG_HAVE_ATOMIC_UNLOCKED_TEST_FLAG+static inline bool+pg_atomic_unlocked_test_flag_impl(volatile pg_atomic_flag *ptr)+{+ return pg_atomic_read_u32_impl(ptr) == 0;+}++#define PG_HAVE_ATOMIC_CLEAR_FLAG+static inline void+pg_atomic_clear_flag_impl(volatile pg_atomic_flag *ptr)+{+ /*+ * Use a memory barrier + plain write if we have a native memory+ * barrier. But don't do so if memory barriers use spinlocks - that'd lead+ * to circularity if flags are used to implement spinlocks.+ */+#ifndef PG_HAVE_MEMORY_BARRIER_EMULATION+ /* XXX: release semantics suffice? */+ pg_memory_barrier_impl();+ pg_atomic_write_u32_impl(ptr, 0);+#else+ uint32 value = 1;+ pg_atomic_compare_exchange_u32_impl(ptr, &value, 0);+#endif+}++#elif !defined(PG_HAVE_ATOMIC_TEST_SET_FLAG)+# error "No pg_atomic_test_and_set provided"+#endif /* !defined(PG_HAVE_ATOMIC_TEST_SET_FLAG) */+++#ifndef PG_HAVE_ATOMIC_INIT_U32+#define PG_HAVE_ATOMIC_INIT_U32+static inline void+pg_atomic_init_u32_impl(volatile pg_atomic_uint32 *ptr, uint32 val_)+{+ pg_atomic_write_u32_impl(ptr, val_);+}+#endif++#if !defined(PG_HAVE_ATOMIC_EXCHANGE_U32) && defined(PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U32)+#define PG_HAVE_ATOMIC_EXCHANGE_U32+static inline uint32+pg_atomic_exchange_u32_impl(volatile pg_atomic_uint32 *ptr, uint32 xchg_)+{+ uint32 old;+ while (true)+ {+ old = pg_atomic_read_u32_impl(ptr);+ if (pg_atomic_compare_exchange_u32_impl(ptr, &old, xchg_))+ break;+ }+ return old;+}+#endif++#if !defined(PG_HAVE_ATOMIC_FETCH_ADD_U32) && defined(PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U32)+#define PG_HAVE_ATOMIC_FETCH_ADD_U32+static inline uint32+pg_atomic_fetch_add_u32_impl(volatile pg_atomic_uint32 *ptr, int32 add_)+{+ uint32 old;+ while (true)+ {+ old = pg_atomic_read_u32_impl(ptr);+ if (pg_atomic_compare_exchange_u32_impl(ptr, &old, old + add_))+ break;+ }+ return old;+}+#endif++#if !defined(PG_HAVE_ATOMIC_FETCH_SUB_U32) && defined(PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U32)+#define PG_HAVE_ATOMIC_FETCH_SUB_U32+static inline uint32+pg_atomic_fetch_sub_u32_impl(volatile pg_atomic_uint32 *ptr, int32 sub_)+{+ return pg_atomic_fetch_add_u32_impl(ptr, -sub_);+}+#endif++#if !defined(PG_HAVE_ATOMIC_FETCH_AND_U32) && defined(PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U32)+#define PG_HAVE_ATOMIC_FETCH_AND_U32+static inline uint32+pg_atomic_fetch_and_u32_impl(volatile pg_atomic_uint32 *ptr, uint32 and_)+{+ uint32 old;+ while (true)+ {+ old = pg_atomic_read_u32_impl(ptr);+ if (pg_atomic_compare_exchange_u32_impl(ptr, &old, old & and_))+ break;+ }+ return old;+}+#endif++#if !defined(PG_HAVE_ATOMIC_FETCH_OR_U32) && defined(PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U32)+#define PG_HAVE_ATOMIC_FETCH_OR_U32+static inline uint32+pg_atomic_fetch_or_u32_impl(volatile pg_atomic_uint32 *ptr, uint32 or_)+{+ uint32 old;+ while (true)+ {+ old = pg_atomic_read_u32_impl(ptr);+ if (pg_atomic_compare_exchange_u32_impl(ptr, &old, old | or_))+ break;+ }+ return old;+}+#endif++#if !defined(PG_HAVE_ATOMIC_ADD_FETCH_U32) && defined(PG_HAVE_ATOMIC_FETCH_ADD_U32)+#define PG_HAVE_ATOMIC_ADD_FETCH_U32+static inline uint32+pg_atomic_add_fetch_u32_impl(volatile pg_atomic_uint32 *ptr, int32 add_)+{+ return pg_atomic_fetch_add_u32_impl(ptr, add_) + add_;+}+#endif++#if !defined(PG_HAVE_ATOMIC_SUB_FETCH_U32) && defined(PG_HAVE_ATOMIC_FETCH_SUB_U32)+#define PG_HAVE_ATOMIC_SUB_FETCH_U32+static inline uint32+pg_atomic_sub_fetch_u32_impl(volatile pg_atomic_uint32 *ptr, int32 sub_)+{+ return pg_atomic_fetch_sub_u32_impl(ptr, sub_) - sub_;+}+#endif++#ifdef PG_HAVE_ATOMIC_U64_SUPPORT++#if !defined(PG_HAVE_ATOMIC_EXCHANGE_U64) && defined(PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U64)+#define PG_HAVE_ATOMIC_EXCHANGE_U64+static inline uint64+pg_atomic_exchange_u64_impl(volatile pg_atomic_uint64 *ptr, uint64 xchg_)+{+ uint64 old;+ while (true)+ {+ old = ptr->value;+ if (pg_atomic_compare_exchange_u64_impl(ptr, &old, xchg_))+ break;+ }+ return old;+}+#endif++#ifndef PG_HAVE_ATOMIC_WRITE_U64+#define PG_HAVE_ATOMIC_WRITE_U64+static inline void+pg_atomic_write_u64_impl(volatile pg_atomic_uint64 *ptr, uint64 val)+{+ /*+ * 64 bit writes aren't safe on all platforms. In the generic+ * implementation implement them as an atomic exchange.+ */+ pg_atomic_exchange_u64_impl(ptr, val);+}+#endif++#ifndef PG_HAVE_ATOMIC_READ_U64+#define PG_HAVE_ATOMIC_READ_U64+static inline uint64+pg_atomic_read_u64_impl(volatile pg_atomic_uint64 *ptr)+{+ uint64 old = 0;++ /*+ * 64 bit reads aren't safe on all platforms. In the generic+ * implementation implement them as a compare/exchange with 0. That'll+ * fail or succeed, but always return the old value. Possible might store+ * a 0, but only if the prev. value also was a 0 - i.e. harmless.+ */+ pg_atomic_compare_exchange_u64_impl(ptr, &old, 0);++ return old;+}+#endif++#ifndef PG_HAVE_ATOMIC_INIT_U64+#define PG_HAVE_ATOMIC_INIT_U64+static inline void+pg_atomic_init_u64_impl(volatile pg_atomic_uint64 *ptr, uint64 val_)+{+ pg_atomic_write_u64_impl(ptr, val_);+}+#endif++#if !defined(PG_HAVE_ATOMIC_FETCH_ADD_U64) && defined(PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U64)+#define PG_HAVE_ATOMIC_FETCH_ADD_U64+static inline uint64+pg_atomic_fetch_add_u64_impl(volatile pg_atomic_uint64 *ptr, int64 add_)+{+ uint64 old;+ while (true)+ {+ old = pg_atomic_read_u64_impl(ptr);+ if (pg_atomic_compare_exchange_u64_impl(ptr, &old, old + add_))+ break;+ }+ return old;+}+#endif++#if !defined(PG_HAVE_ATOMIC_FETCH_SUB_U64) && defined(PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U64)+#define PG_HAVE_ATOMIC_FETCH_SUB_U64+static inline uint64+pg_atomic_fetch_sub_u64_impl(volatile pg_atomic_uint64 *ptr, int64 sub_)+{+ return pg_atomic_fetch_add_u64_impl(ptr, -sub_);+}+#endif++#if !defined(PG_HAVE_ATOMIC_FETCH_AND_U64) && defined(PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U64)+#define PG_HAVE_ATOMIC_FETCH_AND_U64+static inline uint64+pg_atomic_fetch_and_u64_impl(volatile pg_atomic_uint64 *ptr, uint64 and_)+{+ uint64 old;+ while (true)+ {+ old = pg_atomic_read_u64_impl(ptr);+ if (pg_atomic_compare_exchange_u64_impl(ptr, &old, old & and_))+ break;+ }+ return old;+}+#endif++#if !defined(PG_HAVE_ATOMIC_FETCH_OR_U64) && defined(PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U64)+#define PG_HAVE_ATOMIC_FETCH_OR_U64+static inline uint64+pg_atomic_fetch_or_u64_impl(volatile pg_atomic_uint64 *ptr, uint64 or_)+{+ uint64 old;+ while (true)+ {+ old = pg_atomic_read_u64_impl(ptr);+ if (pg_atomic_compare_exchange_u64_impl(ptr, &old, old | or_))+ break;+ }+ return old;+}+#endif++#if !defined(PG_HAVE_ATOMIC_ADD_FETCH_U64) && defined(PG_HAVE_ATOMIC_FETCH_ADD_U64)+#define PG_HAVE_ATOMIC_ADD_FETCH_U64+static inline uint64+pg_atomic_add_fetch_u64_impl(volatile pg_atomic_uint64 *ptr, int64 add_)+{+ return pg_atomic_fetch_add_u64_impl(ptr, add_) + add_;+}+#endif++#if !defined(PG_HAVE_ATOMIC_SUB_FETCH_U64) && defined(PG_HAVE_ATOMIC_FETCH_SUB_U64)+#define PG_HAVE_ATOMIC_SUB_FETCH_U64+static inline uint64+pg_atomic_sub_fetch_u64_impl(volatile pg_atomic_uint64 *ptr, int64 sub_)+{+ return pg_atomic_fetch_sub_u64_impl(ptr, sub_) - sub_;+}+#endif++#endif /* PG_HAVE_ATOMIC_COMPARE_EXCHANGE_U64 */++#endif /* defined(PG_USE_INLINE) || defined(ATOMICS_INCLUDE_DEFINITIONS) */
+ foreign/libpg_query/src/postgres/include/port/pg_crc32c.h view
@@ -0,0 +1,93 @@+/*-------------------------------------------------------------------------+ *+ * pg_crc32c.h+ * Routines for computing CRC-32C checksums.+ *+ * The speed of CRC-32C calculation has a big impact on performance, so we+ * jump through some hoops to get the best implementation for each+ * platform. Some CPU architectures have special instructions for speeding+ * up CRC calculations (e.g. Intel SSE 4.2), on other platforms we use the+ * Slicing-by-8 algorithm which uses lookup tables.+ *+ * The public interface consists of four macros:+ *+ * INIT_CRC32C(crc)+ * Initialize a CRC accumulator+ *+ * COMP_CRC32C(crc, data, len)+ * Accumulate some (more) bytes into a CRC+ *+ * FIN_CRC32C(crc)+ * Finish a CRC calculation+ *+ * EQ_CRC32C(c1, c2)+ * Check for equality of two CRCs.+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/port/pg_crc32c.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef PG_CRC32C_H+#define PG_CRC32C_H++typedef uint32 pg_crc32c;++/* The INIT and EQ macros are the same for all implementations. */+#define INIT_CRC32C(crc) ((crc) = 0xFFFFFFFF)+#define EQ_CRC32C(c1, c2) ((c1) == (c2))++#if defined(USE_SSE42_CRC32C)+/* Use SSE4.2 instructions. */+#define COMP_CRC32C(crc, data, len) \+ ((crc) = pg_comp_crc32c_sse42((crc), (data), (len)))+#define FIN_CRC32C(crc) ((crc) ^= 0xFFFFFFFF)++extern pg_crc32c pg_comp_crc32c_sse42(pg_crc32c crc, const void *data, size_t len);++#elif defined(USE_SSE42_CRC32C_WITH_RUNTIME_CHECK)+/*+ * Use SSE4.2 instructions, but perform a runtime check first to check that+ * they are available.+ */+#define COMP_CRC32C(crc, data, len) \+ ((crc) = pg_comp_crc32c((crc), (data), (len)))+#define FIN_CRC32C(crc) ((crc) ^= 0xFFFFFFFF)++extern pg_crc32c pg_comp_crc32c_sse42(pg_crc32c crc, const void *data, size_t len);+extern pg_crc32c pg_comp_crc32c_sb8(pg_crc32c crc, const void *data, size_t len);+extern pg_crc32c (*pg_comp_crc32c) (pg_crc32c crc, const void *data, size_t len);++#else+/*+ * Use slicing-by-8 algorithm.+ *+ * On big-endian systems, the intermediate value is kept in reverse byte+ * order, to avoid byte-swapping during the calculation. FIN_CRC32C reverses+ * the bytes to the final order.+ */+#define COMP_CRC32C(crc, data, len) \+ ((crc) = pg_comp_crc32c_sb8((crc), (data), (len)))+#ifdef WORDS_BIGENDIAN++#ifdef HAVE__BUILTIN_BSWAP32+#define BSWAP32(x) __builtin_bswap32(x)+#else+#define BSWAP32(x) (((x << 24) & 0xff000000) | \+ ((x << 8) & 0x00ff0000) | \+ ((x >> 8) & 0x0000ff00) | \+ ((x >> 24) & 0x000000ff))+#endif++#define FIN_CRC32C(crc) ((crc) = BSWAP32(crc) ^ 0xFFFFFFFF)+#else+#define FIN_CRC32C(crc) ((crc) ^= 0xFFFFFFFF)+#endif++extern pg_crc32c pg_comp_crc32c_sb8(pg_crc32c crc, const void *data, size_t len);++#endif++#endif /* PG_CRC32C_H */
+ foreign/libpg_query/src/postgres/include/portability/instr_time.h view
@@ -0,0 +1,154 @@+/*-------------------------------------------------------------------------+ *+ * instr_time.h+ * portable high-precision interval timing+ *+ * This file provides an abstraction layer to hide portability issues in+ * interval timing. On Unix we use gettimeofday(), but on Windows that+ * gives a low-precision result so we must use QueryPerformanceCounter()+ * instead. These macros also give some breathing room to use other+ * high-precision-timing APIs on yet other platforms.+ *+ * The basic data type is instr_time, which all callers should treat as an+ * opaque typedef. instr_time can store either an absolute time (of+ * unspecified reference time) or an interval. The operations provided+ * for it are:+ *+ * INSTR_TIME_IS_ZERO(t) is t equal to zero?+ *+ * INSTR_TIME_SET_ZERO(t) set t to zero (memset is acceptable too)+ *+ * INSTR_TIME_SET_CURRENT(t) set t to current time+ *+ * INSTR_TIME_ADD(x, y) x += y+ *+ * INSTR_TIME_SUBTRACT(x, y) x -= y+ *+ * INSTR_TIME_ACCUM_DIFF(x, y, z) x += (y - z)+ *+ * INSTR_TIME_GET_DOUBLE(t) convert t to double (in seconds)+ *+ * INSTR_TIME_GET_MILLISEC(t) convert t to double (in milliseconds)+ *+ * INSTR_TIME_GET_MICROSEC(t) convert t to uint64 (in microseconds)+ *+ * Note that INSTR_TIME_SUBTRACT and INSTR_TIME_ACCUM_DIFF convert+ * absolute times to intervals. The INSTR_TIME_GET_xxx operations are+ * only useful on intervals.+ *+ * When summing multiple measurements, it's recommended to leave the+ * running sum in instr_time form (ie, use INSTR_TIME_ADD or+ * INSTR_TIME_ACCUM_DIFF) and convert to a result format only at the end.+ *+ * Beware of multiple evaluations of the macro arguments.+ *+ *+ * Copyright (c) 2001-2015, PostgreSQL Global Development Group+ *+ * src/include/portability/instr_time.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef INSTR_TIME_H+#define INSTR_TIME_H++#ifndef WIN32++#include <sys/time.h>++typedef struct timeval instr_time;++#define INSTR_TIME_IS_ZERO(t) ((t).tv_usec == 0 && (t).tv_sec == 0)++#define INSTR_TIME_SET_ZERO(t) ((t).tv_sec = 0, (t).tv_usec = 0)++#define INSTR_TIME_SET_CURRENT(t) gettimeofday(&(t), NULL)++#define INSTR_TIME_ADD(x,y) \+ do { \+ (x).tv_sec += (y).tv_sec; \+ (x).tv_usec += (y).tv_usec; \+ /* Normalize */ \+ while ((x).tv_usec >= 1000000) \+ { \+ (x).tv_usec -= 1000000; \+ (x).tv_sec++; \+ } \+ } while (0)++#define INSTR_TIME_SUBTRACT(x,y) \+ do { \+ (x).tv_sec -= (y).tv_sec; \+ (x).tv_usec -= (y).tv_usec; \+ /* Normalize */ \+ while ((x).tv_usec < 0) \+ { \+ (x).tv_usec += 1000000; \+ (x).tv_sec--; \+ } \+ } while (0)++#define INSTR_TIME_ACCUM_DIFF(x,y,z) \+ do { \+ (x).tv_sec += (y).tv_sec - (z).tv_sec; \+ (x).tv_usec += (y).tv_usec - (z).tv_usec; \+ /* Normalize after each add to avoid overflow/underflow of tv_usec */ \+ while ((x).tv_usec < 0) \+ { \+ (x).tv_usec += 1000000; \+ (x).tv_sec--; \+ } \+ while ((x).tv_usec >= 1000000) \+ { \+ (x).tv_usec -= 1000000; \+ (x).tv_sec++; \+ } \+ } while (0)++#define INSTR_TIME_GET_DOUBLE(t) \+ (((double) (t).tv_sec) + ((double) (t).tv_usec) / 1000000.0)++#define INSTR_TIME_GET_MILLISEC(t) \+ (((double) (t).tv_sec * 1000.0) + ((double) (t).tv_usec) / 1000.0)++#define INSTR_TIME_GET_MICROSEC(t) \+ (((uint64) (t).tv_sec * (uint64) 1000000) + (uint64) (t).tv_usec)+#else /* WIN32 */++typedef LARGE_INTEGER instr_time;++#define INSTR_TIME_IS_ZERO(t) ((t).QuadPart == 0)++#define INSTR_TIME_SET_ZERO(t) ((t).QuadPart = 0)++#define INSTR_TIME_SET_CURRENT(t) QueryPerformanceCounter(&(t))++#define INSTR_TIME_ADD(x,y) \+ ((x).QuadPart += (y).QuadPart)++#define INSTR_TIME_SUBTRACT(x,y) \+ ((x).QuadPart -= (y).QuadPart)++#define INSTR_TIME_ACCUM_DIFF(x,y,z) \+ ((x).QuadPart += (y).QuadPart - (z).QuadPart)++#define INSTR_TIME_GET_DOUBLE(t) \+ (((double) (t).QuadPart) / GetTimerFrequency())++#define INSTR_TIME_GET_MILLISEC(t) \+ (((double) (t).QuadPart * 1000.0) / GetTimerFrequency())++#define INSTR_TIME_GET_MICROSEC(t) \+ ((uint64) (((double) (t).QuadPart * 1000000.0) / GetTimerFrequency()))++static inline double+GetTimerFrequency(void)+{+ LARGE_INTEGER f;++ QueryPerformanceFrequency(&f);+ return (double) f.QuadPart;+}+#endif /* WIN32 */++#endif /* INSTR_TIME_H */
+ foreign/libpg_query/src/postgres/include/postgres.h view
@@ -0,0 +1,722 @@+/*-------------------------------------------------------------------------+ *+ * postgres.h+ * Primary include file for PostgreSQL server .c files+ *+ * This should be the first file included by PostgreSQL backend modules.+ * Client-side code should include postgres_fe.h instead.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1995, Regents of the University of California+ *+ * src/include/postgres.h+ *+ *-------------------------------------------------------------------------+ */+/*+ *----------------------------------------------------------------+ * TABLE OF CONTENTS+ *+ * When adding stuff to this file, please try to put stuff+ * into the relevant section, or add new sections as appropriate.+ *+ * section description+ * ------- ------------------------------------------------+ * 1) variable-length datatypes (TOAST support)+ * 2) datum type + support macros+ * 3) exception handling backend support+ *+ * NOTES+ *+ * In general, this file should contain declarations that are widely needed+ * in the backend environment, but are of no interest outside the backend.+ *+ * Simple type definitions live in c.h, where they are shared with+ * postgres_fe.h. We do that since those type definitions are needed by+ * frontend modules that want to deal with binary data transmission to or+ * from the backend. Type definitions in this file should be for+ * representations that never escape the backend, such as Datum or+ * TOASTed varlena objects.+ *+ *----------------------------------------------------------------+ */+#ifndef POSTGRES_H+#define POSTGRES_H++#include "c.h"+#include "utils/elog.h"+#include "utils/palloc.h"++/* ----------------------------------------------------------------+ * Section 1: variable-length datatypes (TOAST support)+ * ----------------------------------------------------------------+ */++/*+ * struct varatt_external is a traditional "TOAST pointer", that is, the+ * information needed to fetch a Datum stored out-of-line in a TOAST table.+ * The data is compressed if and only if va_extsize < va_rawsize - VARHDRSZ.+ * This struct must not contain any padding, because we sometimes compare+ * these pointers using memcmp.+ *+ * Note that this information is stored unaligned within actual tuples, so+ * you need to memcpy from the tuple into a local struct variable before+ * you can look at these fields! (The reason we use memcmp is to avoid+ * having to do that just to detect equality of two TOAST pointers...)+ */+typedef struct varatt_external+{+ int32 va_rawsize; /* Original data size (includes header) */+ int32 va_extsize; /* External saved size (doesn't) */+ Oid va_valueid; /* Unique ID of value within TOAST table */+ Oid va_toastrelid; /* RelID of TOAST table containing it */+} varatt_external;++/*+ * struct varatt_indirect is a "TOAST pointer" representing an out-of-line+ * Datum that's stored in memory, not in an external toast relation.+ * The creator of such a Datum is entirely responsible that the referenced+ * storage survives for as long as referencing pointer Datums can exist.+ *+ * Note that just as for struct varatt_external, this struct is stored+ * unaligned within any containing tuple.+ */+typedef struct varatt_indirect+{+ struct varlena *pointer; /* Pointer to in-memory varlena */+} varatt_indirect;++/*+ * struct varatt_expanded is a "TOAST pointer" representing an out-of-line+ * Datum that is stored in memory, in some type-specific, not necessarily+ * physically contiguous format that is convenient for computation not+ * storage. APIs for this, in particular the definition of struct+ * ExpandedObjectHeader, are in src/include/utils/expandeddatum.h.+ *+ * Note that just as for struct varatt_external, this struct is stored+ * unaligned within any containing tuple.+ */+typedef struct ExpandedObjectHeader ExpandedObjectHeader;++typedef struct varatt_expanded+{+ ExpandedObjectHeader *eohptr;+} varatt_expanded;++/*+ * Type tag for the various sorts of "TOAST pointer" datums. The peculiar+ * value for VARTAG_ONDISK comes from a requirement for on-disk compatibility+ * with a previous notion that the tag field was the pointer datum's length.+ */+typedef enum vartag_external+{+ VARTAG_INDIRECT = 1,+ VARTAG_EXPANDED_RO = 2,+ VARTAG_EXPANDED_RW = 3,+ VARTAG_ONDISK = 18+} vartag_external;++/* this test relies on the specific tag values above */+#define VARTAG_IS_EXPANDED(tag) \+ (((tag) & ~1) == VARTAG_EXPANDED_RO)++#define VARTAG_SIZE(tag) \+ ((tag) == VARTAG_INDIRECT ? sizeof(varatt_indirect) : \+ VARTAG_IS_EXPANDED(tag) ? sizeof(varatt_expanded) : \+ (tag) == VARTAG_ONDISK ? sizeof(varatt_external) : \+ TrapMacro(true, "unrecognized TOAST vartag"))++/*+ * These structs describe the header of a varlena object that may have been+ * TOASTed. Generally, don't reference these structs directly, but use the+ * macros below.+ *+ * We use separate structs for the aligned and unaligned cases because the+ * compiler might otherwise think it could generate code that assumes+ * alignment while touching fields of a 1-byte-header varlena.+ */+typedef union+{+ struct /* Normal varlena (4-byte length) */+ {+ uint32 va_header;+ char va_data[FLEXIBLE_ARRAY_MEMBER];+ } va_4byte;+ struct /* Compressed-in-line format */+ {+ uint32 va_header;+ uint32 va_rawsize; /* Original data size (excludes header) */+ char va_data[FLEXIBLE_ARRAY_MEMBER]; /* Compressed data */+ } va_compressed;+} varattrib_4b;++typedef struct+{+ uint8 va_header;+ char va_data[FLEXIBLE_ARRAY_MEMBER]; /* Data begins here */+} varattrib_1b;++/* TOAST pointers are a subset of varattrib_1b with an identifying tag byte */+typedef struct+{+ uint8 va_header; /* Always 0x80 or 0x01 */+ uint8 va_tag; /* Type of datum */+ char va_data[FLEXIBLE_ARRAY_MEMBER]; /* Type-specific data */+} varattrib_1b_e;++/*+ * Bit layouts for varlena headers on big-endian machines:+ *+ * 00xxxxxx 4-byte length word, aligned, uncompressed data (up to 1G)+ * 01xxxxxx 4-byte length word, aligned, *compressed* data (up to 1G)+ * 10000000 1-byte length word, unaligned, TOAST pointer+ * 1xxxxxxx 1-byte length word, unaligned, uncompressed data (up to 126b)+ *+ * Bit layouts for varlena headers on little-endian machines:+ *+ * xxxxxx00 4-byte length word, aligned, uncompressed data (up to 1G)+ * xxxxxx10 4-byte length word, aligned, *compressed* data (up to 1G)+ * 00000001 1-byte length word, unaligned, TOAST pointer+ * xxxxxxx1 1-byte length word, unaligned, uncompressed data (up to 126b)+ *+ * The "xxx" bits are the length field (which includes itself in all cases).+ * In the big-endian case we mask to extract the length, in the little-endian+ * case we shift. Note that in both cases the flag bits are in the physically+ * first byte. Also, it is not possible for a 1-byte length word to be zero;+ * this lets us disambiguate alignment padding bytes from the start of an+ * unaligned datum. (We now *require* pad bytes to be filled with zero!)+ *+ * In TOAST pointers the va_tag field (see varattrib_1b_e) is used to discern+ * the specific type and length of the pointer datum.+ */++/*+ * Endian-dependent macros. These are considered internal --- use the+ * external macros below instead of using these directly.+ *+ * Note: IS_1B is true for external toast records but VARSIZE_1B will return 0+ * for such records. Hence you should usually check for IS_EXTERNAL before+ * checking for IS_1B.+ */++#ifdef WORDS_BIGENDIAN++#define VARATT_IS_4B(PTR) \+ ((((varattrib_1b *) (PTR))->va_header & 0x80) == 0x00)+#define VARATT_IS_4B_U(PTR) \+ ((((varattrib_1b *) (PTR))->va_header & 0xC0) == 0x00)+#define VARATT_IS_4B_C(PTR) \+ ((((varattrib_1b *) (PTR))->va_header & 0xC0) == 0x40)+#define VARATT_IS_1B(PTR) \+ ((((varattrib_1b *) (PTR))->va_header & 0x80) == 0x80)+#define VARATT_IS_1B_E(PTR) \+ ((((varattrib_1b *) (PTR))->va_header) == 0x80)+#define VARATT_NOT_PAD_BYTE(PTR) \+ (*((uint8 *) (PTR)) != 0)++/* VARSIZE_4B() should only be used on known-aligned data */+#define VARSIZE_4B(PTR) \+ (((varattrib_4b *) (PTR))->va_4byte.va_header & 0x3FFFFFFF)+#define VARSIZE_1B(PTR) \+ (((varattrib_1b *) (PTR))->va_header & 0x7F)+#define VARTAG_1B_E(PTR) \+ (((varattrib_1b_e *) (PTR))->va_tag)++#define SET_VARSIZE_4B(PTR,len) \+ (((varattrib_4b *) (PTR))->va_4byte.va_header = (len) & 0x3FFFFFFF)+#define SET_VARSIZE_4B_C(PTR,len) \+ (((varattrib_4b *) (PTR))->va_4byte.va_header = ((len) & 0x3FFFFFFF) | 0x40000000)+#define SET_VARSIZE_1B(PTR,len) \+ (((varattrib_1b *) (PTR))->va_header = (len) | 0x80)+#define SET_VARTAG_1B_E(PTR,tag) \+ (((varattrib_1b_e *) (PTR))->va_header = 0x80, \+ ((varattrib_1b_e *) (PTR))->va_tag = (tag))+#else /* !WORDS_BIGENDIAN */++#define VARATT_IS_4B(PTR) \+ ((((varattrib_1b *) (PTR))->va_header & 0x01) == 0x00)+#define VARATT_IS_4B_U(PTR) \+ ((((varattrib_1b *) (PTR))->va_header & 0x03) == 0x00)+#define VARATT_IS_4B_C(PTR) \+ ((((varattrib_1b *) (PTR))->va_header & 0x03) == 0x02)+#define VARATT_IS_1B(PTR) \+ ((((varattrib_1b *) (PTR))->va_header & 0x01) == 0x01)+#define VARATT_IS_1B_E(PTR) \+ ((((varattrib_1b *) (PTR))->va_header) == 0x01)+#define VARATT_NOT_PAD_BYTE(PTR) \+ (*((uint8 *) (PTR)) != 0)++/* VARSIZE_4B() should only be used on known-aligned data */+#define VARSIZE_4B(PTR) \+ ((((varattrib_4b *) (PTR))->va_4byte.va_header >> 2) & 0x3FFFFFFF)+#define VARSIZE_1B(PTR) \+ ((((varattrib_1b *) (PTR))->va_header >> 1) & 0x7F)+#define VARTAG_1B_E(PTR) \+ (((varattrib_1b_e *) (PTR))->va_tag)++#define SET_VARSIZE_4B(PTR,len) \+ (((varattrib_4b *) (PTR))->va_4byte.va_header = (((uint32) (len)) << 2))+#define SET_VARSIZE_4B_C(PTR,len) \+ (((varattrib_4b *) (PTR))->va_4byte.va_header = (((uint32) (len)) << 2) | 0x02)+#define SET_VARSIZE_1B(PTR,len) \+ (((varattrib_1b *) (PTR))->va_header = (((uint8) (len)) << 1) | 0x01)+#define SET_VARTAG_1B_E(PTR,tag) \+ (((varattrib_1b_e *) (PTR))->va_header = 0x01, \+ ((varattrib_1b_e *) (PTR))->va_tag = (tag))+#endif /* WORDS_BIGENDIAN */++#define VARHDRSZ_SHORT offsetof(varattrib_1b, va_data)+#define VARATT_SHORT_MAX 0x7F+#define VARATT_CAN_MAKE_SHORT(PTR) \+ (VARATT_IS_4B_U(PTR) && \+ (VARSIZE(PTR) - VARHDRSZ + VARHDRSZ_SHORT) <= VARATT_SHORT_MAX)+#define VARATT_CONVERTED_SHORT_SIZE(PTR) \+ (VARSIZE(PTR) - VARHDRSZ + VARHDRSZ_SHORT)++#define VARHDRSZ_EXTERNAL offsetof(varattrib_1b_e, va_data)++#define VARDATA_4B(PTR) (((varattrib_4b *) (PTR))->va_4byte.va_data)+#define VARDATA_4B_C(PTR) (((varattrib_4b *) (PTR))->va_compressed.va_data)+#define VARDATA_1B(PTR) (((varattrib_1b *) (PTR))->va_data)+#define VARDATA_1B_E(PTR) (((varattrib_1b_e *) (PTR))->va_data)++#define VARRAWSIZE_4B_C(PTR) \+ (((varattrib_4b *) (PTR))->va_compressed.va_rawsize)++/* Externally visible macros */++/*+ * VARDATA, VARSIZE, and SET_VARSIZE are the recommended API for most code+ * for varlena datatypes. Note that they only work on untoasted,+ * 4-byte-header Datums!+ *+ * Code that wants to use 1-byte-header values without detoasting should+ * use VARSIZE_ANY/VARSIZE_ANY_EXHDR/VARDATA_ANY. The other macros here+ * should usually be used only by tuple assembly/disassembly code and+ * code that specifically wants to work with still-toasted Datums.+ *+ * WARNING: It is only safe to use VARDATA_ANY() -- typically with+ * PG_DETOAST_DATUM_PACKED() -- if you really don't care about the alignment.+ * Either because you're working with something like text where the alignment+ * doesn't matter or because you're not going to access its constituent parts+ * and just use things like memcpy on it anyways.+ */+#define VARDATA(PTR) VARDATA_4B(PTR)+#define VARSIZE(PTR) VARSIZE_4B(PTR)++#define VARSIZE_SHORT(PTR) VARSIZE_1B(PTR)+#define VARDATA_SHORT(PTR) VARDATA_1B(PTR)++#define VARTAG_EXTERNAL(PTR) VARTAG_1B_E(PTR)+#define VARSIZE_EXTERNAL(PTR) (VARHDRSZ_EXTERNAL + VARTAG_SIZE(VARTAG_EXTERNAL(PTR)))+#define VARDATA_EXTERNAL(PTR) VARDATA_1B_E(PTR)++#define VARATT_IS_COMPRESSED(PTR) VARATT_IS_4B_C(PTR)+#define VARATT_IS_EXTERNAL(PTR) VARATT_IS_1B_E(PTR)+#define VARATT_IS_EXTERNAL_ONDISK(PTR) \+ (VARATT_IS_EXTERNAL(PTR) && VARTAG_EXTERNAL(PTR) == VARTAG_ONDISK)+#define VARATT_IS_EXTERNAL_INDIRECT(PTR) \+ (VARATT_IS_EXTERNAL(PTR) && VARTAG_EXTERNAL(PTR) == VARTAG_INDIRECT)+#define VARATT_IS_EXTERNAL_EXPANDED_RO(PTR) \+ (VARATT_IS_EXTERNAL(PTR) && VARTAG_EXTERNAL(PTR) == VARTAG_EXPANDED_RO)+#define VARATT_IS_EXTERNAL_EXPANDED_RW(PTR) \+ (VARATT_IS_EXTERNAL(PTR) && VARTAG_EXTERNAL(PTR) == VARTAG_EXPANDED_RW)+#define VARATT_IS_EXTERNAL_EXPANDED(PTR) \+ (VARATT_IS_EXTERNAL(PTR) && VARTAG_IS_EXPANDED(VARTAG_EXTERNAL(PTR)))+#define VARATT_IS_SHORT(PTR) VARATT_IS_1B(PTR)+#define VARATT_IS_EXTENDED(PTR) (!VARATT_IS_4B_U(PTR))++#define SET_VARSIZE(PTR, len) SET_VARSIZE_4B(PTR, len)+#define SET_VARSIZE_SHORT(PTR, len) SET_VARSIZE_1B(PTR, len)+#define SET_VARSIZE_COMPRESSED(PTR, len) SET_VARSIZE_4B_C(PTR, len)++#define SET_VARTAG_EXTERNAL(PTR, tag) SET_VARTAG_1B_E(PTR, tag)++#define VARSIZE_ANY(PTR) \+ (VARATT_IS_1B_E(PTR) ? VARSIZE_EXTERNAL(PTR) : \+ (VARATT_IS_1B(PTR) ? VARSIZE_1B(PTR) : \+ VARSIZE_4B(PTR)))++/* Size of a varlena data, excluding header */+#define VARSIZE_ANY_EXHDR(PTR) \+ (VARATT_IS_1B_E(PTR) ? VARSIZE_EXTERNAL(PTR)-VARHDRSZ_EXTERNAL : \+ (VARATT_IS_1B(PTR) ? VARSIZE_1B(PTR)-VARHDRSZ_SHORT : \+ VARSIZE_4B(PTR)-VARHDRSZ))++/* caution: this will not work on an external or compressed-in-line Datum */+/* caution: this will return a possibly unaligned pointer */+#define VARDATA_ANY(PTR) \+ (VARATT_IS_1B(PTR) ? VARDATA_1B(PTR) : VARDATA_4B(PTR))+++/* ----------------------------------------------------------------+ * Section 2: datum type + support macros+ * ----------------------------------------------------------------+ */++/*+ * Port Notes:+ * Postgres makes the following assumptions about datatype sizes:+ *+ * sizeof(Datum) == sizeof(void *) == 4 or 8+ * sizeof(char) == 1+ * sizeof(short) == 2+ *+ * When a type narrower than Datum is stored in a Datum, we place it in the+ * low-order bits and are careful that the DatumGetXXX macro for it discards+ * the unused high-order bits (as opposed to, say, assuming they are zero).+ * This is needed to support old-style user-defined functions, since depending+ * on architecture and compiler, the return value of a function returning char+ * or short may contain garbage when called as if it returned Datum.+ */++typedef uintptr_t Datum;++#define SIZEOF_DATUM SIZEOF_VOID_P++typedef Datum *DatumPtr;++#define GET_1_BYTE(datum) (((Datum) (datum)) & 0x000000ff)+#define GET_2_BYTES(datum) (((Datum) (datum)) & 0x0000ffff)+#define GET_4_BYTES(datum) (((Datum) (datum)) & 0xffffffff)+#if SIZEOF_DATUM == 8+#define GET_8_BYTES(datum) ((Datum) (datum))+#endif+#define SET_1_BYTE(value) (((Datum) (value)) & 0x000000ff)+#define SET_2_BYTES(value) (((Datum) (value)) & 0x0000ffff)+#define SET_4_BYTES(value) (((Datum) (value)) & 0xffffffff)+#if SIZEOF_DATUM == 8+#define SET_8_BYTES(value) ((Datum) (value))+#endif++/*+ * DatumGetBool+ * Returns boolean value of a datum.+ *+ * Note: any nonzero value will be considered TRUE, but we ignore bits to+ * the left of the width of bool, per comment above.+ */++#define DatumGetBool(X) ((bool) (GET_1_BYTE(X) != 0))++/*+ * BoolGetDatum+ * Returns datum representation for a boolean.+ *+ * Note: any nonzero value will be considered TRUE.+ */++#define BoolGetDatum(X) ((Datum) ((X) ? 1 : 0))++/*+ * DatumGetChar+ * Returns character value of a datum.+ */++#define DatumGetChar(X) ((char) GET_1_BYTE(X))++/*+ * CharGetDatum+ * Returns datum representation for a character.+ */++#define CharGetDatum(X) ((Datum) SET_1_BYTE(X))++/*+ * Int8GetDatum+ * Returns datum representation for an 8-bit integer.+ */++#define Int8GetDatum(X) ((Datum) SET_1_BYTE(X))++/*+ * DatumGetUInt8+ * Returns 8-bit unsigned integer value of a datum.+ */++#define DatumGetUInt8(X) ((uint8) GET_1_BYTE(X))++/*+ * UInt8GetDatum+ * Returns datum representation for an 8-bit unsigned integer.+ */++#define UInt8GetDatum(X) ((Datum) SET_1_BYTE(X))++/*+ * DatumGetInt16+ * Returns 16-bit integer value of a datum.+ */++#define DatumGetInt16(X) ((int16) GET_2_BYTES(X))++/*+ * Int16GetDatum+ * Returns datum representation for a 16-bit integer.+ */++#define Int16GetDatum(X) ((Datum) SET_2_BYTES(X))++/*+ * DatumGetUInt16+ * Returns 16-bit unsigned integer value of a datum.+ */++#define DatumGetUInt16(X) ((uint16) GET_2_BYTES(X))++/*+ * UInt16GetDatum+ * Returns datum representation for a 16-bit unsigned integer.+ */++#define UInt16GetDatum(X) ((Datum) SET_2_BYTES(X))++/*+ * DatumGetInt32+ * Returns 32-bit integer value of a datum.+ */++#define DatumGetInt32(X) ((int32) GET_4_BYTES(X))++/*+ * Int32GetDatum+ * Returns datum representation for a 32-bit integer.+ */++#define Int32GetDatum(X) ((Datum) SET_4_BYTES(X))++/*+ * DatumGetUInt32+ * Returns 32-bit unsigned integer value of a datum.+ */++#define DatumGetUInt32(X) ((uint32) GET_4_BYTES(X))++/*+ * UInt32GetDatum+ * Returns datum representation for a 32-bit unsigned integer.+ */++#define UInt32GetDatum(X) ((Datum) SET_4_BYTES(X))++/*+ * DatumGetObjectId+ * Returns object identifier value of a datum.+ */++#define DatumGetObjectId(X) ((Oid) GET_4_BYTES(X))++/*+ * ObjectIdGetDatum+ * Returns datum representation for an object identifier.+ */++#define ObjectIdGetDatum(X) ((Datum) SET_4_BYTES(X))++/*+ * DatumGetTransactionId+ * Returns transaction identifier value of a datum.+ */++#define DatumGetTransactionId(X) ((TransactionId) GET_4_BYTES(X))++/*+ * TransactionIdGetDatum+ * Returns datum representation for a transaction identifier.+ */++#define TransactionIdGetDatum(X) ((Datum) SET_4_BYTES((X)))++/*+ * MultiXactIdGetDatum+ * Returns datum representation for a multixact identifier.+ */++#define MultiXactIdGetDatum(X) ((Datum) SET_4_BYTES((X)))++/*+ * DatumGetCommandId+ * Returns command identifier value of a datum.+ */++#define DatumGetCommandId(X) ((CommandId) GET_4_BYTES(X))++/*+ * CommandIdGetDatum+ * Returns datum representation for a command identifier.+ */++#define CommandIdGetDatum(X) ((Datum) SET_4_BYTES(X))++/*+ * DatumGetPointer+ * Returns pointer value of a datum.+ */++#define DatumGetPointer(X) ((Pointer) (X))++/*+ * PointerGetDatum+ * Returns datum representation for a pointer.+ */++#define PointerGetDatum(X) ((Datum) (X))++/*+ * DatumGetCString+ * Returns C string (null-terminated string) value of a datum.+ *+ * Note: C string is not a full-fledged Postgres type at present,+ * but type input functions use this conversion for their inputs.+ */++#define DatumGetCString(X) ((char *) DatumGetPointer(X))++/*+ * CStringGetDatum+ * Returns datum representation for a C string (null-terminated string).+ *+ * Note: C string is not a full-fledged Postgres type at present,+ * but type output functions use this conversion for their outputs.+ * Note: CString is pass-by-reference; caller must ensure the pointed-to+ * value has adequate lifetime.+ */++#define CStringGetDatum(X) PointerGetDatum(X)++/*+ * DatumGetName+ * Returns name value of a datum.+ */++#define DatumGetName(X) ((Name) DatumGetPointer(X))++/*+ * NameGetDatum+ * Returns datum representation for a name.+ *+ * Note: Name is pass-by-reference; caller must ensure the pointed-to+ * value has adequate lifetime.+ */++#define NameGetDatum(X) PointerGetDatum(X)++/*+ * DatumGetInt64+ * Returns 64-bit integer value of a datum.+ *+ * Note: this macro hides whether int64 is pass by value or by reference.+ */++#ifdef USE_FLOAT8_BYVAL+#define DatumGetInt64(X) ((int64) GET_8_BYTES(X))+#else+#define DatumGetInt64(X) (* ((int64 *) DatumGetPointer(X)))+#endif++/*+ * Int64GetDatum+ * Returns datum representation for a 64-bit integer.+ *+ * Note: if int64 is pass by reference, this function returns a reference+ * to palloc'd space.+ */++#ifdef USE_FLOAT8_BYVAL+#define Int64GetDatum(X) ((Datum) SET_8_BYTES(X))+#else+extern Datum Int64GetDatum(int64 X);+#endif++/*+ * DatumGetFloat4+ * Returns 4-byte floating point value of a datum.+ *+ * Note: this macro hides whether float4 is pass by value or by reference.+ */++#ifdef USE_FLOAT4_BYVAL+extern float4 DatumGetFloat4(Datum X);+#else+#define DatumGetFloat4(X) (* ((float4 *) DatumGetPointer(X)))+#endif++/*+ * Float4GetDatum+ * Returns datum representation for a 4-byte floating point number.+ *+ * Note: if float4 is pass by reference, this function returns a reference+ * to palloc'd space.+ */++extern Datum Float4GetDatum(float4 X);++/*+ * DatumGetFloat8+ * Returns 8-byte floating point value of a datum.+ *+ * Note: this macro hides whether float8 is pass by value or by reference.+ */++#ifdef USE_FLOAT8_BYVAL+extern float8 DatumGetFloat8(Datum X);+#else+#define DatumGetFloat8(X) (* ((float8 *) DatumGetPointer(X)))+#endif++/*+ * Float8GetDatum+ * Returns datum representation for an 8-byte floating point number.+ *+ * Note: if float8 is pass by reference, this function returns a reference+ * to palloc'd space.+ */++extern Datum Float8GetDatum(float8 X);+++/*+ * Int64GetDatumFast+ * Float8GetDatumFast+ * Float4GetDatumFast+ *+ * These macros are intended to allow writing code that does not depend on+ * whether int64, float8, float4 are pass-by-reference types, while not+ * sacrificing performance when they are. The argument must be a variable+ * that will exist and have the same value for as long as the Datum is needed.+ * In the pass-by-ref case, the address of the variable is taken to use as+ * the Datum. In the pass-by-val case, these will be the same as the non-Fast+ * macros.+ */++#ifdef USE_FLOAT8_BYVAL+#define Int64GetDatumFast(X) Int64GetDatum(X)+#define Float8GetDatumFast(X) Float8GetDatum(X)+#else+#define Int64GetDatumFast(X) PointerGetDatum(&(X))+#define Float8GetDatumFast(X) PointerGetDatum(&(X))+#endif++#ifdef USE_FLOAT4_BYVAL+#define Float4GetDatumFast(X) Float4GetDatum(X)+#else+#define Float4GetDatumFast(X) PointerGetDatum(&(X))+#endif+++/* ----------------------------------------------------------------+ * Section 3: exception handling backend support+ * ----------------------------------------------------------------+ */++/*+ * Backend only infrastructure for the assertion-related macros in c.h.+ *+ * ExceptionalCondition must be present even when assertions are not enabled.+ */+extern void ExceptionalCondition(const char *conditionName,+ const char *errorType,+ const char *fileName, int lineNumber) pg_attribute_noreturn();++#endif /* POSTGRES_H */
+ foreign/libpg_query/src/postgres/include/postgres_ext.h view
@@ -0,0 +1,69 @@+/*-------------------------------------------------------------------------+ *+ * postgres_ext.h+ *+ * This file contains declarations of things that are visible everywhere+ * in PostgreSQL *and* are visible to clients of frontend interface libraries.+ * For example, the Oid type is part of the API of libpq and other libraries.+ *+ * Declarations which are specific to a particular interface should+ * go in the header file for that interface (such as libpq-fe.h). This+ * file is only for fundamental Postgres declarations.+ *+ * User-written C functions don't count as "external to Postgres."+ * Those function much as local modifications to the backend itself, and+ * use header files that are otherwise internal to Postgres to interface+ * with the backend.+ *+ * src/include/postgres_ext.h+ *+ *-------------------------------------------------------------------------+ */++#ifndef POSTGRES_EXT_H+#define POSTGRES_EXT_H++#include "pg_config_ext.h"++/*+ * Object ID is a fundamental type in Postgres.+ */+typedef unsigned int Oid;++#ifdef __cplusplus+#define InvalidOid (Oid(0))+#else+#define InvalidOid ((Oid) 0)+#endif++#define OID_MAX UINT_MAX+/* you will need to include <limits.h> to use the above #define */++/* Define a signed 64-bit integer type for use in client API declarations. */+typedef PG_INT64_TYPE pg_int64;+++/*+ * Identifiers of error message fields. Kept here to keep common+ * between frontend and backend, and also to export them to libpq+ * applications.+ */+#define PG_DIAG_SEVERITY 'S'+#define PG_DIAG_SQLSTATE 'C'+#define PG_DIAG_MESSAGE_PRIMARY 'M'+#define PG_DIAG_MESSAGE_DETAIL 'D'+#define PG_DIAG_MESSAGE_HINT 'H'+#define PG_DIAG_STATEMENT_POSITION 'P'+#define PG_DIAG_INTERNAL_POSITION 'p'+#define PG_DIAG_INTERNAL_QUERY 'q'+#define PG_DIAG_CONTEXT 'W'+#define PG_DIAG_SCHEMA_NAME 's'+#define PG_DIAG_TABLE_NAME 't'+#define PG_DIAG_COLUMN_NAME 'c'+#define PG_DIAG_DATATYPE_NAME 'd'+#define PG_DIAG_CONSTRAINT_NAME 'n'+#define PG_DIAG_SOURCE_FILE 'F'+#define PG_DIAG_SOURCE_LINE 'L'+#define PG_DIAG_SOURCE_FUNCTION 'R'++#endif /* POSTGRES_EXT_H */
+ foreign/libpg_query/src/postgres/include/postmaster/autovacuum.h view
@@ -0,0 +1,67 @@+/*-------------------------------------------------------------------------+ *+ * autovacuum.h+ * header file for integrated autovacuum daemon+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/postmaster/autovacuum.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef AUTOVACUUM_H+#define AUTOVACUUM_H+++/* GUC variables */+extern bool autovacuum_start_daemon;+extern int autovacuum_max_workers;+extern int autovacuum_work_mem;+extern int autovacuum_naptime;+extern int autovacuum_vac_thresh;+extern double autovacuum_vac_scale;+extern int autovacuum_anl_thresh;+extern double autovacuum_anl_scale;+extern int autovacuum_freeze_max_age;+extern int autovacuum_multixact_freeze_max_age;+extern int autovacuum_vac_cost_delay;+extern int autovacuum_vac_cost_limit;++/* autovacuum launcher PID, only valid when worker is shutting down */+extern int AutovacuumLauncherPid;++extern int Log_autovacuum_min_duration;++/* Status inquiry functions */+extern bool AutoVacuumingActive(void);+extern bool IsAutoVacuumLauncherProcess(void);+extern bool IsAutoVacuumWorkerProcess(void);++#define IsAnyAutoVacuumProcess() \+ (IsAutoVacuumLauncherProcess() || IsAutoVacuumWorkerProcess())++/* Functions to start autovacuum process, called from postmaster */+extern void autovac_init(void);+extern int StartAutoVacLauncher(void);+extern int StartAutoVacWorker(void);++/* called from postmaster when a worker could not be forked */+extern void AutoVacWorkerFailed(void);++/* autovacuum cost-delay balancer */+extern void AutoVacuumUpdateDelay(void);++#ifdef EXEC_BACKEND+extern void AutoVacLauncherMain(int argc, char *argv[]) pg_attribute_noreturn();+extern void AutoVacWorkerMain(int argc, char *argv[]) pg_attribute_noreturn();+extern void AutovacuumWorkerIAm(void);+extern void AutovacuumLauncherIAm(void);+#endif++/* shared memory stuff */+extern Size AutoVacuumShmemSize(void);+extern void AutoVacuumShmemInit(void);++#endif /* AUTOVACUUM_H */
+ foreign/libpg_query/src/postgres/include/postmaster/bgworker.h view
@@ -0,0 +1,144 @@+/*--------------------------------------------------------------------+ * bgworker.h+ * POSTGRES pluggable background workers interface+ *+ * A background worker is a process able to run arbitrary, user-supplied code,+ * including normal transactions.+ *+ * Any external module loaded via shared_preload_libraries can register a+ * worker. Workers can also be registered dynamically at runtime. In either+ * case, the worker process is forked from the postmaster and runs the+ * user-supplied "main" function. This code may connect to a database and+ * run transactions. Workers can remain active indefinitely, but will be+ * terminated if a shutdown or crash occurs.+ *+ * If the fork() call fails in the postmaster, it will try again later. Note+ * that the failure can only be transient (fork failure due to high load,+ * memory pressure, too many processes, etc); more permanent problems, like+ * failure to connect to a database, are detected later in the worker and dealt+ * with just by having the worker exit normally. A worker which exits with+ * a return code of 0 will never be restarted and will be removed from worker+ * list. A worker which exits with a return code of 1 will be restarted after+ * the configured restart interval (unless that interval is BGW_NEVER_RESTART).+ * The TerminateBackgroundWorker() function can be used to terminate a+ * dynamically registered background worker; the worker will be sent a SIGTERM+ * and will not be restarted after it exits. Whenever the postmaster knows+ * that a worker will not be restarted, it unregisters the worker, freeing up+ * that worker's slot for use by a new worker.+ *+ * Note that there might be more than one worker in a database concurrently,+ * and the same module may request more than one worker running the same (or+ * different) code.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * IDENTIFICATION+ * src/include/postmaster/bgworker.h+ *--------------------------------------------------------------------+ */+#ifndef BGWORKER_H+#define BGWORKER_H++/*---------------------------------------------------------------------+ * External module API.+ *---------------------------------------------------------------------+ */++/*+ * Pass this flag to have your worker be able to connect to shared memory.+ */+#define BGWORKER_SHMEM_ACCESS 0x0001++/*+ * This flag means the bgworker requires a database connection. The connection+ * is not established automatically; the worker must establish it later.+ * It requires that BGWORKER_SHMEM_ACCESS was passed too.+ */+#define BGWORKER_BACKEND_DATABASE_CONNECTION 0x0002+++typedef void (*bgworker_main_type) (Datum main_arg);++/*+ * Points in time at which a bgworker can request to be started+ */+typedef enum+{+ BgWorkerStart_PostmasterStart,+ BgWorkerStart_ConsistentState,+ BgWorkerStart_RecoveryFinished+} BgWorkerStartTime;++#define BGW_DEFAULT_RESTART_INTERVAL 60+#define BGW_NEVER_RESTART -1+#define BGW_MAXLEN 64+#define BGW_EXTRALEN 128++typedef struct BackgroundWorker+{+ char bgw_name[BGW_MAXLEN];+ int bgw_flags;+ BgWorkerStartTime bgw_start_time;+ int bgw_restart_time; /* in seconds, or BGW_NEVER_RESTART */+ bgworker_main_type bgw_main;+ char bgw_library_name[BGW_MAXLEN]; /* only if bgw_main is NULL */+ char bgw_function_name[BGW_MAXLEN]; /* only if bgw_main is NULL */+ Datum bgw_main_arg;+ char bgw_extra[BGW_EXTRALEN];+ pid_t bgw_notify_pid; /* SIGUSR1 this backend on start/stop */+} BackgroundWorker;++typedef enum BgwHandleStatus+{+ BGWH_STARTED, /* worker is running */+ BGWH_NOT_YET_STARTED, /* worker hasn't been started yet */+ BGWH_STOPPED, /* worker has exited */+ BGWH_POSTMASTER_DIED /* postmaster died; worker status unclear */+} BgwHandleStatus;++struct BackgroundWorkerHandle;+typedef struct BackgroundWorkerHandle BackgroundWorkerHandle;++/* Register a new bgworker during shared_preload_libraries */+extern void RegisterBackgroundWorker(BackgroundWorker *worker);++/* Register a new bgworker from a regular backend */+extern bool RegisterDynamicBackgroundWorker(BackgroundWorker *worker,+ BackgroundWorkerHandle **handle);++/* Query the status of a bgworker */+extern BgwHandleStatus GetBackgroundWorkerPid(BackgroundWorkerHandle *handle,+ pid_t *pidp);+extern BgwHandleStatus+WaitForBackgroundWorkerStartup(BackgroundWorkerHandle *+ handle, pid_t *pid);+extern BgwHandleStatus+ WaitForBackgroundWorkerShutdown(BackgroundWorkerHandle *);++/* Terminate a bgworker */+extern void TerminateBackgroundWorker(BackgroundWorkerHandle *handle);++/* This is valid in a running worker */+extern PGDLLIMPORT BackgroundWorker *MyBgworkerEntry;++/*+ * Connect to the specified database, as the specified user. Only a worker+ * that passed BGWORKER_BACKEND_DATABASE_CONNECTION during registration may+ * call this.+ *+ * If username is NULL, bootstrapping superuser is used.+ * If dbname is NULL, connection is made to no specific database;+ * only shared catalogs can be accessed.+ */+extern void BackgroundWorkerInitializeConnection(char *dbname, char *username);++/* Just like the above, but specifying database and user by OID. */+extern void BackgroundWorkerInitializeConnectionByOid(Oid dboid, Oid useroid);++/* Block/unblock signals in a background worker process */+extern void BackgroundWorkerBlockSignals(void);+extern void BackgroundWorkerUnblockSignals(void);++#endif /* BGWORKER_H */
+ foreign/libpg_query/src/postgres/include/postmaster/bgworker_internals.h view
@@ -0,0 +1,55 @@+/*--------------------------------------------------------------------+ * bgworker_internals.h+ * POSTGRES pluggable background workers internals+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * IDENTIFICATION+ * src/include/postmaster/bgworker_internals.h+ *--------------------------------------------------------------------+ */+#ifndef BGWORKER_INTERNALS_H+#define BGWORKER_INTERNALS_H++#include "datatype/timestamp.h"+#include "lib/ilist.h"+#include "postmaster/bgworker.h"++/*+ * List of background workers, private to postmaster.+ *+ * A worker that requests a database connection during registration will have+ * rw_backend set, and will be present in BackendList. Note: do not rely on+ * rw_backend being non-NULL for shmem-connected workers!+ */+typedef struct RegisteredBgWorker+{+ BackgroundWorker rw_worker; /* its registry entry */+ struct bkend *rw_backend; /* its BackendList entry, or NULL */+ pid_t rw_pid; /* 0 if not running */+ int rw_child_slot;+ TimestampTz rw_crashed_at; /* if not 0, time it last crashed */+ int rw_shmem_slot;+ bool rw_terminate;+ slist_node rw_lnode; /* list link */+} RegisteredBgWorker;++extern slist_head BackgroundWorkerList;++extern Size BackgroundWorkerShmemSize(void);+extern void BackgroundWorkerShmemInit(void);+extern void BackgroundWorkerStateChange(void);+extern void ForgetBackgroundWorker(slist_mutable_iter *cur);+extern void ReportBackgroundWorkerPID(RegisteredBgWorker *);+extern void BackgroundWorkerStopNotifications(pid_t pid);+extern void ResetBackgroundWorkerCrashTimes(void);++/* Function to start a background worker, called from postmaster.c */+extern void StartBackgroundWorker(void) pg_attribute_noreturn();++#ifdef EXEC_BACKEND+extern BackgroundWorker *BackgroundWorkerEntry(int slotno);+#endif++#endif /* BGWORKER_INTERNALS_H */
+ foreign/libpg_query/src/postgres/include/postmaster/bgwriter.h view
@@ -0,0 +1,43 @@+/*-------------------------------------------------------------------------+ *+ * bgwriter.h+ * Exports from postmaster/bgwriter.c and postmaster/checkpointer.c.+ *+ * The bgwriter process used to handle checkpointing duties too. Now+ * there is a separate process, but we did not bother to split this header.+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ *+ * src/include/postmaster/bgwriter.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef _BGWRITER_H+#define _BGWRITER_H++#include "storage/block.h"+#include "storage/relfilenode.h"+++/* GUC options */+extern int BgWriterDelay;+extern int CheckPointTimeout;+extern int CheckPointWarning;+extern double CheckPointCompletionTarget;++extern void BackgroundWriterMain(void) pg_attribute_noreturn();+extern void CheckpointerMain(void) pg_attribute_noreturn();++extern void RequestCheckpoint(int flags);+extern void CheckpointWriteDelay(int flags, double progress);++extern bool ForwardFsyncRequest(RelFileNode rnode, ForkNumber forknum,+ BlockNumber segno);+extern void AbsorbFsyncRequests(void);++extern Size CheckpointerShmemSize(void);+extern void CheckpointerShmemInit(void);++extern bool FirstCallSinceLastCheckpoint(void);++#endif /* _BGWRITER_H */
+ foreign/libpg_query/src/postgres/include/postmaster/fork_process.h view
@@ -0,0 +1,17 @@+/*-------------------------------------------------------------------------+ *+ * fork_process.h+ * Exports from postmaster/fork_process.c.+ *+ * Copyright (c) 1996-2015, PostgreSQL Global Development Group+ *+ * src/include/postmaster/fork_process.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef FORK_PROCESS_H+#define FORK_PROCESS_H++extern pid_t fork_process(void);++#endif /* FORK_PROCESS_H */
+ foreign/libpg_query/src/postgres/include/postmaster/pgarch.h view
@@ -0,0 +1,39 @@+/*-------------------------------------------------------------------------+ *+ * pgarch.h+ * Exports from postmaster/pgarch.c.+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/postmaster/pgarch.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef _PGARCH_H+#define _PGARCH_H++/* ----------+ * Archiver control info.+ *+ * We expect that archivable files within pg_xlog will have names between+ * MIN_XFN_CHARS and MAX_XFN_CHARS in length, consisting only of characters+ * appearing in VALID_XFN_CHARS. The status files in archive_status have+ * corresponding names with ".ready" or ".done" appended.+ * ----------+ */+#define MIN_XFN_CHARS 16+#define MAX_XFN_CHARS 40+#define VALID_XFN_CHARS "0123456789ABCDEF.history.backup.partial"++/* ----------+ * Functions called from postmaster+ * ----------+ */+extern int pgarch_start(void);++#ifdef EXEC_BACKEND+extern void PgArchiverMain(int argc, char *argv[]) pg_attribute_noreturn();+#endif++#endif /* _PGARCH_H */
+ foreign/libpg_query/src/postgres/include/postmaster/postmaster.h view
@@ -0,0 +1,74 @@+/*-------------------------------------------------------------------------+ *+ * postmaster.h+ * Exports from postmaster/postmaster.c.+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/postmaster/postmaster.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef _POSTMASTER_H+#define _POSTMASTER_H++/* GUC options */+extern bool EnableSSL;+extern int ReservedBackends;+extern int PostPortNumber;+extern int Unix_socket_permissions;+extern char *Unix_socket_group;+extern char *Unix_socket_directories;+extern char *ListenAddresses;+extern __thread bool ClientAuthInProgress;+extern int PreAuthDelay;+extern int AuthenticationTimeout;+extern bool Log_connections;+extern bool log_hostname;+extern bool enable_bonjour;+extern char *bonjour_name;+extern bool restart_after_crash;++#ifdef WIN32+extern HANDLE PostmasterHandle;+#else+extern int postmaster_alive_fds[2];++/*+ * Constants that represent which of postmaster_alive_fds is held by+ * postmaster, and which is used in children to check for postmaster death.+ */+#define POSTMASTER_FD_WATCH 0 /* used in children to check for+ * postmaster death */+#define POSTMASTER_FD_OWN 1 /* kept open by postmaster only */+#endif++extern const char *progname;++extern void PostmasterMain(int argc, char *argv[]) pg_attribute_noreturn();+extern void ClosePostmasterPorts(bool am_syslogger);++extern int MaxLivePostmasterChildren(void);++extern int GetNumShmemAttachedBgworkers(void);+extern bool PostmasterMarkPIDForWorkerNotify(int);++#ifdef EXEC_BACKEND+extern pid_t postmaster_forkexec(int argc, char *argv[]);+extern void SubPostmasterMain(int argc, char *argv[]) pg_attribute_noreturn();++extern Size ShmemBackendArraySize(void);+extern void ShmemBackendArrayAllocation(void);+#endif++/*+ * Note: MAX_BACKENDS is limited to 2^23-1 because inval.c stores the+ * backend ID as a 3-byte signed integer. Even if that limitation were+ * removed, we still could not exceed INT_MAX/4 because some places compute+ * 4*MaxBackends without any overflow check. This is rechecked in the relevant+ * GUC check hooks and in RegisterBackgroundWorker().+ */+#define MAX_BACKENDS 0x7fffff++#endif /* _POSTMASTER_H */
+ foreign/libpg_query/src/postgres/include/postmaster/syslogger.h view
@@ -0,0 +1,90 @@+/*-------------------------------------------------------------------------+ *+ * syslogger.h+ * Exports from postmaster/syslogger.c.+ *+ * Copyright (c) 2004-2015, PostgreSQL Global Development Group+ *+ * src/include/postmaster/syslogger.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef _SYSLOGGER_H+#define _SYSLOGGER_H++#include <limits.h> /* for PIPE_BUF */+++/*+ * Primitive protocol structure for writing to syslogger pipe(s). The idea+ * here is to divide long messages into chunks that are not more than+ * PIPE_BUF bytes long, which according to POSIX spec must be written into+ * the pipe atomically. The pipe reader then uses the protocol headers to+ * reassemble the parts of a message into a single string. The reader can+ * also cope with non-protocol data coming down the pipe, though we cannot+ * guarantee long strings won't get split apart.+ *+ * We use non-nul bytes in is_last to make the protocol a tiny bit+ * more robust against finding a false double nul byte prologue. But+ * we still might find it in the len and/or pid bytes unless we're careful.+ */++#ifdef PIPE_BUF+/* Are there any systems with PIPE_BUF > 64K? Unlikely, but ... */+#if PIPE_BUF > 65536+#define PIPE_CHUNK_SIZE 65536+#else+#define PIPE_CHUNK_SIZE ((int) PIPE_BUF)+#endif+#else /* not defined */+/* POSIX says the value of PIPE_BUF must be at least 512, so use that */+#define PIPE_CHUNK_SIZE 512+#endif++typedef struct+{+ char nuls[2]; /* always \0\0 */+ uint16 len; /* size of this chunk (counts data only) */+ int32 pid; /* writer's pid */+ char is_last; /* last chunk of message? 't' or 'f' ('T' or+ * 'F' for CSV case) */+ char data[FLEXIBLE_ARRAY_MEMBER]; /* data payload starts here */+} PipeProtoHeader;++typedef union+{+ PipeProtoHeader proto;+ char filler[PIPE_CHUNK_SIZE];+} PipeProtoChunk;++#define PIPE_HEADER_SIZE offsetof(PipeProtoHeader, data)+#define PIPE_MAX_PAYLOAD ((int) (PIPE_CHUNK_SIZE - PIPE_HEADER_SIZE))+++/* GUC options */+extern bool Logging_collector;+extern int Log_RotationAge;+extern int Log_RotationSize;+extern PGDLLIMPORT char *Log_directory;+extern PGDLLIMPORT char *Log_filename;+extern bool Log_truncate_on_rotation;+extern int Log_file_mode;++extern bool am_syslogger;++#ifndef WIN32+extern int syslogPipe[2];+#else+extern HANDLE syslogPipe[2];+#endif+++extern int SysLogger_Start(void);++extern void write_syslogger_file(const char *buffer, int count, int dest);++#ifdef EXEC_BACKEND+extern void SysLoggerMain(int argc, char *argv[]) pg_attribute_noreturn();+#endif++#endif /* _SYSLOGGER_H */
+ foreign/libpg_query/src/postgres/include/postmaster/walwriter.h view
@@ -0,0 +1,20 @@+/*-------------------------------------------------------------------------+ *+ * walwriter.h+ * Exports from postmaster/walwriter.c.+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ *+ * src/include/postmaster/walwriter.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef _WALWRITER_H+#define _WALWRITER_H++/* GUC options */+extern int WalWriterDelay;++extern void WalWriterMain(void) pg_attribute_noreturn();++#endif /* _WALWRITER_H */
+ foreign/libpg_query/src/postgres/include/regex/regex.h view
@@ -0,0 +1,177 @@+#ifndef _REGEX_H_+#define _REGEX_H_ /* never again */+/*+ * regular expressions+ *+ * Copyright (c) 1998, 1999 Henry Spencer. All rights reserved.+ *+ * Development of this software was funded, in part, by Cray Research Inc.,+ * UUNET Communications Services Inc., Sun Microsystems Inc., and Scriptics+ * Corporation, none of whom are responsible for the results. The author+ * thanks all of them.+ *+ * Redistribution and use in source and binary forms -- with or without+ * modification -- are permitted for any purpose, provided that+ * redistributions in source form retain this entire copyright notice and+ * indicate the origin and nature of any modifications.+ *+ * I'd appreciate being given credit for this package in the documentation+ * of software which uses it, but that is not a requirement.+ *+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY+ * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL+ * HENRY SPENCER BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;+ * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR+ * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.+ *+ * src/include/regex/regex.h+ */++/*+ * Add your own defines, if needed, here.+ */+#include "mb/pg_wchar.h"++/*+ * interface types etc.+ */++/*+ * regoff_t has to be large enough to hold either off_t or ssize_t,+ * and must be signed; it's only a guess that long is suitable.+ */+typedef long regoff_t;++/*+ * other interface types+ */++/* the biggie, a compiled RE (or rather, a front end to same) */+typedef struct+{+ int re_magic; /* magic number */+ size_t re_nsub; /* number of subexpressions */+ long re_info; /* information about RE */+#define REG_UBACKREF 000001+#define REG_ULOOKAHEAD 000002+#define REG_UBOUNDS 000004+#define REG_UBRACES 000010+#define REG_UBSALNUM 000020+#define REG_UPBOTCH 000040+#define REG_UBBS 000100+#define REG_UNONPOSIX 000200+#define REG_UUNSPEC 000400+#define REG_UUNPORT 001000+#define REG_ULOCALE 002000+#define REG_UEMPTYMATCH 004000+#define REG_UIMPOSSIBLE 010000+#define REG_USHORTEST 020000+ int re_csize; /* sizeof(character) */+ char *re_endp; /* backward compatibility kludge */+ Oid re_collation; /* Collation that defines LC_CTYPE behavior */+ /* the rest is opaque pointers to hidden innards */+ char *re_guts; /* `char *' is more portable than `void *' */+ char *re_fns;+} regex_t;++/* result reporting (may acquire more fields later) */+typedef struct+{+ regoff_t rm_so; /* start of substring */+ regoff_t rm_eo; /* end of substring */+} regmatch_t;++/* supplementary control and reporting */+typedef struct+{+ regmatch_t rm_extend; /* see REG_EXPECT */+} rm_detail_t;++++/*+ * regex compilation flags+ */+#define REG_BASIC 000000 /* BREs (convenience) */+#define REG_EXTENDED 000001 /* EREs */+#define REG_ADVF 000002 /* advanced features in EREs */+#define REG_ADVANCED 000003 /* AREs (which are also EREs) */+#define REG_QUOTE 000004 /* no special characters, none */+#define REG_NOSPEC REG_QUOTE /* historical synonym */+#define REG_ICASE 000010 /* ignore case */+#define REG_NOSUB 000020 /* don't care about subexpressions */+#define REG_EXPANDED 000040 /* expanded format, white space & comments */+#define REG_NLSTOP 000100 /* \n doesn't match . or [^ ] */+#define REG_NLANCH 000200 /* ^ matches after \n, $ before */+#define REG_NEWLINE 000300 /* newlines are line terminators */+#define REG_PEND 000400 /* ugh -- backward-compatibility hack */+#define REG_EXPECT 001000 /* report details on partial/limited matches */+#define REG_BOSONLY 002000 /* temporary kludge for BOS-only matches */+#define REG_DUMP 004000 /* none of your business :-) */+#define REG_FAKE 010000 /* none of your business :-) */+#define REG_PROGRESS 020000 /* none of your business :-) */++++/*+ * regex execution flags+ */+#define REG_NOTBOL 0001 /* BOS is not BOL */+#define REG_NOTEOL 0002 /* EOS is not EOL */+#define REG_STARTEND 0004 /* backward compatibility kludge */+#define REG_FTRACE 0010 /* none of your business */+#define REG_MTRACE 0020 /* none of your business */+#define REG_SMALL 0040 /* none of your business */+++/*+ * error reporting+ * Be careful if modifying the list of error codes -- the table used by+ * regerror() is generated automatically from this file!+ */+#define REG_OKAY 0 /* no errors detected */+#define REG_NOMATCH 1 /* failed to match */+#define REG_BADPAT 2 /* invalid regexp */+#define REG_ECOLLATE 3 /* invalid collating element */+#define REG_ECTYPE 4 /* invalid character class */+#define REG_EESCAPE 5 /* invalid escape \ sequence */+#define REG_ESUBREG 6 /* invalid backreference number */+#define REG_EBRACK 7 /* brackets [] not balanced */+#define REG_EPAREN 8 /* parentheses () not balanced */+#define REG_EBRACE 9 /* braces {} not balanced */+#define REG_BADBR 10 /* invalid repetition count(s) */+#define REG_ERANGE 11 /* invalid character range */+#define REG_ESPACE 12 /* out of memory */+#define REG_BADRPT 13 /* quantifier operand invalid */+#define REG_ASSERT 15 /* "can't happen" -- you found a bug */+#define REG_INVARG 16 /* invalid argument to regex function */+#define REG_MIXED 17 /* character widths of regex and string differ */+#define REG_BADOPT 18 /* invalid embedded option */+#define REG_ETOOBIG 19 /* regular expression is too complex */+#define REG_ECOLORS 20 /* too many colors */+#define REG_CANCEL 21 /* operation cancelled */+/* two specials for debugging and testing */+#define REG_ATOI 101 /* convert error-code name to number */+#define REG_ITOA 102 /* convert error-code number to name */+/* non-error result codes for pg_regprefix */+#define REG_PREFIX (-1) /* identified a common prefix */+#define REG_EXACT (-2) /* identified an exact match */++++/*+ * the prototypes for exported functions+ */+extern int pg_regcomp(regex_t *, const pg_wchar *, size_t, int, Oid);+extern int pg_regexec(regex_t *, const pg_wchar *, size_t, size_t, rm_detail_t *, size_t, regmatch_t[], int);+extern int pg_regprefix(regex_t *, pg_wchar **, size_t *);+extern void pg_regfree(regex_t *);+extern size_t pg_regerror(int, const regex_t *, char *, size_t);+extern void pg_set_regex_collation(Oid collation);++#endif /* _REGEX_H_ */
+ foreign/libpg_query/src/postgres/include/replication/origin.h view
@@ -0,0 +1,88 @@+/*-------------------------------------------------------------------------+ * origin.h+ * Exports from replication/logical/origin.c+ *+ * Copyright (c) 2013-2015, PostgreSQL Global Development Group+ *+ * src/include/replication/origin.h+ *-------------------------------------------------------------------------+ */+#ifndef PG_ORIGIN_H+#define PG_ORIGIN_H++#include "fmgr.h"+#include "access/xlog.h"+#include "access/xlogdefs.h"+#include "access/xlogreader.h"+#include "catalog/pg_replication_origin.h"++typedef struct xl_replorigin_set+{+ XLogRecPtr remote_lsn;+ RepOriginId node_id;+ bool force;+} xl_replorigin_set;++typedef struct xl_replorigin_drop+{+ RepOriginId node_id;+} xl_replorigin_drop;++#define XLOG_REPLORIGIN_SET 0x00+#define XLOG_REPLORIGIN_DROP 0x10++#define InvalidRepOriginId 0+#define DoNotReplicateId PG_UINT16_MAX++extern PGDLLIMPORT RepOriginId replorigin_session_origin;+extern PGDLLIMPORT XLogRecPtr replorigin_session_origin_lsn;+extern PGDLLIMPORT TimestampTz replorigin_session_origin_timestamp;++/* API for querying & manipulating replication origins */+extern RepOriginId replorigin_by_name(char *name, bool missing_ok);+extern RepOriginId replorigin_create(char *name);+extern void replorigin_drop(RepOriginId roident);+extern bool replorigin_by_oid(RepOriginId roident, bool missing_ok,+ char **roname);++/* API for querying & manipulating replication progress tracking */+extern void replorigin_advance(RepOriginId node,+ XLogRecPtr remote_commit,+ XLogRecPtr local_commit,+ bool go_backward, bool wal_log);+extern XLogRecPtr replorigin_get_progress(RepOriginId node, bool flush);++extern void replorigin_session_advance(XLogRecPtr remote_commit,+ XLogRecPtr local_commit);+extern void replorigin_session_setup(RepOriginId node);+extern void replorigin_session_reset(void);+extern XLogRecPtr replorigin_session_get_progress(bool flush);++/* Checkpoint/Startup integration */+extern void CheckPointReplicationOrigin(void);+extern void StartupReplicationOrigin(void);++/* WAL logging */+void replorigin_redo(XLogReaderState *record);+void replorigin_desc(StringInfo buf, XLogReaderState *record);+const char *replorigin_identify(uint8 info);++/* shared memory allocation */+extern Size ReplicationOriginShmemSize(void);+extern void ReplicationOriginShmemInit(void);++/* SQL callable functions */+extern Datum pg_replication_origin_create(PG_FUNCTION_ARGS);+extern Datum pg_replication_origin_drop(PG_FUNCTION_ARGS);+extern Datum pg_replication_origin_oid(PG_FUNCTION_ARGS);+extern Datum pg_replication_origin_session_setup(PG_FUNCTION_ARGS);+extern Datum pg_replication_origin_session_reset(PG_FUNCTION_ARGS);+extern Datum pg_replication_origin_session_is_setup(PG_FUNCTION_ARGS);+extern Datum pg_replication_origin_session_progress(PG_FUNCTION_ARGS);+extern Datum pg_replication_origin_xact_setup(PG_FUNCTION_ARGS);+extern Datum pg_replication_origin_xact_reset(PG_FUNCTION_ARGS);+extern Datum pg_replication_origin_advance(PG_FUNCTION_ARGS);+extern Datum pg_replication_origin_progress(PG_FUNCTION_ARGS);+extern Datum pg_show_replication_origin_status(PG_FUNCTION_ARGS);++#endif /* PG_ORIGIN_H */
+ foreign/libpg_query/src/postgres/include/replication/slot.h view
@@ -0,0 +1,182 @@+/*-------------------------------------------------------------------------+ * slot.h+ * Replication slot management.+ *+ * Copyright (c) 2012-2015, PostgreSQL Global Development Group+ *+ *-------------------------------------------------------------------------+ */+#ifndef SLOT_H+#define SLOT_H++#include "fmgr.h"+#include "access/xlog.h"+#include "access/xlogreader.h"+#include "storage/lwlock.h"+#include "storage/shmem.h"+#include "storage/spin.h"++/*+ * Behaviour of replication slots, upon release or crash.+ *+ * Slots marked as PERSISTENT are crashsafe and will not be dropped when+ * released. Slots marked as EPHEMERAL will be dropped when released or after+ * restarts.+ *+ * EPHEMERAL slots can be made PERSISTENT by calling ReplicationSlotPersist().+ */+typedef enum ReplicationSlotPersistency+{+ RS_PERSISTENT,+ RS_EPHEMERAL+} ReplicationSlotPersistency;++/*+ * On-Disk data of a replication slot, preserved across restarts.+ */+typedef struct ReplicationSlotPersistentData+{+ /* The slot's identifier */+ NameData name;++ /* database the slot is active on */+ Oid database;++ /*+ * The slot's behaviour when being dropped (or restored after a crash).+ */+ ReplicationSlotPersistency persistency;++ /*+ * xmin horizon for data+ *+ * NB: This may represent a value that hasn't been written to disk yet;+ * see notes for effective_xmin, below.+ */+ TransactionId xmin;++ /*+ * xmin horizon for catalog tuples+ *+ * NB: This may represent a value that hasn't been written to disk yet;+ * see notes for effective_xmin, below.+ */+ TransactionId catalog_xmin;++ /* oldest LSN that might be required by this replication slot */+ XLogRecPtr restart_lsn;++ /* oldest LSN that the client has acked receipt for */+ XLogRecPtr confirmed_flush;++ /* plugin name */+ NameData plugin;+} ReplicationSlotPersistentData;++/*+ * Shared memory state of a single replication slot.+ */+typedef struct ReplicationSlot+{+ /* lock, on same cacheline as effective_xmin */+ slock_t mutex;++ /* is this slot defined */+ bool in_use;++ /* Who is streaming out changes for this slot? 0 in unused slots. */+ pid_t active_pid;++ /* any outstanding modifications? */+ bool just_dirtied;+ bool dirty;++ /*+ * For logical decoding, it's extremely important that we never remove any+ * data that's still needed for decoding purposes, even after a crash;+ * otherwise, decoding will produce wrong answers. Ordinary streaming+ * replication also needs to prevent old row versions from being removed+ * too soon, but the worst consequence we might encounter there is+ * unwanted query cancellations on the standby. Thus, for logical+ * decoding, this value represents the latest xmin that has actually been+ * written to disk, whereas for streaming replication, it's just the same+ * as the persistent value (data.xmin).+ */+ TransactionId effective_xmin;+ TransactionId effective_catalog_xmin;++ /* data surviving shutdowns and crashes */+ ReplicationSlotPersistentData data;++ /* is somebody performing io on this slot? */+ LWLock *io_in_progress_lock;++ /* all the remaining data is only used for logical slots */++ /* ----+ * When the client has confirmed flushes >= candidate_xmin_lsn we can+ * advance the catalog xmin, when restart_valid has been passed,+ * restart_lsn can be increased.+ * ----+ */+ TransactionId candidate_catalog_xmin;+ XLogRecPtr candidate_xmin_lsn;+ XLogRecPtr candidate_restart_valid;+ XLogRecPtr candidate_restart_lsn;+} ReplicationSlot;++/*+ * Shared memory control area for all of replication slots.+ */+typedef struct ReplicationSlotCtlData+{+ /*+ * This array should be declared [FLEXIBLE_ARRAY_MEMBER], but for some+ * reason you can't do that in an otherwise-empty struct.+ */+ ReplicationSlot replication_slots[1];+} ReplicationSlotCtlData;++/*+ * Pointers to shared memory+ */+extern ReplicationSlotCtlData *ReplicationSlotCtl;+extern ReplicationSlot *MyReplicationSlot;++/* GUCs */+extern PGDLLIMPORT int max_replication_slots;++/* shmem initialization functions */+extern Size ReplicationSlotsShmemSize(void);+extern void ReplicationSlotsShmemInit(void);++/* management of individual slots */+extern void ReplicationSlotCreate(const char *name, bool db_specific,+ ReplicationSlotPersistency p);+extern void ReplicationSlotPersist(void);+extern void ReplicationSlotDrop(const char *name);++extern void ReplicationSlotAcquire(const char *name);+extern void ReplicationSlotRelease(void);+extern void ReplicationSlotSave(void);+extern void ReplicationSlotMarkDirty(void);++/* misc stuff */+extern bool ReplicationSlotValidateName(const char *name, int elevel);+extern void ReplicationSlotsComputeRequiredXmin(bool already_locked);+extern void ReplicationSlotsComputeRequiredLSN(void);+extern XLogRecPtr ReplicationSlotsComputeLogicalRestartLSN(void);+extern bool ReplicationSlotsCountDBSlots(Oid dboid, int *nslots, int *nactive);++extern void StartupReplicationSlots(void);+extern void CheckPointReplicationSlots(void);++extern void CheckSlotRequirements(void);++/* SQL callable functions */+extern Datum pg_create_physical_replication_slot(PG_FUNCTION_ARGS);+extern Datum pg_create_logical_replication_slot(PG_FUNCTION_ARGS);+extern Datum pg_drop_replication_slot(PG_FUNCTION_ARGS);+extern Datum pg_get_replication_slots(PG_FUNCTION_ARGS);++#endif /* SLOT_H */
+ foreign/libpg_query/src/postgres/include/replication/syncrep.h view
@@ -0,0 +1,57 @@+/*-------------------------------------------------------------------------+ *+ * syncrep.h+ * Exports from replication/syncrep.c.+ *+ * Portions Copyright (c) 2010-2015, PostgreSQL Global Development Group+ *+ * IDENTIFICATION+ * src/include/replication/syncrep.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef _SYNCREP_H+#define _SYNCREP_H++#include "access/xlogdefs.h"+#include "utils/guc.h"++#define SyncRepRequested() \+ (max_wal_senders > 0 && synchronous_commit > SYNCHRONOUS_COMMIT_LOCAL_FLUSH)++/* SyncRepWaitMode */+#define SYNC_REP_NO_WAIT -1+#define SYNC_REP_WAIT_WRITE 0+#define SYNC_REP_WAIT_FLUSH 1++#define NUM_SYNC_REP_WAIT_MODE 2++/* syncRepState */+#define SYNC_REP_NOT_WAITING 0+#define SYNC_REP_WAITING 1+#define SYNC_REP_WAIT_COMPLETE 2++/* user-settable parameters for synchronous replication */+extern char *SyncRepStandbyNames;++/* called by user backend */+extern void SyncRepWaitForLSN(XLogRecPtr XactCommitLSN);++/* called at backend exit */+extern void SyncRepCleanupAtProcExit(void);++/* called by wal sender */+extern void SyncRepInitConfig(void);+extern void SyncRepReleaseWaiters(void);++/* called by checkpointer */+extern void SyncRepUpdateSyncStandbysDefined(void);++/* forward declaration to avoid pulling in walsender_private.h */+struct WalSnd;+extern struct WalSnd *SyncRepGetSynchronousStandby(void);++extern bool check_synchronous_standby_names(char **newval, void **extra, GucSource source);+extern void assign_synchronous_commit(int newval, void *extra);++#endif /* _SYNCREP_H */
+ foreign/libpg_query/src/postgres/include/replication/walreceiver.h view
@@ -0,0 +1,164 @@+/*-------------------------------------------------------------------------+ *+ * walreceiver.h+ * Exports from replication/walreceiverfuncs.c.+ *+ * Portions Copyright (c) 2010-2015, PostgreSQL Global Development Group+ *+ * src/include/replication/walreceiver.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef _WALRECEIVER_H+#define _WALRECEIVER_H++#include "access/xlog.h"+#include "access/xlogdefs.h"+#include "storage/latch.h"+#include "storage/spin.h"+#include "pgtime.h"++/* user-settable parameters */+extern int wal_receiver_status_interval;+extern int wal_receiver_timeout;+extern bool hot_standby_feedback;++/*+ * MAXCONNINFO: maximum size of a connection string.+ *+ * XXX: Should this move to pg_config_manual.h?+ */+#define MAXCONNINFO 1024++/* Can we allow the standby to accept replication connection from another standby? */+#define AllowCascadeReplication() (EnableHotStandby && max_wal_senders > 0)++/*+ * Values for WalRcv->walRcvState.+ */+typedef enum+{+ WALRCV_STOPPED, /* stopped and mustn't start up again */+ WALRCV_STARTING, /* launched, but the process hasn't+ * initialized yet */+ WALRCV_STREAMING, /* walreceiver is streaming */+ WALRCV_WAITING, /* stopped streaming, waiting for orders */+ WALRCV_RESTARTING, /* asked to restart streaming */+ WALRCV_STOPPING /* requested to stop, but still running */+} WalRcvState;++/* Shared memory area for management of walreceiver process */+typedef struct+{+ /*+ * PID of currently active walreceiver process, its current state and+ * start time (actually, the time at which it was requested to be+ * started).+ */+ pid_t pid;+ WalRcvState walRcvState;+ pg_time_t startTime;++ /*+ * receiveStart and receiveStartTLI indicate the first byte position and+ * timeline that will be received. When startup process starts the+ * walreceiver, it sets these to the point where it wants the streaming to+ * begin.+ */+ XLogRecPtr receiveStart;+ TimeLineID receiveStartTLI;++ /*+ * receivedUpto-1 is the last byte position that has already been+ * received, and receivedTLI is the timeline it came from. At the first+ * startup of walreceiver, these are set to receiveStart and+ * receiveStartTLI. After that, walreceiver updates these whenever it+ * flushes the received WAL to disk.+ */+ XLogRecPtr receivedUpto;+ TimeLineID receivedTLI;++ /*+ * latestChunkStart is the starting byte position of the current "batch"+ * of received WAL. It's actually the same as the previous value of+ * receivedUpto before the last flush to disk. Startup process can use+ * this to detect whether it's keeping up or not.+ */+ XLogRecPtr latestChunkStart;++ /*+ * Time of send and receive of any message received.+ */+ TimestampTz lastMsgSendTime;+ TimestampTz lastMsgReceiptTime;++ /*+ * Latest reported end of WAL on the sender+ */+ XLogRecPtr latestWalEnd;+ TimestampTz latestWalEndTime;++ /*+ * connection string; is used for walreceiver to connect with the primary.+ */+ char conninfo[MAXCONNINFO];++ /*+ * replication slot name; is also used for walreceiver to connect with the+ * primary+ */+ char slotname[NAMEDATALEN];++ slock_t mutex; /* locks shared variables shown above */++ /*+ * Latch used by startup process to wake up walreceiver after telling it+ * where to start streaming (after setting receiveStart and+ * receiveStartTLI).+ */+ Latch latch;+} WalRcvData;++extern WalRcvData *WalRcv;++/* libpqwalreceiver hooks */+typedef void (*walrcv_connect_type) (char *conninfo);+extern PGDLLIMPORT walrcv_connect_type walrcv_connect;++typedef void (*walrcv_identify_system_type) (TimeLineID *primary_tli);+extern PGDLLIMPORT walrcv_identify_system_type walrcv_identify_system;++typedef void (*walrcv_readtimelinehistoryfile_type) (TimeLineID tli, char **filename, char **content, int *size);+extern PGDLLIMPORT walrcv_readtimelinehistoryfile_type walrcv_readtimelinehistoryfile;++typedef bool (*walrcv_startstreaming_type) (TimeLineID tli, XLogRecPtr startpoint, char *slotname);+extern PGDLLIMPORT walrcv_startstreaming_type walrcv_startstreaming;++typedef void (*walrcv_endstreaming_type) (TimeLineID *next_tli);+extern PGDLLIMPORT walrcv_endstreaming_type walrcv_endstreaming;++typedef int (*walrcv_receive_type) (int timeout, char **buffer);+extern PGDLLIMPORT walrcv_receive_type walrcv_receive;++typedef void (*walrcv_send_type) (const char *buffer, int nbytes);+extern PGDLLIMPORT walrcv_send_type walrcv_send;++typedef void (*walrcv_disconnect_type) (void);+extern PGDLLIMPORT walrcv_disconnect_type walrcv_disconnect;++/* prototypes for functions in walreceiver.c */+extern void WalReceiverMain(void) pg_attribute_noreturn();++/* prototypes for functions in walreceiverfuncs.c */+extern Size WalRcvShmemSize(void);+extern void WalRcvShmemInit(void);+extern void ShutdownWalRcv(void);+extern bool WalRcvStreaming(void);+extern bool WalRcvRunning(void);+extern void RequestXLogStreaming(TimeLineID tli, XLogRecPtr recptr,+ const char *conninfo, const char *slotname);+extern XLogRecPtr GetWalRcvWriteRecPtr(XLogRecPtr *latestChunkStart, TimeLineID *receiveTLI);+extern int GetReplicationApplyDelay(void);+extern int GetReplicationTransferLatency(void);++#endif /* _WALRECEIVER_H */
+ foreign/libpg_query/src/postgres/include/replication/walsender.h view
@@ -0,0 +1,64 @@+/*-------------------------------------------------------------------------+ *+ * walsender.h+ * Exports from replication/walsender.c.+ *+ * Portions Copyright (c) 2010-2015, PostgreSQL Global Development Group+ *+ * src/include/replication/walsender.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef _WALSENDER_H+#define _WALSENDER_H++#include <signal.h>++#include "fmgr.h"++/* global state */+extern bool am_walsender;+extern bool am_cascading_walsender;+extern bool am_db_walsender;+extern bool wake_wal_senders;++/* user-settable parameters */+extern int max_wal_senders;+extern int wal_sender_timeout;+extern bool log_replication_commands;++extern void InitWalSender(void);+extern void exec_replication_command(const char *query_string);+extern void WalSndErrorCleanup(void);+extern void WalSndSignals(void);+extern Size WalSndShmemSize(void);+extern void WalSndShmemInit(void);+extern void WalSndWakeup(void);+extern void WalSndRqstFileReload(void);++extern Datum pg_stat_get_wal_senders(PG_FUNCTION_ARGS);++/*+ * Remember that we want to wakeup walsenders later+ *+ * This is separated from doing the actual wakeup because the writeout is done+ * while holding contended locks.+ */+#define WalSndWakeupRequest() \+ do { wake_wal_senders = true; } while (0)++/*+ * wakeup walsenders if there is work to be done+ */+#define WalSndWakeupProcessRequests() \+ do \+ { \+ if (wake_wal_senders) \+ { \+ wake_wal_senders = false; \+ if (max_wal_senders > 0) \+ WalSndWakeup(); \+ } \+ } while (0)++#endif /* _WALSENDER_H */
+ foreign/libpg_query/src/postgres/include/rewrite/prs2lock.h view
@@ -0,0 +1,46 @@+/*-------------------------------------------------------------------------+ *+ * prs2lock.h+ * data structures for POSTGRES Rule System II (rewrite rules only)+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/rewrite/prs2lock.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef PRS2LOCK_H+#define PRS2LOCK_H++#include "access/attnum.h"+#include "nodes/pg_list.h"++/*+ * RewriteRule -+ * holds an info for a rewrite rule+ *+ */+typedef struct RewriteRule+{+ Oid ruleId;+ CmdType event;+ Node *qual;+ List *actions;+ char enabled;+ bool isInstead;+} RewriteRule;++/*+ * RuleLock -+ * all rules that apply to a particular relation. Even though we only+ * have the rewrite rule system left and these are not really "locks",+ * the name is kept for historical reasons.+ */+typedef struct RuleLock+{+ int numLocks;+ RewriteRule **rules;+} RuleLock;++#endif /* REWRITE_H */
+ foreign/libpg_query/src/postgres/include/rewrite/rewriteHandler.h view
@@ -0,0 +1,33 @@+/*-------------------------------------------------------------------------+ *+ * rewriteHandler.h+ * External interface to query rewriter.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/rewrite/rewriteHandler.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef REWRITEHANDLER_H+#define REWRITEHANDLER_H++#include "utils/relcache.h"+#include "nodes/parsenodes.h"++extern List *QueryRewrite(Query *parsetree);+extern void AcquireRewriteLocks(Query *parsetree,+ bool forExecute,+ bool forUpdatePushedDown);++extern Node *build_column_default(Relation rel, int attrno);+extern Query *get_view_query(Relation view);+extern const char *view_query_is_auto_updatable(Query *viewquery,+ bool check_cols);+extern int relation_is_updatable(Oid reloid,+ bool include_triggers,+ Bitmapset *include_cols);++#endif /* REWRITEHANDLER_H */
+ foreign/libpg_query/src/postgres/include/rewrite/rewriteManip.h view
@@ -0,0 +1,85 @@+/*-------------------------------------------------------------------------+ *+ * rewriteManip.h+ * Querytree manipulation subroutines for query rewriter.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/rewrite/rewriteManip.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef REWRITEMANIP_H+#define REWRITEMANIP_H++#include "nodes/parsenodes.h"+++typedef struct replace_rte_variables_context replace_rte_variables_context;++typedef Node *(*replace_rte_variables_callback) (Var *var,+ replace_rte_variables_context *context);++struct replace_rte_variables_context+{+ replace_rte_variables_callback callback; /* callback function */+ void *callback_arg; /* context data for callback function */+ int target_varno; /* RTE index to search for */+ int sublevels_up; /* (current) nesting depth */+ bool inserted_sublink; /* have we inserted a SubLink? */+};++typedef enum ReplaceVarsNoMatchOption+{+ REPLACEVARS_REPORT_ERROR, /* throw error if no match */+ REPLACEVARS_CHANGE_VARNO, /* change the Var's varno, nothing else */+ REPLACEVARS_SUBSTITUTE_NULL /* replace with a NULL Const */+} ReplaceVarsNoMatchOption;+++extern void OffsetVarNodes(Node *node, int offset, int sublevels_up);+extern void ChangeVarNodes(Node *node, int old_varno, int new_varno,+ int sublevels_up);+extern void IncrementVarSublevelsUp(Node *node, int delta_sublevels_up,+ int min_sublevels_up);+extern void IncrementVarSublevelsUp_rtable(List *rtable,+ int delta_sublevels_up, int min_sublevels_up);++extern bool rangeTableEntry_used(Node *node, int rt_index,+ int sublevels_up);++extern Query *getInsertSelectQuery(Query *parsetree, Query ***subquery_ptr);++extern void AddQual(Query *parsetree, Node *qual);+extern void AddInvertedQual(Query *parsetree, Node *qual);++extern bool contain_aggs_of_level(Node *node, int levelsup);+extern int locate_agg_of_level(Node *node, int levelsup);+extern bool contain_windowfuncs(Node *node);+extern int locate_windowfunc(Node *node);+extern bool checkExprHasSubLink(Node *node);++extern Node *replace_rte_variables(Node *node,+ int target_varno, int sublevels_up,+ replace_rte_variables_callback callback,+ void *callback_arg,+ bool *outer_hasSubLinks);+extern Node *replace_rte_variables_mutator(Node *node,+ replace_rte_variables_context *context);++extern Node *map_variable_attnos(Node *node,+ int target_varno, int sublevels_up,+ const AttrNumber *attno_map, int map_length,+ bool *found_whole_row);++extern Node *ReplaceVarsFromTargetList(Node *node,+ int target_varno, int sublevels_up,+ RangeTblEntry *target_rte,+ List *targetlist,+ ReplaceVarsNoMatchOption nomatch_option,+ int nomatch_varno,+ bool *outer_hasSubLinks);++#endif /* REWRITEMANIP_H */
+ foreign/libpg_query/src/postgres/include/rewrite/rewriteSupport.h view
@@ -0,0 +1,28 @@+/*-------------------------------------------------------------------------+ *+ * rewriteSupport.h+ *+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/rewrite/rewriteSupport.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef REWRITESUPPORT_H+#define REWRITESUPPORT_H++/* The ON SELECT rule of a view is always named this: */+#define ViewSelectRuleName "_RETURN"++extern bool IsDefinedRewriteRule(Oid owningRel, const char *ruleName);++extern void SetRelationRuleStatus(Oid relationId, bool relHasRules);++extern Oid get_rewrite_oid(Oid relid, const char *rulename, bool missing_ok);+extern Oid get_rewrite_oid_without_relid(const char *rulename,+ Oid *relid, bool missing_ok);++#endif /* REWRITESUPPORT_H */
+ foreign/libpg_query/src/postgres/include/sha1.h view
@@ -0,0 +1,75 @@+/* contrib/pgcrypto/sha1.h */+/* $KAME: sha1.h,v 1.4 2000/02/22 14:01:18 itojun Exp $ */++/*+ * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.+ * All rights reserved.+ *+ * Redistribution and use in source and binary forms, with or without+ * modification, are permitted provided that the following conditions+ * are met:+ * 1. Redistributions of source code must retain the above copyright+ * notice, this list of conditions and the following disclaimer.+ * 2. Redistributions in binary form must reproduce the above copyright+ * notice, this list of conditions and the following disclaimer in the+ * documentation and/or other materials provided with the distribution.+ * 3. Neither the name of the project nor the names of its contributors+ * may be used to endorse or promote products derived from this software+ * without specific prior written permission.+ *+ * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE+ * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF+ * SUCH DAMAGE.+ */+/*+ * FIPS pub 180-1: Secure Hash Algorithm (SHA-1)+ * based on: http://www.itl.nist.gov/fipspubs/fip180-1.htm+ * implemented by Jun-ichiro itojun Itoh <itojun@itojun.org>+ */++#ifndef _NETINET6_SHA1_H_+#define _NETINET6_SHA1_H_++struct sha1_ctxt+{+ union+ {+ uint8 b8[20];+ uint32 b32[5];+ } h;+ union+ {+ uint8 b8[8];+ uint64 b64[1];+ } c;+ union+ {+ uint8 b8[64];+ uint32 b32[16];+ } m;+ uint8 count;+};++extern void sha1_init(struct sha1_ctxt *);+extern void sha1_pad(struct sha1_ctxt *);+extern void sha1_loop(struct sha1_ctxt *, const uint8 *, size_t);+extern void sha1_result(struct sha1_ctxt *, uint8 *);++/* compatibilty with other SHA1 source codes */+typedef struct sha1_ctxt SHA1_CTX;++#define SHA1Init(x) sha1_init((x))+#define SHA1Update(x, y, z) sha1_loop((x), (y), (z))+#define SHA1Final(x, y) sha1_result((y), (x))++#define SHA1_RESULTLEN (160/8)++#endif /* _NETINET6_SHA1_H_ */
+ foreign/libpg_query/src/postgres/include/storage/backendid.h view
@@ -0,0 +1,27 @@+/*-------------------------------------------------------------------------+ *+ * backendid.h+ * POSTGRES backend id communication definitions+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/storage/backendid.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef BACKENDID_H+#define BACKENDID_H++/* ----------------+ * -cim 8/17/90+ * ----------------+ */+typedef int BackendId; /* unique currently active backend identifier */++#define InvalidBackendId (-1)++extern PGDLLIMPORT BackendId MyBackendId; /* backend id of this backend */++#endif /* BACKENDID_H */
+ foreign/libpg_query/src/postgres/include/storage/barrier.h view
@@ -0,0 +1,23 @@+/*-------------------------------------------------------------------------+ *+ * barrier.h+ * Memory barrier operations.+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/storage/barrier.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef BARRIER_H+#define BARRIER_H++/*+ * This used to be a separate file, full of compiler/architecture+ * dependent defines, but it's not included in the atomics.h+ * infrastructure and just kept for backward compatibility.+ */+#include "port/atomics.h"++#endif /* BARRIER_H */
+ foreign/libpg_query/src/postgres/include/storage/block.h view
@@ -0,0 +1,121 @@+/*-------------------------------------------------------------------------+ *+ * block.h+ * POSTGRES disk block definitions.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/storage/block.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef BLOCK_H+#define BLOCK_H++/*+ * BlockNumber:+ *+ * each data file (heap or index) is divided into postgres disk blocks+ * (which may be thought of as the unit of i/o -- a postgres buffer+ * contains exactly one disk block). the blocks are numbered+ * sequentially, 0 to 0xFFFFFFFE.+ *+ * InvalidBlockNumber is the same thing as P_NEW in buf.h.+ *+ * the access methods, the buffer manager and the storage manager are+ * more or less the only pieces of code that should be accessing disk+ * blocks directly.+ */+typedef uint32 BlockNumber;++#define InvalidBlockNumber ((BlockNumber) 0xFFFFFFFF)++#define MaxBlockNumber ((BlockNumber) 0xFFFFFFFE)++/*+ * BlockId:+ *+ * this is a storage type for BlockNumber. in other words, this type+ * is used for on-disk structures (e.g., in HeapTupleData) whereas+ * BlockNumber is the type on which calculations are performed (e.g.,+ * in access method code).+ *+ * there doesn't appear to be any reason to have separate types except+ * for the fact that BlockIds can be SHORTALIGN'd (and therefore any+ * structures that contains them, such as ItemPointerData, can also be+ * SHORTALIGN'd). this is an important consideration for reducing the+ * space requirements of the line pointer (ItemIdData) array on each+ * page and the header of each heap or index tuple, so it doesn't seem+ * wise to change this without good reason.+ */+typedef struct BlockIdData+{+ uint16 bi_hi;+ uint16 bi_lo;+} BlockIdData;++typedef BlockIdData *BlockId; /* block identifier */++/* ----------------+ * support macros+ * ----------------+ */++/*+ * BlockNumberIsValid+ * True iff blockNumber is valid.+ */+#define BlockNumberIsValid(blockNumber) \+ ((bool) ((BlockNumber) (blockNumber) != InvalidBlockNumber))++/*+ * BlockIdIsValid+ * True iff the block identifier is valid.+ */+#define BlockIdIsValid(blockId) \+ ((bool) PointerIsValid(blockId))++/*+ * BlockIdSet+ * Sets a block identifier to the specified value.+ */+#define BlockIdSet(blockId, blockNumber) \+( \+ AssertMacro(PointerIsValid(blockId)), \+ (blockId)->bi_hi = (blockNumber) >> 16, \+ (blockId)->bi_lo = (blockNumber) & 0xffff \+)++/*+ * BlockIdCopy+ * Copy a block identifier.+ */+#define BlockIdCopy(toBlockId, fromBlockId) \+( \+ AssertMacro(PointerIsValid(toBlockId)), \+ AssertMacro(PointerIsValid(fromBlockId)), \+ (toBlockId)->bi_hi = (fromBlockId)->bi_hi, \+ (toBlockId)->bi_lo = (fromBlockId)->bi_lo \+)++/*+ * BlockIdEquals+ * Check for block number equality.+ */+#define BlockIdEquals(blockId1, blockId2) \+ ((blockId1)->bi_hi == (blockId2)->bi_hi && \+ (blockId1)->bi_lo == (blockId2)->bi_lo)++/*+ * BlockIdGetBlockNumber+ * Retrieve the block number from a block identifier.+ */+#define BlockIdGetBlockNumber(blockId) \+( \+ AssertMacro(BlockIdIsValid(blockId)), \+ (BlockNumber) (((blockId)->bi_hi << 16) | ((uint16) (blockId)->bi_lo)) \+)++#endif /* BLOCK_H */
+ foreign/libpg_query/src/postgres/include/storage/buf.h view
@@ -0,0 +1,46 @@+/*-------------------------------------------------------------------------+ *+ * buf.h+ * Basic buffer manager data types.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/storage/buf.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef BUF_H+#define BUF_H++/*+ * Buffer identifiers.+ *+ * Zero is invalid, positive is the index of a shared buffer (1..NBuffers),+ * negative is the index of a local buffer (-1 .. -NLocBuffer).+ */+typedef int Buffer;++#define InvalidBuffer 0++/*+ * BufferIsInvalid+ * True iff the buffer is invalid.+ */+#define BufferIsInvalid(buffer) ((buffer) == InvalidBuffer)++/*+ * BufferIsLocal+ * True iff the buffer is local (not visible to other backends).+ */+#define BufferIsLocal(buffer) ((buffer) < 0)++/*+ * Buffer access strategy objects.+ *+ * BufferAccessStrategyData is private to freelist.c+ */+typedef struct BufferAccessStrategyData *BufferAccessStrategy;++#endif /* BUF_H */
+ foreign/libpg_query/src/postgres/include/storage/bufmgr.h view
@@ -0,0 +1,213 @@+/*-------------------------------------------------------------------------+ *+ * bufmgr.h+ * POSTGRES buffer manager definitions.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/storage/bufmgr.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef BUFMGR_H+#define BUFMGR_H++#include "storage/block.h"+#include "storage/buf.h"+#include "storage/bufpage.h"+#include "storage/relfilenode.h"+#include "utils/relcache.h"++typedef void *Block;++/* Possible arguments for GetAccessStrategy() */+typedef enum BufferAccessStrategyType+{+ BAS_NORMAL, /* Normal random access */+ BAS_BULKREAD, /* Large read-only scan (hint bit updates are+ * ok) */+ BAS_BULKWRITE, /* Large multi-block write (e.g. COPY IN) */+ BAS_VACUUM /* VACUUM */+} BufferAccessStrategyType;++/* Possible modes for ReadBufferExtended() */+typedef enum+{+ RBM_NORMAL, /* Normal read */+ RBM_ZERO_AND_LOCK, /* Don't read from disk, caller will+ * initialize. Also locks the page. */+ RBM_ZERO_AND_CLEANUP_LOCK, /* Like RBM_ZERO_AND_LOCK, but locks the page+ * in "cleanup" mode */+ RBM_ZERO_ON_ERROR, /* Read, but return an all-zeros page on error */+ RBM_NORMAL_NO_LOG /* Don't log page as invalid during WAL+ * replay; otherwise same as RBM_NORMAL */+} ReadBufferMode;++/* in globals.c ... this duplicates miscadmin.h */+extern PGDLLIMPORT int NBuffers;++/* in bufmgr.c */+extern bool zero_damaged_pages;+extern int bgwriter_lru_maxpages;+extern double bgwriter_lru_multiplier;+extern bool track_io_timing;+extern int target_prefetch_pages;++/* in buf_init.c */+extern PGDLLIMPORT char *BufferBlocks;++/* in localbuf.c */+extern PGDLLIMPORT int NLocBuffer;+extern PGDLLIMPORT Block *LocalBufferBlockPointers;+extern PGDLLIMPORT int32 *LocalRefCount;++/* special block number for ReadBuffer() */+#define P_NEW InvalidBlockNumber /* grow the file to get a new page */++/*+ * Buffer content lock modes (mode argument for LockBuffer())+ */+#define BUFFER_LOCK_UNLOCK 0+#define BUFFER_LOCK_SHARE 1+#define BUFFER_LOCK_EXCLUSIVE 2++/*+ * These routines are beaten on quite heavily, hence the macroization.+ */++/*+ * BufferIsValid+ * True iff the given buffer number is valid (either as a shared+ * or local buffer).+ *+ * Note: For a long time this was defined the same as BufferIsPinned,+ * that is it would say False if you didn't hold a pin on the buffer.+ * I believe this was bogus and served only to mask logic errors.+ * Code should always know whether it has a buffer reference,+ * independently of the pin state.+ *+ * Note: For a further long time this was not quite the inverse of the+ * BufferIsInvalid() macro, in that it also did sanity checks to verify+ * that the buffer number was in range. Most likely, this macro was+ * originally intended only to be used in assertions, but its use has+ * since expanded quite a bit, and the overhead of making those checks+ * even in non-assert-enabled builds can be significant. Thus, we've+ * now demoted the range checks to assertions within the macro itself.+ */+#define BufferIsValid(bufnum) \+( \+ AssertMacro((bufnum) <= NBuffers && (bufnum) >= -NLocBuffer), \+ (bufnum) != InvalidBuffer \+)++/*+ * BufferGetBlock+ * Returns a reference to a disk page image associated with a buffer.+ *+ * Note:+ * Assumes buffer is valid.+ */+#define BufferGetBlock(buffer) \+( \+ AssertMacro(BufferIsValid(buffer)), \+ BufferIsLocal(buffer) ? \+ LocalBufferBlockPointers[-(buffer) - 1] \+ : \+ (Block) (BufferBlocks + ((Size) ((buffer) - 1)) * BLCKSZ) \+)++/*+ * BufferGetPageSize+ * Returns the page size within a buffer.+ *+ * Notes:+ * Assumes buffer is valid.+ *+ * The buffer can be a raw disk block and need not contain a valid+ * (formatted) disk page.+ */+/* XXX should dig out of buffer descriptor */+#define BufferGetPageSize(buffer) \+( \+ AssertMacro(BufferIsValid(buffer)), \+ (Size)BLCKSZ \+)++/*+ * BufferGetPage+ * Returns the page associated with a buffer.+ */+#define BufferGetPage(buffer) ((Page)BufferGetBlock(buffer))++/*+ * prototypes for functions in bufmgr.c+ */+extern void PrefetchBuffer(Relation reln, ForkNumber forkNum,+ BlockNumber blockNum);+extern Buffer ReadBuffer(Relation reln, BlockNumber blockNum);+extern Buffer ReadBufferExtended(Relation reln, ForkNumber forkNum,+ BlockNumber blockNum, ReadBufferMode mode,+ BufferAccessStrategy strategy);+extern Buffer ReadBufferWithoutRelcache(RelFileNode rnode,+ ForkNumber forkNum, BlockNumber blockNum,+ ReadBufferMode mode, BufferAccessStrategy strategy);+extern void ReleaseBuffer(Buffer buffer);+extern void UnlockReleaseBuffer(Buffer buffer);+extern void MarkBufferDirty(Buffer buffer);+extern void IncrBufferRefCount(Buffer buffer);+extern Buffer ReleaseAndReadBuffer(Buffer buffer, Relation relation,+ BlockNumber blockNum);++extern void InitBufferPool(void);+extern void InitBufferPoolAccess(void);+extern void InitBufferPoolBackend(void);+extern void AtEOXact_Buffers(bool isCommit);+extern void PrintBufferLeakWarning(Buffer buffer);+extern void CheckPointBuffers(int flags);+extern BlockNumber BufferGetBlockNumber(Buffer buffer);+extern BlockNumber RelationGetNumberOfBlocksInFork(Relation relation,+ ForkNumber forkNum);+extern void FlushOneBuffer(Buffer buffer);+extern void FlushRelationBuffers(Relation rel);+extern void FlushDatabaseBuffers(Oid dbid);+extern void DropRelFileNodeBuffers(RelFileNodeBackend rnode,+ ForkNumber forkNum, BlockNumber firstDelBlock);+extern void DropRelFileNodesAllBuffers(RelFileNodeBackend *rnodes, int nnodes);+extern void DropDatabaseBuffers(Oid dbid);++#define RelationGetNumberOfBlocks(reln) \+ RelationGetNumberOfBlocksInFork(reln, MAIN_FORKNUM)++extern bool BufferIsPermanent(Buffer buffer);+extern XLogRecPtr BufferGetLSNAtomic(Buffer buffer);++#ifdef NOT_USED+extern void PrintPinnedBufs(void);+#endif+extern Size BufferShmemSize(void);+extern void BufferGetTag(Buffer buffer, RelFileNode *rnode,+ ForkNumber *forknum, BlockNumber *blknum);++extern void MarkBufferDirtyHint(Buffer buffer, bool buffer_std);++extern void UnlockBuffers(void);+extern void LockBuffer(Buffer buffer, int mode);+extern bool ConditionalLockBuffer(Buffer buffer);+extern void LockBufferForCleanup(Buffer buffer);+extern bool ConditionalLockBufferForCleanup(Buffer buffer);+extern bool HoldingBufferPinThatDelaysRecovery(void);++extern void AbortBufferIO(void);++extern void BufmgrCommit(void);+extern bool BgBufferSync(void);++extern void AtProcExit_LocalBuffers(void);++/* in freelist.c */+extern BufferAccessStrategy GetAccessStrategy(BufferAccessStrategyType btype);+extern void FreeAccessStrategy(BufferAccessStrategy strategy);++#endif
+ foreign/libpg_query/src/postgres/include/storage/bufpage.h view
@@ -0,0 +1,413 @@+/*-------------------------------------------------------------------------+ *+ * bufpage.h+ * Standard POSTGRES buffer page definitions.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/storage/bufpage.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef BUFPAGE_H+#define BUFPAGE_H++#include "access/xlogdefs.h"+#include "storage/block.h"+#include "storage/item.h"+#include "storage/off.h"++/*+ * A postgres disk page is an abstraction layered on top of a postgres+ * disk block (which is simply a unit of i/o, see block.h).+ *+ * specifically, while a disk block can be unformatted, a postgres+ * disk page is always a slotted page of the form:+ *+ * +----------------+---------------------------------++ * | PageHeaderData | linp1 linp2 linp3 ... |+ * +-----------+----+---------------------------------++ * | ... linpN | |+ * +-----------+--------------------------------------++ * | ^ pd_lower |+ * | |+ * | v pd_upper |+ * +-------------+------------------------------------++ * | | tupleN ... |+ * +-------------+------------------+-----------------++ * | ... tuple3 tuple2 tuple1 | "special space" |+ * +--------------------------------+-----------------++ * ^ pd_special+ *+ * a page is full when nothing can be added between pd_lower and+ * pd_upper.+ *+ * all blocks written out by an access method must be disk pages.+ *+ * EXCEPTIONS:+ *+ * obviously, a page is not formatted before it is initialized by+ * a call to PageInit.+ *+ * NOTES:+ *+ * linp1..N form an ItemId array. ItemPointers point into this array+ * rather than pointing directly to a tuple. Note that OffsetNumbers+ * conventionally start at 1, not 0.+ *+ * tuple1..N are added "backwards" on the page. because a tuple's+ * ItemPointer points to its ItemId entry rather than its actual+ * byte-offset position, tuples can be physically shuffled on a page+ * whenever the need arises.+ *+ * AM-generic per-page information is kept in PageHeaderData.+ *+ * AM-specific per-page data (if any) is kept in the area marked "special+ * space"; each AM has an "opaque" structure defined somewhere that is+ * stored as the page trailer. an access method should always+ * initialize its pages with PageInit and then set its own opaque+ * fields.+ */++typedef Pointer Page;+++/*+ * location (byte offset) within a page.+ *+ * note that this is actually limited to 2^15 because we have limited+ * ItemIdData.lp_off and ItemIdData.lp_len to 15 bits (see itemid.h).+ */+typedef uint16 LocationIndex;+++/*+ * For historical reasons, the 64-bit LSN value is stored as two 32-bit+ * values.+ */+typedef struct+{+ uint32 xlogid; /* high bits */+ uint32 xrecoff; /* low bits */+} PageXLogRecPtr;++#define PageXLogRecPtrGet(val) \+ ((uint64) (val).xlogid << 32 | (val).xrecoff)+#define PageXLogRecPtrSet(ptr, lsn) \+ ((ptr).xlogid = (uint32) ((lsn) >> 32), (ptr).xrecoff = (uint32) (lsn))++/*+ * disk page organization+ *+ * space management information generic to any page+ *+ * pd_lsn - identifies xlog record for last change to this page.+ * pd_checksum - page checksum, if set.+ * pd_flags - flag bits.+ * pd_lower - offset to start of free space.+ * pd_upper - offset to end of free space.+ * pd_special - offset to start of special space.+ * pd_pagesize_version - size in bytes and page layout version number.+ * pd_prune_xid - oldest XID among potentially prunable tuples on page.+ *+ * The LSN is used by the buffer manager to enforce the basic rule of WAL:+ * "thou shalt write xlog before data". A dirty buffer cannot be dumped+ * to disk until xlog has been flushed at least as far as the page's LSN.+ *+ * pd_checksum stores the page checksum, if it has been set for this page;+ * zero is a valid value for a checksum. If a checksum is not in use then+ * we leave the field unset. This will typically mean the field is zero+ * though non-zero values may also be present if databases have been+ * pg_upgraded from releases prior to 9.3, when the same byte offset was+ * used to store the current timelineid when the page was last updated.+ * Note that there is no indication on a page as to whether the checksum+ * is valid or not, a deliberate design choice which avoids the problem+ * of relying on the page contents to decide whether to verify it. Hence+ * there are no flag bits relating to checksums.+ *+ * pd_prune_xid is a hint field that helps determine whether pruning will be+ * useful. It is currently unused in index pages.+ *+ * The page version number and page size are packed together into a single+ * uint16 field. This is for historical reasons: before PostgreSQL 7.3,+ * there was no concept of a page version number, and doing it this way+ * lets us pretend that pre-7.3 databases have page version number zero.+ * We constrain page sizes to be multiples of 256, leaving the low eight+ * bits available for a version number.+ *+ * Minimum possible page size is perhaps 64B to fit page header, opaque space+ * and a minimal tuple; of course, in reality you want it much bigger, so+ * the constraint on pagesize mod 256 is not an important restriction.+ * On the high end, we can only support pages up to 32KB because lp_off/lp_len+ * are 15 bits.+ */++typedef struct PageHeaderData+{+ /* XXX LSN is member of *any* block, not only page-organized ones */+ PageXLogRecPtr pd_lsn; /* LSN: next byte after last byte of xlog+ * record for last change to this page */+ uint16 pd_checksum; /* checksum */+ uint16 pd_flags; /* flag bits, see below */+ LocationIndex pd_lower; /* offset to start of free space */+ LocationIndex pd_upper; /* offset to end of free space */+ LocationIndex pd_special; /* offset to start of special space */+ uint16 pd_pagesize_version;+ TransactionId pd_prune_xid; /* oldest prunable XID, or zero if none */+ ItemIdData pd_linp[FLEXIBLE_ARRAY_MEMBER]; /* line pointer array */+} PageHeaderData;++typedef PageHeaderData *PageHeader;++/*+ * pd_flags contains the following flag bits. Undefined bits are initialized+ * to zero and may be used in the future.+ *+ * PD_HAS_FREE_LINES is set if there are any LP_UNUSED line pointers before+ * pd_lower. This should be considered a hint rather than the truth, since+ * changes to it are not WAL-logged.+ *+ * PD_PAGE_FULL is set if an UPDATE doesn't find enough free space in the+ * page for its new tuple version; this suggests that a prune is needed.+ * Again, this is just a hint.+ */+#define PD_HAS_FREE_LINES 0x0001 /* are there any unused line pointers? */+#define PD_PAGE_FULL 0x0002 /* not enough free space for new+ * tuple? */+#define PD_ALL_VISIBLE 0x0004 /* all tuples on page are visible to+ * everyone */++#define PD_VALID_FLAG_BITS 0x0007 /* OR of all valid pd_flags bits */++/*+ * Page layout version number 0 is for pre-7.3 Postgres releases.+ * Releases 7.3 and 7.4 use 1, denoting a new HeapTupleHeader layout.+ * Release 8.0 uses 2; it changed the HeapTupleHeader layout again.+ * Release 8.1 uses 3; it redefined HeapTupleHeader infomask bits.+ * Release 8.3 uses 4; it changed the HeapTupleHeader layout again, and+ * added the pd_flags field (by stealing some bits from pd_tli),+ * as well as adding the pd_prune_xid field (which enlarges the header).+ *+ * As of Release 9.3, the checksum version must also be considered when+ * handling pages.+ */+#define PG_PAGE_LAYOUT_VERSION 4+#define PG_DATA_CHECKSUM_VERSION 1++/* ----------------------------------------------------------------+ * page support macros+ * ----------------------------------------------------------------+ */++/*+ * PageIsValid+ * True iff page is valid.+ */+#define PageIsValid(page) PointerIsValid(page)++/*+ * line pointer(s) do not count as part of header+ */+#define SizeOfPageHeaderData (offsetof(PageHeaderData, pd_linp))++/*+ * PageIsEmpty+ * returns true iff no itemid has been allocated on the page+ */+#define PageIsEmpty(page) \+ (((PageHeader) (page))->pd_lower <= SizeOfPageHeaderData)++/*+ * PageIsNew+ * returns true iff page has not been initialized (by PageInit)+ */+#define PageIsNew(page) (((PageHeader) (page))->pd_upper == 0)++/*+ * PageGetItemId+ * Returns an item identifier of a page.+ */+#define PageGetItemId(page, offsetNumber) \+ ((ItemId) (&((PageHeader) (page))->pd_linp[(offsetNumber) - 1]))++/*+ * PageGetContents+ * To be used in case the page does not contain item pointers.+ *+ * Note: prior to 8.3 this was not guaranteed to yield a MAXALIGN'd result.+ * Now it is. Beware of old code that might think the offset to the contents+ * is just SizeOfPageHeaderData rather than MAXALIGN(SizeOfPageHeaderData).+ */+#define PageGetContents(page) \+ ((char *) (page) + MAXALIGN(SizeOfPageHeaderData))++/* ----------------+ * macros to access page size info+ * ----------------+ */++/*+ * PageSizeIsValid+ * True iff the page size is valid.+ */+#define PageSizeIsValid(pageSize) ((pageSize) == BLCKSZ)++/*+ * PageGetPageSize+ * Returns the page size of a page.+ *+ * this can only be called on a formatted page (unlike+ * BufferGetPageSize, which can be called on an unformatted page).+ * however, it can be called on a page that is not stored in a buffer.+ */+#define PageGetPageSize(page) \+ ((Size) (((PageHeader) (page))->pd_pagesize_version & (uint16) 0xFF00))++/*+ * PageGetPageLayoutVersion+ * Returns the page layout version of a page.+ */+#define PageGetPageLayoutVersion(page) \+ (((PageHeader) (page))->pd_pagesize_version & 0x00FF)++/*+ * PageSetPageSizeAndVersion+ * Sets the page size and page layout version number of a page.+ *+ * We could support setting these two values separately, but there's+ * no real need for it at the moment.+ */+#define PageSetPageSizeAndVersion(page, size, version) \+( \+ AssertMacro(((size) & 0xFF00) == (size)), \+ AssertMacro(((version) & 0x00FF) == (version)), \+ ((PageHeader) (page))->pd_pagesize_version = (size) | (version) \+)++/* ----------------+ * page special data macros+ * ----------------+ */+/*+ * PageGetSpecialSize+ * Returns size of special space on a page.+ */+#define PageGetSpecialSize(page) \+ ((uint16) (PageGetPageSize(page) - ((PageHeader)(page))->pd_special))++/*+ * PageGetSpecialPointer+ * Returns pointer to special space on a page.+ */+#define PageGetSpecialPointer(page) \+( \+ AssertMacro(PageIsValid(page)), \+ AssertMacro(((PageHeader) (page))->pd_special <= BLCKSZ), \+ AssertMacro(((PageHeader) (page))->pd_special >= SizeOfPageHeaderData), \+ (char *) ((char *) (page) + ((PageHeader) (page))->pd_special) \+)++/*+ * PageGetItem+ * Retrieves an item on the given page.+ *+ * Note:+ * This does not change the status of any of the resources passed.+ * The semantics may change in the future.+ */+#define PageGetItem(page, itemId) \+( \+ AssertMacro(PageIsValid(page)), \+ AssertMacro(ItemIdHasStorage(itemId)), \+ (Item)(((char *)(page)) + ItemIdGetOffset(itemId)) \+)++/*+ * PageGetMaxOffsetNumber+ * Returns the maximum offset number used by the given page.+ * Since offset numbers are 1-based, this is also the number+ * of items on the page.+ *+ * NOTE: if the page is not initialized (pd_lower == 0), we must+ * return zero to ensure sane behavior. Accept double evaluation+ * of the argument so that we can ensure this.+ */+#define PageGetMaxOffsetNumber(page) \+ (((PageHeader) (page))->pd_lower <= SizeOfPageHeaderData ? 0 : \+ ((((PageHeader) (page))->pd_lower - SizeOfPageHeaderData) \+ / sizeof(ItemIdData)))++/*+ * Additional macros for access to page headers. (Beware multiple evaluation+ * of the arguments!)+ */+#define PageGetLSN(page) \+ PageXLogRecPtrGet(((PageHeader) (page))->pd_lsn)+#define PageSetLSN(page, lsn) \+ PageXLogRecPtrSet(((PageHeader) (page))->pd_lsn, lsn)++#define PageHasFreeLinePointers(page) \+ (((PageHeader) (page))->pd_flags & PD_HAS_FREE_LINES)+#define PageSetHasFreeLinePointers(page) \+ (((PageHeader) (page))->pd_flags |= PD_HAS_FREE_LINES)+#define PageClearHasFreeLinePointers(page) \+ (((PageHeader) (page))->pd_flags &= ~PD_HAS_FREE_LINES)++#define PageIsFull(page) \+ (((PageHeader) (page))->pd_flags & PD_PAGE_FULL)+#define PageSetFull(page) \+ (((PageHeader) (page))->pd_flags |= PD_PAGE_FULL)+#define PageClearFull(page) \+ (((PageHeader) (page))->pd_flags &= ~PD_PAGE_FULL)++#define PageIsAllVisible(page) \+ (((PageHeader) (page))->pd_flags & PD_ALL_VISIBLE)+#define PageSetAllVisible(page) \+ (((PageHeader) (page))->pd_flags |= PD_ALL_VISIBLE)+#define PageClearAllVisible(page) \+ (((PageHeader) (page))->pd_flags &= ~PD_ALL_VISIBLE)++#define PageIsPrunable(page, oldestxmin) \+( \+ AssertMacro(TransactionIdIsNormal(oldestxmin)), \+ TransactionIdIsValid(((PageHeader) (page))->pd_prune_xid) && \+ TransactionIdPrecedes(((PageHeader) (page))->pd_prune_xid, oldestxmin) \+)+#define PageSetPrunable(page, xid) \+do { \+ Assert(TransactionIdIsNormal(xid)); \+ if (!TransactionIdIsValid(((PageHeader) (page))->pd_prune_xid) || \+ TransactionIdPrecedes(xid, ((PageHeader) (page))->pd_prune_xid)) \+ ((PageHeader) (page))->pd_prune_xid = (xid); \+} while (0)+#define PageClearPrunable(page) \+ (((PageHeader) (page))->pd_prune_xid = InvalidTransactionId)+++/* ----------------------------------------------------------------+ * extern declarations+ * ----------------------------------------------------------------+ */++extern void PageInit(Page page, Size pageSize, Size specialSize);+extern bool PageIsVerified(Page page, BlockNumber blkno);+extern OffsetNumber PageAddItem(Page page, Item item, Size size,+ OffsetNumber offsetNumber, bool overwrite, bool is_heap);+extern Page PageGetTempPage(Page page);+extern Page PageGetTempPageCopy(Page page);+extern Page PageGetTempPageCopySpecial(Page page);+extern void PageRestoreTempPage(Page tempPage, Page oldPage);+extern void PageRepairFragmentation(Page page);+extern Size PageGetFreeSpace(Page page);+extern Size PageGetExactFreeSpace(Page page);+extern Size PageGetHeapFreeSpace(Page page);+extern void PageIndexTupleDelete(Page page, OffsetNumber offset);+extern void PageIndexMultiDelete(Page page, OffsetNumber *itemnos, int nitems);+extern void PageIndexDeleteNoCompact(Page page, OffsetNumber *itemnos,+ int nitems);+extern char *PageSetChecksumCopy(Page page, BlockNumber blkno);+extern void PageSetChecksumInplace(Page page, BlockNumber blkno);++#endif /* BUFPAGE_H */
+ foreign/libpg_query/src/postgres/include/storage/dsm.h view
@@ -0,0 +1,59 @@+/*-------------------------------------------------------------------------+ *+ * dsm.h+ * manage dynamic shared memory segments+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/storage/dsm.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef DSM_H+#define DSM_H++#include "storage/dsm_impl.h"++typedef struct dsm_segment dsm_segment;++#define DSM_CREATE_NULL_IF_MAXSEGMENTS 0x0001++/* Startup and shutdown functions. */+struct PGShmemHeader; /* avoid including pg_shmem.h */+extern void dsm_cleanup_using_control_segment(dsm_handle old_control_handle);+extern void dsm_postmaster_startup(struct PGShmemHeader *);+extern void dsm_backend_shutdown(void);+extern void dsm_detach_all(void);++#ifdef EXEC_BACKEND+extern void dsm_set_control_handle(dsm_handle h);+#endif++/* Functions that create, update, or remove mappings. */+extern dsm_segment *dsm_create(Size size, int flags);+extern dsm_segment *dsm_attach(dsm_handle h);+extern void *dsm_resize(dsm_segment *seg, Size size);+extern void *dsm_remap(dsm_segment *seg);+extern void dsm_detach(dsm_segment *seg);++/* Resource management functions. */+extern void dsm_pin_mapping(dsm_segment *seg);+extern void dsm_unpin_mapping(dsm_segment *seg);+extern void dsm_pin_segment(dsm_segment *seg);+extern dsm_segment *dsm_find_mapping(dsm_handle h);++/* Informational functions. */+extern void *dsm_segment_address(dsm_segment *seg);+extern Size dsm_segment_map_length(dsm_segment *seg);+extern dsm_handle dsm_segment_handle(dsm_segment *seg);++/* Cleanup hooks. */+typedef void (*on_dsm_detach_callback) (dsm_segment *, Datum arg);+extern void on_dsm_detach(dsm_segment *seg,+ on_dsm_detach_callback function, Datum arg);+extern void cancel_on_dsm_detach(dsm_segment *seg,+ on_dsm_detach_callback function, Datum arg);+extern void reset_on_dsm_detach(void);++#endif /* DSM_H */
+ foreign/libpg_query/src/postgres/include/storage/dsm_impl.h view
@@ -0,0 +1,78 @@+/*-------------------------------------------------------------------------+ *+ * dsm_impl.h+ * low-level dynamic shared memory primitives+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/storage/dsm_impl.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef DSM_IMPL_H+#define DSM_IMPL_H++/* Dynamic shared memory implementations. */+#define DSM_IMPL_NONE 0+#define DSM_IMPL_POSIX 1+#define DSM_IMPL_SYSV 2+#define DSM_IMPL_WINDOWS 3+#define DSM_IMPL_MMAP 4++/*+ * Determine which dynamic shared memory implementations will be supported+ * on this platform, and which one will be the default.+ */+#ifdef WIN32+#define USE_DSM_WINDOWS+#define DEFAULT_DYNAMIC_SHARED_MEMORY_TYPE DSM_IMPL_WINDOWS+#else+#ifdef HAVE_SHM_OPEN+#define USE_DSM_POSIX+#define DEFAULT_DYNAMIC_SHARED_MEMORY_TYPE DSM_IMPL_POSIX+#endif+#define USE_DSM_SYSV+#ifndef DEFAULT_DYNAMIC_SHARED_MEMORY_TYPE+#define DEFAULT_DYNAMIC_SHARED_MEMORY_TYPE DSM_IMPL_SYSV+#endif+#define USE_DSM_MMAP+#endif++/* GUC. */+extern int dynamic_shared_memory_type;++/*+ * Directory for on-disk state.+ *+ * This is used by all implementations for crash recovery and by the mmap+ * implementation for storage.+ */+#define PG_DYNSHMEM_DIR "pg_dynshmem"+#define PG_DYNSHMEM_MMAP_FILE_PREFIX "mmap."++/* A "name" for a dynamic shared memory segment. */+typedef uint32 dsm_handle;++/* All the shared-memory operations we know about. */+typedef enum+{+ DSM_OP_CREATE,+ DSM_OP_ATTACH,+ DSM_OP_DETACH,+ DSM_OP_RESIZE,+ DSM_OP_DESTROY+} dsm_op;++/* Create, attach to, detach from, resize, or destroy a segment. */+extern bool dsm_impl_op(dsm_op op, dsm_handle handle, Size request_size,+ void **impl_private, void **mapped_address, Size *mapped_size,+ int elevel);++/* Some implementations cannot resize segments. Can this one? */+extern bool dsm_impl_can_resize(void);++/* Implementation-dependent actions required to keep segment until shudown. */+extern void dsm_impl_pin_segment(dsm_handle handle, void *impl_private);++#endif /* DSM_IMPL_H */
+ foreign/libpg_query/src/postgres/include/storage/fd.h view
@@ -0,0 +1,125 @@+/*-------------------------------------------------------------------------+ *+ * fd.h+ * Virtual file descriptor definitions.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/storage/fd.h+ *+ *-------------------------------------------------------------------------+ */++/*+ * calls:+ *+ * File {Close, Read, Write, Seek, Tell, Sync}+ * {Path Name Open, Allocate, Free} File+ *+ * These are NOT JUST RENAMINGS OF THE UNIX ROUTINES.+ * Use them for all file activity...+ *+ * File fd;+ * fd = PathNameOpenFile("foo", O_RDONLY, 0600);+ *+ * AllocateFile();+ * FreeFile();+ *+ * Use AllocateFile, not fopen, if you need a stdio file (FILE*); then+ * use FreeFile, not fclose, to close it. AVOID using stdio for files+ * that you intend to hold open for any length of time, since there is+ * no way for them to share kernel file descriptors with other files.+ *+ * Likewise, use AllocateDir/FreeDir, not opendir/closedir, to allocate+ * open directories (DIR*), and OpenTransientFile/CloseTransient File for an+ * unbuffered file descriptor.+ */+#ifndef FD_H+#define FD_H++#include <dirent.h>+++/*+ * FileSeek uses the standard UNIX lseek(2) flags.+ */++typedef char *FileName;++typedef int File;+++/* GUC parameter */+extern int max_files_per_process;++/*+ * This is private to fd.c, but exported for save/restore_backend_variables()+ */+extern int max_safe_fds;+++/*+ * prototypes for functions in fd.c+ */++/* Operations on virtual Files --- equivalent to Unix kernel file ops */+extern File PathNameOpenFile(FileName fileName, int fileFlags, int fileMode);+extern File OpenTemporaryFile(bool interXact);+extern void FileClose(File file);+extern int FilePrefetch(File file, off_t offset, int amount);+extern int FileRead(File file, char *buffer, int amount);+extern int FileWrite(File file, char *buffer, int amount);+extern int FileSync(File file);+extern off_t FileSeek(File file, off_t offset, int whence);+extern int FileTruncate(File file, off_t offset);+extern char *FilePathName(File file);++/* Operations that allow use of regular stdio --- USE WITH CAUTION */+extern FILE *AllocateFile(const char *name, const char *mode);+extern int FreeFile(FILE *file);++/* Operations that allow use of pipe streams (popen/pclose) */+extern FILE *OpenPipeStream(const char *command, const char *mode);+extern int ClosePipeStream(FILE *file);++/* Operations to allow use of the <dirent.h> library routines */+extern DIR *AllocateDir(const char *dirname);+extern struct dirent *ReadDir(DIR *dir, const char *dirname);+extern int FreeDir(DIR *dir);++/* Operations to allow use of a plain kernel FD, with automatic cleanup */+extern int OpenTransientFile(FileName fileName, int fileFlags, int fileMode);+extern int CloseTransientFile(int fd);++/* If you've really really gotta have a plain kernel FD, use this */+extern int BasicOpenFile(FileName fileName, int fileFlags, int fileMode);++/* Miscellaneous support routines */+extern void InitFileAccess(void);+extern void set_max_safe_fds(void);+extern void closeAllVfds(void);+extern void SetTempTablespaces(Oid *tableSpaces, int numSpaces);+extern bool TempTablespacesAreSet(void);+extern Oid GetNextTempTableSpace(void);+extern void AtEOXact_Files(void);+extern void AtEOSubXact_Files(bool isCommit, SubTransactionId mySubid,+ SubTransactionId parentSubid);+extern void RemovePgTempFiles(void);++extern int pg_fsync(int fd);+extern int pg_fsync_no_writethrough(int fd);+extern int pg_fsync_writethrough(int fd);+extern int pg_fdatasync(int fd);+extern int pg_flush_data(int fd, off_t offset, off_t amount);+extern void fsync_fname(const char *fname, bool isdir);+extern int durable_rename(const char *oldfile, const char *newfile, int loglevel);+extern int durable_link_or_rename(const char *oldfile, const char *newfile, int loglevel);+extern void SyncDataDirectory(void);++/* Filename components for OpenTemporaryFile */+#define PG_TEMP_FILES_DIR "pgsql_tmp"+#define PG_TEMP_FILE_PREFIX "pgsql_tmp"++#endif /* FD_H */
+ foreign/libpg_query/src/postgres/include/storage/ipc.h view
@@ -0,0 +1,80 @@+/*-------------------------------------------------------------------------+ *+ * ipc.h+ * POSTGRES inter-process communication definitions.+ *+ * This file is misnamed, as it no longer has much of anything directly+ * to do with IPC. The functionality here is concerned with managing+ * exit-time cleanup for either a postmaster or a backend.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/storage/ipc.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef IPC_H+#define IPC_H++typedef void (*pg_on_exit_callback) (int code, Datum arg);+typedef void (*shmem_startup_hook_type) (void);++/*----------+ * API for handling cleanup that must occur during either ereport(ERROR)+ * or ereport(FATAL) exits from a block of code. (Typical examples are+ * undoing transient changes to shared-memory state.)+ *+ * PG_ENSURE_ERROR_CLEANUP(cleanup_function, arg);+ * {+ * ... code that might throw ereport(ERROR) or ereport(FATAL) ...+ * }+ * PG_END_ENSURE_ERROR_CLEANUP(cleanup_function, arg);+ *+ * where the cleanup code is in a function declared per pg_on_exit_callback.+ * The Datum value "arg" can carry any information the cleanup function+ * needs.+ *+ * This construct ensures that cleanup_function() will be called during+ * either ERROR or FATAL exits. It will not be called on successful+ * exit from the controlled code. (If you want it to happen then too,+ * call the function yourself from just after the construct.)+ *+ * Note: the macro arguments are multiply evaluated, so avoid side-effects.+ *----------+ */+#define PG_ENSURE_ERROR_CLEANUP(cleanup_function, arg) \+ do { \+ before_shmem_exit(cleanup_function, arg); \+ PG_TRY()++#define PG_END_ENSURE_ERROR_CLEANUP(cleanup_function, arg) \+ cancel_before_shmem_exit(cleanup_function, arg); \+ PG_CATCH(); \+ { \+ cancel_before_shmem_exit(cleanup_function, arg); \+ cleanup_function (0, arg); \+ PG_RE_THROW(); \+ } \+ PG_END_TRY(); \+ } while (0)+++/* ipc.c */+extern PGDLLIMPORT __thread bool proc_exit_inprogress;++extern void proc_exit(int code) pg_attribute_noreturn();+extern void shmem_exit(int code);+extern void on_proc_exit(pg_on_exit_callback function, Datum arg);+extern void on_shmem_exit(pg_on_exit_callback function, Datum arg);+extern void before_shmem_exit(pg_on_exit_callback function, Datum arg);+extern void cancel_before_shmem_exit(pg_on_exit_callback function, Datum arg);+extern void on_exit_reset(void);++/* ipci.c */+extern PGDLLIMPORT shmem_startup_hook_type shmem_startup_hook;++extern void CreateSharedMemoryAndSemaphores(bool makePrivate, int port);++#endif /* IPC_H */
+ foreign/libpg_query/src/postgres/include/storage/item.h view
@@ -0,0 +1,19 @@+/*-------------------------------------------------------------------------+ *+ * item.h+ * POSTGRES disk item definitions.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/storage/item.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef ITEM_H+#define ITEM_H++typedef Pointer Item;++#endif /* ITEM_H */
+ foreign/libpg_query/src/postgres/include/storage/itemid.h view
@@ -0,0 +1,183 @@+/*-------------------------------------------------------------------------+ *+ * itemid.h+ * Standard POSTGRES buffer page item identifier definitions.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/storage/itemid.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef ITEMID_H+#define ITEMID_H++/*+ * An item pointer (also called line pointer) on a buffer page+ *+ * In some cases an item pointer is "in use" but does not have any associated+ * storage on the page. By convention, lp_len == 0 in every item pointer+ * that does not have storage, independently of its lp_flags state.+ */+typedef struct ItemIdData+{+ unsigned lp_off:15, /* offset to tuple (from start of page) */+ lp_flags:2, /* state of item pointer, see below */+ lp_len:15; /* byte length of tuple */+} ItemIdData;++typedef ItemIdData *ItemId;++/*+ * lp_flags has these possible states. An UNUSED line pointer is available+ * for immediate re-use, the other states are not.+ */+#define LP_UNUSED 0 /* unused (should always have lp_len=0) */+#define LP_NORMAL 1 /* used (should always have lp_len>0) */+#define LP_REDIRECT 2 /* HOT redirect (should have lp_len=0) */+#define LP_DEAD 3 /* dead, may or may not have storage */++/*+ * Item offsets and lengths are represented by these types when+ * they're not actually stored in an ItemIdData.+ */+typedef uint16 ItemOffset;+typedef uint16 ItemLength;+++/* ----------------+ * support macros+ * ----------------+ */++/*+ * ItemIdGetLength+ */+#define ItemIdGetLength(itemId) \+ ((itemId)->lp_len)++/*+ * ItemIdGetOffset+ */+#define ItemIdGetOffset(itemId) \+ ((itemId)->lp_off)++/*+ * ItemIdGetFlags+ */+#define ItemIdGetFlags(itemId) \+ ((itemId)->lp_flags)++/*+ * ItemIdGetRedirect+ * In a REDIRECT pointer, lp_off holds the link to the next item pointer+ */+#define ItemIdGetRedirect(itemId) \+ ((itemId)->lp_off)++/*+ * ItemIdIsValid+ * True iff item identifier is valid.+ * This is a pretty weak test, probably useful only in Asserts.+ */+#define ItemIdIsValid(itemId) PointerIsValid(itemId)++/*+ * ItemIdIsUsed+ * True iff item identifier is in use.+ */+#define ItemIdIsUsed(itemId) \+ ((itemId)->lp_flags != LP_UNUSED)++/*+ * ItemIdIsNormal+ * True iff item identifier is in state NORMAL.+ */+#define ItemIdIsNormal(itemId) \+ ((itemId)->lp_flags == LP_NORMAL)++/*+ * ItemIdIsRedirected+ * True iff item identifier is in state REDIRECT.+ */+#define ItemIdIsRedirected(itemId) \+ ((itemId)->lp_flags == LP_REDIRECT)++/*+ * ItemIdIsDead+ * True iff item identifier is in state DEAD.+ */+#define ItemIdIsDead(itemId) \+ ((itemId)->lp_flags == LP_DEAD)++/*+ * ItemIdHasStorage+ * True iff item identifier has associated storage.+ */+#define ItemIdHasStorage(itemId) \+ ((itemId)->lp_len != 0)++/*+ * ItemIdSetUnused+ * Set the item identifier to be UNUSED, with no storage.+ * Beware of multiple evaluations of itemId!+ */+#define ItemIdSetUnused(itemId) \+( \+ (itemId)->lp_flags = LP_UNUSED, \+ (itemId)->lp_off = 0, \+ (itemId)->lp_len = 0 \+)++/*+ * ItemIdSetNormal+ * Set the item identifier to be NORMAL, with the specified storage.+ * Beware of multiple evaluations of itemId!+ */+#define ItemIdSetNormal(itemId, off, len) \+( \+ (itemId)->lp_flags = LP_NORMAL, \+ (itemId)->lp_off = (off), \+ (itemId)->lp_len = (len) \+)++/*+ * ItemIdSetRedirect+ * Set the item identifier to be REDIRECT, with the specified link.+ * Beware of multiple evaluations of itemId!+ */+#define ItemIdSetRedirect(itemId, link) \+( \+ (itemId)->lp_flags = LP_REDIRECT, \+ (itemId)->lp_off = (link), \+ (itemId)->lp_len = 0 \+)++/*+ * ItemIdSetDead+ * Set the item identifier to be DEAD, with no storage.+ * Beware of multiple evaluations of itemId!+ */+#define ItemIdSetDead(itemId) \+( \+ (itemId)->lp_flags = LP_DEAD, \+ (itemId)->lp_off = 0, \+ (itemId)->lp_len = 0 \+)++/*+ * ItemIdMarkDead+ * Set the item identifier to be DEAD, keeping its existing storage.+ *+ * Note: in indexes, this is used as if it were a hint-bit mechanism;+ * we trust that multiple processors can do this in parallel and get+ * the same result.+ */+#define ItemIdMarkDead(itemId) \+( \+ (itemId)->lp_flags = LP_DEAD \+)++#endif /* ITEMID_H */
+ foreign/libpg_query/src/postgres/include/storage/itemptr.h view
@@ -0,0 +1,150 @@+/*-------------------------------------------------------------------------+ *+ * itemptr.h+ * POSTGRES disk item pointer definitions.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/storage/itemptr.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef ITEMPTR_H+#define ITEMPTR_H++#include "storage/block.h"+#include "storage/off.h"++/*+ * ItemPointer:+ *+ * This is a pointer to an item within a disk page of a known file+ * (for example, a cross-link from an index to its parent table).+ * blkid tells us which block, posid tells us which entry in the linp+ * (ItemIdData) array we want.+ *+ * Note: because there is an item pointer in each tuple header and index+ * tuple header on disk, it's very important not to waste space with+ * structure padding bytes. The struct is designed to be six bytes long+ * (it contains three int16 fields) but a few compilers will pad it to+ * eight bytes unless coerced. We apply appropriate persuasion where+ * possible, and to cope with unpersuadable compilers, we try to use+ * "SizeOfIptrData" rather than "sizeof(ItemPointerData)" when computing+ * on-disk sizes.+ */+typedef struct ItemPointerData+{+ BlockIdData ip_blkid;+ OffsetNumber ip_posid;+}+/* If compiler understands packed and aligned pragmas, use those */+#if defined(pg_attribute_packed) && defined(pg_attribute_aligned)+pg_attribute_packed()+pg_attribute_aligned(2)+#endif+ItemPointerData;++#define SizeOfIptrData \+ (offsetof(ItemPointerData, ip_posid) + sizeof(OffsetNumber))++typedef ItemPointerData *ItemPointer;++/* ----------------+ * support macros+ * ----------------+ */++/*+ * ItemPointerIsValid+ * True iff the disk item pointer is not NULL.+ */+#define ItemPointerIsValid(pointer) \+ ((bool) (PointerIsValid(pointer) && ((pointer)->ip_posid != 0)))++/*+ * ItemPointerGetBlockNumber+ * Returns the block number of a disk item pointer.+ */+#define ItemPointerGetBlockNumber(pointer) \+( \+ AssertMacro(ItemPointerIsValid(pointer)), \+ BlockIdGetBlockNumber(&(pointer)->ip_blkid) \+)++/*+ * ItemPointerGetOffsetNumber+ * Returns the offset number of a disk item pointer.+ */+#define ItemPointerGetOffsetNumber(pointer) \+( \+ AssertMacro(ItemPointerIsValid(pointer)), \+ (pointer)->ip_posid \+)++/*+ * ItemPointerSet+ * Sets a disk item pointer to the specified block and offset.+ */+#define ItemPointerSet(pointer, blockNumber, offNum) \+( \+ AssertMacro(PointerIsValid(pointer)), \+ BlockIdSet(&((pointer)->ip_blkid), blockNumber), \+ (pointer)->ip_posid = offNum \+)++/*+ * ItemPointerSetBlockNumber+ * Sets a disk item pointer to the specified block.+ */+#define ItemPointerSetBlockNumber(pointer, blockNumber) \+( \+ AssertMacro(PointerIsValid(pointer)), \+ BlockIdSet(&((pointer)->ip_blkid), blockNumber) \+)++/*+ * ItemPointerSetOffsetNumber+ * Sets a disk item pointer to the specified offset.+ */+#define ItemPointerSetOffsetNumber(pointer, offsetNumber) \+( \+ AssertMacro(PointerIsValid(pointer)), \+ (pointer)->ip_posid = (offsetNumber) \+)++/*+ * ItemPointerCopy+ * Copies the contents of one disk item pointer to another.+ *+ * Should there ever be padding in an ItemPointer this would need to be handled+ * differently as it's used as hash key.+ */+#define ItemPointerCopy(fromPointer, toPointer) \+( \+ AssertMacro(PointerIsValid(toPointer)), \+ AssertMacro(PointerIsValid(fromPointer)), \+ *(toPointer) = *(fromPointer) \+)++/*+ * ItemPointerSetInvalid+ * Sets a disk item pointer to be invalid.+ */+#define ItemPointerSetInvalid(pointer) \+( \+ AssertMacro(PointerIsValid(pointer)), \+ BlockIdSet(&((pointer)->ip_blkid), InvalidBlockNumber), \+ (pointer)->ip_posid = InvalidOffsetNumber \+)++/* ----------------+ * externs+ * ----------------+ */++extern bool ItemPointerEquals(ItemPointer pointer1, ItemPointer pointer2);+extern int32 ItemPointerCompare(ItemPointer arg1, ItemPointer arg2);++#endif /* ITEMPTR_H */
+ foreign/libpg_query/src/postgres/include/storage/latch.h view
@@ -0,0 +1,132 @@+/*-------------------------------------------------------------------------+ *+ * latch.h+ * Routines for interprocess latches+ *+ * A latch is a boolean variable, with operations that let processes sleep+ * until it is set. A latch can be set from another process, or a signal+ * handler within the same process.+ *+ * The latch interface is a reliable replacement for the common pattern of+ * using pg_usleep() or select() to wait until a signal arrives, where the+ * signal handler sets a flag variable. Because on some platforms an+ * incoming signal doesn't interrupt sleep, and even on platforms where it+ * does there is a race condition if the signal arrives just before+ * entering the sleep, the common pattern must periodically wake up and+ * poll the flag variable. The pselect() system call was invented to solve+ * this problem, but it is not portable enough. Latches are designed to+ * overcome these limitations, allowing you to sleep without polling and+ * ensuring quick response to signals from other processes.+ *+ * There are two kinds of latches: local and shared. A local latch is+ * initialized by InitLatch, and can only be set from the same process.+ * A local latch can be used to wait for a signal to arrive, by calling+ * SetLatch in the signal handler. A shared latch resides in shared memory,+ * and must be initialized at postmaster startup by InitSharedLatch. Before+ * a shared latch can be waited on, it must be associated with a process+ * with OwnLatch. Only the process owning the latch can wait on it, but any+ * process can set it.+ *+ * There are three basic operations on a latch:+ *+ * SetLatch - Sets the latch+ * ResetLatch - Clears the latch, allowing it to be set again+ * WaitLatch - Waits for the latch to become set+ *+ * WaitLatch includes a provision for timeouts (which should be avoided+ * when possible, as they incur extra overhead) and a provision for+ * postmaster child processes to wake up immediately on postmaster death.+ * See unix_latch.c for detailed specifications for the exported functions.+ *+ * The correct pattern to wait for event(s) is:+ *+ * for (;;)+ * {+ * ResetLatch();+ * if (work to do)+ * Do Stuff();+ * WaitLatch();+ * }+ *+ * It's important to reset the latch *before* checking if there's work to+ * do. Otherwise, if someone sets the latch between the check and the+ * ResetLatch call, you will miss it and Wait will incorrectly block.+ *+ * To wake up the waiter, you must first set a global flag or something+ * else that the wait loop tests in the "if (work to do)" part, and call+ * SetLatch *after* that. SetLatch is designed to return quickly if the+ * latch is already set.+ *+ * On some platforms, signals will not interrupt the latch wait primitive+ * by themselves. Therefore, it is critical that any signal handler that+ * is meant to terminate a WaitLatch wait calls SetLatch.+ *+ * Note that use of the process latch (PGPROC.procLatch) is generally better+ * than an ad-hoc shared latch for signaling auxiliary processes. This is+ * because generic signal handlers will call SetLatch on the process latch+ * only, so using any latch other than the process latch effectively precludes+ * use of any generic handler.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/storage/latch.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef LATCH_H+#define LATCH_H++#include <signal.h>++/*+ * Latch structure should be treated as opaque and only accessed through+ * the public functions. It is defined here to allow embedding Latches as+ * part of bigger structs.+ */+typedef struct Latch+{+ sig_atomic_t is_set;+ bool is_shared;+ int owner_pid;+#ifdef WIN32+ HANDLE event;+#endif+} Latch;++/* Bitmasks for events that may wake-up WaitLatch() clients */+#define WL_LATCH_SET (1 << 0)+#define WL_SOCKET_READABLE (1 << 1)+#define WL_SOCKET_WRITEABLE (1 << 2)+#define WL_TIMEOUT (1 << 3)+#define WL_POSTMASTER_DEATH (1 << 4)++/*+ * prototypes for functions in latch.c+ */+extern void InitializeLatchSupport(void);+extern void InitLatch(volatile Latch *latch);+extern void InitSharedLatch(volatile Latch *latch);+extern void OwnLatch(volatile Latch *latch);+extern void DisownLatch(volatile Latch *latch);+extern int WaitLatch(volatile Latch *latch, int wakeEvents, long timeout);+extern int WaitLatchOrSocket(volatile Latch *latch, int wakeEvents,+ pgsocket sock, long timeout);+extern void SetLatch(volatile Latch *latch);+extern void ResetLatch(volatile Latch *latch);++/* beware of memory ordering issues if you use this macro! */+#define TestLatch(latch) (((volatile Latch *) (latch))->is_set)++/*+ * Unix implementation uses SIGUSR1 for inter-process signaling.+ * Win32 doesn't need this.+ */+#ifndef WIN32+extern void latch_sigusr1_handler(void);+#else+#define latch_sigusr1_handler() ((void) 0)+#endif++#endif /* LATCH_H */
+ foreign/libpg_query/src/postgres/include/storage/lmgr.h view
@@ -0,0 +1,104 @@+/*-------------------------------------------------------------------------+ *+ * lmgr.h+ * POSTGRES lock manager definitions.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/storage/lmgr.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef LMGR_H+#define LMGR_H++#include "lib/stringinfo.h"+#include "storage/itemptr.h"+#include "storage/lock.h"+#include "utils/rel.h"+++/* XactLockTableWait operations */+typedef enum XLTW_Oper+{+ XLTW_None,+ XLTW_Update,+ XLTW_Delete,+ XLTW_Lock,+ XLTW_LockUpdated,+ XLTW_InsertIndex,+ XLTW_InsertIndexUnique,+ XLTW_FetchUpdated,+ XLTW_RecheckExclusionConstr+} XLTW_Oper;++extern void RelationInitLockInfo(Relation relation);++/* Lock a relation */+extern void LockRelationOid(Oid relid, LOCKMODE lockmode);+extern bool ConditionalLockRelationOid(Oid relid, LOCKMODE lockmode);+extern void UnlockRelationId(LockRelId *relid, LOCKMODE lockmode);+extern void UnlockRelationOid(Oid relid, LOCKMODE lockmode);++extern void LockRelation(Relation relation, LOCKMODE lockmode);+extern bool ConditionalLockRelation(Relation relation, LOCKMODE lockmode);+extern void UnlockRelation(Relation relation, LOCKMODE lockmode);+extern bool LockHasWaitersRelation(Relation relation, LOCKMODE lockmode);++extern void LockRelationIdForSession(LockRelId *relid, LOCKMODE lockmode);+extern void UnlockRelationIdForSession(LockRelId *relid, LOCKMODE lockmode);++/* Lock a relation for extension */+extern void LockRelationForExtension(Relation relation, LOCKMODE lockmode);+extern void UnlockRelationForExtension(Relation relation, LOCKMODE lockmode);++/* Lock a page (currently only used within indexes) */+extern void LockPage(Relation relation, BlockNumber blkno, LOCKMODE lockmode);+extern bool ConditionalLockPage(Relation relation, BlockNumber blkno, LOCKMODE lockmode);+extern void UnlockPage(Relation relation, BlockNumber blkno, LOCKMODE lockmode);++/* Lock a tuple (see heap_lock_tuple before assuming you understand this) */+extern void LockTuple(Relation relation, ItemPointer tid, LOCKMODE lockmode);+extern bool ConditionalLockTuple(Relation relation, ItemPointer tid,+ LOCKMODE lockmode);+extern void UnlockTuple(Relation relation, ItemPointer tid, LOCKMODE lockmode);++/* Lock an XID (used to wait for a transaction to finish) */+extern void XactLockTableInsert(TransactionId xid);+extern void XactLockTableDelete(TransactionId xid);+extern void XactLockTableWait(TransactionId xid, Relation rel,+ ItemPointer ctid, XLTW_Oper oper);+extern bool ConditionalXactLockTableWait(TransactionId xid);++/* Lock VXIDs, specified by conflicting locktags */+extern void WaitForLockers(LOCKTAG heaplocktag, LOCKMODE lockmode);+extern void WaitForLockersMultiple(List *locktags, LOCKMODE lockmode);++/* Lock an XID for tuple insertion (used to wait for an insertion to finish) */+extern uint32 SpeculativeInsertionLockAcquire(TransactionId xid);+extern void SpeculativeInsertionLockRelease(TransactionId xid);+extern void SpeculativeInsertionWait(TransactionId xid, uint32 token);++/* Lock a general object (other than a relation) of the current database */+extern void LockDatabaseObject(Oid classid, Oid objid, uint16 objsubid,+ LOCKMODE lockmode);+extern void UnlockDatabaseObject(Oid classid, Oid objid, uint16 objsubid,+ LOCKMODE lockmode);++/* Lock a shared-across-databases object (other than a relation) */+extern void LockSharedObject(Oid classid, Oid objid, uint16 objsubid,+ LOCKMODE lockmode);+extern void UnlockSharedObject(Oid classid, Oid objid, uint16 objsubid,+ LOCKMODE lockmode);++extern void LockSharedObjectForSession(Oid classid, Oid objid, uint16 objsubid,+ LOCKMODE lockmode);+extern void UnlockSharedObjectForSession(Oid classid, Oid objid, uint16 objsubid,+ LOCKMODE lockmode);++/* Describe a locktag for error messages */+extern void DescribeLockTag(StringInfo buf, const LOCKTAG *tag);++#endif /* LMGR_H */
+ foreign/libpg_query/src/postgres/include/storage/lock.h view
@@ -0,0 +1,577 @@+/*-------------------------------------------------------------------------+ *+ * lock.h+ * POSTGRES low-level lock mechanism+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/storage/lock.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef LOCK_H_+#define LOCK_H_++#include "storage/backendid.h"+#include "storage/lwlock.h"+#include "storage/shmem.h"+++/* struct PGPROC is declared in proc.h, but must forward-reference it */+typedef struct PGPROC PGPROC;++typedef struct PROC_QUEUE+{+ SHM_QUEUE links; /* head of list of PGPROC objects */+ int size; /* number of entries in list */+} PROC_QUEUE;++/* GUC variables */+extern int max_locks_per_xact;++#ifdef LOCK_DEBUG+extern int Trace_lock_oidmin;+extern bool Trace_locks;+extern bool Trace_userlocks;+extern int Trace_lock_table;+extern bool Debug_deadlocks;+#endif /* LOCK_DEBUG */+++/*+ * Top-level transactions are identified by VirtualTransactionIDs comprising+ * the BackendId of the backend running the xact, plus a locally-assigned+ * LocalTransactionId. These are guaranteed unique over the short term,+ * but will be reused after a database restart; hence they should never+ * be stored on disk.+ *+ * Note that struct VirtualTransactionId can not be assumed to be atomically+ * assignable as a whole. However, type LocalTransactionId is assumed to+ * be atomically assignable, and the backend ID doesn't change often enough+ * to be a problem, so we can fetch or assign the two fields separately.+ * We deliberately refrain from using the struct within PGPROC, to prevent+ * coding errors from trying to use struct assignment with it; instead use+ * GET_VXID_FROM_PGPROC().+ */+typedef struct+{+ BackendId backendId; /* determined at backend startup */+ LocalTransactionId localTransactionId; /* backend-local transaction+ * id */+} VirtualTransactionId;++#define InvalidLocalTransactionId 0+#define LocalTransactionIdIsValid(lxid) ((lxid) != InvalidLocalTransactionId)+#define VirtualTransactionIdIsValid(vxid) \+ (((vxid).backendId != InvalidBackendId) && \+ LocalTransactionIdIsValid((vxid).localTransactionId))+#define VirtualTransactionIdEquals(vxid1, vxid2) \+ ((vxid1).backendId == (vxid2).backendId && \+ (vxid1).localTransactionId == (vxid2).localTransactionId)+#define SetInvalidVirtualTransactionId(vxid) \+ ((vxid).backendId = InvalidBackendId, \+ (vxid).localTransactionId = InvalidLocalTransactionId)+#define GET_VXID_FROM_PGPROC(vxid, proc) \+ ((vxid).backendId = (proc).backendId, \+ (vxid).localTransactionId = (proc).lxid)+++/*+ * LOCKMODE is an integer (1..N) indicating a lock type. LOCKMASK is a bit+ * mask indicating a set of held or requested lock types (the bit 1<<mode+ * corresponds to a particular lock mode).+ */+typedef int LOCKMASK;+typedef int LOCKMODE;++/* MAX_LOCKMODES cannot be larger than the # of bits in LOCKMASK */+#define MAX_LOCKMODES 10++#define LOCKBIT_ON(lockmode) (1 << (lockmode))+#define LOCKBIT_OFF(lockmode) (~(1 << (lockmode)))+++/*+ * This data structure defines the locking semantics associated with a+ * "lock method". The semantics specify the meaning of each lock mode+ * (by defining which lock modes it conflicts with).+ * All of this data is constant and is kept in const tables.+ *+ * numLockModes -- number of lock modes (READ,WRITE,etc) that+ * are defined in this lock method. Must be less than MAX_LOCKMODES.+ *+ * conflictTab -- this is an array of bitmasks showing lock+ * mode conflicts. conflictTab[i] is a mask with the j-th bit+ * turned on if lock modes i and j conflict. Lock modes are+ * numbered 1..numLockModes; conflictTab[0] is unused.+ *+ * lockModeNames -- ID strings for debug printouts.+ *+ * trace_flag -- pointer to GUC trace flag for this lock method. (The+ * GUC variable is not constant, but we use "const" here to denote that+ * it can't be changed through this reference.)+ */+typedef struct LockMethodData+{+ int numLockModes;+ const LOCKMASK *conflictTab;+ const char *const * lockModeNames;+ const bool *trace_flag;+} LockMethodData;++typedef const LockMethodData *LockMethod;++/*+ * Lock methods are identified by LOCKMETHODID. (Despite the declaration as+ * uint16, we are constrained to 256 lockmethods by the layout of LOCKTAG.)+ */+typedef uint16 LOCKMETHODID;++/* These identify the known lock methods */+#define DEFAULT_LOCKMETHOD 1+#define USER_LOCKMETHOD 2++/*+ * These are the valid values of type LOCKMODE for all the standard lock+ * methods (both DEFAULT and USER).+ */++/* NoLock is not a lock mode, but a flag value meaning "don't get a lock" */+#define NoLock 0++#define AccessShareLock 1 /* SELECT */+#define RowShareLock 2 /* SELECT FOR UPDATE/FOR SHARE */+#define RowExclusiveLock 3 /* INSERT, UPDATE, DELETE */+#define ShareUpdateExclusiveLock 4 /* VACUUM (non-FULL),ANALYZE, CREATE+ * INDEX CONCURRENTLY */+#define ShareLock 5 /* CREATE INDEX (WITHOUT CONCURRENTLY) */+#define ShareRowExclusiveLock 6 /* like EXCLUSIVE MODE, but allows ROW+ * SHARE */+#define ExclusiveLock 7 /* blocks ROW SHARE/SELECT...FOR+ * UPDATE */+#define AccessExclusiveLock 8 /* ALTER TABLE, DROP TABLE, VACUUM+ * FULL, and unqualified LOCK TABLE */+++/*+ * LOCKTAG is the key information needed to look up a LOCK item in the+ * lock hashtable. A LOCKTAG value uniquely identifies a lockable object.+ *+ * The LockTagType enum defines the different kinds of objects we can lock.+ * We can handle up to 256 different LockTagTypes.+ */+typedef enum LockTagType+{+ LOCKTAG_RELATION, /* whole relation */+ /* ID info for a relation is DB OID + REL OID; DB OID = 0 if shared */+ LOCKTAG_RELATION_EXTEND, /* the right to extend a relation */+ /* same ID info as RELATION */+ LOCKTAG_PAGE, /* one page of a relation */+ /* ID info for a page is RELATION info + BlockNumber */+ LOCKTAG_TUPLE, /* one physical tuple */+ /* ID info for a tuple is PAGE info + OffsetNumber */+ LOCKTAG_TRANSACTION, /* transaction (for waiting for xact done) */+ /* ID info for a transaction is its TransactionId */+ LOCKTAG_VIRTUALTRANSACTION, /* virtual transaction (ditto) */+ /* ID info for a virtual transaction is its VirtualTransactionId */+ LOCKTAG_SPECULATIVE_TOKEN, /* speculative insertion Xid and token */+ /* ID info for a transaction is its TransactionId */+ LOCKTAG_OBJECT, /* non-relation database object */+ /* ID info for an object is DB OID + CLASS OID + OBJECT OID + SUBID */++ /*+ * Note: object ID has same representation as in pg_depend and+ * pg_description, but notice that we are constraining SUBID to 16 bits.+ * Also, we use DB OID = 0 for shared objects such as tablespaces.+ */+ LOCKTAG_USERLOCK, /* reserved for old contrib/userlock code */+ LOCKTAG_ADVISORY /* advisory user locks */+} LockTagType;++#define LOCKTAG_LAST_TYPE LOCKTAG_ADVISORY++/*+ * The LOCKTAG struct is defined with malice aforethought to fit into 16+ * bytes with no padding. Note that this would need adjustment if we were+ * to widen Oid, BlockNumber, or TransactionId to more than 32 bits.+ *+ * We include lockmethodid in the locktag so that a single hash table in+ * shared memory can store locks of different lockmethods.+ */+typedef struct LOCKTAG+{+ uint32 locktag_field1; /* a 32-bit ID field */+ uint32 locktag_field2; /* a 32-bit ID field */+ uint32 locktag_field3; /* a 32-bit ID field */+ uint16 locktag_field4; /* a 16-bit ID field */+ uint8 locktag_type; /* see enum LockTagType */+ uint8 locktag_lockmethodid; /* lockmethod indicator */+} LOCKTAG;++/*+ * These macros define how we map logical IDs of lockable objects into+ * the physical fields of LOCKTAG. Use these to set up LOCKTAG values,+ * rather than accessing the fields directly. Note multiple eval of target!+ */+#define SET_LOCKTAG_RELATION(locktag,dboid,reloid) \+ ((locktag).locktag_field1 = (dboid), \+ (locktag).locktag_field2 = (reloid), \+ (locktag).locktag_field3 = 0, \+ (locktag).locktag_field4 = 0, \+ (locktag).locktag_type = LOCKTAG_RELATION, \+ (locktag).locktag_lockmethodid = DEFAULT_LOCKMETHOD)++#define SET_LOCKTAG_RELATION_EXTEND(locktag,dboid,reloid) \+ ((locktag).locktag_field1 = (dboid), \+ (locktag).locktag_field2 = (reloid), \+ (locktag).locktag_field3 = 0, \+ (locktag).locktag_field4 = 0, \+ (locktag).locktag_type = LOCKTAG_RELATION_EXTEND, \+ (locktag).locktag_lockmethodid = DEFAULT_LOCKMETHOD)++#define SET_LOCKTAG_PAGE(locktag,dboid,reloid,blocknum) \+ ((locktag).locktag_field1 = (dboid), \+ (locktag).locktag_field2 = (reloid), \+ (locktag).locktag_field3 = (blocknum), \+ (locktag).locktag_field4 = 0, \+ (locktag).locktag_type = LOCKTAG_PAGE, \+ (locktag).locktag_lockmethodid = DEFAULT_LOCKMETHOD)++#define SET_LOCKTAG_TUPLE(locktag,dboid,reloid,blocknum,offnum) \+ ((locktag).locktag_field1 = (dboid), \+ (locktag).locktag_field2 = (reloid), \+ (locktag).locktag_field3 = (blocknum), \+ (locktag).locktag_field4 = (offnum), \+ (locktag).locktag_type = LOCKTAG_TUPLE, \+ (locktag).locktag_lockmethodid = DEFAULT_LOCKMETHOD)++#define SET_LOCKTAG_TRANSACTION(locktag,xid) \+ ((locktag).locktag_field1 = (xid), \+ (locktag).locktag_field2 = 0, \+ (locktag).locktag_field3 = 0, \+ (locktag).locktag_field4 = 0, \+ (locktag).locktag_type = LOCKTAG_TRANSACTION, \+ (locktag).locktag_lockmethodid = DEFAULT_LOCKMETHOD)++#define SET_LOCKTAG_VIRTUALTRANSACTION(locktag,vxid) \+ ((locktag).locktag_field1 = (vxid).backendId, \+ (locktag).locktag_field2 = (vxid).localTransactionId, \+ (locktag).locktag_field3 = 0, \+ (locktag).locktag_field4 = 0, \+ (locktag).locktag_type = LOCKTAG_VIRTUALTRANSACTION, \+ (locktag).locktag_lockmethodid = DEFAULT_LOCKMETHOD)++#define SET_LOCKTAG_SPECULATIVE_INSERTION(locktag,xid,token) \+ ((locktag).locktag_field1 = (xid), \+ (locktag).locktag_field2 = (token), \+ (locktag).locktag_field3 = 0, \+ (locktag).locktag_field4 = 0, \+ (locktag).locktag_type = LOCKTAG_SPECULATIVE_TOKEN, \+ (locktag).locktag_lockmethodid = DEFAULT_LOCKMETHOD)++#define SET_LOCKTAG_OBJECT(locktag,dboid,classoid,objoid,objsubid) \+ ((locktag).locktag_field1 = (dboid), \+ (locktag).locktag_field2 = (classoid), \+ (locktag).locktag_field3 = (objoid), \+ (locktag).locktag_field4 = (objsubid), \+ (locktag).locktag_type = LOCKTAG_OBJECT, \+ (locktag).locktag_lockmethodid = DEFAULT_LOCKMETHOD)++#define SET_LOCKTAG_ADVISORY(locktag,id1,id2,id3,id4) \+ ((locktag).locktag_field1 = (id1), \+ (locktag).locktag_field2 = (id2), \+ (locktag).locktag_field3 = (id3), \+ (locktag).locktag_field4 = (id4), \+ (locktag).locktag_type = LOCKTAG_ADVISORY, \+ (locktag).locktag_lockmethodid = USER_LOCKMETHOD)+++/*+ * Per-locked-object lock information:+ *+ * tag -- uniquely identifies the object being locked+ * grantMask -- bitmask for all lock types currently granted on this object.+ * waitMask -- bitmask for all lock types currently awaited on this object.+ * procLocks -- list of PROCLOCK objects for this lock.+ * waitProcs -- queue of processes waiting for this lock.+ * requested -- count of each lock type currently requested on the lock+ * (includes requests already granted!!).+ * nRequested -- total requested locks of all types.+ * granted -- count of each lock type currently granted on the lock.+ * nGranted -- total granted locks of all types.+ *+ * Note: these counts count 1 for each backend. Internally to a backend,+ * there may be multiple grabs on a particular lock, but this is not reflected+ * into shared memory.+ */+typedef struct LOCK+{+ /* hash key */+ LOCKTAG tag; /* unique identifier of lockable object */++ /* data */+ LOCKMASK grantMask; /* bitmask for lock types already granted */+ LOCKMASK waitMask; /* bitmask for lock types awaited */+ SHM_QUEUE procLocks; /* list of PROCLOCK objects assoc. with lock */+ PROC_QUEUE waitProcs; /* list of PGPROC objects waiting on lock */+ int requested[MAX_LOCKMODES]; /* counts of requested locks */+ int nRequested; /* total of requested[] array */+ int granted[MAX_LOCKMODES]; /* counts of granted locks */+ int nGranted; /* total of granted[] array */+} LOCK;++#define LOCK_LOCKMETHOD(lock) ((LOCKMETHODID) (lock).tag.locktag_lockmethodid)+++/*+ * We may have several different backends holding or awaiting locks+ * on the same lockable object. We need to store some per-holder/waiter+ * information for each such holder (or would-be holder). This is kept in+ * a PROCLOCK struct.+ *+ * PROCLOCKTAG is the key information needed to look up a PROCLOCK item in the+ * proclock hashtable. A PROCLOCKTAG value uniquely identifies the combination+ * of a lockable object and a holder/waiter for that object. (We can use+ * pointers here because the PROCLOCKTAG need only be unique for the lifespan+ * of the PROCLOCK, and it will never outlive the lock or the proc.)+ *+ * Internally to a backend, it is possible for the same lock to be held+ * for different purposes: the backend tracks transaction locks separately+ * from session locks. However, this is not reflected in the shared-memory+ * state: we only track which backend(s) hold the lock. This is OK since a+ * backend can never block itself.+ *+ * The holdMask field shows the already-granted locks represented by this+ * proclock. Note that there will be a proclock object, possibly with+ * zero holdMask, for any lock that the process is currently waiting on.+ * Otherwise, proclock objects whose holdMasks are zero are recycled+ * as soon as convenient.+ *+ * releaseMask is workspace for LockReleaseAll(): it shows the locks due+ * to be released during the current call. This must only be examined or+ * set by the backend owning the PROCLOCK.+ *+ * Each PROCLOCK object is linked into lists for both the associated LOCK+ * object and the owning PGPROC object. Note that the PROCLOCK is entered+ * into these lists as soon as it is created, even if no lock has yet been+ * granted. A PGPROC that is waiting for a lock to be granted will also be+ * linked into the lock's waitProcs queue.+ */+typedef struct PROCLOCKTAG+{+ /* NB: we assume this struct contains no padding! */+ LOCK *myLock; /* link to per-lockable-object information */+ PGPROC *myProc; /* link to PGPROC of owning backend */+} PROCLOCKTAG;++typedef struct PROCLOCK+{+ /* tag */+ PROCLOCKTAG tag; /* unique identifier of proclock object */++ /* data */+ LOCKMASK holdMask; /* bitmask for lock types currently held */+ LOCKMASK releaseMask; /* bitmask for lock types to be released */+ SHM_QUEUE lockLink; /* list link in LOCK's list of proclocks */+ SHM_QUEUE procLink; /* list link in PGPROC's list of proclocks */+} PROCLOCK;++#define PROCLOCK_LOCKMETHOD(proclock) \+ LOCK_LOCKMETHOD(*((proclock).tag.myLock))++/*+ * Each backend also maintains a local hash table with information about each+ * lock it is currently interested in. In particular the local table counts+ * the number of times that lock has been acquired. This allows multiple+ * requests for the same lock to be executed without additional accesses to+ * shared memory. We also track the number of lock acquisitions per+ * ResourceOwner, so that we can release just those locks belonging to a+ * particular ResourceOwner.+ *+ * When holding a lock taken "normally", the lock and proclock fields always+ * point to the associated objects in shared memory. However, if we acquired+ * the lock via the fast-path mechanism, the lock and proclock fields are set+ * to NULL, since there probably aren't any such objects in shared memory.+ * (If the lock later gets promoted to normal representation, we may eventually+ * update our locallock's lock/proclock fields after finding the shared+ * objects.)+ *+ * Caution: a locallock object can be left over from a failed lock acquisition+ * attempt. In this case its lock/proclock fields are untrustworthy, since+ * the shared lock object is neither held nor awaited, and hence is available+ * to be reclaimed. If nLocks > 0 then these pointers must either be valid or+ * NULL, but when nLocks == 0 they should be considered garbage.+ */+typedef struct LOCALLOCKTAG+{+ LOCKTAG lock; /* identifies the lockable object */+ LOCKMODE mode; /* lock mode for this table entry */+} LOCALLOCKTAG;++typedef struct LOCALLOCKOWNER+{+ /*+ * Note: if owner is NULL then the lock is held on behalf of the session;+ * otherwise it is held on behalf of my current transaction.+ *+ * Must use a forward struct reference to avoid circularity.+ */+ struct ResourceOwnerData *owner;+ int64 nLocks; /* # of times held by this owner */+} LOCALLOCKOWNER;++typedef struct LOCALLOCK+{+ /* tag */+ LOCALLOCKTAG tag; /* unique identifier of locallock entry */++ /* data */+ LOCK *lock; /* associated LOCK object, if any */+ PROCLOCK *proclock; /* associated PROCLOCK object, if any */+ uint32 hashcode; /* copy of LOCKTAG's hash value */+ int64 nLocks; /* total number of times lock is held */+ int numLockOwners; /* # of relevant ResourceOwners */+ int maxLockOwners; /* allocated size of array */+ bool holdsStrongLockCount; /* bumped FastPathStrongRelationLocks */+ LOCALLOCKOWNER *lockOwners; /* dynamically resizable array */+} LOCALLOCK;++#define LOCALLOCK_LOCKMETHOD(llock) ((llock).tag.lock.locktag_lockmethodid)+++/*+ * These structures hold information passed from lmgr internals to the lock+ * listing user-level functions (in lockfuncs.c).+ */++typedef struct LockInstanceData+{+ LOCKTAG locktag; /* locked object */+ LOCKMASK holdMask; /* locks held by this PGPROC */+ LOCKMODE waitLockMode; /* lock awaited by this PGPROC, if any */+ BackendId backend; /* backend ID of this PGPROC */+ LocalTransactionId lxid; /* local transaction ID of this PGPROC */+ int pid; /* pid of this PGPROC */+ bool fastpath; /* taken via fastpath? */+} LockInstanceData;++typedef struct LockData+{+ int nelements; /* The length of the array */+ LockInstanceData *locks;+} LockData;+++/* Result codes for LockAcquire() */+typedef enum+{+ LOCKACQUIRE_NOT_AVAIL, /* lock not available, and dontWait=true */+ LOCKACQUIRE_OK, /* lock successfully acquired */+ LOCKACQUIRE_ALREADY_HELD /* incremented count for lock already held */+} LockAcquireResult;++/* Deadlock states identified by DeadLockCheck() */+typedef enum+{+ DS_NOT_YET_CHECKED, /* no deadlock check has run yet */+ DS_NO_DEADLOCK, /* no deadlock detected */+ DS_SOFT_DEADLOCK, /* deadlock avoided by queue rearrangement */+ DS_HARD_DEADLOCK, /* deadlock, no way out but ERROR */+ DS_BLOCKED_BY_AUTOVACUUM /* no deadlock; queue blocked by autovacuum+ * worker */+} DeadLockState;+++/*+ * The lockmgr's shared hash tables are partitioned to reduce contention.+ * To determine which partition a given locktag belongs to, compute the tag's+ * hash code with LockTagHashCode(), then apply one of these macros.+ * NB: NUM_LOCK_PARTITIONS must be a power of 2!+ */+#define LockHashPartition(hashcode) \+ ((hashcode) % NUM_LOCK_PARTITIONS)+#define LockHashPartitionLock(hashcode) \+ (&MainLWLockArray[LOCK_MANAGER_LWLOCK_OFFSET + \+ LockHashPartition(hashcode)].lock)+#define LockHashPartitionLockByIndex(i) \+ (&MainLWLockArray[LOCK_MANAGER_LWLOCK_OFFSET + (i)].lock)++/*+ * function prototypes+ */+extern void InitLocks(void);+extern LockMethod GetLocksMethodTable(const LOCK *lock);+extern uint32 LockTagHashCode(const LOCKTAG *locktag);+extern bool DoLockModesConflict(LOCKMODE mode1, LOCKMODE mode2);+extern LockAcquireResult LockAcquire(const LOCKTAG *locktag,+ LOCKMODE lockmode,+ bool sessionLock,+ bool dontWait);+extern LockAcquireResult LockAcquireExtended(const LOCKTAG *locktag,+ LOCKMODE lockmode,+ bool sessionLock,+ bool dontWait,+ bool report_memory_error);+extern void AbortStrongLockAcquire(void);+extern bool LockRelease(const LOCKTAG *locktag,+ LOCKMODE lockmode, bool sessionLock);+extern void LockReleaseAll(LOCKMETHODID lockmethodid, bool allLocks);+extern void LockReleaseSession(LOCKMETHODID lockmethodid);+extern void LockReleaseCurrentOwner(LOCALLOCK **locallocks, int nlocks);+extern void LockReassignCurrentOwner(LOCALLOCK **locallocks, int nlocks);+extern bool LockHasWaiters(const LOCKTAG *locktag,+ LOCKMODE lockmode, bool sessionLock);+extern VirtualTransactionId *GetLockConflicts(const LOCKTAG *locktag,+ LOCKMODE lockmode);+extern void AtPrepare_Locks(void);+extern void PostPrepare_Locks(TransactionId xid);+extern int LockCheckConflicts(LockMethod lockMethodTable,+ LOCKMODE lockmode,+ LOCK *lock, PROCLOCK *proclock);+extern void GrantLock(LOCK *lock, PROCLOCK *proclock, LOCKMODE lockmode);+extern void GrantAwaitedLock(void);+extern void RemoveFromWaitQueue(PGPROC *proc, uint32 hashcode);+extern Size LockShmemSize(void);+extern LockData *GetLockStatusData(void);++typedef struct xl_standby_lock+{+ TransactionId xid; /* xid of holder of AccessExclusiveLock */+ Oid dbOid;+ Oid relOid;+} xl_standby_lock;++extern xl_standby_lock *GetRunningTransactionLocks(int *nlocks);+extern const char *GetLockmodeName(LOCKMETHODID lockmethodid, LOCKMODE mode);++extern void lock_twophase_recover(TransactionId xid, uint16 info,+ void *recdata, uint32 len);+extern void lock_twophase_postcommit(TransactionId xid, uint16 info,+ void *recdata, uint32 len);+extern void lock_twophase_postabort(TransactionId xid, uint16 info,+ void *recdata, uint32 len);+extern void lock_twophase_standby_recover(TransactionId xid, uint16 info,+ void *recdata, uint32 len);++extern DeadLockState DeadLockCheck(PGPROC *proc);+extern PGPROC *GetBlockingAutoVacuumPgproc(void);+extern void DeadLockReport(void) pg_attribute_noreturn();+extern void RememberSimpleDeadLock(PGPROC *proc1,+ LOCKMODE lockmode,+ LOCK *lock,+ PGPROC *proc2);+extern void InitDeadLockChecking(void);++#ifdef LOCK_DEBUG+extern void DumpLocks(PGPROC *proc);+extern void DumpAllLocks(void);+#endif++/* Lock a VXID (used to wait for a transaction to finish) */+extern void VirtualXactLockTableInsert(VirtualTransactionId vxid);+extern void VirtualXactLockTableCleanup(void);+extern bool VirtualXactLock(VirtualTransactionId vxid, bool wait);++#endif /* LOCK_H */
+ foreign/libpg_query/src/postgres/include/storage/lwlock.h view
@@ -0,0 +1,229 @@+/*-------------------------------------------------------------------------+ *+ * lwlock.h+ * Lightweight lock manager+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/storage/lwlock.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef LWLOCK_H+#define LWLOCK_H++#include "lib/ilist.h"+#include "storage/s_lock.h"+#include "port/atomics.h"++struct PGPROC;++/*+ * It's occasionally necessary to identify a particular LWLock "by name"; e.g.+ * because we wish to report the lock to dtrace. We could store a name or+ * other identifying information in the lock itself, but since it's common+ * to have many nearly-identical locks (e.g. one per buffer) this would end+ * up wasting significant amounts of memory. Instead, each lwlock stores a+ * tranche ID which tells us which array it's part of. Based on that, we can+ * figure out where the lwlock lies within the array using the data structure+ * shown below; the lock is then identified based on the tranche name and+ * computed array index. We need the array stride because the array might not+ * be an array of lwlocks, but rather some larger data structure that includes+ * one or more lwlocks per element.+ */+typedef struct LWLockTranche+{+ const char *name;+ void *array_base;+ Size array_stride;+} LWLockTranche;++/*+ * Code outside of lwlock.c should not manipulate the contents of this+ * structure directly, but we have to declare it here to allow LWLocks to be+ * incorporated into other data structures.+ */+typedef struct LWLock+{+ slock_t mutex; /* Protects LWLock and queue of PGPROCs */+ uint16 tranche; /* tranche ID */++ pg_atomic_uint32 state; /* state of exclusive/nonexclusive lockers */+#ifdef LOCK_DEBUG+ pg_atomic_uint32 nwaiters; /* number of waiters */+#endif+ dlist_head waiters; /* list of waiting PGPROCs */+#ifdef LOCK_DEBUG+ struct PGPROC *owner; /* last exclusive owner of the lock */+#endif+} LWLock;++/*+ * Prior to PostgreSQL 9.4, every lightweight lock in the system was stored+ * in a single array. For convenience and for compatibility with past+ * releases, we still have a main array, but it's now also permissible to+ * store LWLocks elsewhere in the main shared memory segment or in a dynamic+ * shared memory segment. In the main array, we force the array stride to+ * be a power of 2, which saves a few cycles in indexing, but more importantly+ * also ensures that individual LWLocks don't cross cache line boundaries.+ * This reduces cache contention problems, especially on AMD Opterons.+ * (Of course, we have to also ensure that the array start address is suitably+ * aligned.)+ *+ * On a 32-bit platforms a LWLock will these days fit into 16 bytes, but since+ * that didn't use to be the case and cramming more lwlocks into a cacheline+ * might be detrimental performancewise we still use 32 byte alignment+ * there. So, both on 32 and 64 bit platforms, it should fit into 32 bytes+ * unless slock_t is really big. We allow for that just in case.+ */+#define LWLOCK_PADDED_SIZE (sizeof(LWLock) <= 32 ? 32 : 64)++typedef union LWLockPadded+{+ LWLock lock;+ char pad[LWLOCK_PADDED_SIZE];+} LWLockPadded;+extern PGDLLIMPORT LWLockPadded *MainLWLockArray;++/*+ * Some commonly-used locks have predefined positions within MainLWLockArray;+ * defining macros here makes it much easier to keep track of these. If you+ * add a lock, add it to the end to avoid renumbering the existing locks;+ * if you remove a lock, consider leaving a gap in the numbering sequence for+ * the benefit of DTrace and other external debugging scripts.+ */+/* 0 is available; was formerly BufFreelistLock */+#define ShmemIndexLock (&MainLWLockArray[1].lock)+#define OidGenLock (&MainLWLockArray[2].lock)+#define XidGenLock (&MainLWLockArray[3].lock)+#define ProcArrayLock (&MainLWLockArray[4].lock)+#define SInvalReadLock (&MainLWLockArray[5].lock)+#define SInvalWriteLock (&MainLWLockArray[6].lock)+#define WALBufMappingLock (&MainLWLockArray[7].lock)+#define WALWriteLock (&MainLWLockArray[8].lock)+#define ControlFileLock (&MainLWLockArray[9].lock)+#define CheckpointLock (&MainLWLockArray[10].lock)+#define CLogControlLock (&MainLWLockArray[11].lock)+#define SubtransControlLock (&MainLWLockArray[12].lock)+#define MultiXactGenLock (&MainLWLockArray[13].lock)+#define MultiXactOffsetControlLock (&MainLWLockArray[14].lock)+#define MultiXactMemberControlLock (&MainLWLockArray[15].lock)+#define RelCacheInitLock (&MainLWLockArray[16].lock)+#define CheckpointerCommLock (&MainLWLockArray[17].lock)+#define TwoPhaseStateLock (&MainLWLockArray[18].lock)+#define TablespaceCreateLock (&MainLWLockArray[19].lock)+#define BtreeVacuumLock (&MainLWLockArray[20].lock)+#define AddinShmemInitLock (&MainLWLockArray[21].lock)+#define AutovacuumLock (&MainLWLockArray[22].lock)+#define AutovacuumScheduleLock (&MainLWLockArray[23].lock)+#define SyncScanLock (&MainLWLockArray[24].lock)+#define RelationMappingLock (&MainLWLockArray[25].lock)+#define AsyncCtlLock (&MainLWLockArray[26].lock)+#define AsyncQueueLock (&MainLWLockArray[27].lock)+#define SerializableXactHashLock (&MainLWLockArray[28].lock)+#define SerializableFinishedListLock (&MainLWLockArray[29].lock)+#define SerializablePredicateLockListLock (&MainLWLockArray[30].lock)+#define OldSerXidLock (&MainLWLockArray[31].lock)+#define SyncRepLock (&MainLWLockArray[32].lock)+#define BackgroundWorkerLock (&MainLWLockArray[33].lock)+#define DynamicSharedMemoryControlLock (&MainLWLockArray[34].lock)+#define AutoFileLock (&MainLWLockArray[35].lock)+#define ReplicationSlotAllocationLock (&MainLWLockArray[36].lock)+#define ReplicationSlotControlLock (&MainLWLockArray[37].lock)+#define CommitTsControlLock (&MainLWLockArray[38].lock)+#define CommitTsLock (&MainLWLockArray[39].lock)+#define ReplicationOriginLock (&MainLWLockArray[40].lock)+#define MultiXactTruncationLock (&MainLWLockArray[41].lock)+#define NUM_INDIVIDUAL_LWLOCKS 42++/*+ * It's a bit odd to declare NUM_BUFFER_PARTITIONS and NUM_LOCK_PARTITIONS+ * here, but we need them to figure out offsets within MainLWLockArray, and+ * having this file include lock.h or bufmgr.h would be backwards.+ */++/* Number of partitions of the shared buffer mapping hashtable */+#define NUM_BUFFER_PARTITIONS 128++/* Number of partitions the shared lock tables are divided into */+#define LOG2_NUM_LOCK_PARTITIONS 4+#define NUM_LOCK_PARTITIONS (1 << LOG2_NUM_LOCK_PARTITIONS)++/* Number of partitions the shared predicate lock tables are divided into */+#define LOG2_NUM_PREDICATELOCK_PARTITIONS 4+#define NUM_PREDICATELOCK_PARTITIONS (1 << LOG2_NUM_PREDICATELOCK_PARTITIONS)++/* Offsets for various chunks of preallocated lwlocks. */+#define BUFFER_MAPPING_LWLOCK_OFFSET NUM_INDIVIDUAL_LWLOCKS+#define LOCK_MANAGER_LWLOCK_OFFSET \+ (BUFFER_MAPPING_LWLOCK_OFFSET + NUM_BUFFER_PARTITIONS)+#define PREDICATELOCK_MANAGER_LWLOCK_OFFSET \+ (LOCK_MANAGER_LWLOCK_OFFSET + NUM_LOCK_PARTITIONS)+#define NUM_FIXED_LWLOCKS \+ (PREDICATELOCK_MANAGER_LWLOCK_OFFSET + NUM_PREDICATELOCK_PARTITIONS)++typedef enum LWLockMode+{+ LW_EXCLUSIVE,+ LW_SHARED,+ LW_WAIT_UNTIL_FREE /* A special mode used in PGPROC->lwlockMode,+ * when waiting for lock to become free. Not+ * to be used as LWLockAcquire argument */+} LWLockMode;+++#ifdef LOCK_DEBUG+extern bool Trace_lwlocks;+#endif++extern bool LWLockAcquire(LWLock *lock, LWLockMode mode);+extern bool LWLockConditionalAcquire(LWLock *lock, LWLockMode mode);+extern bool LWLockAcquireOrWait(LWLock *lock, LWLockMode mode);+extern void LWLockRelease(LWLock *lock);+extern void LWLockReleaseClearVar(LWLock *lock, uint64 *valptr, uint64 val);+extern void LWLockReleaseAll(void);+extern bool LWLockHeldByMe(LWLock *lock);++extern bool LWLockWaitForVar(LWLock *lock, uint64 *valptr, uint64 oldval, uint64 *newval);+extern void LWLockUpdateVar(LWLock *lock, uint64 *valptr, uint64 value);++extern Size LWLockShmemSize(void);+extern void CreateLWLocks(void);+extern void InitLWLockAccess(void);++/*+ * The traditional method for obtaining an lwlock for use by an extension is+ * to call RequestAddinLWLocks() during postmaster startup; this will reserve+ * space for the indicated number of locks in MainLWLockArray. Subsequently,+ * a lock can be allocated using LWLockAssign.+ */+extern void RequestAddinLWLocks(int n);+extern LWLock *LWLockAssign(void);++/*+ * There is another, more flexible method of obtaining lwlocks. First, call+ * LWLockNewTrancheId just once to obtain a tranche ID; this allocates from+ * a shared counter. Next, each individual process using the tranche should+ * call LWLockRegisterTranche() to associate that tranche ID with appropriate+ * metadata. Finally, LWLockInitialize should be called just once per lwlock,+ * passing the tranche ID as an argument.+ *+ * It may seem strange that each process using the tranche must register it+ * separately, but dynamic shared memory segments aren't guaranteed to be+ * mapped at the same address in all coordinating backends, so storing the+ * registration in the main shared memory segment wouldn't work for that case.+ */+extern int LWLockNewTrancheId(void);+extern void LWLockRegisterTranche(int tranche_id, LWLockTranche *tranche);+extern void LWLockInitialize(LWLock *lock, int tranche_id);++/*+ * Prior to PostgreSQL 9.4, we used an enum type called LWLockId to refer+ * to LWLocks. New code should instead use LWLock *. However, for the+ * convenience of third-party code, we include the following typedef.+ */+typedef LWLock *LWLockId;++#endif /* LWLOCK_H */
+ foreign/libpg_query/src/postgres/include/storage/off.h view
@@ -0,0 +1,58 @@+/*-------------------------------------------------------------------------+ *+ * off.h+ * POSTGRES disk "offset" definitions.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/storage/off.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef OFF_H+#define OFF_H++#include "storage/itemid.h"+/*+ * OffsetNumber:+ *+ * this is a 1-based index into the linp (ItemIdData) array in the+ * header of each disk page.+ */+typedef uint16 OffsetNumber;++#define InvalidOffsetNumber ((OffsetNumber) 0)+#define FirstOffsetNumber ((OffsetNumber) 1)+#define MaxOffsetNumber ((OffsetNumber) (BLCKSZ / sizeof(ItemIdData)))+#define OffsetNumberMask (0xffff) /* valid uint16 bits */++/* ----------------+ * support macros+ * ----------------+ */++/*+ * OffsetNumberIsValid+ * True iff the offset number is valid.+ */+#define OffsetNumberIsValid(offsetNumber) \+ ((bool) ((offsetNumber != InvalidOffsetNumber) && \+ (offsetNumber <= MaxOffsetNumber)))++/*+ * OffsetNumberNext+ * OffsetNumberPrev+ * Increments/decrements the argument. These macros look pointless+ * but they help us disambiguate the different manipulations on+ * OffsetNumbers (e.g., sometimes we subtract one from an+ * OffsetNumber to move back, and sometimes we do so to form a+ * real C array index).+ */+#define OffsetNumberNext(offsetNumber) \+ ((OffsetNumber) (1 + (offsetNumber)))+#define OffsetNumberPrev(offsetNumber) \+ ((OffsetNumber) (-1 + (offsetNumber)))++#endif /* OFF_H */
+ foreign/libpg_query/src/postgres/include/storage/pg_sema.h view
@@ -0,0 +1,83 @@+/*-------------------------------------------------------------------------+ *+ * pg_sema.h+ * Platform-independent API for semaphores.+ *+ * PostgreSQL requires counting semaphores (the kind that keep track of+ * multiple unlock operations, and will allow an equal number of subsequent+ * lock operations before blocking). The underlying implementation is+ * not the same on every platform. This file defines the API that must+ * be provided by each port.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/storage/pg_sema.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef PG_SEMA_H+#define PG_SEMA_H++/*+ * PGSemaphoreData and pointer type PGSemaphore are the data structure+ * representing an individual semaphore. The contents of PGSemaphoreData+ * vary across implementations and must never be touched by platform-+ * independent code. PGSemaphoreData structures are always allocated+ * in shared memory (to support implementations where the data changes during+ * lock/unlock).+ *+ * pg_config.h must define exactly one of the USE_xxx_SEMAPHORES symbols.+ */++#ifdef USE_NAMED_POSIX_SEMAPHORES++#include <semaphore.h>++typedef sem_t *PGSemaphoreData;+#endif++#ifdef USE_UNNAMED_POSIX_SEMAPHORES++#include <semaphore.h>++typedef sem_t PGSemaphoreData;+#endif++#ifdef USE_SYSV_SEMAPHORES++typedef struct PGSemaphoreData+{+ int semId; /* semaphore set identifier */+ int semNum; /* semaphore number within set */+} PGSemaphoreData;+#endif++#ifdef USE_WIN32_SEMAPHORES++typedef HANDLE PGSemaphoreData;+#endif++typedef PGSemaphoreData *PGSemaphore;+++/* Module initialization (called during postmaster start or shmem reinit) */+extern void PGReserveSemaphores(int maxSemas, int port);++/* Initialize a PGSemaphore structure to represent a sema with count 1 */+extern void PGSemaphoreCreate(PGSemaphore sema);++/* Reset a previously-initialized PGSemaphore to have count 0 */+extern void PGSemaphoreReset(PGSemaphore sema);++/* Lock a semaphore (decrement count), blocking if count would be < 0 */+extern void PGSemaphoreLock(PGSemaphore sema);++/* Unlock a semaphore (increment count) */+extern void PGSemaphoreUnlock(PGSemaphore sema);++/* Lock a semaphore only if able to do so without blocking */+extern bool PGSemaphoreTryLock(PGSemaphore sema);++#endif /* PG_SEMA_H */
+ foreign/libpg_query/src/postgres/include/storage/pg_shmem.h view
@@ -0,0 +1,72 @@+/*-------------------------------------------------------------------------+ *+ * pg_shmem.h+ * Platform-independent API for shared memory support.+ *+ * Every port is expected to support shared memory with approximately+ * SysV-ish semantics; in particular, a memory block is not anonymous+ * but has an ID, and we must be able to tell whether there are any+ * remaining processes attached to a block of a specified ID.+ *+ * To simplify life for the SysV implementation, the ID is assumed to+ * consist of two unsigned long values (these are key and ID in SysV+ * terms). Other platforms may ignore the second value if they need+ * only one ID number.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/storage/pg_shmem.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef PG_SHMEM_H+#define PG_SHMEM_H++#include "storage/dsm_impl.h"++typedef struct PGShmemHeader /* standard header for all Postgres shmem */+{+ int32 magic; /* magic # to identify Postgres segments */+#define PGShmemMagic 679834894+ pid_t creatorPID; /* PID of creating process */+ Size totalsize; /* total size of segment */+ Size freeoffset; /* offset to first free space */+ dsm_handle dsm_control; /* ID of dynamic shared memory control seg */+ void *index; /* pointer to ShmemIndex table */+#ifndef WIN32 /* Windows doesn't have useful inode#s */+ dev_t device; /* device data directory is on */+ ino_t inode; /* inode number of data directory */+#endif+} PGShmemHeader;++/* GUC variable */+extern int huge_pages;++/* Possible values for huge_pages */+typedef enum+{+ HUGE_PAGES_OFF,+ HUGE_PAGES_ON,+ HUGE_PAGES_TRY+} HugePagesType;++#ifndef WIN32+extern unsigned long UsedShmemSegID;+#else+extern HANDLE UsedShmemSegID;+#endif+extern void *UsedShmemSegAddr;++#ifdef EXEC_BACKEND+extern void PGSharedMemoryReAttach(void);+extern void PGSharedMemoryNoReAttach(void);+#endif++extern PGShmemHeader *PGSharedMemoryCreate(Size size, bool makePrivate,+ int port, PGShmemHeader **shim);+extern bool PGSharedMemoryIsInUse(unsigned long id1, unsigned long id2);+extern void PGSharedMemoryDetach(void);++#endif /* PG_SHMEM_H */
+ foreign/libpg_query/src/postgres/include/storage/pmsignal.h view
@@ -0,0 +1,56 @@+/*-------------------------------------------------------------------------+ *+ * pmsignal.h+ * routines for signaling the postmaster from its child processes+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/storage/pmsignal.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef PMSIGNAL_H+#define PMSIGNAL_H++/*+ * Reasons for signaling the postmaster. We can cope with simultaneous+ * signals for different reasons. If the same reason is signaled multiple+ * times in quick succession, however, the postmaster is likely to observe+ * only one notification of it. This is okay for the present uses.+ */+typedef enum+{+ PMSIGNAL_RECOVERY_STARTED, /* recovery has started */+ PMSIGNAL_BEGIN_HOT_STANDBY, /* begin Hot Standby */+ PMSIGNAL_WAKEN_ARCHIVER, /* send a NOTIFY signal to xlog archiver */+ PMSIGNAL_ROTATE_LOGFILE, /* send SIGUSR1 to syslogger to rotate logfile */+ PMSIGNAL_START_AUTOVAC_LAUNCHER, /* start an autovacuum launcher */+ PMSIGNAL_START_AUTOVAC_WORKER, /* start an autovacuum worker */+ PMSIGNAL_BACKGROUND_WORKER_CHANGE, /* background worker state change */+ PMSIGNAL_START_WALRECEIVER, /* start a walreceiver */+ PMSIGNAL_ADVANCE_STATE_MACHINE, /* advance postmaster's state machine */++ NUM_PMSIGNALS /* Must be last value of enum! */+} PMSignalReason;++/* PMSignalData is an opaque struct, details known only within pmsignal.c */+typedef struct PMSignalData PMSignalData;++/*+ * prototypes for functions in pmsignal.c+ */+extern Size PMSignalShmemSize(void);+extern void PMSignalShmemInit(void);+extern void SendPostmasterSignal(PMSignalReason reason);+extern bool CheckPostmasterSignal(PMSignalReason reason);+extern int AssignPostmasterChildSlot(void);+extern bool ReleasePostmasterChildSlot(int slot);+extern bool IsPostmasterChildWalSender(int slot);+extern void MarkPostmasterChildActive(void);+extern void MarkPostmasterChildInactive(void);+extern void MarkPostmasterChildWalSender(void);+extern bool PostmasterIsAlive(void);++#endif /* PMSIGNAL_H */
+ foreign/libpg_query/src/postgres/include/storage/predicate.h view
@@ -0,0 +1,73 @@+/*-------------------------------------------------------------------------+ *+ * predicate.h+ * POSTGRES public predicate locking definitions.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/storage/predicate.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef PREDICATE_H+#define PREDICATE_H++#include "utils/relcache.h"+#include "utils/snapshot.h"+++/*+ * GUC variables+ */+extern int max_predicate_locks_per_xact;+++/* Number of SLRU buffers to use for predicate locking */+#define NUM_OLDSERXID_BUFFERS 16+++/*+ * function prototypes+ */++/* housekeeping for shared memory predicate lock structures */+extern void InitPredicateLocks(void);+extern Size PredicateLockShmemSize(void);++extern void CheckPointPredicate(void);++/* predicate lock reporting */+extern bool PageIsPredicateLocked(Relation relation, BlockNumber blkno);++/* predicate lock maintenance */+extern Snapshot GetSerializableTransactionSnapshot(Snapshot snapshot);+extern void SetSerializableTransactionSnapshot(Snapshot snapshot,+ TransactionId sourcexid);+extern void RegisterPredicateLockingXid(TransactionId xid);+extern void PredicateLockRelation(Relation relation, Snapshot snapshot);+extern void PredicateLockPage(Relation relation, BlockNumber blkno, Snapshot snapshot);+extern void PredicateLockTuple(Relation relation, HeapTuple tuple, Snapshot snapshot);+extern void PredicateLockPageSplit(Relation relation, BlockNumber oldblkno, BlockNumber newblkno);+extern void PredicateLockPageCombine(Relation relation, BlockNumber oldblkno, BlockNumber newblkno);+extern void TransferPredicateLocksToHeapRelation(Relation relation);+extern void ReleasePredicateLocks(bool isCommit);++/* conflict detection (may also trigger rollback) */+extern void CheckForSerializableConflictOut(bool valid, Relation relation, HeapTuple tuple,+ Buffer buffer, Snapshot snapshot);+extern void CheckForSerializableConflictIn(Relation relation, HeapTuple tuple, Buffer buffer);+extern void CheckTableForSerializableConflictIn(Relation relation);++/* final rollback checking */+extern void PreCommit_CheckForSerializationFailure(void);++/* two-phase commit support */+extern void AtPrepare_PredicateLocks(void);+extern void PostPrepare_PredicateLocks(TransactionId xid);+extern void PredicateLockTwoPhaseFinish(TransactionId xid, bool isCommit);+extern void predicatelock_twophase_recover(TransactionId xid, uint16 info,+ void *recdata, uint32 len);++#endif /* PREDICATE_H */
+ foreign/libpg_query/src/postgres/include/storage/proc.h view
@@ -0,0 +1,261 @@+/*-------------------------------------------------------------------------+ *+ * proc.h+ * per-process shared memory data structures+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/storage/proc.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef _PROC_H_+#define _PROC_H_++#include "access/xlogdefs.h"+#include "lib/ilist.h"+#include "storage/latch.h"+#include "storage/lock.h"+#include "storage/pg_sema.h"++/*+ * Each backend advertises up to PGPROC_MAX_CACHED_SUBXIDS TransactionIds+ * for non-aborted subtransactions of its current top transaction. These+ * have to be treated as running XIDs by other backends.+ *+ * We also keep track of whether the cache overflowed (ie, the transaction has+ * generated at least one subtransaction that didn't fit in the cache).+ * If none of the caches have overflowed, we can assume that an XID that's not+ * listed anywhere in the PGPROC array is not a running transaction. Else we+ * have to look at pg_subtrans.+ */+#define PGPROC_MAX_CACHED_SUBXIDS 64 /* XXX guessed-at value */++struct XidCache+{+ TransactionId xids[PGPROC_MAX_CACHED_SUBXIDS];+};++/* Flags for PGXACT->vacuumFlags */+#define PROC_IS_AUTOVACUUM 0x01 /* is it an autovac worker? */+#define PROC_IN_VACUUM 0x02 /* currently running lazy vacuum */+#define PROC_IN_ANALYZE 0x04 /* currently running analyze */+#define PROC_VACUUM_FOR_WRAPAROUND 0x08 /* set by autovac only */+#define PROC_IN_LOGICAL_DECODING 0x10 /* currently doing logical+ * decoding outside xact */++/* flags reset at EOXact */+#define PROC_VACUUM_STATE_MASK \+ (PROC_IN_VACUUM | PROC_IN_ANALYZE | PROC_VACUUM_FOR_WRAPAROUND)++/*+ * We allow a small number of "weak" relation locks (AccesShareLock,+ * RowShareLock, RowExclusiveLock) to be recorded in the PGPROC structure+ * rather than the main lock table. This eases contention on the lock+ * manager LWLocks. See storage/lmgr/README for additional details.+ */+#define FP_LOCK_SLOTS_PER_BACKEND 16++/*+ * Each backend has a PGPROC struct in shared memory. There is also a list of+ * currently-unused PGPROC structs that will be reallocated to new backends.+ *+ * links: list link for any list the PGPROC is in. When waiting for a lock,+ * the PGPROC is linked into that lock's waitProcs queue. A recycled PGPROC+ * is linked into ProcGlobal's freeProcs list.+ *+ * Note: twophase.c also sets up a dummy PGPROC struct for each currently+ * prepared transaction. These PGPROCs appear in the ProcArray data structure+ * so that the prepared transactions appear to be still running and are+ * correctly shown as holding locks. A prepared transaction PGPROC can be+ * distinguished from a real one at need by the fact that it has pid == 0.+ * The semaphore and lock-activity fields in a prepared-xact PGPROC are unused,+ * but its myProcLocks[] lists are valid.+ */+struct PGPROC+{+ /* proc->links MUST BE FIRST IN STRUCT (see ProcSleep,ProcWakeup,etc) */+ SHM_QUEUE links; /* list link if process is in a list */++ PGSemaphoreData sem; /* ONE semaphore to sleep on */+ int waitStatus; /* STATUS_WAITING, STATUS_OK or STATUS_ERROR */++ Latch procLatch; /* generic latch for process */++ LocalTransactionId lxid; /* local id of top-level transaction currently+ * being executed by this proc, if running;+ * else InvalidLocalTransactionId */+ int pid; /* Backend's process ID; 0 if prepared xact */+ int pgprocno;++ /* These fields are zero while a backend is still starting up: */+ BackendId backendId; /* This backend's backend ID (if assigned) */+ Oid databaseId; /* OID of database this backend is using */+ Oid roleId; /* OID of role using this backend */++ /*+ * While in hot standby mode, shows that a conflict signal has been sent+ * for the current transaction. Set/cleared while holding ProcArrayLock,+ * though not required. Accessed without lock, if needed.+ */+ bool recoveryConflictPending;++ /* Info about LWLock the process is currently waiting for, if any. */+ bool lwWaiting; /* true if waiting for an LW lock */+ uint8 lwWaitMode; /* lwlock mode being waited for */+ dlist_node lwWaitLink; /* position in LW lock wait list */++ /* Info about lock the process is currently waiting for, if any. */+ /* waitLock and waitProcLock are NULL if not currently waiting. */+ LOCK *waitLock; /* Lock object we're sleeping on ... */+ PROCLOCK *waitProcLock; /* Per-holder info for awaited lock */+ LOCKMODE waitLockMode; /* type of lock we're waiting for */+ LOCKMASK heldLocks; /* bitmask for lock types already held on this+ * lock object by this backend */++ /*+ * Info to allow us to wait for synchronous replication, if needed.+ * waitLSN is InvalidXLogRecPtr if not waiting; set only by user backend.+ * syncRepState must not be touched except by owning process or WALSender.+ * syncRepLinks used only while holding SyncRepLock.+ */+ XLogRecPtr waitLSN; /* waiting for this LSN or higher */+ int syncRepState; /* wait state for sync rep */+ SHM_QUEUE syncRepLinks; /* list link if process is in syncrep queue */++ /*+ * All PROCLOCK objects for locks held or awaited by this backend are+ * linked into one of these lists, according to the partition number of+ * their lock.+ */+ SHM_QUEUE myProcLocks[NUM_LOCK_PARTITIONS];++ struct XidCache subxids; /* cache for subtransaction XIDs */++ /* Per-backend LWLock. Protects fields below. */+ LWLock *backendLock; /* protects the fields below */++ /* Lock manager data, recording fast-path locks taken by this backend. */+ uint64 fpLockBits; /* lock modes held for each fast-path slot */+ Oid fpRelId[FP_LOCK_SLOTS_PER_BACKEND]; /* slots for rel oids */+ bool fpVXIDLock; /* are we holding a fast-path VXID lock? */+ LocalTransactionId fpLocalTransactionId; /* lxid for fast-path VXID+ * lock */+};++/* NOTE: "typedef struct PGPROC PGPROC" appears in storage/lock.h. */+++extern PGDLLIMPORT PGPROC *MyProc;+extern PGDLLIMPORT struct PGXACT *MyPgXact;++/*+ * Prior to PostgreSQL 9.2, the fields below were stored as part of the+ * PGPROC. However, benchmarking revealed that packing these particular+ * members into a separate array as tightly as possible sped up GetSnapshotData+ * considerably on systems with many CPU cores, by reducing the number of+ * cache lines needing to be fetched. Thus, think very carefully before adding+ * anything else here.+ */+typedef struct PGXACT+{+ TransactionId xid; /* id of top-level transaction currently being+ * executed by this proc, if running and XID+ * is assigned; else InvalidTransactionId */++ TransactionId xmin; /* minimal running XID as it was when we were+ * starting our xact, excluding LAZY VACUUM:+ * vacuum must not remove tuples deleted by+ * xid >= xmin ! */++ uint8 vacuumFlags; /* vacuum-related flags, see above */+ bool overflowed;+ bool delayChkpt; /* true if this proc delays checkpoint start;+ * previously called InCommit */++ uint8 nxids;+} PGXACT;++/*+ * There is one ProcGlobal struct for the whole database cluster.+ */+typedef struct PROC_HDR+{+ /* Array of PGPROC structures (not including dummies for prepared txns) */+ PGPROC *allProcs;+ /* Array of PGXACT structures (not including dummies for prepared txns) */+ PGXACT *allPgXact;+ /* Length of allProcs array */+ uint32 allProcCount;+ /* Head of list of free PGPROC structures */+ PGPROC *freeProcs;+ /* Head of list of autovacuum's free PGPROC structures */+ PGPROC *autovacFreeProcs;+ /* Head of list of bgworker free PGPROC structures */+ PGPROC *bgworkerFreeProcs;+ /* WALWriter process's latch */+ Latch *walwriterLatch;+ /* Checkpointer process's latch */+ Latch *checkpointerLatch;+ /* Current shared estimate of appropriate spins_per_delay value */+ int spins_per_delay;+ /* The proc of the Startup process, since not in ProcArray */+ PGPROC *startupProc;+ int startupProcPid;+ /* Buffer id of the buffer that Startup process waits for pin on, or -1 */+ int startupBufferPinWaitBufId;+} PROC_HDR;++extern PROC_HDR *ProcGlobal;++extern PGPROC *PreparedXactProcs;++/*+ * We set aside some extra PGPROC structures for auxiliary processes,+ * ie things that aren't full-fledged backends but need shmem access.+ *+ * Background writer, checkpointer and WAL writer run during normal operation.+ * Startup process and WAL receiver also consume 2 slots, but WAL writer is+ * launched only after startup has exited, so we only need 4 slots.+ */+#define NUM_AUXILIARY_PROCS 4+++/* configurable options */+extern int DeadlockTimeout;+extern int StatementTimeout;+extern int LockTimeout;+extern bool log_lock_waits;+++/*+ * Function Prototypes+ */+extern int ProcGlobalSemas(void);+extern Size ProcGlobalShmemSize(void);+extern void InitProcGlobal(void);+extern void InitProcess(void);+extern void InitProcessPhase2(void);+extern void InitAuxiliaryProcess(void);++extern void PublishStartupProcessInformation(void);+extern void SetStartupBufferPinWaitBufId(int bufid);+extern int GetStartupBufferPinWaitBufId(void);++extern bool HaveNFreeProcs(int n);+extern void ProcReleaseLocks(bool isCommit);++extern void ProcQueueInit(PROC_QUEUE *queue);+extern int ProcSleep(LOCALLOCK *locallock, LockMethod lockMethodTable);+extern PGPROC *ProcWakeup(PGPROC *proc, int waitStatus);+extern void ProcLockWakeup(LockMethod lockMethodTable, LOCK *lock);+extern void CheckDeadLockAlert(void);+extern bool IsWaitingForLock(void);+extern void LockErrorCleanup(void);++extern void ProcWaitForSignal(void);+extern void ProcSendSignal(int pid);++#endif /* PROC_H */
+ foreign/libpg_query/src/postgres/include/storage/procsignal.h view
@@ -0,0 +1,60 @@+/*-------------------------------------------------------------------------+ *+ * procsignal.h+ * Routines for interprocess signalling+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/storage/procsignal.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef PROCSIGNAL_H+#define PROCSIGNAL_H++#include "storage/backendid.h"+++/*+ * Reasons for signalling a Postgres child process (a backend or an auxiliary+ * process, like checkpointer). We can cope with concurrent signals for different+ * reasons. However, if the same reason is signaled multiple times in quick+ * succession, the process is likely to observe only one notification of it.+ * This is okay for the present uses.+ *+ * Also, because of race conditions, it's important that all the signals be+ * defined so that no harm is done if a process mistakenly receives one.+ */+typedef enum+{+ PROCSIG_CATCHUP_INTERRUPT, /* sinval catchup interrupt */+ PROCSIG_NOTIFY_INTERRUPT, /* listen/notify interrupt */+ PROCSIG_PARALLEL_MESSAGE, /* message from cooperating parallel backend */++ /* Recovery conflict reasons */+ PROCSIG_RECOVERY_CONFLICT_DATABASE,+ PROCSIG_RECOVERY_CONFLICT_TABLESPACE,+ PROCSIG_RECOVERY_CONFLICT_LOCK,+ PROCSIG_RECOVERY_CONFLICT_SNAPSHOT,+ PROCSIG_RECOVERY_CONFLICT_BUFFERPIN,+ PROCSIG_RECOVERY_CONFLICT_STARTUP_DEADLOCK,++ NUM_PROCSIGNALS /* Must be last! */+} ProcSignalReason;++/*+ * prototypes for functions in procsignal.c+ */+extern Size ProcSignalShmemSize(void);+extern void ProcSignalShmemInit(void);++extern void ProcSignalInit(int pss_idx);+extern int SendProcSignal(pid_t pid, ProcSignalReason reason,+ BackendId backendId);++extern void procsignal_sigusr1_handler(SIGNAL_ARGS);+extern PGDLLIMPORT bool set_latch_on_sigusr1;++#endif /* PROCSIGNAL_H */
+ foreign/libpg_query/src/postgres/include/storage/relfilenode.h view
@@ -0,0 +1,99 @@+/*-------------------------------------------------------------------------+ *+ * relfilenode.h+ * Physical access information for relations.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/storage/relfilenode.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef RELFILENODE_H+#define RELFILENODE_H++#include "common/relpath.h"+#include "storage/backendid.h"++/*+ * RelFileNode must provide all that we need to know to physically access+ * a relation, with the exception of the backend ID, which can be provided+ * separately. Note, however, that a "physical" relation is comprised of+ * multiple files on the filesystem, as each fork is stored as a separate+ * file, and each fork can be divided into multiple segments. See md.c.+ *+ * spcNode identifies the tablespace of the relation. It corresponds to+ * pg_tablespace.oid.+ *+ * dbNode identifies the database of the relation. It is zero for+ * "shared" relations (those common to all databases of a cluster).+ * Nonzero dbNode values correspond to pg_database.oid.+ *+ * relNode identifies the specific relation. relNode corresponds to+ * pg_class.relfilenode (NOT pg_class.oid, because we need to be able+ * to assign new physical files to relations in some situations).+ * Notice that relNode is only unique within a database in a particular+ * tablespace.+ *+ * Note: spcNode must be GLOBALTABLESPACE_OID if and only if dbNode is+ * zero. We support shared relations only in the "global" tablespace.+ *+ * Note: in pg_class we allow reltablespace == 0 to denote that the+ * relation is stored in its database's "default" tablespace (as+ * identified by pg_database.dattablespace). However this shorthand+ * is NOT allowed in RelFileNode structs --- the real tablespace ID+ * must be supplied when setting spcNode.+ *+ * Note: in pg_class, relfilenode can be zero to denote that the relation+ * is a "mapped" relation, whose current true filenode number is available+ * from relmapper.c. Again, this case is NOT allowed in RelFileNodes.+ *+ * Note: various places use RelFileNode in hashtable keys. Therefore,+ * there *must not* be any unused padding bytes in this struct. That+ * should be safe as long as all the fields are of type Oid.+ */+typedef struct RelFileNode+{+ Oid spcNode; /* tablespace */+ Oid dbNode; /* database */+ Oid relNode; /* relation */+} RelFileNode;++/*+ * Augmenting a relfilenode with the backend ID provides all the information+ * we need to locate the physical storage. The backend ID is InvalidBackendId+ * for regular relations (those accessible to more than one backend), or the+ * owning backend's ID for backend-local relations. Backend-local relations+ * are always transient and removed in case of a database crash; they are+ * never WAL-logged or fsync'd.+ */+typedef struct RelFileNodeBackend+{+ RelFileNode node;+ BackendId backend;+} RelFileNodeBackend;++#define RelFileNodeBackendIsTemp(rnode) \+ ((rnode).backend != InvalidBackendId)++/*+ * Note: RelFileNodeEquals and RelFileNodeBackendEquals compare relNode first+ * since that is most likely to be different in two unequal RelFileNodes. It+ * is probably redundant to compare spcNode if the other fields are found equal,+ * but do it anyway to be sure. Likewise for checking the backend ID in+ * RelFileNodeBackendEquals.+ */+#define RelFileNodeEquals(node1, node2) \+ ((node1).relNode == (node2).relNode && \+ (node1).dbNode == (node2).dbNode && \+ (node1).spcNode == (node2).spcNode)++#define RelFileNodeBackendEquals(node1, node2) \+ ((node1).node.relNode == (node2).node.relNode && \+ (node1).node.dbNode == (node2).node.dbNode && \+ (node1).backend == (node2).backend && \+ (node1).node.spcNode == (node2).node.spcNode)++#endif /* RELFILENODE_H */
+ foreign/libpg_query/src/postgres/include/storage/s_lock.h view
@@ -0,0 +1,985 @@+/*-------------------------------------------------------------------------+ *+ * s_lock.h+ * Hardware-dependent implementation of spinlocks.+ *+ * NOTE: none of the macros in this file are intended to be called directly.+ * Call them through the hardware-independent macros in spin.h.+ *+ * The following hardware-dependent macros must be provided for each+ * supported platform:+ *+ * void S_INIT_LOCK(slock_t *lock)+ * Initialize a spinlock (to the unlocked state).+ *+ * int S_LOCK(slock_t *lock)+ * Acquire a spinlock, waiting if necessary.+ * Time out and abort() if unable to acquire the lock in a+ * "reasonable" amount of time --- typically ~ 1 minute.+ * Should return number of "delays"; see s_lock.c+ *+ * void S_UNLOCK(slock_t *lock)+ * Unlock a previously acquired lock.+ *+ * bool S_LOCK_FREE(slock_t *lock)+ * Tests if the lock is free. Returns TRUE if free, FALSE if locked.+ * This does *not* change the state of the lock.+ *+ * void SPIN_DELAY(void)+ * Delay operation to occur inside spinlock wait loop.+ *+ * Note to implementors: there are default implementations for all these+ * macros at the bottom of the file. Check if your platform can use+ * these or needs to override them.+ *+ * Usually, S_LOCK() is implemented in terms of even lower-level macros+ * TAS() and TAS_SPIN():+ *+ * int TAS(slock_t *lock)+ * Atomic test-and-set instruction. Attempt to acquire the lock,+ * but do *not* wait. Returns 0 if successful, nonzero if unable+ * to acquire the lock.+ *+ * int TAS_SPIN(slock_t *lock)+ * Like TAS(), but this version is used when waiting for a lock+ * previously found to be contended. By default, this is the+ * same as TAS(), but on some architectures it's better to poll a+ * contended lock using an unlocked instruction and retry the+ * atomic test-and-set only when it appears free.+ *+ * TAS() and TAS_SPIN() are NOT part of the API, and should never be called+ * directly.+ *+ * CAUTION: on some platforms TAS() and/or TAS_SPIN() may sometimes report+ * failure to acquire a lock even when the lock is not locked. For example,+ * on Alpha TAS() will "fail" if interrupted. Therefore a retry loop must+ * always be used, even if you are certain the lock is free.+ *+ * It is the responsibility of these macros to make sure that the compiler+ * does not re-order accesses to shared memory to precede the actual lock+ * acquisition, or follow the lock release. Prior to PostgreSQL 9.5, this+ * was the caller's responsibility, which meant that callers had to use+ * volatile-qualified pointers to refer to both the spinlock itself and the+ * shared data being accessed within the spinlocked critical section. This+ * was notationally awkward, easy to forget (and thus error-prone), and+ * prevented some useful compiler optimizations. For these reasons, we+ * now require that the macros themselves prevent compiler re-ordering,+ * so that the caller doesn't need to take special precautions.+ *+ * On platforms with weak memory ordering, the TAS(), TAS_SPIN(), and+ * S_UNLOCK() macros must further include hardware-level memory fence+ * instructions to prevent similar re-ordering at the hardware level.+ * TAS() and TAS_SPIN() must guarantee that loads and stores issued after+ * the macro are not executed until the lock has been obtained. Conversely,+ * S_UNLOCK() must guarantee that loads and stores issued before the macro+ * have been executed before the lock is released.+ *+ * On most supported platforms, TAS() uses a tas() function written+ * in assembly language to execute a hardware atomic-test-and-set+ * instruction. Equivalent OS-supplied mutex routines could be used too.+ *+ * If no system-specific TAS() is available (ie, HAVE_SPINLOCKS is not+ * defined), then we fall back on an emulation that uses SysV semaphores+ * (see spin.c). This emulation will be MUCH MUCH slower than a proper TAS()+ * implementation, because of the cost of a kernel call per lock or unlock.+ * An old report is that Postgres spends around 40% of its time in semop(2)+ * when using the SysV semaphore code.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/storage/s_lock.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef S_LOCK_H+#define S_LOCK_H++#ifdef HAVE_SPINLOCKS /* skip spinlocks if requested */++#if defined(__GNUC__) || defined(__INTEL_COMPILER)+/*************************************************************************+ * All the gcc inlines+ * Gcc consistently defines the CPU as __cpu__.+ * Other compilers use __cpu or __cpu__ so we test for both in those cases.+ */++/*----------+ * Standard gcc asm format (assuming "volatile slock_t *lock"):++ __asm__ __volatile__(+ " instruction \n"+ " instruction \n"+ " instruction \n"+: "=r"(_res), "+m"(*lock) // return register, in/out lock value+: "r"(lock) // lock pointer, in input register+: "memory", "cc"); // show clobbered registers here++ * The output-operands list (after first colon) should always include+ * "+m"(*lock), whether or not the asm code actually refers to this+ * operand directly. This ensures that gcc believes the value in the+ * lock variable is used and set by the asm code. Also, the clobbers+ * list (after third colon) should always include "memory"; this prevents+ * gcc from thinking it can cache the values of shared-memory fields+ * across the asm code. Add "cc" if your asm code changes the condition+ * code register, and also list any temp registers the code uses.+ *----------+ */+++#ifdef __i386__ /* 32-bit i386 */+#define HAS_TEST_AND_SET++typedef unsigned char slock_t;++#define TAS(lock) tas(lock)++static __inline__ int+tas(volatile slock_t *lock)+{+ register slock_t _res = 1;++ /*+ * Use a non-locking test before asserting the bus lock. Note that the+ * extra test appears to be a small loss on some x86 platforms and a small+ * win on others; it's by no means clear that we should keep it.+ *+ * When this was last tested, we didn't have separate TAS() and TAS_SPIN()+ * macros. Nowadays it probably would be better to do a non-locking test+ * in TAS_SPIN() but not in TAS(), like on x86_64, but no-one's done the+ * testing to verify that. Without some empirical evidence, better to+ * leave it alone.+ */+ __asm__ __volatile__(+ " cmpb $0,%1 \n"+ " jne 1f \n"+ " lock \n"+ " xchgb %0,%1 \n"+ "1: \n"+: "+q"(_res), "+m"(*lock)+: /* no inputs */+: "memory", "cc");+ return (int) _res;+}++#define SPIN_DELAY() spin_delay()++static __inline__ void+spin_delay(void)+{+ /*+ * This sequence is equivalent to the PAUSE instruction ("rep" is+ * ignored by old IA32 processors if the following instruction is+ * not a string operation); the IA-32 Architecture Software+ * Developer's Manual, Vol. 3, Section 7.7.2 describes why using+ * PAUSE in the inner loop of a spin lock is necessary for good+ * performance:+ *+ * The PAUSE instruction improves the performance of IA-32+ * processors supporting Hyper-Threading Technology when+ * executing spin-wait loops and other routines where one+ * thread is accessing a shared lock or semaphore in a tight+ * polling loop. When executing a spin-wait loop, the+ * processor can suffer a severe performance penalty when+ * exiting the loop because it detects a possible memory order+ * violation and flushes the core processor's pipeline. The+ * PAUSE instruction provides a hint to the processor that the+ * code sequence is a spin-wait loop. The processor uses this+ * hint to avoid the memory order violation and prevent the+ * pipeline flush. In addition, the PAUSE instruction+ * de-pipelines the spin-wait loop to prevent it from+ * consuming execution resources excessively.+ */+ __asm__ __volatile__(+ " rep; nop \n");+}++#endif /* __i386__ */+++#ifdef __x86_64__ /* AMD Opteron, Intel EM64T */+#define HAS_TEST_AND_SET++typedef unsigned char slock_t;++#define TAS(lock) tas(lock)++/*+ * On Intel EM64T, it's a win to use a non-locking test before the xchg proper,+ * but only when spinning.+ *+ * See also Implementing Scalable Atomic Locks for Multi-Core Intel(tm) EM64T+ * and IA32, by Michael Chynoweth and Mary R. Lee. As of this writing, it is+ * available at:+ * http://software.intel.com/en-us/articles/implementing-scalable-atomic-locks-for-multi-core-intel-em64t-and-ia32-architectures+ */+#define TAS_SPIN(lock) (*(lock) ? 1 : TAS(lock))++static __inline__ int+tas(volatile slock_t *lock)+{+ register slock_t _res = 1;++ __asm__ __volatile__(+ " lock \n"+ " xchgb %0,%1 \n"+: "+q"(_res), "+m"(*lock)+: /* no inputs */+: "memory", "cc");+ return (int) _res;+}++#define SPIN_DELAY() spin_delay()++static __inline__ void+spin_delay(void)+{+ /*+ * Adding a PAUSE in the spin delay loop is demonstrably a no-op on+ * Opteron, but it may be of some use on EM64T, so we keep it.+ */+ __asm__ __volatile__(+ " rep; nop \n");+}++#endif /* __x86_64__ */+++#if defined(__ia64__) || defined(__ia64)+/*+ * Intel Itanium, gcc or Intel's compiler.+ *+ * Itanium has weak memory ordering, but we rely on the compiler to enforce+ * strict ordering of accesses to volatile data. In particular, while the+ * xchg instruction implicitly acts as a memory barrier with 'acquire'+ * semantics, we do not have an explicit memory fence instruction in the+ * S_UNLOCK macro. We use a regular assignment to clear the spinlock, and+ * trust that the compiler marks the generated store instruction with the+ * ".rel" opcode.+ *+ * Testing shows that assumption to hold on gcc, although I could not find+ * any explicit statement on that in the gcc manual. In Intel's compiler,+ * the -m[no-]serialize-volatile option controls that, and testing shows that+ * it is enabled by default.+ */+#define HAS_TEST_AND_SET++typedef unsigned int slock_t;++#define TAS(lock) tas(lock)++/* On IA64, it's a win to use a non-locking test before the xchg proper */+#define TAS_SPIN(lock) (*(lock) ? 1 : TAS(lock))++#ifndef __INTEL_COMPILER++static __inline__ int+tas(volatile slock_t *lock)+{+ long int ret;++ __asm__ __volatile__(+ " xchg4 %0=%1,%2 \n"+: "=r"(ret), "+m"(*lock)+: "r"(1)+: "memory");+ return (int) ret;+}++#else /* __INTEL_COMPILER */++static __inline__ int+tas(volatile slock_t *lock)+{+ int ret;++ ret = _InterlockedExchange(lock,1); /* this is a xchg asm macro */++ return ret;+}++#endif /* __INTEL_COMPILER */+#endif /* __ia64__ || __ia64 */++/*+ * On ARM and ARM64, we use __sync_lock_test_and_set(int *, int) if available.+ *+ * We use the int-width variant of the builtin because it works on more chips+ * than other widths.+ */+#if defined(__arm__) || defined(__arm) || defined(__aarch64__) || defined(__aarch64)+#ifdef HAVE_GCC__SYNC_INT32_TAS+#define HAS_TEST_AND_SET++#define TAS(lock) tas(lock)++typedef int slock_t;++static __inline__ int+tas(volatile slock_t *lock)+{+ return __sync_lock_test_and_set(lock, 1);+}++#define S_UNLOCK(lock) __sync_lock_release(lock)++#endif /* HAVE_GCC__SYNC_INT32_TAS */+#endif /* __arm__ || __arm || __aarch64__ || __aarch64 */+++/* S/390 and S/390x Linux (32- and 64-bit zSeries) */+#if defined(__s390__) || defined(__s390x__)+#define HAS_TEST_AND_SET++typedef unsigned int slock_t;++#define TAS(lock) tas(lock)++static __inline__ int+tas(volatile slock_t *lock)+{+ int _res = 0;++ __asm__ __volatile__(+ " cs %0,%3,0(%2) \n"+: "+d"(_res), "+m"(*lock)+: "a"(lock), "d"(1)+: "memory", "cc");+ return _res;+}++#endif /* __s390__ || __s390x__ */+++#if defined(__sparc__) /* Sparc */+/*+ * Solaris has always run sparc processors in TSO (total store) mode, but+ * linux didn't use to and the *BSDs still don't. So, be careful about+ * acquire/release semantics. The CPU will treat superfluous membars as+ * NOPs, so it's just code space.+ */+#define HAS_TEST_AND_SET++typedef unsigned char slock_t;++#define TAS(lock) tas(lock)++static __inline__ int+tas(volatile slock_t *lock)+{+ register slock_t _res;++ /*+ * See comment in /pg/backend/port/tas/solaris_sparc.s for why this+ * uses "ldstub", and that file uses "cas". gcc currently generates+ * sparcv7-targeted binaries, so "cas" use isn't possible.+ */+ __asm__ __volatile__(+ " ldstub [%2], %0 \n"+: "=r"(_res), "+m"(*lock)+: "r"(lock)+: "memory");+#if defined(__sparcv7) || defined(__sparc_v7__)+ /*+ * No stbar or membar available, luckily no actually produced hardware+ * requires a barrier.+ */+#elif defined(__sparcv8) || defined(__sparc_v8__)+ /* stbar is available (and required for both PSO, RMO), membar isn't */+ __asm__ __volatile__ ("stbar \n":::"memory");+#else+ /*+ * #LoadStore (RMO) | #LoadLoad (RMO) together are the appropriate acquire+ * barrier for sparcv8+ upwards.+ */+ __asm__ __volatile__ ("membar #LoadStore | #LoadLoad \n":::"memory");+#endif+ return (int) _res;+}++#if defined(__sparcv7) || defined(__sparc_v7__)+/*+ * No stbar or membar available, luckily no actually produced hardware+ * requires a barrier. We fall through to the default gcc definition of+ * S_UNLOCK in this case.+ */+#elif defined(__sparcv8) || defined(__sparc_v8__)+/* stbar is available (and required for both PSO, RMO), membar isn't */+#define S_UNLOCK(lock) \+do \+{ \+ __asm__ __volatile__ ("stbar \n":::"memory"); \+ *((volatile slock_t *) (lock)) = 0; \+} while (0)+#else+/*+ * #LoadStore (RMO) | #StoreStore (RMO, PSO) together are the appropriate+ * release barrier for sparcv8+ upwards.+ */+#define S_UNLOCK(lock) \+do \+{ \+ __asm__ __volatile__ ("membar #LoadStore | #StoreStore \n":::"memory"); \+ *((volatile slock_t *) (lock)) = 0; \+} while (0)+#endif++#endif /* __sparc__ */+++/* PowerPC */+#if defined(__ppc__) || defined(__powerpc__) || defined(__ppc64__) || defined(__powerpc64__)+#define HAS_TEST_AND_SET++typedef unsigned int slock_t;++#define TAS(lock) tas(lock)++/* On PPC, it's a win to use a non-locking test before the lwarx */+#define TAS_SPIN(lock) (*(lock) ? 1 : TAS(lock))++/*+ * NOTE: per the Enhanced PowerPC Architecture manual, v1.0 dated 7-May-2002,+ * an isync is a sufficient synchronization barrier after a lwarx/stwcx loop.+ * On newer machines, we can use lwsync instead for better performance.+ *+ * Ordinarily, we'd code the branches here using GNU-style local symbols, that+ * is "1f" referencing "1:" and so on. But some people run gcc on AIX with+ * IBM's assembler as backend, and IBM's assembler doesn't do local symbols.+ * So hand-code the branch offsets; fortunately, all PPC instructions are+ * exactly 4 bytes each, so it's not too hard to count.+ */+static __inline__ int+tas(volatile slock_t *lock)+{+ slock_t _t;+ int _res;++ __asm__ __volatile__(+#ifdef USE_PPC_LWARX_MUTEX_HINT+" lwarx %0,0,%3,1 \n"+#else+" lwarx %0,0,%3 \n"+#endif+" cmpwi %0,0 \n"+" bne $+16 \n" /* branch to li %1,1 */+" addi %0,%0,1 \n"+" stwcx. %0,0,%3 \n"+" beq $+12 \n" /* branch to lwsync/isync */+" li %1,1 \n"+" b $+12 \n" /* branch to end of asm sequence */+#ifdef USE_PPC_LWSYNC+" lwsync \n"+#else+" isync \n"+#endif+" li %1,0 \n"++: "=&r"(_t), "=r"(_res), "+m"(*lock)+: "r"(lock)+: "memory", "cc");+ return _res;+}++/*+ * PowerPC S_UNLOCK is almost standard but requires a "sync" instruction.+ * On newer machines, we can use lwsync instead for better performance.+ */+#ifdef USE_PPC_LWSYNC+#define S_UNLOCK(lock) \+do \+{ \+ __asm__ __volatile__ (" lwsync \n" ::: "memory"); \+ *((volatile slock_t *) (lock)) = 0; \+} while (0)+#else+#define S_UNLOCK(lock) \+do \+{ \+ __asm__ __volatile__ (" sync \n" ::: "memory"); \+ *((volatile slock_t *) (lock)) = 0; \+} while (0)+#endif /* USE_PPC_LWSYNC */++#endif /* powerpc */+++/* Linux Motorola 68k */+#if (defined(__mc68000__) || defined(__m68k__)) && defined(__linux__)+#define HAS_TEST_AND_SET++typedef unsigned char slock_t;++#define TAS(lock) tas(lock)++static __inline__ int+tas(volatile slock_t *lock)+{+ register int rv;++ __asm__ __volatile__(+ " clrl %0 \n"+ " tas %1 \n"+ " sne %0 \n"+: "=d"(rv), "+m"(*lock)+: /* no inputs */+: "memory", "cc");+ return rv;+}++#endif /* (__mc68000__ || __m68k__) && __linux__ */+++/*+ * VAXen -- even multiprocessor ones+ * (thanks to Tom Ivar Helbekkmo)+ */+#if defined(__vax__)+#define HAS_TEST_AND_SET++typedef unsigned char slock_t;++#define TAS(lock) tas(lock)++static __inline__ int+tas(volatile slock_t *lock)+{+ register int _res;++ __asm__ __volatile__(+ " movl $1, %0 \n"+ " bbssi $0, (%2), 1f \n"+ " clrl %0 \n"+ "1: \n"+: "=&r"(_res), "+m"(*lock)+: "r"(lock)+: "memory");+ return _res;+}++#endif /* __vax__ */+++#if defined(__mips__) && !defined(__sgi) /* non-SGI MIPS */+/* Note: on SGI we use the OS' mutex ABI, see below */+/* Note: R10000 processors require a separate SYNC */+#define HAS_TEST_AND_SET++typedef unsigned int slock_t;++#define TAS(lock) tas(lock)++static __inline__ int+tas(volatile slock_t *lock)+{+ register volatile slock_t *_l = lock;+ register int _res;+ register int _tmp;++ __asm__ __volatile__(+ " .set push \n"+ " .set mips2 \n"+ " .set noreorder \n"+ " .set nomacro \n"+ " ll %0, %2 \n"+ " or %1, %0, 1 \n"+ " sc %1, %2 \n"+ " xori %1, 1 \n"+ " or %0, %0, %1 \n"+ " sync \n"+ " .set pop "+: "=&r" (_res), "=&r" (_tmp), "+R" (*_l)+: /* no inputs */+: "memory");+ return _res;+}++/* MIPS S_UNLOCK is almost standard but requires a "sync" instruction */+#define S_UNLOCK(lock) \+do \+{ \+ __asm__ __volatile__( \+ " .set push \n" \+ " .set mips2 \n" \+ " .set noreorder \n" \+ " .set nomacro \n" \+ " sync \n" \+ " .set pop " \+: /* no outputs */ \+: /* no inputs */ \+: "memory"); \+ *((volatile slock_t *) (lock)) = 0; \+} while (0)++#endif /* __mips__ && !__sgi */+++#if defined(__m32r__) && defined(HAVE_SYS_TAS_H) /* Renesas' M32R */+#define HAS_TEST_AND_SET++#include <sys/tas.h>++typedef int slock_t;++#define TAS(lock) tas(lock)++#endif /* __m32r__ */+++#if defined(__sh__) /* Renesas' SuperH */+#define HAS_TEST_AND_SET++typedef unsigned char slock_t;++#define TAS(lock) tas(lock)++static __inline__ int+tas(volatile slock_t *lock)+{+ register int _res;++ /*+ * This asm is coded as if %0 could be any register, but actually SuperH+ * restricts the target of xor-immediate to be R0. That's handled by+ * the "z" constraint on _res.+ */+ __asm__ __volatile__(+ " tas.b @%2 \n"+ " movt %0 \n"+ " xor #1,%0 \n"+: "=z"(_res), "+m"(*lock)+: "r"(lock)+: "memory", "t");+ return _res;+}++#endif /* __sh__ */+++/* These live in s_lock.c, but only for gcc */+++#if defined(__m68k__) && !defined(__linux__) /* non-Linux Motorola 68k */+#define HAS_TEST_AND_SET++typedef unsigned char slock_t;+#endif++/*+ * Note that this implementation is unsafe for any platform that can speculate+ * a memory access (either load or store) after a following store. That+ * happens not to be possible x86 and most legacy architectures (some are+ * single-processor!), but many modern systems have weaker memory ordering.+ * Those that do must define their own version S_UNLOCK() rather than relying+ * on this one.+ */+#if !defined(S_UNLOCK)+#if defined(__INTEL_COMPILER)+#define S_UNLOCK(lock) \+ do { __memory_barrier(); *(lock) = 0; } while (0)+#else+#define S_UNLOCK(lock) \+ do { __asm__ __volatile__("" : : : "memory"); *(lock) = 0; } while (0)+#endif+#endif++#endif /* defined(__GNUC__) || defined(__INTEL_COMPILER) */++++/*+ * ---------------------------------------------------------------------+ * Platforms that use non-gcc inline assembly:+ * ---------------------------------------------------------------------+ */++#if !defined(HAS_TEST_AND_SET) /* We didn't trigger above, let's try here */+++#if defined(USE_UNIVEL_CC) /* Unixware compiler */+#define HAS_TEST_AND_SET++typedef unsigned char slock_t;++#define TAS(lock) tas(lock)++asm int+tas(volatile slock_t *s_lock)+{+/* UNIVEL wants %mem in column 1, so we don't pg_indent this file */+%mem s_lock+ pushl %ebx+ movl s_lock, %ebx+ movl $255, %eax+ lock+ xchgb %al, (%ebx)+ popl %ebx+}++#endif /* defined(USE_UNIVEL_CC) */+++#if defined(__hppa) || defined(__hppa__) /* HP PA-RISC, GCC and HP compilers */+/*+ * HP's PA-RISC+ *+ * See src/backend/port/hpux/tas.c.template for details about LDCWX. Because+ * LDCWX requires a 16-byte-aligned address, we declare slock_t as a 16-byte+ * struct. The active word in the struct is whichever has the aligned address;+ * the other three words just sit at -1.+ *+ * When using gcc, we can inline the required assembly code.+ */+#define HAS_TEST_AND_SET++typedef struct+{+ int sema[4];+} slock_t;++#define TAS_ACTIVE_WORD(lock) ((volatile int *) (((uintptr_t) (lock) + 15) & ~15))++#if defined(__GNUC__)++static __inline__ int+tas(volatile slock_t *lock)+{+ volatile int *lockword = TAS_ACTIVE_WORD(lock);+ register int lockval;++ __asm__ __volatile__(+ " ldcwx 0(0,%2),%0 \n"+: "=r"(lockval), "+m"(*lockword)+: "r"(lockword)+: "memory");+ return (lockval == 0);+}++/*+ * The hppa implementation doesn't follow the rules of this files and provides+ * a gcc specific implementation outside of the above defined(__GNUC__). It+ * does so to avoid duplication between the HP compiler and gcc. So undefine+ * the generic fallback S_UNLOCK from above.+ */+#ifdef S_UNLOCK+#undef S_UNLOCK+#endif+#define S_UNLOCK(lock) \+ do { \+ __asm__ __volatile__("" : : : "memory"); \+ *TAS_ACTIVE_WORD(lock) = -1; \+ } while (0)++#endif /* __GNUC__ */++#define S_INIT_LOCK(lock) \+ do { \+ volatile slock_t *lock_ = (lock); \+ lock_->sema[0] = -1; \+ lock_->sema[1] = -1; \+ lock_->sema[2] = -1; \+ lock_->sema[3] = -1; \+ } while (0)++#define S_LOCK_FREE(lock) (*TAS_ACTIVE_WORD(lock) != 0)++#endif /* __hppa || __hppa__ */+++#if defined(__hpux) && defined(__ia64) && !defined(__GNUC__)+/*+ * HP-UX on Itanium, non-gcc compiler+ *+ * We assume that the compiler enforces strict ordering of loads/stores on+ * volatile data (see comments on the gcc-version earlier in this file).+ * Note that this assumption does *not* hold if you use the+ * +Ovolatile=__unordered option on the HP-UX compiler, so don't do that.+ *+ * See also Implementing Spinlocks on the Intel Itanium Architecture and+ * PA-RISC, by Tor Ekqvist and David Graves, for more information. As of+ * this writing, version 1.0 of the manual is available at:+ * http://h21007.www2.hp.com/portal/download/files/unprot/itanium/spinlocks.pdf+ */+#define HAS_TEST_AND_SET++typedef unsigned int slock_t;++#include <ia64/sys/inline.h>+#define TAS(lock) _Asm_xchg(_SZ_W, lock, 1, _LDHINT_NONE)+/* On IA64, it's a win to use a non-locking test before the xchg proper */+#define TAS_SPIN(lock) (*(lock) ? 1 : TAS(lock))+#define S_UNLOCK(lock) \+ do { _Asm_mf(); (*(lock)) = 0; } while (0)++#endif /* HPUX on IA64, non gcc */++#if defined(_AIX) /* AIX */+/*+ * AIX (POWER)+ */+#define HAS_TEST_AND_SET++#include <sys/atomic_op.h>++typedef int slock_t;++#define TAS(lock) _check_lock((slock_t *) (lock), 0, 1)+#define S_UNLOCK(lock) _clear_lock((slock_t *) (lock), 0)+#endif /* _AIX */+++/* These are in sunstudio_(sparc|x86).s */++#if defined(__SUNPRO_C) && (defined(__i386) || defined(__x86_64__) || defined(__sparc__) || defined(__sparc))+#define HAS_TEST_AND_SET++#if defined(__i386) || defined(__x86_64__) || defined(__sparcv9) || defined(__sparcv8plus)+typedef unsigned int slock_t;+#else+typedef unsigned char slock_t;+#endif++extern slock_t pg_atomic_cas(volatile slock_t *lock, slock_t with,+ slock_t cmp);++#define TAS(a) (pg_atomic_cas((a), 1, 0) != 0)+#endif+++#ifdef WIN32_ONLY_COMPILER+typedef LONG slock_t;++#define HAS_TEST_AND_SET+#define TAS(lock) (InterlockedCompareExchange(lock, 1, 0))++#define SPIN_DELAY() spin_delay()++/* If using Visual C++ on Win64, inline assembly is unavailable.+ * Use a _mm_pause instrinsic instead of rep nop.+ */+#if defined(_WIN64)+static __forceinline void+spin_delay(void)+{+ _mm_pause();+}+#else+static __forceinline void+spin_delay(void)+{+ /* See comment for gcc code. Same code, MASM syntax */+ __asm rep nop;+}+#endif++#include <intrin.h>+#pragma intrinsic(_ReadWriteBarrier)++#define S_UNLOCK(lock) \+ do { _ReadWriteBarrier(); (*(lock)) = 0; } while (0)++#endif+++#endif /* !defined(HAS_TEST_AND_SET) */+++/* Blow up if we didn't have any way to do spinlocks */+#ifndef HAS_TEST_AND_SET+#error PostgreSQL does not have native spinlock support on this platform. To continue the compilation, rerun configure using --disable-spinlocks. However, performance will be poor. Please report this to pgsql-bugs@postgresql.org.+#endif+++#else /* !HAVE_SPINLOCKS */+++/*+ * Fake spinlock implementation using semaphores --- slow and prone+ * to fall foul of kernel limits on number of semaphores, so don't use this+ * unless you must! The subroutines appear in spin.c.+ */+typedef int slock_t;++extern bool s_lock_free_sema(volatile slock_t *lock);+extern void s_unlock_sema(volatile slock_t *lock);+extern void s_init_lock_sema(volatile slock_t *lock, bool nested);+extern int tas_sema(volatile slock_t *lock);++#define S_LOCK_FREE(lock) s_lock_free_sema(lock)+#define S_UNLOCK(lock) s_unlock_sema(lock)+#define S_INIT_LOCK(lock) s_init_lock_sema(lock, false)+#define TAS(lock) tas_sema(lock)+++#endif /* HAVE_SPINLOCKS */+++/*+ * Default Definitions - override these above as needed.+ */++#if !defined(S_LOCK)+#define S_LOCK(lock) \+ (TAS(lock) ? s_lock((lock), __FILE__, __LINE__) : 0)+#endif /* S_LOCK */++#if !defined(S_LOCK_FREE)+#define S_LOCK_FREE(lock) (*(lock) == 0)+#endif /* S_LOCK_FREE */++#if !defined(S_UNLOCK)+/*+ * Our default implementation of S_UNLOCK is essentially *(lock) = 0. This+ * is unsafe if the platform can speculate a memory access (either load or+ * store) after a following store; platforms where this is possible must+ * define their own S_UNLOCK. But CPU reordering is not the only concern:+ * if we simply defined S_UNLOCK() as an inline macro, the compiler might+ * reorder instructions from inside the critical section to occur after the+ * lock release. Since the compiler probably can't know what the external+ * function s_unlock is doing, putting the same logic there should be adequate.+ * A sufficiently-smart globally optimizing compiler could break that+ * assumption, though, and the cost of a function call for every spinlock+ * release may hurt performance significantly, so we use this implementation+ * only for platforms where we don't know of a suitable intrinsic. For the+ * most part, those are relatively obscure platform/compiler combinations to+ * which the PostgreSQL project does not have access.+ */+#define USE_DEFAULT_S_UNLOCK+extern void s_unlock(volatile slock_t *lock);+#define S_UNLOCK(lock) s_unlock(lock)+#endif /* S_UNLOCK */++#if !defined(S_INIT_LOCK)+#define S_INIT_LOCK(lock) S_UNLOCK(lock)+#endif /* S_INIT_LOCK */++#if !defined(SPIN_DELAY)+#define SPIN_DELAY() ((void) 0)+#endif /* SPIN_DELAY */++#if !defined(TAS)+extern int tas(volatile slock_t *lock); /* in port/.../tas.s, or+ * s_lock.c */++#define TAS(lock) tas(lock)+#endif /* TAS */++#if !defined(TAS_SPIN)+#define TAS_SPIN(lock) TAS(lock)+#endif /* TAS_SPIN */++extern slock_t dummy_spinlock;++/*+ * Platform-independent out-of-line support routines+ */+extern int s_lock(volatile slock_t *lock, const char *file, int line);++/* Support for dynamic adjustment of spins_per_delay */+#define DEFAULT_SPINS_PER_DELAY 100++extern void set_spins_per_delay(int shared_spins_per_delay);+extern int update_spins_per_delay(int shared_spins_per_delay);++#endif /* S_LOCK_H */
+ foreign/libpg_query/src/postgres/include/storage/shm_mq.h view
@@ -0,0 +1,85 @@+/*-------------------------------------------------------------------------+ *+ * shm_mq.h+ * single-reader, single-writer shared memory message queue+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/storage/shm_mq.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef SHM_MQ_H+#define SHM_MQ_H++#include "postmaster/bgworker.h"+#include "storage/dsm.h"+#include "storage/proc.h"++/* The queue itself, in shared memory. */+struct shm_mq;+typedef struct shm_mq shm_mq;++/* Backend-private state. */+struct shm_mq_handle;+typedef struct shm_mq_handle shm_mq_handle;++/* Descriptors for a single write spanning multiple locations. */+typedef struct+{+ const char *data;+ Size len;+} shm_mq_iovec;++/* Possible results of a send or receive operation. */+typedef enum+{+ SHM_MQ_SUCCESS, /* Sent or received a message. */+ SHM_MQ_WOULD_BLOCK, /* Not completed; retry later. */+ SHM_MQ_DETACHED /* Other process has detached queue. */+} shm_mq_result;++/*+ * Primitives to create a queue and set the sender and receiver.+ *+ * Both the sender and the receiver must be set before any messages are read+ * or written, but they need not be set by the same process. Each must be+ * set exactly once.+ */+extern shm_mq *shm_mq_create(void *address, Size size);+extern void shm_mq_set_receiver(shm_mq *mq, PGPROC *);+extern void shm_mq_set_sender(shm_mq *mq, PGPROC *);++/* Accessor methods for sender and receiver. */+extern PGPROC *shm_mq_get_receiver(shm_mq *);+extern PGPROC *shm_mq_get_sender(shm_mq *);++/* Set up backend-local queue state. */+extern shm_mq_handle *shm_mq_attach(shm_mq *mq, dsm_segment *seg,+ BackgroundWorkerHandle *handle);++/* Associate worker handle with shm_mq. */+extern void shm_mq_set_handle(shm_mq_handle *, BackgroundWorkerHandle *);++/* Break connection. */+extern void shm_mq_detach(shm_mq *);++/* Get the shm_mq from handle. */+extern shm_mq *shm_mq_get_queue(shm_mq_handle *mqh);++/* Send or receive messages. */+extern shm_mq_result shm_mq_send(shm_mq_handle *mqh,+ Size nbytes, const void *data, bool nowait);+extern shm_mq_result shm_mq_sendv(shm_mq_handle *mqh,+ shm_mq_iovec *iov, int iovcnt, bool nowait);+extern shm_mq_result shm_mq_receive(shm_mq_handle *mqh,+ Size *nbytesp, void **datap, bool nowait);++/* Wait for our counterparty to attach to the queue. */+extern shm_mq_result shm_mq_wait_for_attach(shm_mq_handle *mqh);++/* Smallest possible queue. */+extern PGDLLIMPORT const Size shm_mq_minimum_size;++#endif /* SHM_MQ_H */
+ foreign/libpg_query/src/postgres/include/storage/shm_toc.h view
@@ -0,0 +1,57 @@+/*-------------------------------------------------------------------------+ *+ * shm_toc.h+ * shared memory segment table of contents+ *+ * This is intended to provide a simple way to divide a chunk of shared+ * memory (probably dynamic shared memory allocated via dsm_create) into+ * a number of regions and keep track of the addreses of those regions or+ * key data structures within those regions. This is not intended to+ * scale to a large number of keys and will perform poorly if used that+ * way; if you need a large number of pointers, store them within some+ * other data structure within the segment and only put the pointer to+ * the data structure itself in the table of contents.+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/storage/shm_toc.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef SHM_TOC_H+#define SHM_TOC_H++#include "storage/shmem.h"++struct shm_toc;+typedef struct shm_toc shm_toc;++extern shm_toc *shm_toc_create(uint64 magic, void *address, Size nbytes);+extern shm_toc *shm_toc_attach(uint64 magic, void *address);+extern void *shm_toc_allocate(shm_toc *toc, Size nbytes);+extern Size shm_toc_freespace(shm_toc *toc);+extern void shm_toc_insert(shm_toc *toc, uint64 key, void *address);+extern void *shm_toc_lookup(shm_toc *toc, uint64 key);++/*+ * Tools for estimating how large a chunk of shared memory will be needed+ * to store a TOC and its dependent objects.+ */+typedef struct+{+ Size space_for_chunks;+ Size number_of_keys;+} shm_toc_estimator;++#define shm_toc_initialize_estimator(e) \+ ((e)->space_for_chunks = 0, (e)->number_of_keys = 0)+#define shm_toc_estimate_chunk(e, sz) \+ ((e)->space_for_chunks = add_size((e)->space_for_chunks, \+ BUFFERALIGN((sz))))+#define shm_toc_estimate_keys(e, cnt) \+ ((e)->number_of_keys = add_size((e)->number_of_keys, (cnt)))++extern Size shm_toc_estimate(shm_toc_estimator *);++#endif /* SHM_TOC_H */
+ foreign/libpg_query/src/postgres/include/storage/shmem.h view
@@ -0,0 +1,78 @@+/*-------------------------------------------------------------------------+ *+ * shmem.h+ * shared memory management structures+ *+ * Historical note:+ * A long time ago, Postgres' shared memory region was allowed to be mapped+ * at a different address in each process, and shared memory "pointers" were+ * passed around as offsets relative to the start of the shared memory region.+ * That is no longer the case: each process must map the shared memory region+ * at the same address. This means shared memory pointers can be passed+ * around directly between different processes.+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/storage/shmem.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef SHMEM_H+#define SHMEM_H++#include "utils/hsearch.h"+++/* shmqueue.c */+typedef struct SHM_QUEUE+{+ struct SHM_QUEUE *prev;+ struct SHM_QUEUE *next;+} SHM_QUEUE;++/* shmem.c */+extern void InitShmemAccess(void *seghdr);+extern void InitShmemAllocation(void);+extern void *ShmemAlloc(Size size);+extern bool ShmemAddrIsValid(const void *addr);+extern void InitShmemIndex(void);+extern HTAB *ShmemInitHash(const char *name, long init_size, long max_size,+ HASHCTL *infoP, int hash_flags);+extern void *ShmemInitStruct(const char *name, Size size, bool *foundPtr);+extern Size add_size(Size s1, Size s2);+extern Size mul_size(Size s1, Size s2);++/* ipci.c */+extern void RequestAddinShmemSpace(Size size);++/* size constants for the shmem index table */+ /* max size of data structure string name */+#define SHMEM_INDEX_KEYSIZE (48)+ /* estimated size of the shmem index table (not a hard limit) */+#define SHMEM_INDEX_SIZE (64)++/* this is a hash bucket in the shmem index table */+typedef struct+{+ char key[SHMEM_INDEX_KEYSIZE]; /* string name */+ void *location; /* location in shared mem */+ Size size; /* # bytes allocated for the structure */+} ShmemIndexEnt;++/*+ * prototypes for functions in shmqueue.c+ */+extern void SHMQueueInit(SHM_QUEUE *queue);+extern void SHMQueueElemInit(SHM_QUEUE *queue);+extern void SHMQueueDelete(SHM_QUEUE *queue);+extern void SHMQueueInsertBefore(SHM_QUEUE *queue, SHM_QUEUE *elem);+extern void SHMQueueInsertAfter(SHM_QUEUE *queue, SHM_QUEUE *elem);+extern Pointer SHMQueueNext(const SHM_QUEUE *queue, const SHM_QUEUE *curElem,+ Size linkOffset);+extern Pointer SHMQueuePrev(const SHM_QUEUE *queue, const SHM_QUEUE *curElem,+ Size linkOffset);+extern bool SHMQueueEmpty(const SHM_QUEUE *queue);+extern bool SHMQueueIsDetached(const SHM_QUEUE *queue);++#endif /* SHMEM_H */
+ foreign/libpg_query/src/postgres/include/storage/sinval.h view
@@ -0,0 +1,153 @@+/*-------------------------------------------------------------------------+ *+ * sinval.h+ * POSTGRES shared cache invalidation communication definitions.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/storage/sinval.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef SINVAL_H+#define SINVAL_H++#include <signal.h>++#include "storage/relfilenode.h"++/*+ * We support several types of shared-invalidation messages:+ * * invalidate a specific tuple in a specific catcache+ * * invalidate all catcache entries from a given system catalog+ * * invalidate a relcache entry for a specific logical relation+ * * invalidate an smgr cache entry for a specific physical relation+ * * invalidate the mapped-relation mapping for a given database+ * * invalidate any saved snapshot that might be used to scan a given relation+ * More types could be added if needed. The message type is identified by+ * the first "int8" field of the message struct. Zero or positive means a+ * specific-catcache inval message (and also serves as the catcache ID field).+ * Negative values identify the other message types, as per codes below.+ *+ * Catcache inval events are initially driven by detecting tuple inserts,+ * updates and deletions in system catalogs (see CacheInvalidateHeapTuple).+ * An update can generate two inval events, one for the old tuple and one for+ * the new, but this is reduced to one event if the tuple's hash key doesn't+ * change. Note that the inval events themselves don't actually say whether+ * the tuple is being inserted or deleted. Also, since we transmit only a+ * hash key, there is a small risk of unnecessary invalidations due to chance+ * matches of hash keys.+ *+ * Note that some system catalogs have multiple caches on them (with different+ * indexes). On detecting a tuple invalidation in such a catalog, separate+ * catcache inval messages must be generated for each of its caches, since+ * the hash keys will generally be different.+ *+ * Catcache, relcache, and snapshot invalidations are transactional, and so+ * are sent to other backends upon commit. Internally to the generating+ * backend, they are also processed at CommandCounterIncrement so that later+ * commands in the same transaction see the new state. The generating backend+ * also has to process them at abort, to flush out any cache state it's loaded+ * from no-longer-valid entries.+ *+ * smgr and relation mapping invalidations are non-transactional: they are+ * sent immediately when the underlying file change is made.+ */++typedef struct+{+ int8 id; /* cache ID --- must be first */+ Oid dbId; /* database ID, or 0 if a shared relation */+ uint32 hashValue; /* hash value of key for this catcache */+} SharedInvalCatcacheMsg;++#define SHAREDINVALCATALOG_ID (-1)++typedef struct+{+ int8 id; /* type field --- must be first */+ Oid dbId; /* database ID, or 0 if a shared catalog */+ Oid catId; /* ID of catalog whose contents are invalid */+} SharedInvalCatalogMsg;++#define SHAREDINVALRELCACHE_ID (-2)++typedef struct+{+ int8 id; /* type field --- must be first */+ Oid dbId; /* database ID, or 0 if a shared relation */+ Oid relId; /* relation ID */+} SharedInvalRelcacheMsg;++#define SHAREDINVALSMGR_ID (-3)++typedef struct+{+ /* note: field layout chosen to pack into 16 bytes */+ int8 id; /* type field --- must be first */+ int8 backend_hi; /* high bits of backend ID, if temprel */+ uint16 backend_lo; /* low bits of backend ID, if temprel */+ RelFileNode rnode; /* spcNode, dbNode, relNode */+} SharedInvalSmgrMsg;++#define SHAREDINVALRELMAP_ID (-4)++typedef struct+{+ int8 id; /* type field --- must be first */+ Oid dbId; /* database ID, or 0 for shared catalogs */+} SharedInvalRelmapMsg;++#define SHAREDINVALSNAPSHOT_ID (-5)++typedef struct+{+ int8 id; /* type field --- must be first */+ Oid dbId; /* database ID, or 0 if a shared relation */+ Oid relId; /* relation ID */+} SharedInvalSnapshotMsg;++typedef union+{+ int8 id; /* type field --- must be first */+ SharedInvalCatcacheMsg cc;+ SharedInvalCatalogMsg cat;+ SharedInvalRelcacheMsg rc;+ SharedInvalSmgrMsg sm;+ SharedInvalRelmapMsg rm;+ SharedInvalSnapshotMsg sn;+} SharedInvalidationMessage;+++/* Counter of messages processed; don't worry about overflow. */+extern uint64 SharedInvalidMessageCounter;++extern volatile sig_atomic_t catchupInterruptPending;++extern void SendSharedInvalidMessages(const SharedInvalidationMessage *msgs,+ int n);+extern void ReceiveSharedInvalidMessages(+ void (*invalFunction) (SharedInvalidationMessage *msg),+ void (*resetFunction) (void));++/* signal handler for catchup events (PROCSIG_CATCHUP_INTERRUPT) */+extern void HandleCatchupInterrupt(void);++/*+ * enable/disable processing of catchup events directly from signal handler.+ * The enable routine first performs processing of any catchup events that+ * have occurred since the last disable.+ */+extern void ProcessCatchupInterrupt(void);++extern int xactGetCommittedInvalidationMessages(SharedInvalidationMessage **msgs,+ bool *RelcacheInitFileInval);+extern void ProcessCommittedInvalidationMessages(SharedInvalidationMessage *msgs,+ int nmsgs, bool RelcacheInitFileInval,+ Oid dbid, Oid tsid);++extern void LocalExecuteInvalidationMessage(SharedInvalidationMessage *msg);++#endif /* SINVAL_H */
+ foreign/libpg_query/src/postgres/include/storage/spin.h view
@@ -0,0 +1,77 @@+/*-------------------------------------------------------------------------+ *+ * spin.h+ * Hardware-independent implementation of spinlocks.+ *+ *+ * The hardware-independent interface to spinlocks is defined by the+ * typedef "slock_t" and these macros:+ *+ * void SpinLockInit(volatile slock_t *lock)+ * Initialize a spinlock (to the unlocked state).+ *+ * void SpinLockAcquire(volatile slock_t *lock)+ * Acquire a spinlock, waiting if necessary.+ * Time out and abort() if unable to acquire the lock in a+ * "reasonable" amount of time --- typically ~ 1 minute.+ *+ * void SpinLockRelease(volatile slock_t *lock)+ * Unlock a previously acquired lock.+ *+ * bool SpinLockFree(slock_t *lock)+ * Tests if the lock is free. Returns TRUE if free, FALSE if locked.+ * This does *not* change the state of the lock.+ *+ * Callers must beware that the macro argument may be evaluated multiple+ * times!+ *+ * Load and store operations in calling code are guaranteed not to be+ * reordered with respect to these operations, because they include a+ * compiler barrier. (Before PostgreSQL 9.5, callers needed to use a+ * volatile qualifier to access data protected by spinlocks.)+ *+ * Keep in mind the coding rule that spinlocks must not be held for more+ * than a few instructions. In particular, we assume it is not possible+ * for a CHECK_FOR_INTERRUPTS() to occur while holding a spinlock, and so+ * it is not necessary to do HOLD/RESUME_INTERRUPTS() in these macros.+ *+ * These macros are implemented in terms of hardware-dependent macros+ * supplied by s_lock.h. There is not currently any extra functionality+ * added by this header, but there has been in the past and may someday+ * be again.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/storage/spin.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef SPIN_H+#define SPIN_H++#include "storage/s_lock.h"+#ifndef HAVE_SPINLOCKS+#include "storage/pg_sema.h"+#endif+++#define SpinLockInit(lock) S_INIT_LOCK(lock)++#define SpinLockAcquire(lock) S_LOCK(lock)++#define SpinLockRelease(lock) S_UNLOCK(lock)++#define SpinLockFree(lock) S_LOCK_FREE(lock)+++extern int SpinlockSemas(void);+extern Size SpinlockSemaSize(void);++#ifndef HAVE_SPINLOCKS+extern void SpinlockSemaInit(PGSemaphore);+extern PGSemaphore SpinlockSemaArray;+#endif++#endif /* SPIN_H */
+ foreign/libpg_query/src/postgres/include/storage/standby.h view
@@ -0,0 +1,120 @@+/*-------------------------------------------------------------------------+ *+ * standby.h+ * Definitions for hot standby mode.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/storage/standby.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef STANDBY_H+#define STANDBY_H++#include "access/xlogreader.h"+#include "lib/stringinfo.h"+#include "storage/lock.h"+#include "storage/procsignal.h"+#include "storage/relfilenode.h"++/* User-settable GUC parameters */+extern int vacuum_defer_cleanup_age;+extern int max_standby_archive_delay;+extern int max_standby_streaming_delay;++extern void InitRecoveryTransactionEnvironment(void);+extern void ShutdownRecoveryTransactionEnvironment(void);++extern void ResolveRecoveryConflictWithSnapshot(TransactionId latestRemovedXid,+ RelFileNode node);+extern void ResolveRecoveryConflictWithTablespace(Oid tsid);+extern void ResolveRecoveryConflictWithDatabase(Oid dbid);++extern void ResolveRecoveryConflictWithBufferPin(void);+extern void CheckRecoveryConflictDeadlock(void);+extern void StandbyDeadLockHandler(void);+extern void StandbyTimeoutHandler(void);++/*+ * Standby Rmgr (RM_STANDBY_ID)+ *+ * Standby recovery manager exists to perform actions that are required+ * to make hot standby work. That includes logging AccessExclusiveLocks taken+ * by transactions and running-xacts snapshots.+ */+extern void StandbyAcquireAccessExclusiveLock(TransactionId xid, Oid dbOid, Oid relOid);+extern void StandbyReleaseLockTree(TransactionId xid,+ int nsubxids, TransactionId *subxids);+extern void StandbyReleaseAllLocks(void);+extern void StandbyReleaseOldLocks(int nxids, TransactionId *xids);++/*+ * XLOG message types+ */+#define XLOG_STANDBY_LOCK 0x00+#define XLOG_RUNNING_XACTS 0x10++typedef struct xl_standby_locks+{+ int nlocks; /* number of entries in locks array */+ xl_standby_lock locks[FLEXIBLE_ARRAY_MEMBER];+} xl_standby_locks;++/*+ * When we write running xact data to WAL, we use this structure.+ */+typedef struct xl_running_xacts+{+ int xcnt; /* # of xact ids in xids[] */+ int subxcnt; /* # of subxact ids in xids[] */+ bool subxid_overflow; /* snapshot overflowed, subxids missing */+ TransactionId nextXid; /* copy of ShmemVariableCache->nextXid */+ TransactionId oldestRunningXid; /* *not* oldestXmin */+ TransactionId latestCompletedXid; /* so we can set xmax */++ TransactionId xids[FLEXIBLE_ARRAY_MEMBER];+} xl_running_xacts;++#define MinSizeOfXactRunningXacts offsetof(xl_running_xacts, xids)+++/* Recovery handlers for the Standby Rmgr (RM_STANDBY_ID) */+extern void standby_redo(XLogReaderState *record);+extern void standby_desc(StringInfo buf, XLogReaderState *record);+extern const char *standby_identify(uint8 info);++/*+ * Declarations for GetRunningTransactionData(). Similar to Snapshots, but+ * not quite. This has nothing at all to do with visibility on this server,+ * so this is completely separate from snapmgr.c and snapmgr.h.+ * This data is important for creating the initial snapshot state on a+ * standby server. We need lots more information than a normal snapshot,+ * hence we use a specific data structure for our needs. This data+ * is written to WAL as a separate record immediately after each+ * checkpoint. That means that wherever we start a standby from we will+ * almost immediately see the data we need to begin executing queries.+ */++typedef struct RunningTransactionsData+{+ int xcnt; /* # of xact ids in xids[] */+ int subxcnt; /* # of subxact ids in xids[] */+ bool subxid_overflow; /* snapshot overflowed, subxids missing */+ TransactionId nextXid; /* copy of ShmemVariableCache->nextXid */+ TransactionId oldestRunningXid; /* *not* oldestXmin */+ TransactionId latestCompletedXid; /* so we can set xmax */++ TransactionId *xids; /* array of (sub)xids still running */+} RunningTransactionsData;++typedef RunningTransactionsData *RunningTransactions;++extern void LogAccessExclusiveLock(Oid dbOid, Oid relOid);+extern void LogAccessExclusiveLockPrepare(void);++extern XLogRecPtr LogStandbySnapshot(void);++#endif /* STANDBY_H */
+ foreign/libpg_query/src/postgres/include/tcop/deparse_utility.h view
@@ -0,0 +1,105 @@+/*-------------------------------------------------------------------------+ *+ * deparse_utility.h+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/tcop/deparse_utility.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef DEPARSE_UTILITY_H+#define DEPARSE_UTILITY_H++#include "access/attnum.h"+#include "catalog/objectaddress.h"+#include "nodes/nodes.h"+#include "utils/aclchk_internal.h"+++/*+ * Support for keeping track of collected commands.+ */+typedef enum CollectedCommandType+{+ SCT_Simple,+ SCT_AlterTable,+ SCT_Grant,+ SCT_AlterOpFamily,+ SCT_AlterDefaultPrivileges,+ SCT_CreateOpClass,+ SCT_AlterTSConfig+} CollectedCommandType;++/*+ * For ALTER TABLE commands, we keep a list of the subcommands therein.+ */+typedef struct CollectedATSubcmd+{+ ObjectAddress address; /* affected column, constraint, index, ... */+ Node *parsetree;+} CollectedATSubcmd;++typedef struct CollectedCommand+{+ CollectedCommandType type;+ bool in_extension;+ Node *parsetree;++ union+ {+ /* most commands */+ struct+ {+ ObjectAddress address;+ ObjectAddress secondaryObject;+ } simple;++ /* ALTER TABLE, and internal uses thereof */+ struct+ {+ Oid objectId;+ Oid classId;+ List *subcmds;+ } alterTable;++ /* GRANT / REVOKE */+ struct+ {+ InternalGrant *istmt;+ } grant;++ /* ALTER OPERATOR FAMILY */+ struct+ {+ ObjectAddress address;+ List *operators;+ List *procedures;+ } opfam;++ /* CREATE OPERATOR CLASS */+ struct+ {+ ObjectAddress address;+ List *operators;+ List *procedures;+ } createopc;++ /* ALTER TEXT SEARCH CONFIGURATION ADD/ALTER/DROP MAPPING */+ struct+ {+ ObjectAddress address;+ Oid *dictIds;+ int ndicts;+ } atscfg;++ /* ALTER DEFAULT PRIVILEGES */+ struct+ {+ GrantObjectType objtype;+ } defprivs;+ } d;+} CollectedCommand;++#endif /* DEPARSE_UTILITY_H */
+ foreign/libpg_query/src/postgres/include/tcop/dest.h view
@@ -0,0 +1,141 @@+/*-------------------------------------------------------------------------+ *+ * dest.h+ * support for communication destinations+ *+ * Whenever the backend executes a query that returns tuples, the results+ * have to go someplace. For example:+ *+ * - stdout is the destination only when we are running a+ * standalone backend (no postmaster) and are returning results+ * back to an interactive user.+ *+ * - a remote process is the destination when we are+ * running a backend with a frontend and the frontend executes+ * PQexec() or PQfn(). In this case, the results are sent+ * to the frontend via the functions in backend/libpq.+ *+ * - DestNone is the destination when the system executes+ * a query internally. The results are discarded.+ *+ * dest.c defines three functions that implement destination management:+ *+ * BeginCommand: initialize the destination at start of command.+ * CreateDestReceiver: return a pointer to a struct of destination-specific+ * receiver functions.+ * EndCommand: clean up the destination at end of command.+ *+ * BeginCommand/EndCommand are executed once per received SQL query.+ *+ * CreateDestReceiver returns a receiver object appropriate to the specified+ * destination. The executor, as well as utility statements that can return+ * tuples, are passed the resulting DestReceiver* pointer. Each executor run+ * or utility execution calls the receiver's rStartup method, then the+ * receiveSlot method (zero or more times), then the rShutdown method.+ * The same receiver object may be re-used multiple times; eventually it is+ * destroyed by calling its rDestroy method.+ *+ * In some cases, receiver objects require additional parameters that must+ * be passed to them after calling CreateDestReceiver. Since the set of+ * parameters varies for different receiver types, this is not handled by+ * this module, but by direct calls from the calling code to receiver type+ * specific functions.+ *+ * The DestReceiver object returned by CreateDestReceiver may be a statically+ * allocated object (for destination types that require no local state),+ * in which case rDestroy is a no-op. Alternatively it can be a palloc'd+ * object that has DestReceiver as its first field and contains additional+ * fields (see printtup.c for an example). These additional fields are then+ * accessible to the DestReceiver functions by casting the DestReceiver*+ * pointer passed to them. The palloc'd object is pfree'd by the rDestroy+ * method. Note that the caller of CreateDestReceiver should take care to+ * do so in a memory context that is long-lived enough for the receiver+ * object not to disappear while still needed.+ *+ * Special provision: None_Receiver is a permanently available receiver+ * object for the DestNone destination. This avoids useless creation/destroy+ * calls in portal and cursor manipulations.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/tcop/dest.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef DEST_H+#define DEST_H++#include "executor/tuptable.h"+++/* buffer size to use for command completion tags */+#define COMPLETION_TAG_BUFSIZE 64+++/* ----------------+ * CommandDest is a simplistic means of identifying the desired+ * destination. Someday this will probably need to be improved.+ *+ * Note: only the values DestNone, DestDebug, DestRemote are legal for the+ * global variable whereToSendOutput. The other values may be used+ * as the destination for individual commands.+ * ----------------+ */+typedef enum+{+ DestNone, /* results are discarded */+ DestDebug, /* results go to debugging output */+ DestRemote, /* results sent to frontend process */+ DestRemoteExecute, /* sent to frontend, in Execute command */+ DestSPI, /* results sent to SPI manager */+ DestTuplestore, /* results sent to Tuplestore */+ DestIntoRel, /* results sent to relation (SELECT INTO) */+ DestCopyOut, /* results sent to COPY TO code */+ DestSQLFunction, /* results sent to SQL-language func mgr */+ DestTransientRel /* results sent to transient relation */+} CommandDest;++/* ----------------+ * DestReceiver is a base type for destination-specific local state.+ * In the simplest cases, there is no state info, just the function+ * pointers that the executor must call.+ *+ * Note: the receiveSlot routine must be passed a slot containing a TupleDesc+ * identical to the one given to the rStartup routine.+ * ----------------+ */+typedef struct _DestReceiver DestReceiver;++struct _DestReceiver+{+ /* Called for each tuple to be output: */+ void (*receiveSlot) (TupleTableSlot *slot,+ DestReceiver *self);+ /* Per-executor-run initialization and shutdown: */+ void (*rStartup) (DestReceiver *self,+ int operation,+ TupleDesc typeinfo);+ void (*rShutdown) (DestReceiver *self);+ /* Destroy the receiver object itself (if dynamically allocated) */+ void (*rDestroy) (DestReceiver *self);+ /* CommandDest code for this receiver */+ CommandDest mydest;+ /* Private fields might appear beyond this point... */+};++extern DestReceiver *None_Receiver; /* permanent receiver for DestNone */++/* The primary destination management functions */++extern void BeginCommand(const char *commandTag, CommandDest dest);+extern DestReceiver *CreateDestReceiver(CommandDest dest);+extern void EndCommand(const char *commandTag, CommandDest dest);++/* Additional functions that go with destination management, more or less. */++extern void NullCommand(CommandDest dest);+extern void ReadyForQuery(CommandDest dest);++#endif /* DEST_H */
+ foreign/libpg_query/src/postgres/include/tcop/fastpath.h view
@@ -0,0 +1,21 @@+/*-------------------------------------------------------------------------+ *+ * fastpath.h+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/tcop/fastpath.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef FASTPATH_H+#define FASTPATH_H++#include "lib/stringinfo.h"++extern int GetOldFunctionMessage(StringInfo buf);+extern int HandleFunctionRequest(StringInfo msgBuf);++#endif /* FASTPATH_H */
+ foreign/libpg_query/src/postgres/include/tcop/pquery.h view
@@ -0,0 +1,45 @@+/*-------------------------------------------------------------------------+ *+ * pquery.h+ * prototypes for pquery.c.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/tcop/pquery.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef PQUERY_H+#define PQUERY_H++#include "nodes/parsenodes.h"+#include "utils/portal.h"+++extern PGDLLIMPORT Portal ActivePortal;+++extern PortalStrategy ChoosePortalStrategy(List *stmts);++extern List *FetchPortalTargetList(Portal portal);++extern List *FetchStatementTargetList(Node *stmt);++extern void PortalStart(Portal portal, ParamListInfo params,+ int eflags, Snapshot snapshot);++extern void PortalSetResultFormat(Portal portal, int nFormats,+ int16 *formats);++extern bool PortalRun(Portal portal, long count, bool isTopLevel,+ DestReceiver *dest, DestReceiver *altdest,+ char *completionTag);++extern long PortalRunFetch(Portal portal,+ FetchDirection fdirection,+ long count,+ DestReceiver *dest);++#endif /* PQUERY_H */
+ foreign/libpg_query/src/postgres/include/tcop/tcopprot.h view
@@ -0,0 +1,88 @@+/*-------------------------------------------------------------------------+ *+ * tcopprot.h+ * prototypes for postgres.c.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/tcop/tcopprot.h+ *+ * OLD COMMENTS+ * This file was created so that other c files could get the two+ * function prototypes without having to include tcop.h which single+ * handedly includes the whole f*cking tree -- mer 5 Nov. 1991+ *+ *-------------------------------------------------------------------------+ */+#ifndef TCOPPROT_H+#define TCOPPROT_H++#include "nodes/params.h"+#include "nodes/parsenodes.h"+#include "nodes/plannodes.h"+#include "storage/procsignal.h"+#include "utils/guc.h"+++/* Required daylight between max_stack_depth and the kernel limit, in bytes */+#define STACK_DEPTH_SLOP (512 * 1024L)++extern __thread CommandDest whereToSendOutput;+extern PGDLLIMPORT __thread const char *debug_query_string;+extern __thread int max_stack_depth;+extern int PostAuthDelay;++/* GUC-configurable parameters */++typedef enum+{+ LOGSTMT_NONE, /* log no statements */+ LOGSTMT_DDL, /* log data definition statements */+ LOGSTMT_MOD, /* log modification statements, plus DDL */+ LOGSTMT_ALL /* log all statements */+} LogStmtLevel;++extern int log_statement;++extern List *pg_parse_query(const char *query_string);+extern List *pg_analyze_and_rewrite(Node *parsetree, const char *query_string,+ Oid *paramTypes, int numParams);+extern List *pg_analyze_and_rewrite_params(Node *parsetree,+ const char *query_string,+ ParserSetupHook parserSetup,+ void *parserSetupArg);+extern PlannedStmt *pg_plan_query(Query *querytree, int cursorOptions,+ ParamListInfo boundParams);+extern List *pg_plan_queries(List *querytrees, int cursorOptions,+ ParamListInfo boundParams);++extern bool check_max_stack_depth(int *newval, void **extra, GucSource source);+extern void assign_max_stack_depth(int newval, void *extra);++extern void die(SIGNAL_ARGS);+extern void quickdie(SIGNAL_ARGS) pg_attribute_noreturn();+extern void StatementCancelHandler(SIGNAL_ARGS);+extern void FloatExceptionHandler(SIGNAL_ARGS) pg_attribute_noreturn();+extern void RecoveryConflictInterrupt(ProcSignalReason reason); /* called from SIGUSR1+ * handler */+extern void ProcessClientReadInterrupt(bool blocked);+extern void ProcessClientWriteInterrupt(bool blocked);++extern void process_postgres_switches(int argc, char *argv[],+ GucContext ctx, const char **dbname);+extern void PostgresMain(int argc, char *argv[],+ const char *dbname,+ const char *username) pg_attribute_noreturn();+extern long get_stack_depth_rlimit(void);+extern void ResetUsage(void);+extern void ShowUsage(const char *title);+extern int check_log_duration(char *msec_str, bool was_logged);+extern void set_debug_options(int debug_flag,+ GucContext context, GucSource source);+extern bool set_plan_disabling_options(const char *arg,+ GucContext context, GucSource source);+extern const char *get_stats_option_name(const char *arg);++#endif /* TCOPPROT_H */
+ foreign/libpg_query/src/postgres/include/tcop/utility.h view
@@ -0,0 +1,52 @@+/*-------------------------------------------------------------------------+ *+ * utility.h+ * prototypes for utility.c.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/tcop/utility.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef UTILITY_H+#define UTILITY_H++#include "tcop/tcopprot.h"++typedef enum+{+ PROCESS_UTILITY_TOPLEVEL, /* toplevel interactive command */+ PROCESS_UTILITY_QUERY, /* a complete query, but not toplevel */+ PROCESS_UTILITY_SUBCOMMAND /* a portion of a query */+} ProcessUtilityContext;++/* Hook for plugins to get control in ProcessUtility() */+typedef void (*ProcessUtility_hook_type) (Node *parsetree,+ const char *queryString, ProcessUtilityContext context,+ ParamListInfo params,+ DestReceiver *dest, char *completionTag);+extern PGDLLIMPORT ProcessUtility_hook_type ProcessUtility_hook;++extern void ProcessUtility(Node *parsetree, const char *queryString,+ ProcessUtilityContext context, ParamListInfo params,+ DestReceiver *dest, char *completionTag);+extern void standard_ProcessUtility(Node *parsetree, const char *queryString,+ ProcessUtilityContext context, ParamListInfo params,+ DestReceiver *dest, char *completionTag);++extern bool UtilityReturnsTuples(Node *parsetree);++extern TupleDesc UtilityTupleDescriptor(Node *parsetree);++extern Query *UtilityContainsQuery(Node *parsetree);++extern const char *CreateCommandTag(Node *parsetree);++extern LogStmtLevel GetCommandLogLevel(Node *parsetree);++extern bool CommandIsReadOnly(Node *parsetree);++#endif /* UTILITY_H */
+ foreign/libpg_query/src/postgres/include/tsearch/ts_cache.h view
@@ -0,0 +1,98 @@+/*-------------------------------------------------------------------------+ *+ * ts_cache.h+ * Tsearch related object caches.+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/tsearch/ts_cache.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef TS_CACHE_H+#define TS_CACHE_H++#include "utils/guc.h"+++/*+ * All TS*CacheEntry structs must share this common header+ * (see InvalidateTSCacheCallBack)+ */+typedef struct TSAnyCacheEntry+{+ Oid objId;+ bool isvalid;+} TSAnyCacheEntry;+++typedef struct TSParserCacheEntry+{+ /* prsId is the hash lookup key and MUST BE FIRST */+ Oid prsId; /* OID of the parser */+ bool isvalid;++ Oid startOid;+ Oid tokenOid;+ Oid endOid;+ Oid headlineOid;+ Oid lextypeOid;++ /*+ * Pre-set-up fmgr call of most needed parser's methods+ */+ FmgrInfo prsstart;+ FmgrInfo prstoken;+ FmgrInfo prsend;+ FmgrInfo prsheadline;+} TSParserCacheEntry;++typedef struct TSDictionaryCacheEntry+{+ /* dictId is the hash lookup key and MUST BE FIRST */+ Oid dictId;+ bool isvalid;++ /* most frequent fmgr call */+ Oid lexizeOid;+ FmgrInfo lexize;++ MemoryContext dictCtx; /* memory context to store private data */+ void *dictData;+} TSDictionaryCacheEntry;++typedef struct+{+ int len;+ Oid *dictIds;+} ListDictionary;++typedef struct+{+ /* cfgId is the hash lookup key and MUST BE FIRST */+ Oid cfgId;+ bool isvalid;++ Oid prsId;++ int lenmap;+ ListDictionary *map;+} TSConfigCacheEntry;+++/*+ * GUC variable for current configuration+ */+extern char *TSCurrentConfig;+++extern TSParserCacheEntry *lookup_ts_parser_cache(Oid prsId);+extern TSDictionaryCacheEntry *lookup_ts_dictionary_cache(Oid dictId);+extern TSConfigCacheEntry *lookup_ts_config_cache(Oid cfgId);++extern Oid getTSCurrentConfig(bool emitError);+extern bool check_TSCurrentConfig(char **newval, void **extra, GucSource source);+extern void assign_TSCurrentConfig(const char *newval, void *extra);++#endif /* TS_CACHE_H */
+ foreign/libpg_query/src/postgres/include/utils/acl.h view
@@ -0,0 +1,336 @@+/*-------------------------------------------------------------------------+ *+ * acl.h+ * Definition of (and support for) access control list data structures.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/utils/acl.h+ *+ * NOTES+ * An ACL array is simply an array of AclItems, representing the union+ * of the privileges represented by the individual items. A zero-length+ * array represents "no privileges". There are no assumptions about the+ * ordering of the items, but we do expect that there are no two entries+ * in the array with the same grantor and grantee.+ *+ * For backward-compatibility purposes we have to allow null ACL entries+ * in system catalogs. A null ACL will be treated as meaning "default+ * protection" (i.e., whatever acldefault() returns).+ *-------------------------------------------------------------------------+ */+#ifndef ACL_H+#define ACL_H++#include "access/htup.h"+#include "nodes/parsenodes.h"+#include "utils/array.h"+#include "utils/snapshot.h"+++/*+ * typedef AclMode is declared in parsenodes.h, also the individual privilege+ * bit meanings are defined there+ */++#define ACL_ID_PUBLIC 0 /* placeholder for id in a PUBLIC acl item */++/*+ * AclItem+ *+ * Note: must be same size on all platforms, because the size is hardcoded+ * in the pg_type.h entry for aclitem.+ */+typedef struct AclItem+{+ Oid ai_grantee; /* ID that this item grants privs to */+ Oid ai_grantor; /* grantor of privs */+ AclMode ai_privs; /* privilege bits */+} AclItem;++/*+ * The upper 16 bits of the ai_privs field of an AclItem are the grant option+ * bits, and the lower 16 bits are the actual privileges. We use "rights"+ * to mean the combined grant option and privilege bits fields.+ */+#define ACLITEM_GET_PRIVS(item) ((item).ai_privs & 0xFFFF)+#define ACLITEM_GET_GOPTIONS(item) (((item).ai_privs >> 16) & 0xFFFF)+#define ACLITEM_GET_RIGHTS(item) ((item).ai_privs)++#define ACL_GRANT_OPTION_FOR(privs) (((AclMode) (privs) & 0xFFFF) << 16)+#define ACL_OPTION_TO_PRIVS(privs) (((AclMode) (privs) >> 16) & 0xFFFF)++#define ACLITEM_SET_PRIVS(item,privs) \+ ((item).ai_privs = ((item).ai_privs & ~((AclMode) 0xFFFF)) | \+ ((AclMode) (privs) & 0xFFFF))+#define ACLITEM_SET_GOPTIONS(item,goptions) \+ ((item).ai_privs = ((item).ai_privs & ~(((AclMode) 0xFFFF) << 16)) | \+ (((AclMode) (goptions) & 0xFFFF) << 16))+#define ACLITEM_SET_RIGHTS(item,rights) \+ ((item).ai_privs = (AclMode) (rights))++#define ACLITEM_SET_PRIVS_GOPTIONS(item,privs,goptions) \+ ((item).ai_privs = ((AclMode) (privs) & 0xFFFF) | \+ (((AclMode) (goptions) & 0xFFFF) << 16))+++#define ACLITEM_ALL_PRIV_BITS ((AclMode) 0xFFFF)+#define ACLITEM_ALL_GOPTION_BITS ((AclMode) 0xFFFF << 16)++/*+ * Definitions for convenient access to Acl (array of AclItem).+ * These are standard PostgreSQL arrays, but are restricted to have one+ * dimension and no nulls. We also ignore the lower bound when reading,+ * and set it to one when writing.+ *+ * CAUTION: as of PostgreSQL 7.1, these arrays are toastable (just like all+ * other array types). Therefore, be careful to detoast them with the+ * macros provided, unless you know for certain that a particular array+ * can't have been toasted.+ */+++/*+ * Acl a one-dimensional array of AclItem+ */+typedef ArrayType Acl;++#define ACL_NUM(ACL) (ARR_DIMS(ACL)[0])+#define ACL_DAT(ACL) ((AclItem *) ARR_DATA_PTR(ACL))+#define ACL_N_SIZE(N) (ARR_OVERHEAD_NONULLS(1) + ((N) * sizeof(AclItem)))+#define ACL_SIZE(ACL) ARR_SIZE(ACL)++/*+ * fmgr macros for these types+ */+#define DatumGetAclItemP(X) ((AclItem *) DatumGetPointer(X))+#define PG_GETARG_ACLITEM_P(n) DatumGetAclItemP(PG_GETARG_DATUM(n))+#define PG_RETURN_ACLITEM_P(x) PG_RETURN_POINTER(x)++#define DatumGetAclP(X) ((Acl *) PG_DETOAST_DATUM(X))+#define DatumGetAclPCopy(X) ((Acl *) PG_DETOAST_DATUM_COPY(X))+#define PG_GETARG_ACL_P(n) DatumGetAclP(PG_GETARG_DATUM(n))+#define PG_GETARG_ACL_P_COPY(n) DatumGetAclPCopy(PG_GETARG_DATUM(n))+#define PG_RETURN_ACL_P(x) PG_RETURN_POINTER(x)++/*+ * ACL modification opcodes for aclupdate+ */+#define ACL_MODECHG_ADD 1+#define ACL_MODECHG_DEL 2+#define ACL_MODECHG_EQL 3++/*+ * External representations of the privilege bits --- aclitemin/aclitemout+ * represent each possible privilege bit with a distinct 1-character code+ */+#define ACL_INSERT_CHR 'a' /* formerly known as "append" */+#define ACL_SELECT_CHR 'r' /* formerly known as "read" */+#define ACL_UPDATE_CHR 'w' /* formerly known as "write" */+#define ACL_DELETE_CHR 'd'+#define ACL_TRUNCATE_CHR 'D' /* super-delete, as it were */+#define ACL_REFERENCES_CHR 'x'+#define ACL_TRIGGER_CHR 't'+#define ACL_EXECUTE_CHR 'X'+#define ACL_USAGE_CHR 'U'+#define ACL_CREATE_CHR 'C'+#define ACL_CREATE_TEMP_CHR 'T'+#define ACL_CONNECT_CHR 'c'++/* string holding all privilege code chars, in order by bitmask position */+#define ACL_ALL_RIGHTS_STR "arwdDxtXUCTc"++/*+ * Bitmasks defining "all rights" for each supported object type+ */+#define ACL_ALL_RIGHTS_COLUMN (ACL_INSERT|ACL_SELECT|ACL_UPDATE|ACL_REFERENCES)+#define ACL_ALL_RIGHTS_RELATION (ACL_INSERT|ACL_SELECT|ACL_UPDATE|ACL_DELETE|ACL_TRUNCATE|ACL_REFERENCES|ACL_TRIGGER)+#define ACL_ALL_RIGHTS_SEQUENCE (ACL_USAGE|ACL_SELECT|ACL_UPDATE)+#define ACL_ALL_RIGHTS_DATABASE (ACL_CREATE|ACL_CREATE_TEMP|ACL_CONNECT)+#define ACL_ALL_RIGHTS_FDW (ACL_USAGE)+#define ACL_ALL_RIGHTS_FOREIGN_SERVER (ACL_USAGE)+#define ACL_ALL_RIGHTS_FUNCTION (ACL_EXECUTE)+#define ACL_ALL_RIGHTS_LANGUAGE (ACL_USAGE)+#define ACL_ALL_RIGHTS_LARGEOBJECT (ACL_SELECT|ACL_UPDATE)+#define ACL_ALL_RIGHTS_NAMESPACE (ACL_USAGE|ACL_CREATE)+#define ACL_ALL_RIGHTS_TABLESPACE (ACL_CREATE)+#define ACL_ALL_RIGHTS_TYPE (ACL_USAGE)++/* operation codes for pg_*_aclmask */+typedef enum+{+ ACLMASK_ALL, /* normal case: compute all bits */+ ACLMASK_ANY /* return when result is known nonzero */+} AclMaskHow;++/* result codes for pg_*_aclcheck */+typedef enum+{+ ACLCHECK_OK = 0,+ ACLCHECK_NO_PRIV,+ ACLCHECK_NOT_OWNER+} AclResult;++/* this enum covers all object types that can have privilege errors */+/* currently it's only used to tell aclcheck_error what to say */+typedef enum AclObjectKind+{+ ACL_KIND_COLUMN, /* pg_attribute */+ ACL_KIND_CLASS, /* pg_class */+ ACL_KIND_SEQUENCE, /* pg_sequence */+ ACL_KIND_DATABASE, /* pg_database */+ ACL_KIND_PROC, /* pg_proc */+ ACL_KIND_OPER, /* pg_operator */+ ACL_KIND_TYPE, /* pg_type */+ ACL_KIND_LANGUAGE, /* pg_language */+ ACL_KIND_LARGEOBJECT, /* pg_largeobject */+ ACL_KIND_NAMESPACE, /* pg_namespace */+ ACL_KIND_OPCLASS, /* pg_opclass */+ ACL_KIND_OPFAMILY, /* pg_opfamily */+ ACL_KIND_COLLATION, /* pg_collation */+ ACL_KIND_CONVERSION, /* pg_conversion */+ ACL_KIND_TABLESPACE, /* pg_tablespace */+ ACL_KIND_TSDICTIONARY, /* pg_ts_dict */+ ACL_KIND_TSCONFIGURATION, /* pg_ts_config */+ ACL_KIND_FDW, /* pg_foreign_data_wrapper */+ ACL_KIND_FOREIGN_SERVER, /* pg_foreign_server */+ ACL_KIND_EVENT_TRIGGER, /* pg_event_trigger */+ ACL_KIND_EXTENSION, /* pg_extension */+ MAX_ACL_KIND /* MUST BE LAST */+} AclObjectKind;+++/*+ * routines used internally+ */+extern Acl *acldefault(GrantObjectType objtype, Oid ownerId);+extern Acl *get_user_default_acl(GrantObjectType objtype, Oid ownerId,+ Oid nsp_oid);++extern Acl *aclupdate(const Acl *old_acl, const AclItem *mod_aip,+ int modechg, Oid ownerId, DropBehavior behavior);+extern Acl *aclnewowner(const Acl *old_acl, Oid oldOwnerId, Oid newOwnerId);+extern Acl *make_empty_acl(void);+extern Acl *aclcopy(const Acl *orig_acl);+extern Acl *aclconcat(const Acl *left_acl, const Acl *right_acl);+extern Acl *aclmerge(const Acl *left_acl, const Acl *right_acl, Oid ownerId);+extern void aclitemsort(Acl *acl);+extern bool aclequal(const Acl *left_acl, const Acl *right_acl);++extern AclMode aclmask(const Acl *acl, Oid roleid, Oid ownerId,+ AclMode mask, AclMaskHow how);+extern int aclmembers(const Acl *acl, Oid **roleids);++extern bool has_privs_of_role(Oid member, Oid role);+extern bool is_member_of_role(Oid member, Oid role);+extern bool is_member_of_role_nosuper(Oid member, Oid role);+extern bool is_admin_of_role(Oid member, Oid role);+extern void check_is_member_of_role(Oid member, Oid role);+extern Oid get_role_oid(const char *rolename, bool missing_ok);+extern Oid get_role_oid_or_public(const char *rolename);+extern Oid get_rolespec_oid(const Node *node, bool missing_ok);+extern HeapTuple get_rolespec_tuple(const Node *node);+extern char *get_rolespec_name(const Node *node);++extern void select_best_grantor(Oid roleId, AclMode privileges,+ const Acl *acl, Oid ownerId,+ Oid *grantorId, AclMode *grantOptions);++extern void initialize_acl(void);++/*+ * SQL functions (from acl.c)+ */+extern Datum aclitemin(PG_FUNCTION_ARGS);+extern Datum aclitemout(PG_FUNCTION_ARGS);+extern Datum aclinsert(PG_FUNCTION_ARGS);+extern Datum aclremove(PG_FUNCTION_ARGS);+extern Datum aclcontains(PG_FUNCTION_ARGS);+extern Datum makeaclitem(PG_FUNCTION_ARGS);+extern Datum aclitem_eq(PG_FUNCTION_ARGS);+extern Datum hash_aclitem(PG_FUNCTION_ARGS);+extern Datum acldefault_sql(PG_FUNCTION_ARGS);+extern Datum aclexplode(PG_FUNCTION_ARGS);++/*+ * prototypes for functions in aclchk.c+ */+extern void ExecuteGrantStmt(GrantStmt *stmt);+extern void ExecAlterDefaultPrivilegesStmt(AlterDefaultPrivilegesStmt *stmt);++extern void RemoveRoleFromObjectACL(Oid roleid, Oid classid, Oid objid);+extern void RemoveDefaultACLById(Oid defaclOid);++extern AclMode pg_attribute_aclmask(Oid table_oid, AttrNumber attnum,+ Oid roleid, AclMode mask, AclMaskHow how);+extern AclMode pg_class_aclmask(Oid table_oid, Oid roleid,+ AclMode mask, AclMaskHow how);+extern AclMode pg_database_aclmask(Oid db_oid, Oid roleid,+ AclMode mask, AclMaskHow how);+extern AclMode pg_proc_aclmask(Oid proc_oid, Oid roleid,+ AclMode mask, AclMaskHow how);+extern AclMode pg_language_aclmask(Oid lang_oid, Oid roleid,+ AclMode mask, AclMaskHow how);+extern AclMode pg_largeobject_aclmask_snapshot(Oid lobj_oid, Oid roleid,+ AclMode mask, AclMaskHow how, Snapshot snapshot);+extern AclMode pg_namespace_aclmask(Oid nsp_oid, Oid roleid,+ AclMode mask, AclMaskHow how);+extern AclMode pg_tablespace_aclmask(Oid spc_oid, Oid roleid,+ AclMode mask, AclMaskHow how);+extern AclMode pg_foreign_data_wrapper_aclmask(Oid fdw_oid, Oid roleid,+ AclMode mask, AclMaskHow how);+extern AclMode pg_foreign_server_aclmask(Oid srv_oid, Oid roleid,+ AclMode mask, AclMaskHow how);+extern AclMode pg_type_aclmask(Oid type_oid, Oid roleid,+ AclMode mask, AclMaskHow how);++extern AclResult pg_attribute_aclcheck(Oid table_oid, AttrNumber attnum,+ Oid roleid, AclMode mode);+extern AclResult pg_attribute_aclcheck_all(Oid table_oid, Oid roleid,+ AclMode mode, AclMaskHow how);+extern AclResult pg_class_aclcheck(Oid table_oid, Oid roleid, AclMode mode);+extern AclResult pg_database_aclcheck(Oid db_oid, Oid roleid, AclMode mode);+extern AclResult pg_proc_aclcheck(Oid proc_oid, Oid roleid, AclMode mode);+extern AclResult pg_language_aclcheck(Oid lang_oid, Oid roleid, AclMode mode);+extern AclResult pg_largeobject_aclcheck_snapshot(Oid lang_oid, Oid roleid,+ AclMode mode, Snapshot snapshot);+extern AclResult pg_namespace_aclcheck(Oid nsp_oid, Oid roleid, AclMode mode);+extern AclResult pg_tablespace_aclcheck(Oid spc_oid, Oid roleid, AclMode mode);+extern AclResult pg_foreign_data_wrapper_aclcheck(Oid fdw_oid, Oid roleid, AclMode mode);+extern AclResult pg_foreign_server_aclcheck(Oid srv_oid, Oid roleid, AclMode mode);+extern AclResult pg_type_aclcheck(Oid type_oid, Oid roleid, AclMode mode);++extern void aclcheck_error(AclResult aclerr, AclObjectKind objectkind,+ const char *objectname);++extern void aclcheck_error_col(AclResult aclerr, AclObjectKind objectkind,+ const char *objectname, const char *colname);++extern void aclcheck_error_type(AclResult aclerr, Oid typeOid);++/* ownercheck routines just return true (owner) or false (not) */+extern bool pg_class_ownercheck(Oid class_oid, Oid roleid);+extern bool pg_type_ownercheck(Oid type_oid, Oid roleid);+extern bool pg_oper_ownercheck(Oid oper_oid, Oid roleid);+extern bool pg_proc_ownercheck(Oid proc_oid, Oid roleid);+extern bool pg_language_ownercheck(Oid lan_oid, Oid roleid);+extern bool pg_largeobject_ownercheck(Oid lobj_oid, Oid roleid);+extern bool pg_namespace_ownercheck(Oid nsp_oid, Oid roleid);+extern bool pg_tablespace_ownercheck(Oid spc_oid, Oid roleid);+extern bool pg_opclass_ownercheck(Oid opc_oid, Oid roleid);+extern bool pg_opfamily_ownercheck(Oid opf_oid, Oid roleid);+extern bool pg_database_ownercheck(Oid db_oid, Oid roleid);+extern bool pg_collation_ownercheck(Oid coll_oid, Oid roleid);+extern bool pg_conversion_ownercheck(Oid conv_oid, Oid roleid);+extern bool pg_ts_dict_ownercheck(Oid dict_oid, Oid roleid);+extern bool pg_ts_config_ownercheck(Oid cfg_oid, Oid roleid);+extern bool pg_foreign_data_wrapper_ownercheck(Oid srv_oid, Oid roleid);+extern bool pg_foreign_server_ownercheck(Oid srv_oid, Oid roleid);+extern bool pg_event_trigger_ownercheck(Oid et_oid, Oid roleid);+extern bool pg_extension_ownercheck(Oid ext_oid, Oid roleid);+extern bool has_createrole_privilege(Oid roleid);+extern bool has_bypassrls_privilege(Oid roleid);++#endif /* ACL_H */
+ foreign/libpg_query/src/postgres/include/utils/aclchk_internal.h view
@@ -0,0 +1,45 @@+/*-------------------------------------------------------------------------+ *+ * aclchk_internal.h+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/utils/aclchk_internal.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef ACLCHK_INTERNAL_H+#define ACLCHK_INTERNAL_H++#include "nodes/parsenodes.h"+#include "nodes/pg_list.h"++/*+ * The information about one Grant/Revoke statement, in internal format: object+ * and grantees names have been turned into Oids, the privilege list is an+ * AclMode bitmask. If 'privileges' is ACL_NO_RIGHTS (the 0 value) and+ * all_privs is true, 'privileges' will be internally set to the right kind of+ * ACL_ALL_RIGHTS_*, depending on the object type (NB - this will modify the+ * InternalGrant struct!)+ *+ * Note: 'all_privs' and 'privileges' represent object-level privileges only.+ * There might also be column-level privilege specifications, which are+ * represented in col_privs (this is a list of untransformed AccessPriv nodes).+ * Column privileges are only valid for objtype ACL_OBJECT_RELATION.+ */+typedef struct+{+ bool is_grant;+ GrantObjectType objtype;+ List *objects;+ bool all_privs;+ AclMode privileges;+ List *col_privs;+ List *grantees;+ bool grant_option;+ DropBehavior behavior;+} InternalGrant;+++#endif /* ACLCHK_INTERNAL_H */
+ foreign/libpg_query/src/postgres/include/utils/array.h view
@@ -0,0 +1,503 @@+/*-------------------------------------------------------------------------+ *+ * array.h+ * Declarations for Postgres arrays.+ *+ * A standard varlena array has the following internal structure:+ * <vl_len_> - standard varlena header word+ * <ndim> - number of dimensions of the array+ * <dataoffset> - offset to stored data, or 0 if no nulls bitmap+ * <elemtype> - element type OID+ * <dimensions> - length of each array axis (C array of int)+ * <lower bnds> - lower boundary of each dimension (C array of int)+ * <null bitmap> - bitmap showing locations of nulls (OPTIONAL)+ * <actual data> - whatever is the stored data+ *+ * The <dimensions> and <lower bnds> arrays each have ndim elements.+ *+ * The <null bitmap> may be omitted if the array contains no NULL elements.+ * If it is absent, the <dataoffset> field is zero and the offset to the+ * stored data must be computed on-the-fly. If the bitmap is present,+ * <dataoffset> is nonzero and is equal to the offset from the array start+ * to the first data element (including any alignment padding). The bitmap+ * follows the same conventions as tuple null bitmaps, ie, a 1 indicates+ * a non-null entry and the LSB of each bitmap byte is used first.+ *+ * The actual data starts on a MAXALIGN boundary. Individual items in the+ * array are aligned as specified by the array element type. They are+ * stored in row-major order (last subscript varies most rapidly).+ *+ * NOTE: it is important that array elements of toastable datatypes NOT be+ * toasted, since the tupletoaster won't know they are there. (We could+ * support compressed toasted items; only out-of-line items are dangerous.+ * However, it seems preferable to store such items uncompressed and allow+ * the toaster to compress the whole array as one input.)+ *+ *+ * The OIDVECTOR and INT2VECTOR datatypes are storage-compatible with+ * generic arrays, but they support only one-dimensional arrays with no+ * nulls (and no null bitmap).+ *+ * There are also some "fixed-length array" datatypes, such as NAME and+ * POINT. These are simply a sequence of a fixed number of items each+ * of a fixed-length datatype, with no overhead; the item size must be+ * a multiple of its alignment requirement, because we do no padding.+ * We support subscripting on these types, but array_in() and array_out()+ * only work with varlena arrays.+ *+ * In addition, arrays are a major user of the "expanded object" TOAST+ * infrastructure. This allows a varlena array to be converted to a+ * separate representation that may include "deconstructed" Datum/isnull+ * arrays holding the elements.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/utils/array.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef ARRAY_H+#define ARRAY_H++#include "fmgr.h"+#include "utils/expandeddatum.h"+++/*+ * Arrays are varlena objects, so must meet the varlena convention that+ * the first int32 of the object contains the total object size in bytes.+ * Be sure to use VARSIZE() and SET_VARSIZE() to access it, though!+ *+ * CAUTION: if you change the header for ordinary arrays you will also+ * need to change the headers for oidvector and int2vector!+ */+typedef struct+{+ int32 vl_len_; /* varlena header (do not touch directly!) */+ int ndim; /* # of dimensions */+ int32 dataoffset; /* offset to data, or 0 if no bitmap */+ Oid elemtype; /* element type OID */+} ArrayType;++/*+ * An expanded array is contained within a private memory context (as+ * all expanded objects must be) and has a control structure as below.+ *+ * The expanded array might contain a regular "flat" array if that was the+ * original input and we've not modified it significantly. Otherwise, the+ * contents are represented by Datum/isnull arrays plus dimensionality and+ * type information. We could also have both forms, if we've deconstructed+ * the original array for access purposes but not yet changed it. For pass-+ * by-reference element types, the Datums would point into the flat array in+ * this situation. Once we start modifying array elements, new pass-by-ref+ * elements are separately palloc'd within the memory context.+ */+#define EA_MAGIC 689375833 /* ID for debugging crosschecks */++typedef struct ExpandedArrayHeader+{+ /* Standard header for expanded objects */+ ExpandedObjectHeader hdr;++ /* Magic value identifying an expanded array (for debugging only) */+ int ea_magic;++ /* Dimensionality info (always valid) */+ int ndims; /* # of dimensions */+ int *dims; /* array dimensions */+ int *lbound; /* index lower bounds for each dimension */++ /* Element type info (always valid) */+ Oid element_type; /* element type OID */+ int16 typlen; /* needed info about element datatype */+ bool typbyval;+ char typalign;++ /*+ * If we have a Datum-array representation of the array, it's kept here;+ * else dvalues/dnulls are NULL. The dvalues and dnulls arrays are always+ * palloc'd within the object private context, but may change size from+ * time to time. For pass-by-ref element types, dvalues entries might+ * point either into the fstartptr..fendptr area, or to separately+ * palloc'd chunks. Elements should always be fully detoasted, as they+ * are in the standard flat representation.+ *+ * Even when dvalues is valid, dnulls can be NULL if there are no null+ * elements.+ */+ Datum *dvalues; /* array of Datums */+ bool *dnulls; /* array of is-null flags for Datums */+ int dvalueslen; /* allocated length of above arrays */+ int nelems; /* number of valid entries in above arrays */++ /*+ * flat_size is the current space requirement for the flat equivalent of+ * the expanded array, if known; otherwise it's 0. We store this to make+ * consecutive calls of get_flat_size cheap.+ */+ Size flat_size;++ /*+ * fvalue points to the flat representation if it is valid, else it is+ * NULL. If we have or ever had a flat representation then+ * fstartptr/fendptr point to the start and end+1 of its data area; this+ * is so that we can tell which Datum pointers point into the flat+ * representation rather than being pointers to separately palloc'd data.+ */+ ArrayType *fvalue; /* must be a fully detoasted array */+ char *fstartptr; /* start of its data area */+ char *fendptr; /* end+1 of its data area */+} ExpandedArrayHeader;++/*+ * Functions that can handle either a "flat" varlena array or an expanded+ * array use this union to work with their input.+ */+typedef union AnyArrayType+{+ ArrayType flt;+ ExpandedArrayHeader xpn;+} AnyArrayType;++/*+ * working state for accumArrayResult() and friends+ * note that the input must be scalars (legal array elements)+ */+typedef struct ArrayBuildState+{+ MemoryContext mcontext; /* where all the temp stuff is kept */+ Datum *dvalues; /* array of accumulated Datums */+ bool *dnulls; /* array of is-null flags for Datums */+ int alen; /* allocated length of above arrays */+ int nelems; /* number of valid entries in above arrays */+ Oid element_type; /* data type of the Datums */+ int16 typlen; /* needed info about datatype */+ bool typbyval;+ char typalign;+ bool private_cxt; /* use private memory context */+} ArrayBuildState;++/*+ * working state for accumArrayResultArr() and friends+ * note that the input must be arrays, and the same array type is returned+ */+typedef struct ArrayBuildStateArr+{+ MemoryContext mcontext; /* where all the temp stuff is kept */+ char *data; /* accumulated data */+ bits8 *nullbitmap; /* bitmap of is-null flags, or NULL if none */+ int abytes; /* allocated length of "data" */+ int nbytes; /* number of bytes used so far */+ int aitems; /* allocated length of bitmap (in elements) */+ int nitems; /* total number of elements in result */+ int ndims; /* current dimensions of result */+ int dims[MAXDIM];+ int lbs[MAXDIM];+ Oid array_type; /* data type of the arrays */+ Oid element_type; /* data type of the array elements */+ bool private_cxt; /* use private memory context */+} ArrayBuildStateArr;++/*+ * working state for accumArrayResultAny() and friends+ * these functions handle both cases+ */+typedef struct ArrayBuildStateAny+{+ /* Exactly one of these is not NULL: */+ ArrayBuildState *scalarstate;+ ArrayBuildStateArr *arraystate;+} ArrayBuildStateAny;++/*+ * structure to cache type metadata needed for array manipulation+ */+typedef struct ArrayMetaState+{+ Oid element_type;+ int16 typlen;+ bool typbyval;+ char typalign;+ char typdelim;+ Oid typioparam;+ Oid typiofunc;+ FmgrInfo proc;+} ArrayMetaState;++/*+ * private state needed by array_map (here because caller must provide it)+ */+typedef struct ArrayMapState+{+ ArrayMetaState inp_extra;+ ArrayMetaState ret_extra;+} ArrayMapState;++/* ArrayIteratorData is private in arrayfuncs.c */+typedef struct ArrayIteratorData *ArrayIterator;++/* fmgr macros for regular varlena array objects */+#define DatumGetArrayTypeP(X) ((ArrayType *) PG_DETOAST_DATUM(X))+#define DatumGetArrayTypePCopy(X) ((ArrayType *) PG_DETOAST_DATUM_COPY(X))+#define PG_GETARG_ARRAYTYPE_P(n) DatumGetArrayTypeP(PG_GETARG_DATUM(n))+#define PG_GETARG_ARRAYTYPE_P_COPY(n) DatumGetArrayTypePCopy(PG_GETARG_DATUM(n))+#define PG_RETURN_ARRAYTYPE_P(x) PG_RETURN_POINTER(x)++/* fmgr macros for expanded array objects */+#define PG_GETARG_EXPANDED_ARRAY(n) DatumGetExpandedArray(PG_GETARG_DATUM(n))+#define PG_GETARG_EXPANDED_ARRAYX(n, metacache) \+ DatumGetExpandedArrayX(PG_GETARG_DATUM(n), metacache)+#define PG_RETURN_EXPANDED_ARRAY(x) PG_RETURN_DATUM(EOHPGetRWDatum(&(x)->hdr))++/* fmgr macros for AnyArrayType (ie, get either varlena or expanded form) */+#define PG_GETARG_ANY_ARRAY(n) DatumGetAnyArray(PG_GETARG_DATUM(n))++/*+ * Access macros for varlena array header fields.+ *+ * ARR_DIMS returns a pointer to an array of array dimensions (number of+ * elements along the various array axes).+ *+ * ARR_LBOUND returns a pointer to an array of array lower bounds.+ *+ * That is: if the third axis of an array has elements 5 through 8, then+ * ARR_DIMS(a)[2] == 4 and ARR_LBOUND(a)[2] == 5.+ *+ * Unlike C, the default lower bound is 1.+ */+#define ARR_SIZE(a) VARSIZE(a)+#define ARR_NDIM(a) ((a)->ndim)+#define ARR_HASNULL(a) ((a)->dataoffset != 0)+#define ARR_ELEMTYPE(a) ((a)->elemtype)++#define ARR_DIMS(a) \+ ((int *) (((char *) (a)) + sizeof(ArrayType)))+#define ARR_LBOUND(a) \+ ((int *) (((char *) (a)) + sizeof(ArrayType) + \+ sizeof(int) * ARR_NDIM(a)))++#define ARR_NULLBITMAP(a) \+ (ARR_HASNULL(a) ? \+ (bits8 *) (((char *) (a)) + sizeof(ArrayType) + \+ 2 * sizeof(int) * ARR_NDIM(a)) \+ : (bits8 *) NULL)++/*+ * The total array header size (in bytes) for an array with the specified+ * number of dimensions and total number of items.+ */+#define ARR_OVERHEAD_NONULLS(ndims) \+ MAXALIGN(sizeof(ArrayType) + 2 * sizeof(int) * (ndims))+#define ARR_OVERHEAD_WITHNULLS(ndims, nitems) \+ MAXALIGN(sizeof(ArrayType) + 2 * sizeof(int) * (ndims) + \+ ((nitems) + 7) / 8)++#define ARR_DATA_OFFSET(a) \+ (ARR_HASNULL(a) ? (a)->dataoffset : ARR_OVERHEAD_NONULLS(ARR_NDIM(a)))++/*+ * Returns a pointer to the actual array data.+ */+#define ARR_DATA_PTR(a) \+ (((char *) (a)) + ARR_DATA_OFFSET(a))++/*+ * Macros for working with AnyArrayType inputs. Beware multiple references!+ */+#define AARR_NDIM(a) \+ (VARATT_IS_EXPANDED_HEADER(a) ? (a)->xpn.ndims : ARR_NDIM(&(a)->flt))+#define AARR_HASNULL(a) \+ (VARATT_IS_EXPANDED_HEADER(a) ? \+ ((a)->xpn.dvalues != NULL ? (a)->xpn.dnulls != NULL : ARR_HASNULL((a)->xpn.fvalue)) : \+ ARR_HASNULL(&(a)->flt))+#define AARR_ELEMTYPE(a) \+ (VARATT_IS_EXPANDED_HEADER(a) ? (a)->xpn.element_type : ARR_ELEMTYPE(&(a)->flt))+#define AARR_DIMS(a) \+ (VARATT_IS_EXPANDED_HEADER(a) ? (a)->xpn.dims : ARR_DIMS(&(a)->flt))+#define AARR_LBOUND(a) \+ (VARATT_IS_EXPANDED_HEADER(a) ? (a)->xpn.lbound : ARR_LBOUND(&(a)->flt))+++/*+ * GUC parameter+ */+extern bool Array_nulls;++/*+ * prototypes for functions defined in arrayfuncs.c+ */+extern Datum array_in(PG_FUNCTION_ARGS);+extern Datum array_out(PG_FUNCTION_ARGS);+extern Datum array_recv(PG_FUNCTION_ARGS);+extern Datum array_send(PG_FUNCTION_ARGS);+extern Datum array_eq(PG_FUNCTION_ARGS);+extern Datum array_ne(PG_FUNCTION_ARGS);+extern Datum array_lt(PG_FUNCTION_ARGS);+extern Datum array_gt(PG_FUNCTION_ARGS);+extern Datum array_le(PG_FUNCTION_ARGS);+extern Datum array_ge(PG_FUNCTION_ARGS);+extern Datum btarraycmp(PG_FUNCTION_ARGS);+extern Datum hash_array(PG_FUNCTION_ARGS);+extern Datum arrayoverlap(PG_FUNCTION_ARGS);+extern Datum arraycontains(PG_FUNCTION_ARGS);+extern Datum arraycontained(PG_FUNCTION_ARGS);+extern Datum array_ndims(PG_FUNCTION_ARGS);+extern Datum array_dims(PG_FUNCTION_ARGS);+extern Datum array_lower(PG_FUNCTION_ARGS);+extern Datum array_upper(PG_FUNCTION_ARGS);+extern Datum array_length(PG_FUNCTION_ARGS);+extern Datum array_cardinality(PG_FUNCTION_ARGS);+extern Datum array_larger(PG_FUNCTION_ARGS);+extern Datum array_smaller(PG_FUNCTION_ARGS);+extern Datum generate_subscripts(PG_FUNCTION_ARGS);+extern Datum generate_subscripts_nodir(PG_FUNCTION_ARGS);+extern Datum array_fill(PG_FUNCTION_ARGS);+extern Datum array_fill_with_lower_bounds(PG_FUNCTION_ARGS);+extern Datum array_unnest(PG_FUNCTION_ARGS);+extern Datum array_remove(PG_FUNCTION_ARGS);+extern Datum array_replace(PG_FUNCTION_ARGS);+extern Datum width_bucket_array(PG_FUNCTION_ARGS);++extern void CopyArrayEls(ArrayType *array,+ Datum *values,+ bool *nulls,+ int nitems,+ int typlen,+ bool typbyval,+ char typalign,+ bool freedata);++extern Datum array_get_element(Datum arraydatum, int nSubscripts, int *indx,+ int arraytyplen, int elmlen, bool elmbyval, char elmalign,+ bool *isNull);+extern Datum array_set_element(Datum arraydatum, int nSubscripts, int *indx,+ Datum dataValue, bool isNull,+ int arraytyplen, int elmlen, bool elmbyval, char elmalign);+extern Datum array_get_slice(Datum arraydatum, int nSubscripts,+ int *upperIndx, int *lowerIndx,+ int arraytyplen, int elmlen, bool elmbyval, char elmalign);+extern Datum array_set_slice(Datum arraydatum, int nSubscripts,+ int *upperIndx, int *lowerIndx,+ Datum srcArrayDatum, bool isNull,+ int arraytyplen, int elmlen, bool elmbyval, char elmalign);++extern Datum array_ref(ArrayType *array, int nSubscripts, int *indx,+ int arraytyplen, int elmlen, bool elmbyval, char elmalign,+ bool *isNull);+extern ArrayType *array_set(ArrayType *array, int nSubscripts, int *indx,+ Datum dataValue, bool isNull,+ int arraytyplen, int elmlen, bool elmbyval, char elmalign);++extern Datum array_map(FunctionCallInfo fcinfo, Oid retType,+ ArrayMapState *amstate);++extern void array_bitmap_copy(bits8 *destbitmap, int destoffset,+ const bits8 *srcbitmap, int srcoffset,+ int nitems);++extern ArrayType *construct_array(Datum *elems, int nelems,+ Oid elmtype,+ int elmlen, bool elmbyval, char elmalign);+extern ArrayType *construct_md_array(Datum *elems,+ bool *nulls,+ int ndims,+ int *dims,+ int *lbs,+ Oid elmtype, int elmlen, bool elmbyval, char elmalign);+extern ArrayType *construct_empty_array(Oid elmtype);+extern ExpandedArrayHeader *construct_empty_expanded_array(Oid element_type,+ MemoryContext parentcontext,+ ArrayMetaState *metacache);+extern void deconstruct_array(ArrayType *array,+ Oid elmtype,+ int elmlen, bool elmbyval, char elmalign,+ Datum **elemsp, bool **nullsp, int *nelemsp);+extern bool array_contains_nulls(ArrayType *array);++extern ArrayBuildState *initArrayResult(Oid element_type,+ MemoryContext rcontext, bool subcontext);+extern ArrayBuildState *accumArrayResult(ArrayBuildState *astate,+ Datum dvalue, bool disnull,+ Oid element_type,+ MemoryContext rcontext);+extern Datum makeArrayResult(ArrayBuildState *astate,+ MemoryContext rcontext);+extern Datum makeMdArrayResult(ArrayBuildState *astate, int ndims,+ int *dims, int *lbs, MemoryContext rcontext, bool release);++extern ArrayBuildStateArr *initArrayResultArr(Oid array_type, Oid element_type,+ MemoryContext rcontext, bool subcontext);+extern ArrayBuildStateArr *accumArrayResultArr(ArrayBuildStateArr *astate,+ Datum dvalue, bool disnull,+ Oid array_type,+ MemoryContext rcontext);+extern Datum makeArrayResultArr(ArrayBuildStateArr *astate,+ MemoryContext rcontext, bool release);++extern ArrayBuildStateAny *initArrayResultAny(Oid input_type,+ MemoryContext rcontext, bool subcontext);+extern ArrayBuildStateAny *accumArrayResultAny(ArrayBuildStateAny *astate,+ Datum dvalue, bool disnull,+ Oid input_type,+ MemoryContext rcontext);+extern Datum makeArrayResultAny(ArrayBuildStateAny *astate,+ MemoryContext rcontext, bool release);++extern ArrayIterator array_create_iterator(ArrayType *arr, int slice_ndim, ArrayMetaState *mstate);+extern bool array_iterate(ArrayIterator iterator, Datum *value, bool *isnull);+extern void array_free_iterator(ArrayIterator iterator);++/*+ * prototypes for functions defined in arrayutils.c+ */++extern int ArrayGetOffset(int n, const int *dim, const int *lb, const int *indx);+extern int ArrayGetOffset0(int n, const int *tup, const int *scale);+extern int ArrayGetNItems(int ndim, const int *dims);+extern void mda_get_range(int n, int *span, const int *st, const int *endp);+extern void mda_get_prod(int n, const int *range, int *prod);+extern void mda_get_offset_values(int n, int *dist, const int *prod, const int *span);+extern int mda_next_tuple(int n, int *curr, const int *span);+extern int32 *ArrayGetIntegerTypmods(ArrayType *arr, int *n);++/*+ * prototypes for functions defined in array_expanded.c+ */+extern Datum expand_array(Datum arraydatum, MemoryContext parentcontext,+ ArrayMetaState *metacache);+extern ExpandedArrayHeader *DatumGetExpandedArray(Datum d);+extern ExpandedArrayHeader *DatumGetExpandedArrayX(Datum d,+ ArrayMetaState *metacache);+extern AnyArrayType *DatumGetAnyArray(Datum d);+extern void deconstruct_expanded_array(ExpandedArrayHeader *eah);++/*+ * prototypes for functions defined in array_userfuncs.c+ */+extern Datum array_append(PG_FUNCTION_ARGS);+extern Datum array_prepend(PG_FUNCTION_ARGS);+extern Datum array_cat(PG_FUNCTION_ARGS);++extern ArrayType *create_singleton_array(FunctionCallInfo fcinfo,+ Oid element_type,+ Datum element,+ bool isNull,+ int ndims);++extern Datum array_agg_transfn(PG_FUNCTION_ARGS);+extern Datum array_agg_finalfn(PG_FUNCTION_ARGS);+extern Datum array_agg_array_transfn(PG_FUNCTION_ARGS);+extern Datum array_agg_array_finalfn(PG_FUNCTION_ARGS);++extern Datum array_position(PG_FUNCTION_ARGS);+extern Datum array_position_start(PG_FUNCTION_ARGS);+extern Datum array_positions(PG_FUNCTION_ARGS);++/*+ * prototypes for functions defined in array_typanalyze.c+ */+extern Datum array_typanalyze(PG_FUNCTION_ARGS);++#endif /* ARRAY_H */
+ foreign/libpg_query/src/postgres/include/utils/builtins.h view
@@ -0,0 +1,1269 @@+/*-------------------------------------------------------------------------+ *+ * builtins.h+ * Declarations for operations on built-in types.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/utils/builtins.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef BUILTINS_H+#define BUILTINS_H++#include "fmgr.h"+#include "nodes/parsenodes.h"++/*+ * Defined in adt/+ */++/* acl.c */+extern Datum has_any_column_privilege_name_name(PG_FUNCTION_ARGS);+extern Datum has_any_column_privilege_name_id(PG_FUNCTION_ARGS);+extern Datum has_any_column_privilege_id_name(PG_FUNCTION_ARGS);+extern Datum has_any_column_privilege_id_id(PG_FUNCTION_ARGS);+extern Datum has_any_column_privilege_name(PG_FUNCTION_ARGS);+extern Datum has_any_column_privilege_id(PG_FUNCTION_ARGS);+extern Datum has_column_privilege_name_name_name(PG_FUNCTION_ARGS);+extern Datum has_column_privilege_name_name_attnum(PG_FUNCTION_ARGS);+extern Datum has_column_privilege_name_id_name(PG_FUNCTION_ARGS);+extern Datum has_column_privilege_name_id_attnum(PG_FUNCTION_ARGS);+extern Datum has_column_privilege_id_name_name(PG_FUNCTION_ARGS);+extern Datum has_column_privilege_id_name_attnum(PG_FUNCTION_ARGS);+extern Datum has_column_privilege_id_id_name(PG_FUNCTION_ARGS);+extern Datum has_column_privilege_id_id_attnum(PG_FUNCTION_ARGS);+extern Datum has_column_privilege_name_name(PG_FUNCTION_ARGS);+extern Datum has_column_privilege_name_attnum(PG_FUNCTION_ARGS);+extern Datum has_column_privilege_id_name(PG_FUNCTION_ARGS);+extern Datum has_column_privilege_id_attnum(PG_FUNCTION_ARGS);+extern Datum has_table_privilege_name_name(PG_FUNCTION_ARGS);+extern Datum has_table_privilege_name_id(PG_FUNCTION_ARGS);+extern Datum has_table_privilege_id_name(PG_FUNCTION_ARGS);+extern Datum has_table_privilege_id_id(PG_FUNCTION_ARGS);+extern Datum has_table_privilege_name(PG_FUNCTION_ARGS);+extern Datum has_table_privilege_id(PG_FUNCTION_ARGS);+extern Datum has_sequence_privilege_name_name(PG_FUNCTION_ARGS);+extern Datum has_sequence_privilege_name_id(PG_FUNCTION_ARGS);+extern Datum has_sequence_privilege_id_name(PG_FUNCTION_ARGS);+extern Datum has_sequence_privilege_id_id(PG_FUNCTION_ARGS);+extern Datum has_sequence_privilege_name(PG_FUNCTION_ARGS);+extern Datum has_sequence_privilege_id(PG_FUNCTION_ARGS);+extern Datum has_database_privilege_name_name(PG_FUNCTION_ARGS);+extern Datum has_database_privilege_name_id(PG_FUNCTION_ARGS);+extern Datum has_database_privilege_id_name(PG_FUNCTION_ARGS);+extern Datum has_database_privilege_id_id(PG_FUNCTION_ARGS);+extern Datum has_database_privilege_name(PG_FUNCTION_ARGS);+extern Datum has_database_privilege_id(PG_FUNCTION_ARGS);+extern Datum has_foreign_data_wrapper_privilege_name_name(PG_FUNCTION_ARGS);+extern Datum has_foreign_data_wrapper_privilege_name_id(PG_FUNCTION_ARGS);+extern Datum has_foreign_data_wrapper_privilege_id_name(PG_FUNCTION_ARGS);+extern Datum has_foreign_data_wrapper_privilege_id_id(PG_FUNCTION_ARGS);+extern Datum has_foreign_data_wrapper_privilege_name(PG_FUNCTION_ARGS);+extern Datum has_foreign_data_wrapper_privilege_id(PG_FUNCTION_ARGS);+extern Datum has_function_privilege_name_name(PG_FUNCTION_ARGS);+extern Datum has_function_privilege_name_id(PG_FUNCTION_ARGS);+extern Datum has_function_privilege_id_name(PG_FUNCTION_ARGS);+extern Datum has_function_privilege_id_id(PG_FUNCTION_ARGS);+extern Datum has_function_privilege_name(PG_FUNCTION_ARGS);+extern Datum has_function_privilege_id(PG_FUNCTION_ARGS);+extern Datum has_language_privilege_name_name(PG_FUNCTION_ARGS);+extern Datum has_language_privilege_name_id(PG_FUNCTION_ARGS);+extern Datum has_language_privilege_id_name(PG_FUNCTION_ARGS);+extern Datum has_language_privilege_id_id(PG_FUNCTION_ARGS);+extern Datum has_language_privilege_name(PG_FUNCTION_ARGS);+extern Datum has_language_privilege_id(PG_FUNCTION_ARGS);+extern Datum has_schema_privilege_name_name(PG_FUNCTION_ARGS);+extern Datum has_schema_privilege_name_id(PG_FUNCTION_ARGS);+extern Datum has_schema_privilege_id_name(PG_FUNCTION_ARGS);+extern Datum has_schema_privilege_id_id(PG_FUNCTION_ARGS);+extern Datum has_schema_privilege_name(PG_FUNCTION_ARGS);+extern Datum has_schema_privilege_id(PG_FUNCTION_ARGS);+extern Datum has_server_privilege_name_name(PG_FUNCTION_ARGS);+extern Datum has_server_privilege_name_id(PG_FUNCTION_ARGS);+extern Datum has_server_privilege_id_name(PG_FUNCTION_ARGS);+extern Datum has_server_privilege_id_id(PG_FUNCTION_ARGS);+extern Datum has_server_privilege_name(PG_FUNCTION_ARGS);+extern Datum has_server_privilege_id(PG_FUNCTION_ARGS);+extern Datum has_tablespace_privilege_name_name(PG_FUNCTION_ARGS);+extern Datum has_tablespace_privilege_name_id(PG_FUNCTION_ARGS);+extern Datum has_tablespace_privilege_id_name(PG_FUNCTION_ARGS);+extern Datum has_tablespace_privilege_id_id(PG_FUNCTION_ARGS);+extern Datum has_tablespace_privilege_name(PG_FUNCTION_ARGS);+extern Datum has_tablespace_privilege_id(PG_FUNCTION_ARGS);+extern Datum has_type_privilege_name_name(PG_FUNCTION_ARGS);+extern Datum has_type_privilege_name_id(PG_FUNCTION_ARGS);+extern Datum has_type_privilege_id_name(PG_FUNCTION_ARGS);+extern Datum has_type_privilege_id_id(PG_FUNCTION_ARGS);+extern Datum has_type_privilege_name(PG_FUNCTION_ARGS);+extern Datum has_type_privilege_id(PG_FUNCTION_ARGS);+extern Datum pg_has_role_name_name(PG_FUNCTION_ARGS);+extern Datum pg_has_role_name_id(PG_FUNCTION_ARGS);+extern Datum pg_has_role_id_name(PG_FUNCTION_ARGS);+extern Datum pg_has_role_id_id(PG_FUNCTION_ARGS);+extern Datum pg_has_role_name(PG_FUNCTION_ARGS);+extern Datum pg_has_role_id(PG_FUNCTION_ARGS);++/* bool.c */+extern Datum boolin(PG_FUNCTION_ARGS);+extern Datum boolout(PG_FUNCTION_ARGS);+extern Datum boolrecv(PG_FUNCTION_ARGS);+extern Datum boolsend(PG_FUNCTION_ARGS);+extern Datum booltext(PG_FUNCTION_ARGS);+extern Datum booleq(PG_FUNCTION_ARGS);+extern Datum boolne(PG_FUNCTION_ARGS);+extern Datum boollt(PG_FUNCTION_ARGS);+extern Datum boolgt(PG_FUNCTION_ARGS);+extern Datum boolle(PG_FUNCTION_ARGS);+extern Datum boolge(PG_FUNCTION_ARGS);+extern Datum booland_statefunc(PG_FUNCTION_ARGS);+extern Datum boolor_statefunc(PG_FUNCTION_ARGS);+extern Datum bool_accum(PG_FUNCTION_ARGS);+extern Datum bool_accum_inv(PG_FUNCTION_ARGS);+extern Datum bool_alltrue(PG_FUNCTION_ARGS);+extern Datum bool_anytrue(PG_FUNCTION_ARGS);+extern bool parse_bool(const char *value, bool *result);+extern bool parse_bool_with_len(const char *value, size_t len, bool *result);++/* char.c */+extern Datum charin(PG_FUNCTION_ARGS);+extern Datum charout(PG_FUNCTION_ARGS);+extern Datum charrecv(PG_FUNCTION_ARGS);+extern Datum charsend(PG_FUNCTION_ARGS);+extern Datum chareq(PG_FUNCTION_ARGS);+extern Datum charne(PG_FUNCTION_ARGS);+extern Datum charlt(PG_FUNCTION_ARGS);+extern Datum charle(PG_FUNCTION_ARGS);+extern Datum chargt(PG_FUNCTION_ARGS);+extern Datum charge(PG_FUNCTION_ARGS);+extern Datum chartoi4(PG_FUNCTION_ARGS);+extern Datum i4tochar(PG_FUNCTION_ARGS);+extern Datum text_char(PG_FUNCTION_ARGS);+extern Datum char_text(PG_FUNCTION_ARGS);++/* domains.c */+extern Datum domain_in(PG_FUNCTION_ARGS);+extern Datum domain_recv(PG_FUNCTION_ARGS);+extern void domain_check(Datum value, bool isnull, Oid domainType,+ void **extra, MemoryContext mcxt);+extern int errdatatype(Oid datatypeOid);+extern int errdomainconstraint(Oid datatypeOid, const char *conname);++/* encode.c */+extern Datum binary_encode(PG_FUNCTION_ARGS);+extern Datum binary_decode(PG_FUNCTION_ARGS);+extern unsigned hex_encode(const char *src, unsigned len, char *dst);+extern unsigned hex_decode(const char *src, unsigned len, char *dst);++/* enum.c */+extern Datum enum_in(PG_FUNCTION_ARGS);+extern Datum enum_out(PG_FUNCTION_ARGS);+extern Datum enum_recv(PG_FUNCTION_ARGS);+extern Datum enum_send(PG_FUNCTION_ARGS);+extern Datum enum_lt(PG_FUNCTION_ARGS);+extern Datum enum_le(PG_FUNCTION_ARGS);+extern Datum enum_eq(PG_FUNCTION_ARGS);+extern Datum enum_ne(PG_FUNCTION_ARGS);+extern Datum enum_ge(PG_FUNCTION_ARGS);+extern Datum enum_gt(PG_FUNCTION_ARGS);+extern Datum enum_cmp(PG_FUNCTION_ARGS);+extern Datum enum_smaller(PG_FUNCTION_ARGS);+extern Datum enum_larger(PG_FUNCTION_ARGS);+extern Datum enum_first(PG_FUNCTION_ARGS);+extern Datum enum_last(PG_FUNCTION_ARGS);+extern Datum enum_range_bounds(PG_FUNCTION_ARGS);+extern Datum enum_range_all(PG_FUNCTION_ARGS);++/* int.c */+extern Datum int2in(PG_FUNCTION_ARGS);+extern Datum int2out(PG_FUNCTION_ARGS);+extern Datum int2recv(PG_FUNCTION_ARGS);+extern Datum int2send(PG_FUNCTION_ARGS);+extern Datum int2vectorin(PG_FUNCTION_ARGS);+extern Datum int2vectorout(PG_FUNCTION_ARGS);+extern Datum int2vectorrecv(PG_FUNCTION_ARGS);+extern Datum int2vectorsend(PG_FUNCTION_ARGS);+extern Datum int2vectoreq(PG_FUNCTION_ARGS);+extern Datum int4in(PG_FUNCTION_ARGS);+extern Datum int4out(PG_FUNCTION_ARGS);+extern Datum int4recv(PG_FUNCTION_ARGS);+extern Datum int4send(PG_FUNCTION_ARGS);+extern Datum i2toi4(PG_FUNCTION_ARGS);+extern Datum i4toi2(PG_FUNCTION_ARGS);+extern Datum int4_bool(PG_FUNCTION_ARGS);+extern Datum bool_int4(PG_FUNCTION_ARGS);+extern Datum int4eq(PG_FUNCTION_ARGS);+extern Datum int4ne(PG_FUNCTION_ARGS);+extern Datum int4lt(PG_FUNCTION_ARGS);+extern Datum int4le(PG_FUNCTION_ARGS);+extern Datum int4gt(PG_FUNCTION_ARGS);+extern Datum int4ge(PG_FUNCTION_ARGS);+extern Datum int2eq(PG_FUNCTION_ARGS);+extern Datum int2ne(PG_FUNCTION_ARGS);+extern Datum int2lt(PG_FUNCTION_ARGS);+extern Datum int2le(PG_FUNCTION_ARGS);+extern Datum int2gt(PG_FUNCTION_ARGS);+extern Datum int2ge(PG_FUNCTION_ARGS);+extern Datum int24eq(PG_FUNCTION_ARGS);+extern Datum int24ne(PG_FUNCTION_ARGS);+extern Datum int24lt(PG_FUNCTION_ARGS);+extern Datum int24le(PG_FUNCTION_ARGS);+extern Datum int24gt(PG_FUNCTION_ARGS);+extern Datum int24ge(PG_FUNCTION_ARGS);+extern Datum int42eq(PG_FUNCTION_ARGS);+extern Datum int42ne(PG_FUNCTION_ARGS);+extern Datum int42lt(PG_FUNCTION_ARGS);+extern Datum int42le(PG_FUNCTION_ARGS);+extern Datum int42gt(PG_FUNCTION_ARGS);+extern Datum int42ge(PG_FUNCTION_ARGS);+extern Datum int4um(PG_FUNCTION_ARGS);+extern Datum int4up(PG_FUNCTION_ARGS);+extern Datum int4pl(PG_FUNCTION_ARGS);+extern Datum int4mi(PG_FUNCTION_ARGS);+extern Datum int4mul(PG_FUNCTION_ARGS);+extern Datum int4div(PG_FUNCTION_ARGS);+extern Datum int4abs(PG_FUNCTION_ARGS);+extern Datum int4inc(PG_FUNCTION_ARGS);+extern Datum int2um(PG_FUNCTION_ARGS);+extern Datum int2up(PG_FUNCTION_ARGS);+extern Datum int2pl(PG_FUNCTION_ARGS);+extern Datum int2mi(PG_FUNCTION_ARGS);+extern Datum int2mul(PG_FUNCTION_ARGS);+extern Datum int2div(PG_FUNCTION_ARGS);+extern Datum int2abs(PG_FUNCTION_ARGS);+extern Datum int24pl(PG_FUNCTION_ARGS);+extern Datum int24mi(PG_FUNCTION_ARGS);+extern Datum int24mul(PG_FUNCTION_ARGS);+extern Datum int24div(PG_FUNCTION_ARGS);+extern Datum int42pl(PG_FUNCTION_ARGS);+extern Datum int42mi(PG_FUNCTION_ARGS);+extern Datum int42mul(PG_FUNCTION_ARGS);+extern Datum int42div(PG_FUNCTION_ARGS);+extern Datum int4mod(PG_FUNCTION_ARGS);+extern Datum int2mod(PG_FUNCTION_ARGS);+extern Datum int2larger(PG_FUNCTION_ARGS);+extern Datum int2smaller(PG_FUNCTION_ARGS);+extern Datum int4larger(PG_FUNCTION_ARGS);+extern Datum int4smaller(PG_FUNCTION_ARGS);++extern Datum int4and(PG_FUNCTION_ARGS);+extern Datum int4or(PG_FUNCTION_ARGS);+extern Datum int4xor(PG_FUNCTION_ARGS);+extern Datum int4not(PG_FUNCTION_ARGS);+extern Datum int4shl(PG_FUNCTION_ARGS);+extern Datum int4shr(PG_FUNCTION_ARGS);+extern Datum int2and(PG_FUNCTION_ARGS);+extern Datum int2or(PG_FUNCTION_ARGS);+extern Datum int2xor(PG_FUNCTION_ARGS);+extern Datum int2not(PG_FUNCTION_ARGS);+extern Datum int2shl(PG_FUNCTION_ARGS);+extern Datum int2shr(PG_FUNCTION_ARGS);+extern Datum generate_series_int4(PG_FUNCTION_ARGS);+extern Datum generate_series_step_int4(PG_FUNCTION_ARGS);+extern int2vector *buildint2vector(const int16 *int2s, int n);++/* name.c */+extern Datum namein(PG_FUNCTION_ARGS);+extern Datum nameout(PG_FUNCTION_ARGS);+extern Datum namerecv(PG_FUNCTION_ARGS);+extern Datum namesend(PG_FUNCTION_ARGS);+extern Datum nameeq(PG_FUNCTION_ARGS);+extern Datum namene(PG_FUNCTION_ARGS);+extern Datum namelt(PG_FUNCTION_ARGS);+extern Datum namele(PG_FUNCTION_ARGS);+extern Datum namegt(PG_FUNCTION_ARGS);+extern Datum namege(PG_FUNCTION_ARGS);+extern int namecpy(Name n1, Name n2);+extern int namestrcpy(Name name, const char *str);+extern int namestrcmp(Name name, const char *str);+extern Datum current_user(PG_FUNCTION_ARGS);+extern Datum session_user(PG_FUNCTION_ARGS);+extern Datum current_schema(PG_FUNCTION_ARGS);+extern Datum current_schemas(PG_FUNCTION_ARGS);++/* numutils.c */+extern int32 pg_atoi(const char *s, int size, int c);+extern void pg_itoa(int16 i, char *a);+extern void pg_ltoa(int32 l, char *a);+extern void pg_lltoa(int64 ll, char *a);++/*+ * Per-opclass comparison functions for new btrees. These are+ * stored in pg_amproc; most are defined in access/nbtree/nbtcompare.c+ */+extern Datum btboolcmp(PG_FUNCTION_ARGS);+extern Datum btint2cmp(PG_FUNCTION_ARGS);+extern Datum btint4cmp(PG_FUNCTION_ARGS);+extern Datum btint8cmp(PG_FUNCTION_ARGS);+extern Datum btfloat4cmp(PG_FUNCTION_ARGS);+extern Datum btfloat8cmp(PG_FUNCTION_ARGS);+extern Datum btint48cmp(PG_FUNCTION_ARGS);+extern Datum btint84cmp(PG_FUNCTION_ARGS);+extern Datum btint24cmp(PG_FUNCTION_ARGS);+extern Datum btint42cmp(PG_FUNCTION_ARGS);+extern Datum btint28cmp(PG_FUNCTION_ARGS);+extern Datum btint82cmp(PG_FUNCTION_ARGS);+extern Datum btfloat48cmp(PG_FUNCTION_ARGS);+extern Datum btfloat84cmp(PG_FUNCTION_ARGS);+extern Datum btoidcmp(PG_FUNCTION_ARGS);+extern Datum btoidvectorcmp(PG_FUNCTION_ARGS);+extern Datum btabstimecmp(PG_FUNCTION_ARGS);+extern Datum btreltimecmp(PG_FUNCTION_ARGS);+extern Datum bttintervalcmp(PG_FUNCTION_ARGS);+extern Datum btcharcmp(PG_FUNCTION_ARGS);+extern Datum btnamecmp(PG_FUNCTION_ARGS);+extern Datum bttextcmp(PG_FUNCTION_ARGS);+extern Datum bttextsortsupport(PG_FUNCTION_ARGS);++/*+ * Per-opclass sort support functions for new btrees. Like the+ * functions above, these are stored in pg_amproc; most are defined in+ * access/nbtree/nbtcompare.c+ */+extern Datum btint2sortsupport(PG_FUNCTION_ARGS);+extern Datum btint4sortsupport(PG_FUNCTION_ARGS);+extern Datum btint8sortsupport(PG_FUNCTION_ARGS);+extern Datum btfloat4sortsupport(PG_FUNCTION_ARGS);+extern Datum btfloat8sortsupport(PG_FUNCTION_ARGS);+extern Datum btoidsortsupport(PG_FUNCTION_ARGS);+extern Datum btnamesortsupport(PG_FUNCTION_ARGS);++/* float.c */+extern PGDLLIMPORT int extra_float_digits;++extern double get_float8_infinity(void);+extern float get_float4_infinity(void);+extern double get_float8_nan(void);+extern float get_float4_nan(void);+extern int is_infinite(double val);++extern Datum float4in(PG_FUNCTION_ARGS);+extern Datum float4out(PG_FUNCTION_ARGS);+extern Datum float4recv(PG_FUNCTION_ARGS);+extern Datum float4send(PG_FUNCTION_ARGS);+extern Datum float8in(PG_FUNCTION_ARGS);+extern Datum float8out(PG_FUNCTION_ARGS);+extern Datum float8recv(PG_FUNCTION_ARGS);+extern Datum float8send(PG_FUNCTION_ARGS);+extern Datum float4abs(PG_FUNCTION_ARGS);+extern Datum float4um(PG_FUNCTION_ARGS);+extern Datum float4up(PG_FUNCTION_ARGS);+extern Datum float4larger(PG_FUNCTION_ARGS);+extern Datum float4smaller(PG_FUNCTION_ARGS);+extern Datum float8abs(PG_FUNCTION_ARGS);+extern Datum float8um(PG_FUNCTION_ARGS);+extern Datum float8up(PG_FUNCTION_ARGS);+extern Datum float8larger(PG_FUNCTION_ARGS);+extern Datum float8smaller(PG_FUNCTION_ARGS);+extern Datum float4pl(PG_FUNCTION_ARGS);+extern Datum float4mi(PG_FUNCTION_ARGS);+extern Datum float4mul(PG_FUNCTION_ARGS);+extern Datum float4div(PG_FUNCTION_ARGS);+extern Datum float8pl(PG_FUNCTION_ARGS);+extern Datum float8mi(PG_FUNCTION_ARGS);+extern Datum float8mul(PG_FUNCTION_ARGS);+extern Datum float8div(PG_FUNCTION_ARGS);+extern Datum float4eq(PG_FUNCTION_ARGS);+extern Datum float4ne(PG_FUNCTION_ARGS);+extern Datum float4lt(PG_FUNCTION_ARGS);+extern Datum float4le(PG_FUNCTION_ARGS);+extern Datum float4gt(PG_FUNCTION_ARGS);+extern Datum float4ge(PG_FUNCTION_ARGS);+extern Datum float8eq(PG_FUNCTION_ARGS);+extern Datum float8ne(PG_FUNCTION_ARGS);+extern Datum float8lt(PG_FUNCTION_ARGS);+extern Datum float8le(PG_FUNCTION_ARGS);+extern Datum float8gt(PG_FUNCTION_ARGS);+extern Datum float8ge(PG_FUNCTION_ARGS);+extern Datum ftod(PG_FUNCTION_ARGS);+extern Datum i4tod(PG_FUNCTION_ARGS);+extern Datum i2tod(PG_FUNCTION_ARGS);+extern Datum dtof(PG_FUNCTION_ARGS);+extern Datum dtoi4(PG_FUNCTION_ARGS);+extern Datum dtoi2(PG_FUNCTION_ARGS);+extern Datum i4tof(PG_FUNCTION_ARGS);+extern Datum i2tof(PG_FUNCTION_ARGS);+extern Datum ftoi4(PG_FUNCTION_ARGS);+extern Datum ftoi2(PG_FUNCTION_ARGS);+extern Datum dround(PG_FUNCTION_ARGS);+extern Datum dceil(PG_FUNCTION_ARGS);+extern Datum dfloor(PG_FUNCTION_ARGS);+extern Datum dsign(PG_FUNCTION_ARGS);+extern Datum dtrunc(PG_FUNCTION_ARGS);+extern Datum dsqrt(PG_FUNCTION_ARGS);+extern Datum dcbrt(PG_FUNCTION_ARGS);+extern Datum dpow(PG_FUNCTION_ARGS);+extern Datum dexp(PG_FUNCTION_ARGS);+extern Datum dlog1(PG_FUNCTION_ARGS);+extern Datum dlog10(PG_FUNCTION_ARGS);+extern Datum dacos(PG_FUNCTION_ARGS);+extern Datum dasin(PG_FUNCTION_ARGS);+extern Datum datan(PG_FUNCTION_ARGS);+extern Datum datan2(PG_FUNCTION_ARGS);+extern Datum dcos(PG_FUNCTION_ARGS);+extern Datum dcot(PG_FUNCTION_ARGS);+extern Datum dsin(PG_FUNCTION_ARGS);+extern Datum dtan(PG_FUNCTION_ARGS);+extern Datum degrees(PG_FUNCTION_ARGS);+extern Datum dpi(PG_FUNCTION_ARGS);+extern Datum radians(PG_FUNCTION_ARGS);+extern Datum drandom(PG_FUNCTION_ARGS);+extern Datum setseed(PG_FUNCTION_ARGS);+extern Datum float8_accum(PG_FUNCTION_ARGS);+extern Datum float4_accum(PG_FUNCTION_ARGS);+extern Datum float8_avg(PG_FUNCTION_ARGS);+extern Datum float8_var_pop(PG_FUNCTION_ARGS);+extern Datum float8_var_samp(PG_FUNCTION_ARGS);+extern Datum float8_stddev_pop(PG_FUNCTION_ARGS);+extern Datum float8_stddev_samp(PG_FUNCTION_ARGS);+extern Datum float8_regr_accum(PG_FUNCTION_ARGS);+extern Datum float8_regr_sxx(PG_FUNCTION_ARGS);+extern Datum float8_regr_syy(PG_FUNCTION_ARGS);+extern Datum float8_regr_sxy(PG_FUNCTION_ARGS);+extern Datum float8_regr_avgx(PG_FUNCTION_ARGS);+extern Datum float8_regr_avgy(PG_FUNCTION_ARGS);+extern Datum float8_covar_pop(PG_FUNCTION_ARGS);+extern Datum float8_covar_samp(PG_FUNCTION_ARGS);+extern Datum float8_corr(PG_FUNCTION_ARGS);+extern Datum float8_regr_r2(PG_FUNCTION_ARGS);+extern Datum float8_regr_slope(PG_FUNCTION_ARGS);+extern Datum float8_regr_intercept(PG_FUNCTION_ARGS);+extern Datum float48pl(PG_FUNCTION_ARGS);+extern Datum float48mi(PG_FUNCTION_ARGS);+extern Datum float48mul(PG_FUNCTION_ARGS);+extern Datum float48div(PG_FUNCTION_ARGS);+extern Datum float84pl(PG_FUNCTION_ARGS);+extern Datum float84mi(PG_FUNCTION_ARGS);+extern Datum float84mul(PG_FUNCTION_ARGS);+extern Datum float84div(PG_FUNCTION_ARGS);+extern Datum float48eq(PG_FUNCTION_ARGS);+extern Datum float48ne(PG_FUNCTION_ARGS);+extern Datum float48lt(PG_FUNCTION_ARGS);+extern Datum float48le(PG_FUNCTION_ARGS);+extern Datum float48gt(PG_FUNCTION_ARGS);+extern Datum float48ge(PG_FUNCTION_ARGS);+extern Datum float84eq(PG_FUNCTION_ARGS);+extern Datum float84ne(PG_FUNCTION_ARGS);+extern Datum float84lt(PG_FUNCTION_ARGS);+extern Datum float84le(PG_FUNCTION_ARGS);+extern Datum float84gt(PG_FUNCTION_ARGS);+extern Datum float84ge(PG_FUNCTION_ARGS);+extern Datum width_bucket_float8(PG_FUNCTION_ARGS);++/* dbsize.c */+extern Datum pg_tablespace_size_oid(PG_FUNCTION_ARGS);+extern Datum pg_tablespace_size_name(PG_FUNCTION_ARGS);+extern Datum pg_database_size_oid(PG_FUNCTION_ARGS);+extern Datum pg_database_size_name(PG_FUNCTION_ARGS);+extern Datum pg_relation_size(PG_FUNCTION_ARGS);+extern Datum pg_total_relation_size(PG_FUNCTION_ARGS);+extern Datum pg_size_pretty(PG_FUNCTION_ARGS);+extern Datum pg_size_pretty_numeric(PG_FUNCTION_ARGS);+extern Datum pg_table_size(PG_FUNCTION_ARGS);+extern Datum pg_indexes_size(PG_FUNCTION_ARGS);+extern Datum pg_relation_filenode(PG_FUNCTION_ARGS);+extern Datum pg_filenode_relation(PG_FUNCTION_ARGS);+extern Datum pg_relation_filepath(PG_FUNCTION_ARGS);++/* genfile.c */+extern Datum pg_stat_file(PG_FUNCTION_ARGS);+extern Datum pg_stat_file_1arg(PG_FUNCTION_ARGS);+extern Datum pg_read_file(PG_FUNCTION_ARGS);+extern Datum pg_read_file_off_len(PG_FUNCTION_ARGS);+extern Datum pg_read_file_all(PG_FUNCTION_ARGS);+extern Datum pg_read_binary_file(PG_FUNCTION_ARGS);+extern Datum pg_read_binary_file_off_len(PG_FUNCTION_ARGS);+extern Datum pg_read_binary_file_all(PG_FUNCTION_ARGS);+extern Datum pg_ls_dir(PG_FUNCTION_ARGS);+extern Datum pg_ls_dir_1arg(PG_FUNCTION_ARGS);++/* misc.c */+extern Datum current_database(PG_FUNCTION_ARGS);+extern Datum current_query(PG_FUNCTION_ARGS);+extern Datum pg_cancel_backend(PG_FUNCTION_ARGS);+extern Datum pg_terminate_backend(PG_FUNCTION_ARGS);+extern Datum pg_reload_conf(PG_FUNCTION_ARGS);+extern Datum pg_tablespace_databases(PG_FUNCTION_ARGS);+extern Datum pg_tablespace_location(PG_FUNCTION_ARGS);+extern Datum pg_rotate_logfile(PG_FUNCTION_ARGS);+extern Datum pg_sleep(PG_FUNCTION_ARGS);+extern Datum pg_get_keywords(PG_FUNCTION_ARGS);+extern Datum pg_typeof(PG_FUNCTION_ARGS);+extern Datum pg_collation_for(PG_FUNCTION_ARGS);+extern Datum pg_relation_is_updatable(PG_FUNCTION_ARGS);+extern Datum pg_column_is_updatable(PG_FUNCTION_ARGS);++/* oid.c */+extern Datum oidin(PG_FUNCTION_ARGS);+extern Datum oidout(PG_FUNCTION_ARGS);+extern Datum oidrecv(PG_FUNCTION_ARGS);+extern Datum oidsend(PG_FUNCTION_ARGS);+extern Datum oideq(PG_FUNCTION_ARGS);+extern Datum oidne(PG_FUNCTION_ARGS);+extern Datum oidlt(PG_FUNCTION_ARGS);+extern Datum oidle(PG_FUNCTION_ARGS);+extern Datum oidge(PG_FUNCTION_ARGS);+extern Datum oidgt(PG_FUNCTION_ARGS);+extern Datum oidlarger(PG_FUNCTION_ARGS);+extern Datum oidsmaller(PG_FUNCTION_ARGS);+extern Datum oidvectorin(PG_FUNCTION_ARGS);+extern Datum oidvectorout(PG_FUNCTION_ARGS);+extern Datum oidvectorrecv(PG_FUNCTION_ARGS);+extern Datum oidvectorsend(PG_FUNCTION_ARGS);+extern Datum oidvectoreq(PG_FUNCTION_ARGS);+extern Datum oidvectorne(PG_FUNCTION_ARGS);+extern Datum oidvectorlt(PG_FUNCTION_ARGS);+extern Datum oidvectorle(PG_FUNCTION_ARGS);+extern Datum oidvectorge(PG_FUNCTION_ARGS);+extern Datum oidvectorgt(PG_FUNCTION_ARGS);+extern oidvector *buildoidvector(const Oid *oids, int n);+extern Oid oidparse(Node *node);++/* orderedsetaggs.c */+extern Datum ordered_set_transition(PG_FUNCTION_ARGS);+extern Datum ordered_set_transition_multi(PG_FUNCTION_ARGS);+extern Datum percentile_disc_final(PG_FUNCTION_ARGS);+extern Datum percentile_cont_float8_final(PG_FUNCTION_ARGS);+extern Datum percentile_cont_interval_final(PG_FUNCTION_ARGS);+extern Datum percentile_disc_multi_final(PG_FUNCTION_ARGS);+extern Datum percentile_cont_float8_multi_final(PG_FUNCTION_ARGS);+extern Datum percentile_cont_interval_multi_final(PG_FUNCTION_ARGS);+extern Datum mode_final(PG_FUNCTION_ARGS);+extern Datum hypothetical_rank_final(PG_FUNCTION_ARGS);+extern Datum hypothetical_percent_rank_final(PG_FUNCTION_ARGS);+extern Datum hypothetical_cume_dist_final(PG_FUNCTION_ARGS);+extern Datum hypothetical_dense_rank_final(PG_FUNCTION_ARGS);++/* pseudotypes.c */+extern Datum cstring_in(PG_FUNCTION_ARGS);+extern Datum cstring_out(PG_FUNCTION_ARGS);+extern Datum cstring_recv(PG_FUNCTION_ARGS);+extern Datum cstring_send(PG_FUNCTION_ARGS);+extern Datum any_in(PG_FUNCTION_ARGS);+extern Datum any_out(PG_FUNCTION_ARGS);+extern Datum anyarray_in(PG_FUNCTION_ARGS);+extern Datum anyarray_out(PG_FUNCTION_ARGS);+extern Datum anyarray_recv(PG_FUNCTION_ARGS);+extern Datum anyarray_send(PG_FUNCTION_ARGS);+extern Datum anynonarray_in(PG_FUNCTION_ARGS);+extern Datum anynonarray_out(PG_FUNCTION_ARGS);+extern Datum anyenum_in(PG_FUNCTION_ARGS);+extern Datum anyenum_out(PG_FUNCTION_ARGS);+extern Datum anyrange_in(PG_FUNCTION_ARGS);+extern Datum anyrange_out(PG_FUNCTION_ARGS);+extern Datum void_in(PG_FUNCTION_ARGS);+extern Datum void_out(PG_FUNCTION_ARGS);+extern Datum void_recv(PG_FUNCTION_ARGS);+extern Datum void_send(PG_FUNCTION_ARGS);+extern Datum trigger_in(PG_FUNCTION_ARGS);+extern Datum trigger_out(PG_FUNCTION_ARGS);+extern Datum event_trigger_in(PG_FUNCTION_ARGS);+extern Datum event_trigger_out(PG_FUNCTION_ARGS);+extern Datum language_handler_in(PG_FUNCTION_ARGS);+extern Datum language_handler_out(PG_FUNCTION_ARGS);+extern Datum fdw_handler_in(PG_FUNCTION_ARGS);+extern Datum fdw_handler_out(PG_FUNCTION_ARGS);+extern Datum tsm_handler_in(PG_FUNCTION_ARGS);+extern Datum tsm_handler_out(PG_FUNCTION_ARGS);+extern Datum internal_in(PG_FUNCTION_ARGS);+extern Datum internal_out(PG_FUNCTION_ARGS);+extern Datum opaque_in(PG_FUNCTION_ARGS);+extern Datum opaque_out(PG_FUNCTION_ARGS);+extern Datum anyelement_in(PG_FUNCTION_ARGS);+extern Datum anyelement_out(PG_FUNCTION_ARGS);+extern Datum shell_in(PG_FUNCTION_ARGS);+extern Datum shell_out(PG_FUNCTION_ARGS);+extern Datum pg_node_tree_in(PG_FUNCTION_ARGS);+extern Datum pg_node_tree_out(PG_FUNCTION_ARGS);+extern Datum pg_node_tree_recv(PG_FUNCTION_ARGS);+extern Datum pg_node_tree_send(PG_FUNCTION_ARGS);+extern Datum pg_ddl_command_in(PG_FUNCTION_ARGS);+extern Datum pg_ddl_command_out(PG_FUNCTION_ARGS);+extern Datum pg_ddl_command_recv(PG_FUNCTION_ARGS);+extern Datum pg_ddl_command_send(PG_FUNCTION_ARGS);++/* regexp.c */+extern Datum nameregexeq(PG_FUNCTION_ARGS);+extern Datum nameregexne(PG_FUNCTION_ARGS);+extern Datum textregexeq(PG_FUNCTION_ARGS);+extern Datum textregexne(PG_FUNCTION_ARGS);+extern Datum nameicregexeq(PG_FUNCTION_ARGS);+extern Datum nameicregexne(PG_FUNCTION_ARGS);+extern Datum texticregexeq(PG_FUNCTION_ARGS);+extern Datum texticregexne(PG_FUNCTION_ARGS);+extern Datum textregexsubstr(PG_FUNCTION_ARGS);+extern Datum textregexreplace_noopt(PG_FUNCTION_ARGS);+extern Datum textregexreplace(PG_FUNCTION_ARGS);+extern Datum similar_escape(PG_FUNCTION_ARGS);+extern Datum regexp_matches(PG_FUNCTION_ARGS);+extern Datum regexp_matches_no_flags(PG_FUNCTION_ARGS);+extern Datum regexp_split_to_table(PG_FUNCTION_ARGS);+extern Datum regexp_split_to_table_no_flags(PG_FUNCTION_ARGS);+extern Datum regexp_split_to_array(PG_FUNCTION_ARGS);+extern Datum regexp_split_to_array_no_flags(PG_FUNCTION_ARGS);+extern char *regexp_fixed_prefix(text *text_re, bool case_insensitive,+ Oid collation, bool *exact);++/* regproc.c */+extern Datum regprocin(PG_FUNCTION_ARGS);+extern Datum regprocout(PG_FUNCTION_ARGS);+extern Datum to_regproc(PG_FUNCTION_ARGS);+extern Datum to_regprocedure(PG_FUNCTION_ARGS);+extern Datum regprocrecv(PG_FUNCTION_ARGS);+extern Datum regprocsend(PG_FUNCTION_ARGS);+extern Datum regprocedurein(PG_FUNCTION_ARGS);+extern Datum regprocedureout(PG_FUNCTION_ARGS);+extern Datum regprocedurerecv(PG_FUNCTION_ARGS);+extern Datum regproceduresend(PG_FUNCTION_ARGS);+extern Datum regoperin(PG_FUNCTION_ARGS);+extern Datum regoperout(PG_FUNCTION_ARGS);+extern Datum regoperrecv(PG_FUNCTION_ARGS);+extern Datum regopersend(PG_FUNCTION_ARGS);+extern Datum to_regoper(PG_FUNCTION_ARGS);+extern Datum to_regoperator(PG_FUNCTION_ARGS);+extern Datum regoperatorin(PG_FUNCTION_ARGS);+extern Datum regoperatorout(PG_FUNCTION_ARGS);+extern Datum regoperatorrecv(PG_FUNCTION_ARGS);+extern Datum regoperatorsend(PG_FUNCTION_ARGS);+extern Datum regclassin(PG_FUNCTION_ARGS);+extern Datum regclassout(PG_FUNCTION_ARGS);+extern Datum regclassrecv(PG_FUNCTION_ARGS);+extern Datum regclasssend(PG_FUNCTION_ARGS);+extern Datum to_regclass(PG_FUNCTION_ARGS);+extern Datum regtypein(PG_FUNCTION_ARGS);+extern Datum regtypeout(PG_FUNCTION_ARGS);+extern Datum regtyperecv(PG_FUNCTION_ARGS);+extern Datum regtypesend(PG_FUNCTION_ARGS);+extern Datum to_regtype(PG_FUNCTION_ARGS);+extern Datum regrolein(PG_FUNCTION_ARGS);+extern Datum regroleout(PG_FUNCTION_ARGS);+extern Datum regrolerecv(PG_FUNCTION_ARGS);+extern Datum regrolesend(PG_FUNCTION_ARGS);+extern Datum to_regrole(PG_FUNCTION_ARGS);+extern Datum regnamespacein(PG_FUNCTION_ARGS);+extern Datum regnamespaceout(PG_FUNCTION_ARGS);+extern Datum regnamespacerecv(PG_FUNCTION_ARGS);+extern Datum regnamespacesend(PG_FUNCTION_ARGS);+extern Datum to_regnamespace(PG_FUNCTION_ARGS);+extern Datum regconfigin(PG_FUNCTION_ARGS);+extern Datum regconfigout(PG_FUNCTION_ARGS);+extern Datum regconfigrecv(PG_FUNCTION_ARGS);+extern Datum regconfigsend(PG_FUNCTION_ARGS);+extern Datum regdictionaryin(PG_FUNCTION_ARGS);+extern Datum regdictionaryout(PG_FUNCTION_ARGS);+extern Datum regdictionaryrecv(PG_FUNCTION_ARGS);+extern Datum regdictionarysend(PG_FUNCTION_ARGS);+extern Datum text_regclass(PG_FUNCTION_ARGS);+extern List *stringToQualifiedNameList(const char *string);+extern char *format_procedure(Oid procedure_oid);+extern char *format_procedure_qualified(Oid procedure_oid);+extern void format_procedure_parts(Oid operator_oid, List **objnames,+ List **objargs);+extern char *format_operator(Oid operator_oid);+extern char *format_operator_qualified(Oid operator_oid);+extern void format_operator_parts(Oid operator_oid, List **objnames,+ List **objargs);++/* rowtypes.c */+extern Datum record_in(PG_FUNCTION_ARGS);+extern Datum record_out(PG_FUNCTION_ARGS);+extern Datum record_recv(PG_FUNCTION_ARGS);+extern Datum record_send(PG_FUNCTION_ARGS);+extern Datum record_eq(PG_FUNCTION_ARGS);+extern Datum record_ne(PG_FUNCTION_ARGS);+extern Datum record_lt(PG_FUNCTION_ARGS);+extern Datum record_gt(PG_FUNCTION_ARGS);+extern Datum record_le(PG_FUNCTION_ARGS);+extern Datum record_ge(PG_FUNCTION_ARGS);+extern Datum btrecordcmp(PG_FUNCTION_ARGS);+extern Datum record_image_eq(PG_FUNCTION_ARGS);+extern Datum record_image_ne(PG_FUNCTION_ARGS);+extern Datum record_image_lt(PG_FUNCTION_ARGS);+extern Datum record_image_gt(PG_FUNCTION_ARGS);+extern Datum record_image_le(PG_FUNCTION_ARGS);+extern Datum record_image_ge(PG_FUNCTION_ARGS);+extern Datum btrecordimagecmp(PG_FUNCTION_ARGS);++/* ruleutils.c */+extern __thread bool quote_all_identifiers;+extern Datum pg_get_ruledef(PG_FUNCTION_ARGS);+extern Datum pg_get_ruledef_ext(PG_FUNCTION_ARGS);+extern Datum pg_get_viewdef(PG_FUNCTION_ARGS);+extern Datum pg_get_viewdef_ext(PG_FUNCTION_ARGS);+extern Datum pg_get_viewdef_wrap(PG_FUNCTION_ARGS);+extern Datum pg_get_viewdef_name(PG_FUNCTION_ARGS);+extern Datum pg_get_viewdef_name_ext(PG_FUNCTION_ARGS);+extern Datum pg_get_indexdef(PG_FUNCTION_ARGS);+extern Datum pg_get_indexdef_ext(PG_FUNCTION_ARGS);+extern Datum pg_get_triggerdef(PG_FUNCTION_ARGS);+extern Datum pg_get_triggerdef_ext(PG_FUNCTION_ARGS);+extern Datum pg_get_constraintdef(PG_FUNCTION_ARGS);+extern Datum pg_get_constraintdef_ext(PG_FUNCTION_ARGS);+extern Datum pg_get_expr(PG_FUNCTION_ARGS);+extern Datum pg_get_expr_ext(PG_FUNCTION_ARGS);+extern Datum pg_get_userbyid(PG_FUNCTION_ARGS);+extern Datum pg_get_serial_sequence(PG_FUNCTION_ARGS);+extern Datum pg_get_functiondef(PG_FUNCTION_ARGS);+extern Datum pg_get_function_arguments(PG_FUNCTION_ARGS);+extern Datum pg_get_function_identity_arguments(PG_FUNCTION_ARGS);+extern Datum pg_get_function_result(PG_FUNCTION_ARGS);+extern Datum pg_get_function_arg_default(PG_FUNCTION_ARGS);+extern const char *quote_identifier(const char *ident);+extern char *quote_qualified_identifier(const char *qualifier,+ const char *ident);+++/* tid.c */+extern Datum tidin(PG_FUNCTION_ARGS);+extern Datum tidout(PG_FUNCTION_ARGS);+extern Datum tidrecv(PG_FUNCTION_ARGS);+extern Datum tidsend(PG_FUNCTION_ARGS);+extern Datum tideq(PG_FUNCTION_ARGS);+extern Datum tidne(PG_FUNCTION_ARGS);+extern Datum tidlt(PG_FUNCTION_ARGS);+extern Datum tidle(PG_FUNCTION_ARGS);+extern Datum tidgt(PG_FUNCTION_ARGS);+extern Datum tidge(PG_FUNCTION_ARGS);+extern Datum bttidcmp(PG_FUNCTION_ARGS);+extern Datum tidlarger(PG_FUNCTION_ARGS);+extern Datum tidsmaller(PG_FUNCTION_ARGS);+extern Datum currtid_byreloid(PG_FUNCTION_ARGS);+extern Datum currtid_byrelname(PG_FUNCTION_ARGS);++/* varchar.c */+extern Datum bpcharin(PG_FUNCTION_ARGS);+extern Datum bpcharout(PG_FUNCTION_ARGS);+extern Datum bpcharrecv(PG_FUNCTION_ARGS);+extern Datum bpcharsend(PG_FUNCTION_ARGS);+extern Datum bpchartypmodin(PG_FUNCTION_ARGS);+extern Datum bpchartypmodout(PG_FUNCTION_ARGS);+extern Datum bpchar(PG_FUNCTION_ARGS);+extern Datum char_bpchar(PG_FUNCTION_ARGS);+extern Datum name_bpchar(PG_FUNCTION_ARGS);+extern Datum bpchar_name(PG_FUNCTION_ARGS);+extern Datum bpchareq(PG_FUNCTION_ARGS);+extern Datum bpcharne(PG_FUNCTION_ARGS);+extern Datum bpcharlt(PG_FUNCTION_ARGS);+extern Datum bpcharle(PG_FUNCTION_ARGS);+extern Datum bpchargt(PG_FUNCTION_ARGS);+extern Datum bpcharge(PG_FUNCTION_ARGS);+extern Datum bpcharcmp(PG_FUNCTION_ARGS);+extern Datum bpchar_larger(PG_FUNCTION_ARGS);+extern Datum bpchar_smaller(PG_FUNCTION_ARGS);+extern Datum bpcharlen(PG_FUNCTION_ARGS);+extern Datum bpcharoctetlen(PG_FUNCTION_ARGS);+extern Datum hashbpchar(PG_FUNCTION_ARGS);+extern Datum bpchar_pattern_lt(PG_FUNCTION_ARGS);+extern Datum bpchar_pattern_le(PG_FUNCTION_ARGS);+extern Datum bpchar_pattern_gt(PG_FUNCTION_ARGS);+extern Datum bpchar_pattern_ge(PG_FUNCTION_ARGS);+extern Datum btbpchar_pattern_cmp(PG_FUNCTION_ARGS);++extern Datum varcharin(PG_FUNCTION_ARGS);+extern Datum varcharout(PG_FUNCTION_ARGS);+extern Datum varcharrecv(PG_FUNCTION_ARGS);+extern Datum varcharsend(PG_FUNCTION_ARGS);+extern Datum varchartypmodin(PG_FUNCTION_ARGS);+extern Datum varchartypmodout(PG_FUNCTION_ARGS);+extern Datum varchar_transform(PG_FUNCTION_ARGS);+extern Datum varchar(PG_FUNCTION_ARGS);++/* varlena.c */+extern text *cstring_to_text(const char *s);+extern text *cstring_to_text_with_len(const char *s, int len);+extern char *text_to_cstring(const text *t);+extern void text_to_cstring_buffer(const text *src, char *dst, size_t dst_len);++#define CStringGetTextDatum(s) PointerGetDatum(cstring_to_text(s))+#define TextDatumGetCString(d) text_to_cstring((text *) DatumGetPointer(d))++extern Datum textin(PG_FUNCTION_ARGS);+extern Datum textout(PG_FUNCTION_ARGS);+extern Datum textrecv(PG_FUNCTION_ARGS);+extern Datum textsend(PG_FUNCTION_ARGS);+extern Datum textcat(PG_FUNCTION_ARGS);+extern Datum texteq(PG_FUNCTION_ARGS);+extern Datum textne(PG_FUNCTION_ARGS);+extern Datum text_lt(PG_FUNCTION_ARGS);+extern Datum text_le(PG_FUNCTION_ARGS);+extern Datum text_gt(PG_FUNCTION_ARGS);+extern Datum text_ge(PG_FUNCTION_ARGS);+extern Datum text_larger(PG_FUNCTION_ARGS);+extern Datum text_smaller(PG_FUNCTION_ARGS);+extern Datum text_pattern_lt(PG_FUNCTION_ARGS);+extern Datum text_pattern_le(PG_FUNCTION_ARGS);+extern Datum text_pattern_gt(PG_FUNCTION_ARGS);+extern Datum text_pattern_ge(PG_FUNCTION_ARGS);+extern Datum bttext_pattern_cmp(PG_FUNCTION_ARGS);+extern Datum textlen(PG_FUNCTION_ARGS);+extern Datum textoctetlen(PG_FUNCTION_ARGS);+extern Datum textpos(PG_FUNCTION_ARGS);+extern Datum text_substr(PG_FUNCTION_ARGS);+extern Datum text_substr_no_len(PG_FUNCTION_ARGS);+extern Datum textoverlay(PG_FUNCTION_ARGS);+extern Datum textoverlay_no_len(PG_FUNCTION_ARGS);+extern Datum name_text(PG_FUNCTION_ARGS);+extern Datum text_name(PG_FUNCTION_ARGS);+extern int varstr_cmp(char *arg1, int len1, char *arg2, int len2, Oid collid);+extern int varstr_levenshtein(const char *source, int slen,+ const char *target, int tlen,+ int ins_c, int del_c, int sub_c,+ bool trusted);+extern int varstr_levenshtein_less_equal(const char *source, int slen,+ const char *target, int tlen,+ int ins_c, int del_c, int sub_c,+ int max_d, bool trusted);+extern List *textToQualifiedNameList(text *textval);+extern bool SplitIdentifierString(char *rawstring, char separator,+ List **namelist);+extern bool SplitDirectoriesString(char *rawstring, char separator,+ List **namelist);+extern Datum replace_text(PG_FUNCTION_ARGS);+extern text *replace_text_regexp(text *src_text, void *regexp,+ text *replace_text, bool glob);+extern Datum split_text(PG_FUNCTION_ARGS);+extern Datum text_to_array(PG_FUNCTION_ARGS);+extern Datum array_to_text(PG_FUNCTION_ARGS);+extern Datum text_to_array_null(PG_FUNCTION_ARGS);+extern Datum array_to_text_null(PG_FUNCTION_ARGS);+extern Datum to_hex32(PG_FUNCTION_ARGS);+extern Datum to_hex64(PG_FUNCTION_ARGS);+extern Datum md5_text(PG_FUNCTION_ARGS);+extern Datum md5_bytea(PG_FUNCTION_ARGS);++extern Datum unknownin(PG_FUNCTION_ARGS);+extern Datum unknownout(PG_FUNCTION_ARGS);+extern Datum unknownrecv(PG_FUNCTION_ARGS);+extern Datum unknownsend(PG_FUNCTION_ARGS);++extern Datum pg_column_size(PG_FUNCTION_ARGS);++extern Datum bytea_string_agg_transfn(PG_FUNCTION_ARGS);+extern Datum bytea_string_agg_finalfn(PG_FUNCTION_ARGS);+extern Datum string_agg_transfn(PG_FUNCTION_ARGS);+extern Datum string_agg_finalfn(PG_FUNCTION_ARGS);++extern Datum text_concat(PG_FUNCTION_ARGS);+extern Datum text_concat_ws(PG_FUNCTION_ARGS);+extern Datum text_left(PG_FUNCTION_ARGS);+extern Datum text_right(PG_FUNCTION_ARGS);+extern Datum text_reverse(PG_FUNCTION_ARGS);+extern Datum text_format(PG_FUNCTION_ARGS);+extern Datum text_format_nv(PG_FUNCTION_ARGS);++/* version.c */+extern Datum pgsql_version(PG_FUNCTION_ARGS);++/* xid.c */+extern Datum xidin(PG_FUNCTION_ARGS);+extern Datum xidout(PG_FUNCTION_ARGS);+extern Datum xidrecv(PG_FUNCTION_ARGS);+extern Datum xidsend(PG_FUNCTION_ARGS);+extern Datum xideq(PG_FUNCTION_ARGS);+extern Datum xid_age(PG_FUNCTION_ARGS);+extern Datum mxid_age(PG_FUNCTION_ARGS);+extern int xidComparator(const void *arg1, const void *arg2);+extern Datum cidin(PG_FUNCTION_ARGS);+extern Datum cidout(PG_FUNCTION_ARGS);+extern Datum cidrecv(PG_FUNCTION_ARGS);+extern Datum cidsend(PG_FUNCTION_ARGS);+extern Datum cideq(PG_FUNCTION_ARGS);++/* like.c */+extern Datum namelike(PG_FUNCTION_ARGS);+extern Datum namenlike(PG_FUNCTION_ARGS);+extern Datum nameiclike(PG_FUNCTION_ARGS);+extern Datum nameicnlike(PG_FUNCTION_ARGS);+extern Datum textlike(PG_FUNCTION_ARGS);+extern Datum textnlike(PG_FUNCTION_ARGS);+extern Datum texticlike(PG_FUNCTION_ARGS);+extern Datum texticnlike(PG_FUNCTION_ARGS);+extern Datum bytealike(PG_FUNCTION_ARGS);+extern Datum byteanlike(PG_FUNCTION_ARGS);+extern Datum like_escape(PG_FUNCTION_ARGS);+extern Datum like_escape_bytea(PG_FUNCTION_ARGS);++/* oracle_compat.c */+extern Datum lower(PG_FUNCTION_ARGS);+extern Datum upper(PG_FUNCTION_ARGS);+extern Datum initcap(PG_FUNCTION_ARGS);+extern Datum lpad(PG_FUNCTION_ARGS);+extern Datum rpad(PG_FUNCTION_ARGS);+extern Datum btrim(PG_FUNCTION_ARGS);+extern Datum btrim1(PG_FUNCTION_ARGS);+extern Datum byteatrim(PG_FUNCTION_ARGS);+extern Datum ltrim(PG_FUNCTION_ARGS);+extern Datum ltrim1(PG_FUNCTION_ARGS);+extern Datum rtrim(PG_FUNCTION_ARGS);+extern Datum rtrim1(PG_FUNCTION_ARGS);+extern Datum translate(PG_FUNCTION_ARGS);+extern Datum chr (PG_FUNCTION_ARGS);+extern Datum repeat(PG_FUNCTION_ARGS);+extern Datum ascii(PG_FUNCTION_ARGS);++/* inet_cidr_ntop.c */+extern char *inet_cidr_ntop(int af, const void *src, int bits,+ char *dst, size_t size);++/* inet_net_pton.c */+extern int inet_net_pton(int af, const char *src,+ void *dst, size_t size);++/* network.c */+extern Datum inet_in(PG_FUNCTION_ARGS);+extern Datum inet_out(PG_FUNCTION_ARGS);+extern Datum inet_recv(PG_FUNCTION_ARGS);+extern Datum inet_send(PG_FUNCTION_ARGS);+extern Datum cidr_in(PG_FUNCTION_ARGS);+extern Datum cidr_out(PG_FUNCTION_ARGS);+extern Datum cidr_recv(PG_FUNCTION_ARGS);+extern Datum cidr_send(PG_FUNCTION_ARGS);+extern Datum network_cmp(PG_FUNCTION_ARGS);+extern Datum network_lt(PG_FUNCTION_ARGS);+extern Datum network_le(PG_FUNCTION_ARGS);+extern Datum network_eq(PG_FUNCTION_ARGS);+extern Datum network_ge(PG_FUNCTION_ARGS);+extern Datum network_gt(PG_FUNCTION_ARGS);+extern Datum network_ne(PG_FUNCTION_ARGS);+extern Datum network_smaller(PG_FUNCTION_ARGS);+extern Datum network_larger(PG_FUNCTION_ARGS);+extern Datum hashinet(PG_FUNCTION_ARGS);+extern Datum network_sub(PG_FUNCTION_ARGS);+extern Datum network_subeq(PG_FUNCTION_ARGS);+extern Datum network_sup(PG_FUNCTION_ARGS);+extern Datum network_supeq(PG_FUNCTION_ARGS);+extern Datum network_overlap(PG_FUNCTION_ARGS);+extern Datum network_network(PG_FUNCTION_ARGS);+extern Datum network_netmask(PG_FUNCTION_ARGS);+extern Datum network_hostmask(PG_FUNCTION_ARGS);+extern Datum network_masklen(PG_FUNCTION_ARGS);+extern Datum network_family(PG_FUNCTION_ARGS);+extern Datum network_broadcast(PG_FUNCTION_ARGS);+extern Datum network_host(PG_FUNCTION_ARGS);+extern Datum network_show(PG_FUNCTION_ARGS);+extern Datum inet_abbrev(PG_FUNCTION_ARGS);+extern Datum cidr_abbrev(PG_FUNCTION_ARGS);+extern double convert_network_to_scalar(Datum value, Oid typid);+extern Datum inet_to_cidr(PG_FUNCTION_ARGS);+extern Datum inet_set_masklen(PG_FUNCTION_ARGS);+extern Datum cidr_set_masklen(PG_FUNCTION_ARGS);+extern Datum network_scan_first(Datum in);+extern Datum network_scan_last(Datum in);+extern Datum inet_client_addr(PG_FUNCTION_ARGS);+extern Datum inet_client_port(PG_FUNCTION_ARGS);+extern Datum inet_server_addr(PG_FUNCTION_ARGS);+extern Datum inet_server_port(PG_FUNCTION_ARGS);+extern Datum inetnot(PG_FUNCTION_ARGS);+extern Datum inetand(PG_FUNCTION_ARGS);+extern Datum inetor(PG_FUNCTION_ARGS);+extern Datum inetpl(PG_FUNCTION_ARGS);+extern Datum inetmi_int8(PG_FUNCTION_ARGS);+extern Datum inetmi(PG_FUNCTION_ARGS);+extern void clean_ipv6_addr(int addr_family, char *addr);+extern Datum inet_same_family(PG_FUNCTION_ARGS);+extern Datum inet_merge(PG_FUNCTION_ARGS);++/* mac.c */+extern Datum macaddr_in(PG_FUNCTION_ARGS);+extern Datum macaddr_out(PG_FUNCTION_ARGS);+extern Datum macaddr_recv(PG_FUNCTION_ARGS);+extern Datum macaddr_send(PG_FUNCTION_ARGS);+extern Datum macaddr_cmp(PG_FUNCTION_ARGS);+extern Datum macaddr_lt(PG_FUNCTION_ARGS);+extern Datum macaddr_le(PG_FUNCTION_ARGS);+extern Datum macaddr_eq(PG_FUNCTION_ARGS);+extern Datum macaddr_ge(PG_FUNCTION_ARGS);+extern Datum macaddr_gt(PG_FUNCTION_ARGS);+extern Datum macaddr_ne(PG_FUNCTION_ARGS);+extern Datum macaddr_not(PG_FUNCTION_ARGS);+extern Datum macaddr_and(PG_FUNCTION_ARGS);+extern Datum macaddr_or(PG_FUNCTION_ARGS);+extern Datum macaddr_trunc(PG_FUNCTION_ARGS);+extern Datum hashmacaddr(PG_FUNCTION_ARGS);++/* numeric.c */+extern Datum numeric_in(PG_FUNCTION_ARGS);+extern Datum numeric_out(PG_FUNCTION_ARGS);+extern Datum numeric_recv(PG_FUNCTION_ARGS);+extern Datum numeric_send(PG_FUNCTION_ARGS);+extern Datum numerictypmodin(PG_FUNCTION_ARGS);+extern Datum numerictypmodout(PG_FUNCTION_ARGS);+extern Datum numeric_transform(PG_FUNCTION_ARGS);+extern Datum numeric (PG_FUNCTION_ARGS);+extern Datum numeric_abs(PG_FUNCTION_ARGS);+extern Datum numeric_uminus(PG_FUNCTION_ARGS);+extern Datum numeric_uplus(PG_FUNCTION_ARGS);+extern Datum numeric_sign(PG_FUNCTION_ARGS);+extern Datum numeric_round(PG_FUNCTION_ARGS);+extern Datum numeric_trunc(PG_FUNCTION_ARGS);+extern Datum numeric_ceil(PG_FUNCTION_ARGS);+extern Datum numeric_floor(PG_FUNCTION_ARGS);+extern Datum numeric_sortsupport(PG_FUNCTION_ARGS);+extern Datum numeric_cmp(PG_FUNCTION_ARGS);+extern Datum numeric_eq(PG_FUNCTION_ARGS);+extern Datum numeric_ne(PG_FUNCTION_ARGS);+extern Datum numeric_gt(PG_FUNCTION_ARGS);+extern Datum numeric_ge(PG_FUNCTION_ARGS);+extern Datum numeric_lt(PG_FUNCTION_ARGS);+extern Datum numeric_le(PG_FUNCTION_ARGS);+extern Datum numeric_add(PG_FUNCTION_ARGS);+extern Datum numeric_sub(PG_FUNCTION_ARGS);+extern Datum numeric_mul(PG_FUNCTION_ARGS);+extern Datum numeric_div(PG_FUNCTION_ARGS);+extern Datum numeric_div_trunc(PG_FUNCTION_ARGS);+extern Datum numeric_mod(PG_FUNCTION_ARGS);+extern Datum numeric_inc(PG_FUNCTION_ARGS);+extern Datum numeric_smaller(PG_FUNCTION_ARGS);+extern Datum numeric_larger(PG_FUNCTION_ARGS);+extern Datum numeric_fac(PG_FUNCTION_ARGS);+extern Datum numeric_sqrt(PG_FUNCTION_ARGS);+extern Datum numeric_exp(PG_FUNCTION_ARGS);+extern Datum numeric_ln(PG_FUNCTION_ARGS);+extern Datum numeric_log(PG_FUNCTION_ARGS);+extern Datum numeric_power(PG_FUNCTION_ARGS);+extern Datum int4_numeric(PG_FUNCTION_ARGS);+extern Datum numeric_int4(PG_FUNCTION_ARGS);+extern Datum int8_numeric(PG_FUNCTION_ARGS);+extern Datum numeric_int8(PG_FUNCTION_ARGS);+extern Datum int2_numeric(PG_FUNCTION_ARGS);+extern Datum numeric_int2(PG_FUNCTION_ARGS);+extern Datum float8_numeric(PG_FUNCTION_ARGS);+extern Datum numeric_float8(PG_FUNCTION_ARGS);+extern Datum numeric_float8_no_overflow(PG_FUNCTION_ARGS);+extern Datum float4_numeric(PG_FUNCTION_ARGS);+extern Datum numeric_float4(PG_FUNCTION_ARGS);+extern Datum numeric_accum(PG_FUNCTION_ARGS);+extern Datum numeric_avg_accum(PG_FUNCTION_ARGS);+extern Datum numeric_accum_inv(PG_FUNCTION_ARGS);+extern Datum int2_accum(PG_FUNCTION_ARGS);+extern Datum int4_accum(PG_FUNCTION_ARGS);+extern Datum int8_accum(PG_FUNCTION_ARGS);+extern Datum int2_accum_inv(PG_FUNCTION_ARGS);+extern Datum int4_accum_inv(PG_FUNCTION_ARGS);+extern Datum int8_accum_inv(PG_FUNCTION_ARGS);+extern Datum int8_avg_accum(PG_FUNCTION_ARGS);+extern Datum numeric_avg(PG_FUNCTION_ARGS);+extern Datum numeric_sum(PG_FUNCTION_ARGS);+extern Datum numeric_var_pop(PG_FUNCTION_ARGS);+extern Datum numeric_var_samp(PG_FUNCTION_ARGS);+extern Datum numeric_stddev_pop(PG_FUNCTION_ARGS);+extern Datum numeric_stddev_samp(PG_FUNCTION_ARGS);+extern Datum numeric_poly_sum(PG_FUNCTION_ARGS);+extern Datum numeric_poly_avg(PG_FUNCTION_ARGS);+extern Datum numeric_poly_var_pop(PG_FUNCTION_ARGS);+extern Datum numeric_poly_var_samp(PG_FUNCTION_ARGS);+extern Datum numeric_poly_stddev_pop(PG_FUNCTION_ARGS);+extern Datum numeric_poly_stddev_samp(PG_FUNCTION_ARGS);+extern Datum int2_sum(PG_FUNCTION_ARGS);+extern Datum int4_sum(PG_FUNCTION_ARGS);+extern Datum int8_sum(PG_FUNCTION_ARGS);+extern Datum int2_avg_accum(PG_FUNCTION_ARGS);+extern Datum int4_avg_accum(PG_FUNCTION_ARGS);+extern Datum int2_avg_accum_inv(PG_FUNCTION_ARGS);+extern Datum int4_avg_accum_inv(PG_FUNCTION_ARGS);+extern Datum int8_avg_accum_inv(PG_FUNCTION_ARGS);+extern Datum int8_avg(PG_FUNCTION_ARGS);+extern Datum int2int4_sum(PG_FUNCTION_ARGS);+extern Datum width_bucket_numeric(PG_FUNCTION_ARGS);+extern Datum hash_numeric(PG_FUNCTION_ARGS);+extern Datum generate_series_numeric(PG_FUNCTION_ARGS);+extern Datum generate_series_step_numeric(PG_FUNCTION_ARGS);++/* ri_triggers.c */+extern Datum RI_FKey_check_ins(PG_FUNCTION_ARGS);+extern Datum RI_FKey_check_upd(PG_FUNCTION_ARGS);+extern Datum RI_FKey_noaction_del(PG_FUNCTION_ARGS);+extern Datum RI_FKey_noaction_upd(PG_FUNCTION_ARGS);+extern Datum RI_FKey_cascade_del(PG_FUNCTION_ARGS);+extern Datum RI_FKey_cascade_upd(PG_FUNCTION_ARGS);+extern Datum RI_FKey_restrict_del(PG_FUNCTION_ARGS);+extern Datum RI_FKey_restrict_upd(PG_FUNCTION_ARGS);+extern Datum RI_FKey_setnull_del(PG_FUNCTION_ARGS);+extern Datum RI_FKey_setnull_upd(PG_FUNCTION_ARGS);+extern Datum RI_FKey_setdefault_del(PG_FUNCTION_ARGS);+extern Datum RI_FKey_setdefault_upd(PG_FUNCTION_ARGS);++/* trigfuncs.c */+extern Datum suppress_redundant_updates_trigger(PG_FUNCTION_ARGS);++/* encoding support functions */+extern Datum getdatabaseencoding(PG_FUNCTION_ARGS);+extern Datum database_character_set(PG_FUNCTION_ARGS);+extern Datum pg_client_encoding(PG_FUNCTION_ARGS);+extern Datum PG_encoding_to_char(PG_FUNCTION_ARGS);+extern Datum PG_char_to_encoding(PG_FUNCTION_ARGS);+extern Datum PG_character_set_name(PG_FUNCTION_ARGS);+extern Datum PG_character_set_id(PG_FUNCTION_ARGS);+extern Datum pg_convert(PG_FUNCTION_ARGS);+extern Datum pg_convert_to(PG_FUNCTION_ARGS);+extern Datum pg_convert_from(PG_FUNCTION_ARGS);+extern Datum length_in_encoding(PG_FUNCTION_ARGS);+extern Datum pg_encoding_max_length_sql(PG_FUNCTION_ARGS);++/* format_type.c */+extern Datum format_type(PG_FUNCTION_ARGS);+extern char *format_type_be(Oid type_oid);+extern char *format_type_be_qualified(Oid type_oid);+extern char *format_type_with_typemod(Oid type_oid, int32 typemod);+extern Datum oidvectortypes(PG_FUNCTION_ARGS);+extern int32 type_maximum_size(Oid type_oid, int32 typemod);++/* quote.c */+extern Datum quote_ident(PG_FUNCTION_ARGS);+extern Datum quote_literal(PG_FUNCTION_ARGS);+extern char *quote_literal_cstr(const char *rawstr);+extern Datum quote_nullable(PG_FUNCTION_ARGS);++/* guc.c */+extern Datum show_config_by_name(PG_FUNCTION_ARGS);+extern Datum set_config_by_name(PG_FUNCTION_ARGS);+extern Datum show_all_settings(PG_FUNCTION_ARGS);+extern Datum show_all_file_settings(PG_FUNCTION_ARGS);++/* rls.c */+extern Datum row_security_active(PG_FUNCTION_ARGS);+extern Datum row_security_active_name(PG_FUNCTION_ARGS);++/* lockfuncs.c */+extern Datum pg_lock_status(PG_FUNCTION_ARGS);+extern Datum pg_advisory_lock_int8(PG_FUNCTION_ARGS);+extern Datum pg_advisory_xact_lock_int8(PG_FUNCTION_ARGS);+extern Datum pg_advisory_lock_shared_int8(PG_FUNCTION_ARGS);+extern Datum pg_advisory_xact_lock_shared_int8(PG_FUNCTION_ARGS);+extern Datum pg_try_advisory_lock_int8(PG_FUNCTION_ARGS);+extern Datum pg_try_advisory_xact_lock_int8(PG_FUNCTION_ARGS);+extern Datum pg_try_advisory_lock_shared_int8(PG_FUNCTION_ARGS);+extern Datum pg_try_advisory_xact_lock_shared_int8(PG_FUNCTION_ARGS);+extern Datum pg_advisory_unlock_int8(PG_FUNCTION_ARGS);+extern Datum pg_advisory_unlock_shared_int8(PG_FUNCTION_ARGS);+extern Datum pg_advisory_lock_int4(PG_FUNCTION_ARGS);+extern Datum pg_advisory_xact_lock_int4(PG_FUNCTION_ARGS);+extern Datum pg_advisory_lock_shared_int4(PG_FUNCTION_ARGS);+extern Datum pg_advisory_xact_lock_shared_int4(PG_FUNCTION_ARGS);+extern Datum pg_try_advisory_lock_int4(PG_FUNCTION_ARGS);+extern Datum pg_try_advisory_xact_lock_int4(PG_FUNCTION_ARGS);+extern Datum pg_try_advisory_lock_shared_int4(PG_FUNCTION_ARGS);+extern Datum pg_try_advisory_xact_lock_shared_int4(PG_FUNCTION_ARGS);+extern Datum pg_advisory_unlock_int4(PG_FUNCTION_ARGS);+extern Datum pg_advisory_unlock_shared_int4(PG_FUNCTION_ARGS);+extern Datum pg_advisory_unlock_all(PG_FUNCTION_ARGS);++/* txid.c */+extern Datum txid_snapshot_in(PG_FUNCTION_ARGS);+extern Datum txid_snapshot_out(PG_FUNCTION_ARGS);+extern Datum txid_snapshot_recv(PG_FUNCTION_ARGS);+extern Datum txid_snapshot_send(PG_FUNCTION_ARGS);+extern Datum txid_current(PG_FUNCTION_ARGS);+extern Datum txid_current_snapshot(PG_FUNCTION_ARGS);+extern Datum txid_snapshot_xmin(PG_FUNCTION_ARGS);+extern Datum txid_snapshot_xmax(PG_FUNCTION_ARGS);+extern Datum txid_snapshot_xip(PG_FUNCTION_ARGS);+extern Datum txid_visible_in_snapshot(PG_FUNCTION_ARGS);++/* uuid.c */+extern Datum uuid_in(PG_FUNCTION_ARGS);+extern Datum uuid_out(PG_FUNCTION_ARGS);+extern Datum uuid_send(PG_FUNCTION_ARGS);+extern Datum uuid_recv(PG_FUNCTION_ARGS);+extern Datum uuid_lt(PG_FUNCTION_ARGS);+extern Datum uuid_le(PG_FUNCTION_ARGS);+extern Datum uuid_eq(PG_FUNCTION_ARGS);+extern Datum uuid_ge(PG_FUNCTION_ARGS);+extern Datum uuid_gt(PG_FUNCTION_ARGS);+extern Datum uuid_ne(PG_FUNCTION_ARGS);+extern Datum uuid_cmp(PG_FUNCTION_ARGS);+extern Datum uuid_hash(PG_FUNCTION_ARGS);++/* windowfuncs.c */+extern Datum window_row_number(PG_FUNCTION_ARGS);+extern Datum window_rank(PG_FUNCTION_ARGS);+extern Datum window_dense_rank(PG_FUNCTION_ARGS);+extern Datum window_percent_rank(PG_FUNCTION_ARGS);+extern Datum window_cume_dist(PG_FUNCTION_ARGS);+extern Datum window_ntile(PG_FUNCTION_ARGS);+extern Datum window_lag(PG_FUNCTION_ARGS);+extern Datum window_lag_with_offset(PG_FUNCTION_ARGS);+extern Datum window_lag_with_offset_and_default(PG_FUNCTION_ARGS);+extern Datum window_lead(PG_FUNCTION_ARGS);+extern Datum window_lead_with_offset(PG_FUNCTION_ARGS);+extern Datum window_lead_with_offset_and_default(PG_FUNCTION_ARGS);+extern Datum window_first_value(PG_FUNCTION_ARGS);+extern Datum window_last_value(PG_FUNCTION_ARGS);+extern Datum window_nth_value(PG_FUNCTION_ARGS);++/* access/spgist/spgquadtreeproc.c */+extern Datum spg_quad_config(PG_FUNCTION_ARGS);+extern Datum spg_quad_choose(PG_FUNCTION_ARGS);+extern Datum spg_quad_picksplit(PG_FUNCTION_ARGS);+extern Datum spg_quad_inner_consistent(PG_FUNCTION_ARGS);+extern Datum spg_quad_leaf_consistent(PG_FUNCTION_ARGS);++/* access/spgist/spgkdtreeproc.c */+extern Datum spg_kd_config(PG_FUNCTION_ARGS);+extern Datum spg_kd_choose(PG_FUNCTION_ARGS);+extern Datum spg_kd_picksplit(PG_FUNCTION_ARGS);+extern Datum spg_kd_inner_consistent(PG_FUNCTION_ARGS);++/* access/spgist/spgtextproc.c */+extern Datum spg_text_config(PG_FUNCTION_ARGS);+extern Datum spg_text_choose(PG_FUNCTION_ARGS);+extern Datum spg_text_picksplit(PG_FUNCTION_ARGS);+extern Datum spg_text_inner_consistent(PG_FUNCTION_ARGS);+extern Datum spg_text_leaf_consistent(PG_FUNCTION_ARGS);++/* access/gin/ginarrayproc.c */+extern Datum ginarrayextract(PG_FUNCTION_ARGS);+extern Datum ginarrayextract_2args(PG_FUNCTION_ARGS);+extern Datum ginqueryarrayextract(PG_FUNCTION_ARGS);+extern Datum ginarrayconsistent(PG_FUNCTION_ARGS);+extern Datum ginarraytriconsistent(PG_FUNCTION_ARGS);++/* access/tablesample/bernoulli.c */+extern Datum tsm_bernoulli_handler(PG_FUNCTION_ARGS);++/* access/tablesample/system.c */+extern Datum tsm_system_handler(PG_FUNCTION_ARGS);++/* access/transam/twophase.c */+extern Datum pg_prepared_xact(PG_FUNCTION_ARGS);++/* access/transam/multixact.c */+extern Datum pg_get_multixact_members(PG_FUNCTION_ARGS);++/* access/transam/committs.c */+extern Datum pg_xact_commit_timestamp(PG_FUNCTION_ARGS);+extern Datum pg_last_committed_xact(PG_FUNCTION_ARGS);++/* catalogs/dependency.c */+extern Datum pg_describe_object(PG_FUNCTION_ARGS);+extern Datum pg_identify_object(PG_FUNCTION_ARGS);+extern Datum pg_identify_object_as_address(PG_FUNCTION_ARGS);++/* catalog/objectaddress.c */+extern Datum pg_get_object_address(PG_FUNCTION_ARGS);++/* commands/constraint.c */+extern Datum unique_key_recheck(PG_FUNCTION_ARGS);++/* commands/event_trigger.c */+extern Datum pg_event_trigger_dropped_objects(PG_FUNCTION_ARGS);+extern Datum pg_event_trigger_table_rewrite_oid(PG_FUNCTION_ARGS);+extern Datum pg_event_trigger_table_rewrite_reason(PG_FUNCTION_ARGS);+extern Datum pg_event_trigger_ddl_commands(PG_FUNCTION_ARGS);++/* commands/extension.c */+extern Datum pg_available_extensions(PG_FUNCTION_ARGS);+extern Datum pg_available_extension_versions(PG_FUNCTION_ARGS);+extern Datum pg_extension_update_paths(PG_FUNCTION_ARGS);+extern Datum pg_extension_config_dump(PG_FUNCTION_ARGS);++/* commands/prepare.c */+extern Datum pg_prepared_statement(PG_FUNCTION_ARGS);++/* utils/mmgr/portalmem.c */+extern Datum pg_cursor(PG_FUNCTION_ARGS);++#endif /* BUILTINS_H */
+ foreign/libpg_query/src/postgres/include/utils/bytea.h view
@@ -0,0 +1,52 @@+/*-------------------------------------------------------------------------+ *+ * bytea.h+ * Declarations for BYTEA data type support.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/utils/bytea.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef BYTEA_H+#define BYTEA_H++#include "fmgr.h"+++typedef enum+{+ BYTEA_OUTPUT_ESCAPE,+ BYTEA_OUTPUT_HEX+} ByteaOutputType;++extern int bytea_output; /* ByteaOutputType, but int for GUC enum */++/* functions are in utils/adt/varlena.c */+extern Datum byteain(PG_FUNCTION_ARGS);+extern Datum byteaout(PG_FUNCTION_ARGS);+extern Datum bytearecv(PG_FUNCTION_ARGS);+extern Datum byteasend(PG_FUNCTION_ARGS);+extern Datum byteaoctetlen(PG_FUNCTION_ARGS);+extern Datum byteaGetByte(PG_FUNCTION_ARGS);+extern Datum byteaGetBit(PG_FUNCTION_ARGS);+extern Datum byteaSetByte(PG_FUNCTION_ARGS);+extern Datum byteaSetBit(PG_FUNCTION_ARGS);+extern Datum byteaeq(PG_FUNCTION_ARGS);+extern Datum byteane(PG_FUNCTION_ARGS);+extern Datum bytealt(PG_FUNCTION_ARGS);+extern Datum byteale(PG_FUNCTION_ARGS);+extern Datum byteagt(PG_FUNCTION_ARGS);+extern Datum byteage(PG_FUNCTION_ARGS);+extern Datum byteacmp(PG_FUNCTION_ARGS);+extern Datum byteacat(PG_FUNCTION_ARGS);+extern Datum byteapos(PG_FUNCTION_ARGS);+extern Datum bytea_substr(PG_FUNCTION_ARGS);+extern Datum bytea_substr_no_len(PG_FUNCTION_ARGS);+extern Datum byteaoverlay(PG_FUNCTION_ARGS);+extern Datum byteaoverlay_no_len(PG_FUNCTION_ARGS);++#endif /* BYTEA_H */
+ foreign/libpg_query/src/postgres/include/utils/catcache.h view
@@ -0,0 +1,197 @@+/*-------------------------------------------------------------------------+ *+ * catcache.h+ * Low-level catalog cache definitions.+ *+ * NOTE: every catalog cache must have a corresponding unique index on+ * the system table that it caches --- ie, the index must match the keys+ * used to do lookups in this cache. All cache fetches are done with+ * indexscans (under normal conditions). The index should be unique to+ * guarantee that there can only be one matching row for a key combination.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/utils/catcache.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef CATCACHE_H+#define CATCACHE_H++#include "access/htup.h"+#include "access/skey.h"+#include "lib/ilist.h"+#include "utils/relcache.h"++/*+ * struct catctup: individual tuple in the cache.+ * struct catclist: list of tuples matching a partial key.+ * struct catcache: information for managing a cache.+ * struct catcacheheader: information for managing all the caches.+ */++#define CATCACHE_MAXKEYS 4++typedef struct catcache+{+ int id; /* cache identifier --- see syscache.h */+ slist_node cc_next; /* list link */+ const char *cc_relname; /* name of relation the tuples come from */+ Oid cc_reloid; /* OID of relation the tuples come from */+ Oid cc_indexoid; /* OID of index matching cache keys */+ bool cc_relisshared; /* is relation shared across databases? */+ TupleDesc cc_tupdesc; /* tuple descriptor (copied from reldesc) */+ int cc_ntup; /* # of tuples currently in this cache */+ int cc_nbuckets; /* # of hash buckets in this cache */+ int cc_nkeys; /* # of keys (1..CATCACHE_MAXKEYS) */+ int cc_key[CATCACHE_MAXKEYS]; /* AttrNumber of each key */+ PGFunction cc_hashfunc[CATCACHE_MAXKEYS]; /* hash function for each key */+ ScanKeyData cc_skey[CATCACHE_MAXKEYS]; /* precomputed key info for+ * heap scans */+ bool cc_isname[CATCACHE_MAXKEYS]; /* flag "name" key columns */+ dlist_head cc_lists; /* list of CatCList structs */+#ifdef CATCACHE_STATS+ long cc_searches; /* total # searches against this cache */+ long cc_hits; /* # of matches against existing entry */+ long cc_neg_hits; /* # of matches against negative entry */+ long cc_newloads; /* # of successful loads of new entry */++ /*+ * cc_searches - (cc_hits + cc_neg_hits + cc_newloads) is number of failed+ * searches, each of which will result in loading a negative entry+ */+ long cc_invals; /* # of entries invalidated from cache */+ long cc_lsearches; /* total # list-searches */+ long cc_lhits; /* # of matches against existing lists */+#endif+ dlist_head *cc_bucket; /* hash buckets */+} CatCache;+++typedef struct catctup+{+ int ct_magic; /* for identifying CatCTup entries */+#define CT_MAGIC 0x57261502+ CatCache *my_cache; /* link to owning catcache */++ /*+ * Each tuple in a cache is a member of a dlist that stores the elements+ * of its hash bucket. We keep each dlist in LRU order to speed repeated+ * lookups.+ */+ dlist_node cache_elem; /* list member of per-bucket list */++ /*+ * The tuple may also be a member of at most one CatCList. (If a single+ * catcache is list-searched with varying numbers of keys, we may have to+ * make multiple entries for the same tuple because of this restriction.+ * Currently, that's not expected to be common, so we accept the potential+ * inefficiency.)+ */+ struct catclist *c_list; /* containing CatCList, or NULL if none */++ /*+ * A tuple marked "dead" must not be returned by subsequent searches.+ * However, it won't be physically deleted from the cache until its+ * refcount goes to zero. (If it's a member of a CatCList, the list's+ * refcount must go to zero, too; also, remember to mark the list dead at+ * the same time the tuple is marked.)+ *+ * A negative cache entry is an assertion that there is no tuple matching+ * a particular key. This is just as useful as a normal entry so far as+ * avoiding catalog searches is concerned. Management of positive and+ * negative entries is identical.+ */+ int refcount; /* number of active references */+ bool dead; /* dead but not yet removed? */+ bool negative; /* negative cache entry? */+ uint32 hash_value; /* hash value for this tuple's keys */+ HeapTupleData tuple; /* tuple management header */+} CatCTup;+++typedef struct catclist+{+ int cl_magic; /* for identifying CatCList entries */+#define CL_MAGIC 0x52765103+ CatCache *my_cache; /* link to owning catcache */++ /*+ * A CatCList describes the result of a partial search, ie, a search using+ * only the first K key columns of an N-key cache. We form the keys used+ * into a tuple (with other attributes NULL) to represent the stored key+ * set. The CatCList object contains links to cache entries for all the+ * table rows satisfying the partial key. (Note: none of these will be+ * negative cache entries.)+ *+ * A CatCList is only a member of a per-cache list; we do not currently+ * divide them into hash buckets.+ *+ * A list marked "dead" must not be returned by subsequent searches.+ * However, it won't be physically deleted from the cache until its+ * refcount goes to zero. (A list should be marked dead if any of its+ * member entries are dead.)+ *+ * If "ordered" is true then the member tuples appear in the order of the+ * cache's underlying index. This will be true in normal operation, but+ * might not be true during bootstrap or recovery operations. (namespace.c+ * is able to save some cycles when it is true.)+ */+ dlist_node cache_elem; /* list member of per-catcache list */+ int refcount; /* number of active references */+ bool dead; /* dead but not yet removed? */+ bool ordered; /* members listed in index order? */+ short nkeys; /* number of lookup keys specified */+ uint32 hash_value; /* hash value for lookup keys */+ HeapTupleData tuple; /* header for tuple holding keys */+ int n_members; /* number of member tuples */+ CatCTup *members[FLEXIBLE_ARRAY_MEMBER]; /* members */+} CatCList;+++typedef struct catcacheheader+{+ slist_head ch_caches; /* head of list of CatCache structs */+ int ch_ntup; /* # of tuples in all caches */+} CatCacheHeader;+++/* this extern duplicates utils/memutils.h... */+extern PGDLLIMPORT MemoryContext CacheMemoryContext;++extern void CreateCacheMemoryContext(void);+extern void AtEOXact_CatCache(bool isCommit);++extern CatCache *InitCatCache(int id, Oid reloid, Oid indexoid,+ int nkeys, const int *key,+ int nbuckets);+extern void InitCatCachePhase2(CatCache *cache, bool touch_index);++extern HeapTuple SearchCatCache(CatCache *cache,+ Datum v1, Datum v2,+ Datum v3, Datum v4);+extern void ReleaseCatCache(HeapTuple tuple);++extern uint32 GetCatCacheHashValue(CatCache *cache,+ Datum v1, Datum v2,+ Datum v3, Datum v4);++extern CatCList *SearchCatCacheList(CatCache *cache, int nkeys,+ Datum v1, Datum v2,+ Datum v3, Datum v4);+extern void ReleaseCatCacheList(CatCList *list);++extern void ResetCatalogCaches(void);+extern void CatalogCacheFlushCatalog(Oid catId);+extern void CatalogCacheIdInvalidate(int cacheId, uint32 hashValue);+extern void PrepareToInvalidateCacheTuple(Relation relation,+ HeapTuple tuple,+ HeapTuple newtuple,+ void (*function) (int, uint32, Oid));++extern void PrintCatCacheLeakWarning(HeapTuple tuple);+extern void PrintCatCacheListLeakWarning(CatCList *list);++#endif /* CATCACHE_H */
+ foreign/libpg_query/src/postgres/include/utils/date.h view
@@ -0,0 +1,208 @@+/*-------------------------------------------------------------------------+ *+ * date.h+ * Definitions for the SQL "date" and "time" types.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/utils/date.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef DATE_H+#define DATE_H++#include <math.h>++#include "fmgr.h"+++typedef int32 DateADT;++#ifdef HAVE_INT64_TIMESTAMP+typedef int64 TimeADT;+#else+typedef float8 TimeADT;+#endif++typedef struct+{+ TimeADT time; /* all time units other than months and years */+ int32 zone; /* numeric time zone, in seconds */+} TimeTzADT;++/*+ * Infinity and minus infinity must be the max and min values of DateADT.+ */+#define DATEVAL_NOBEGIN ((DateADT) PG_INT32_MIN)+#define DATEVAL_NOEND ((DateADT) PG_INT32_MAX)++#define DATE_NOBEGIN(j) ((j) = DATEVAL_NOBEGIN)+#define DATE_IS_NOBEGIN(j) ((j) == DATEVAL_NOBEGIN)+#define DATE_NOEND(j) ((j) = DATEVAL_NOEND)+#define DATE_IS_NOEND(j) ((j) == DATEVAL_NOEND)+#define DATE_NOT_FINITE(j) (DATE_IS_NOBEGIN(j) || DATE_IS_NOEND(j))++/*+ * Macros for fmgr-callable functions.+ *+ * For TimeADT, we make use of the same support routines as for float8 or int64.+ * Therefore TimeADT is pass-by-reference if and only if float8 or int64 is!+ */+#ifdef HAVE_INT64_TIMESTAMP++#define MAX_TIME_PRECISION 6++#define DatumGetDateADT(X) ((DateADT) DatumGetInt32(X))+#define DatumGetTimeADT(X) ((TimeADT) DatumGetInt64(X))+#define DatumGetTimeTzADTP(X) ((TimeTzADT *) DatumGetPointer(X))++#define DateADTGetDatum(X) Int32GetDatum(X)+#define TimeADTGetDatum(X) Int64GetDatum(X)+#define TimeTzADTPGetDatum(X) PointerGetDatum(X)+#else /* !HAVE_INT64_TIMESTAMP */++#define MAX_TIME_PRECISION 10++/* round off to MAX_TIME_PRECISION decimal places */+#define TIME_PREC_INV 10000000000.0+#define TIMEROUND(j) (rint(((double) (j)) * TIME_PREC_INV) / TIME_PREC_INV)++#define DatumGetDateADT(X) ((DateADT) DatumGetInt32(X))+#define DatumGetTimeADT(X) ((TimeADT) DatumGetFloat8(X))+#define DatumGetTimeTzADTP(X) ((TimeTzADT *) DatumGetPointer(X))++#define DateADTGetDatum(X) Int32GetDatum(X)+#define TimeADTGetDatum(X) Float8GetDatum(X)+#define TimeTzADTPGetDatum(X) PointerGetDatum(X)+#endif /* HAVE_INT64_TIMESTAMP */++#define PG_GETARG_DATEADT(n) DatumGetDateADT(PG_GETARG_DATUM(n))+#define PG_GETARG_TIMEADT(n) DatumGetTimeADT(PG_GETARG_DATUM(n))+#define PG_GETARG_TIMETZADT_P(n) DatumGetTimeTzADTP(PG_GETARG_DATUM(n))++#define PG_RETURN_DATEADT(x) return DateADTGetDatum(x)+#define PG_RETURN_TIMEADT(x) return TimeADTGetDatum(x)+#define PG_RETURN_TIMETZADT_P(x) return TimeTzADTPGetDatum(x)+++/* date.c */+extern double date2timestamp_no_overflow(DateADT dateVal);+extern void EncodeSpecialDate(DateADT dt, char *str);++extern Datum date_in(PG_FUNCTION_ARGS);+extern Datum date_out(PG_FUNCTION_ARGS);+extern Datum date_recv(PG_FUNCTION_ARGS);+extern Datum date_send(PG_FUNCTION_ARGS);+extern Datum make_date(PG_FUNCTION_ARGS);+extern Datum date_eq(PG_FUNCTION_ARGS);+extern Datum date_ne(PG_FUNCTION_ARGS);+extern Datum date_lt(PG_FUNCTION_ARGS);+extern Datum date_le(PG_FUNCTION_ARGS);+extern Datum date_gt(PG_FUNCTION_ARGS);+extern Datum date_ge(PG_FUNCTION_ARGS);+extern Datum date_cmp(PG_FUNCTION_ARGS);+extern Datum date_sortsupport(PG_FUNCTION_ARGS);+extern Datum date_finite(PG_FUNCTION_ARGS);+extern Datum date_larger(PG_FUNCTION_ARGS);+extern Datum date_smaller(PG_FUNCTION_ARGS);+extern Datum date_mi(PG_FUNCTION_ARGS);+extern Datum date_pli(PG_FUNCTION_ARGS);+extern Datum date_mii(PG_FUNCTION_ARGS);+extern Datum date_eq_timestamp(PG_FUNCTION_ARGS);+extern Datum date_ne_timestamp(PG_FUNCTION_ARGS);+extern Datum date_lt_timestamp(PG_FUNCTION_ARGS);+extern Datum date_le_timestamp(PG_FUNCTION_ARGS);+extern Datum date_gt_timestamp(PG_FUNCTION_ARGS);+extern Datum date_ge_timestamp(PG_FUNCTION_ARGS);+extern Datum date_cmp_timestamp(PG_FUNCTION_ARGS);+extern Datum date_eq_timestamptz(PG_FUNCTION_ARGS);+extern Datum date_ne_timestamptz(PG_FUNCTION_ARGS);+extern Datum date_lt_timestamptz(PG_FUNCTION_ARGS);+extern Datum date_le_timestamptz(PG_FUNCTION_ARGS);+extern Datum date_gt_timestamptz(PG_FUNCTION_ARGS);+extern Datum date_ge_timestamptz(PG_FUNCTION_ARGS);+extern Datum date_cmp_timestamptz(PG_FUNCTION_ARGS);+extern Datum timestamp_eq_date(PG_FUNCTION_ARGS);+extern Datum timestamp_ne_date(PG_FUNCTION_ARGS);+extern Datum timestamp_lt_date(PG_FUNCTION_ARGS);+extern Datum timestamp_le_date(PG_FUNCTION_ARGS);+extern Datum timestamp_gt_date(PG_FUNCTION_ARGS);+extern Datum timestamp_ge_date(PG_FUNCTION_ARGS);+extern Datum timestamp_cmp_date(PG_FUNCTION_ARGS);+extern Datum timestamptz_eq_date(PG_FUNCTION_ARGS);+extern Datum timestamptz_ne_date(PG_FUNCTION_ARGS);+extern Datum timestamptz_lt_date(PG_FUNCTION_ARGS);+extern Datum timestamptz_le_date(PG_FUNCTION_ARGS);+extern Datum timestamptz_gt_date(PG_FUNCTION_ARGS);+extern Datum timestamptz_ge_date(PG_FUNCTION_ARGS);+extern Datum timestamptz_cmp_date(PG_FUNCTION_ARGS);+extern Datum date_pl_interval(PG_FUNCTION_ARGS);+extern Datum date_mi_interval(PG_FUNCTION_ARGS);+extern Datum date_timestamp(PG_FUNCTION_ARGS);+extern Datum timestamp_date(PG_FUNCTION_ARGS);+extern Datum date_timestamptz(PG_FUNCTION_ARGS);+extern Datum timestamptz_date(PG_FUNCTION_ARGS);+extern Datum datetime_timestamp(PG_FUNCTION_ARGS);+extern Datum abstime_date(PG_FUNCTION_ARGS);++extern Datum time_in(PG_FUNCTION_ARGS);+extern Datum time_out(PG_FUNCTION_ARGS);+extern Datum time_recv(PG_FUNCTION_ARGS);+extern Datum time_send(PG_FUNCTION_ARGS);+extern Datum timetypmodin(PG_FUNCTION_ARGS);+extern Datum timetypmodout(PG_FUNCTION_ARGS);+extern Datum make_time(PG_FUNCTION_ARGS);+extern Datum time_transform(PG_FUNCTION_ARGS);+extern Datum time_scale(PG_FUNCTION_ARGS);+extern Datum time_eq(PG_FUNCTION_ARGS);+extern Datum time_ne(PG_FUNCTION_ARGS);+extern Datum time_lt(PG_FUNCTION_ARGS);+extern Datum time_le(PG_FUNCTION_ARGS);+extern Datum time_gt(PG_FUNCTION_ARGS);+extern Datum time_ge(PG_FUNCTION_ARGS);+extern Datum time_cmp(PG_FUNCTION_ARGS);+extern Datum time_hash(PG_FUNCTION_ARGS);+extern Datum overlaps_time(PG_FUNCTION_ARGS);+extern Datum time_larger(PG_FUNCTION_ARGS);+extern Datum time_smaller(PG_FUNCTION_ARGS);+extern Datum time_mi_time(PG_FUNCTION_ARGS);+extern Datum timestamp_time(PG_FUNCTION_ARGS);+extern Datum timestamptz_time(PG_FUNCTION_ARGS);+extern Datum time_interval(PG_FUNCTION_ARGS);+extern Datum interval_time(PG_FUNCTION_ARGS);+extern Datum time_pl_interval(PG_FUNCTION_ARGS);+extern Datum time_mi_interval(PG_FUNCTION_ARGS);+extern Datum time_part(PG_FUNCTION_ARGS);++extern Datum timetz_in(PG_FUNCTION_ARGS);+extern Datum timetz_out(PG_FUNCTION_ARGS);+extern Datum timetz_recv(PG_FUNCTION_ARGS);+extern Datum timetz_send(PG_FUNCTION_ARGS);+extern Datum timetztypmodin(PG_FUNCTION_ARGS);+extern Datum timetztypmodout(PG_FUNCTION_ARGS);+extern Datum timetz_scale(PG_FUNCTION_ARGS);+extern Datum timetz_eq(PG_FUNCTION_ARGS);+extern Datum timetz_ne(PG_FUNCTION_ARGS);+extern Datum timetz_lt(PG_FUNCTION_ARGS);+extern Datum timetz_le(PG_FUNCTION_ARGS);+extern Datum timetz_gt(PG_FUNCTION_ARGS);+extern Datum timetz_ge(PG_FUNCTION_ARGS);+extern Datum timetz_cmp(PG_FUNCTION_ARGS);+extern Datum timetz_hash(PG_FUNCTION_ARGS);+extern Datum overlaps_timetz(PG_FUNCTION_ARGS);+extern Datum timetz_larger(PG_FUNCTION_ARGS);+extern Datum timetz_smaller(PG_FUNCTION_ARGS);+extern Datum timetz_time(PG_FUNCTION_ARGS);+extern Datum time_timetz(PG_FUNCTION_ARGS);+extern Datum timestamptz_timetz(PG_FUNCTION_ARGS);+extern Datum datetimetz_timestamptz(PG_FUNCTION_ARGS);+extern Datum timetz_part(PG_FUNCTION_ARGS);+extern Datum timetz_zone(PG_FUNCTION_ARGS);+extern Datum timetz_izone(PG_FUNCTION_ARGS);+extern Datum timetz_pl_interval(PG_FUNCTION_ARGS);+extern Datum timetz_mi_interval(PG_FUNCTION_ARGS);++#endif /* DATE_H */
+ foreign/libpg_query/src/postgres/include/utils/datetime.h view
@@ -0,0 +1,352 @@+/*-------------------------------------------------------------------------+ *+ * datetime.h+ * Definitions for date/time support code.+ * The support code is shared with other date data types,+ * including abstime, reltime, date, and time.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/utils/datetime.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef DATETIME_H+#define DATETIME_H++#include "nodes/nodes.h"+#include "utils/timestamp.h"++/* this struct is declared in utils/tzparser.h: */+struct tzEntry;+++/* ----------------------------------------------------------------+ * time types + support macros+ *+ * String definitions for standard time quantities.+ *+ * These strings are the defaults used to form output time strings.+ * Other alternative forms are hardcoded into token tables in datetime.c.+ * ----------------------------------------------------------------+ */++#define DAGO "ago"+#define DCURRENT "current"+#define EPOCH "epoch"+#define INVALID "invalid"+#define EARLY "-infinity"+#define LATE "infinity"+#define NOW "now"+#define TODAY "today"+#define TOMORROW "tomorrow"+#define YESTERDAY "yesterday"+#define ZULU "zulu"++#define DMICROSEC "usecond"+#define DMILLISEC "msecond"+#define DSECOND "second"+#define DMINUTE "minute"+#define DHOUR "hour"+#define DDAY "day"+#define DWEEK "week"+#define DMONTH "month"+#define DQUARTER "quarter"+#define DYEAR "year"+#define DDECADE "decade"+#define DCENTURY "century"+#define DMILLENNIUM "millennium"+#define DA_D "ad"+#define DB_C "bc"+#define DTIMEZONE "timezone"++/*+ * Fundamental time field definitions for parsing.+ *+ * Meridian: am, pm, or 24-hour style.+ * Millennium: ad, bc+ */++#define AM 0+#define PM 1+#define HR24 2++#define AD 0+#define BC 1++/*+ * Field types for time decoding.+ *+ * Can't have more of these than there are bits in an unsigned int+ * since these are turned into bit masks during parsing and decoding.+ *+ * Furthermore, the values for YEAR, MONTH, DAY, HOUR, MINUTE, SECOND+ * must be in the range 0..14 so that the associated bitmasks can fit+ * into the left half of an INTERVAL's typmod value. Since those bits+ * are stored in typmods, you can't change them without initdb!+ */++#define RESERV 0+#define MONTH 1+#define YEAR 2+#define DAY 3+#define JULIAN 4+#define TZ 5 /* fixed-offset timezone abbreviation */+#define DTZ 6 /* fixed-offset timezone abbrev, DST */+#define DYNTZ 7 /* dynamic timezone abbreviation */+#define IGNORE_DTF 8+#define AMPM 9+#define HOUR 10+#define MINUTE 11+#define SECOND 12+#define MILLISECOND 13+#define MICROSECOND 14+#define DOY 15+#define DOW 16+#define UNITS 17+#define ADBC 18+/* these are only for relative dates */+#define AGO 19+#define ABS_BEFORE 20+#define ABS_AFTER 21+/* generic fields to help with parsing */+#define ISODATE 22+#define ISOTIME 23+/* these are only for parsing intervals */+#define WEEK 24+#define DECADE 25+#define CENTURY 26+#define MILLENNIUM 27+/* hack for parsing two-word timezone specs "MET DST" etc */+#define DTZMOD 28 /* "DST" as a separate word */+/* reserved for unrecognized string values */+#define UNKNOWN_FIELD 31++/*+ * Token field definitions for time parsing and decoding.+ *+ * Some field type codes (see above) use these as the "value" in datetktbl[].+ * These are also used for bit masks in DecodeDateTime and friends+ * so actually restrict them to within [0,31] for now.+ * - thomas 97/06/19+ * Not all of these fields are used for masks in DecodeDateTime+ * so allow some larger than 31. - thomas 1997-11-17+ *+ * Caution: there are undocumented assumptions in the code that most of these+ * values are not equal to IGNORE_DTF nor RESERV. Be very careful when+ * renumbering values in either of these apparently-independent lists :-(+ */++#define DTK_NUMBER 0+#define DTK_STRING 1++#define DTK_DATE 2+#define DTK_TIME 3+#define DTK_TZ 4+#define DTK_AGO 5++#define DTK_SPECIAL 6+#define DTK_INVALID 7+#define DTK_CURRENT 8+#define DTK_EARLY 9+#define DTK_LATE 10+#define DTK_EPOCH 11+#define DTK_NOW 12+#define DTK_YESTERDAY 13+#define DTK_TODAY 14+#define DTK_TOMORROW 15+#define DTK_ZULU 16++#define DTK_DELTA 17+#define DTK_SECOND 18+#define DTK_MINUTE 19+#define DTK_HOUR 20+#define DTK_DAY 21+#define DTK_WEEK 22+#define DTK_MONTH 23+#define DTK_QUARTER 24+#define DTK_YEAR 25+#define DTK_DECADE 26+#define DTK_CENTURY 27+#define DTK_MILLENNIUM 28+#define DTK_MILLISEC 29+#define DTK_MICROSEC 30+#define DTK_JULIAN 31++#define DTK_DOW 32+#define DTK_DOY 33+#define DTK_TZ_HOUR 34+#define DTK_TZ_MINUTE 35+#define DTK_ISOYEAR 36+#define DTK_ISODOW 37+++/*+ * Bit mask definitions for time parsing.+ */++#define DTK_M(t) (0x01 << (t))++/* Convenience: a second, plus any fractional component */+#define DTK_ALL_SECS_M (DTK_M(SECOND) | DTK_M(MILLISECOND) | DTK_M(MICROSECOND))+#define DTK_DATE_M (DTK_M(YEAR) | DTK_M(MONTH) | DTK_M(DAY))+#define DTK_TIME_M (DTK_M(HOUR) | DTK_M(MINUTE) | DTK_ALL_SECS_M)++/*+ * Working buffer size for input and output of interval, timestamp, etc.+ * Inputs that need more working space will be rejected early. Longer outputs+ * will overrun buffers, so this must suffice for all possible output. As of+ * this writing, interval_out() needs the most space at ~90 bytes.+ */+#define MAXDATELEN 128+/* maximum possible number of fields in a date string */+#define MAXDATEFIELDS 25+/* only this many chars are stored in datetktbl */+#define TOKMAXLEN 10++/* keep this struct small; it gets used a lot */+typedef struct+{+ char token[TOKMAXLEN + 1]; /* always NUL-terminated */+ char type; /* see field type codes above */+ int32 value; /* meaning depends on type */+} datetkn;++/* one of its uses is in tables of time zone abbreviations */+typedef struct TimeZoneAbbrevTable+{+ Size tblsize; /* size in bytes of TimeZoneAbbrevTable */+ int numabbrevs; /* number of entries in abbrevs[] array */+ datetkn abbrevs[FLEXIBLE_ARRAY_MEMBER];+ /* DynamicZoneAbbrev(s) may follow the abbrevs[] array */+} TimeZoneAbbrevTable;++/* auxiliary data for a dynamic time zone abbreviation (non-fixed-offset) */+typedef struct DynamicZoneAbbrev+{+ pg_tz *tz; /* NULL if not yet looked up */+ char zone[FLEXIBLE_ARRAY_MEMBER]; /* NUL-terminated zone name */+} DynamicZoneAbbrev;+++/* FMODULO()+ * Macro to replace modf(), which is broken on some platforms.+ * t = input and remainder+ * q = integer part+ * u = divisor+ */+#define FMODULO(t,q,u) \+do { \+ (q) = (((t) < 0) ? ceil((t) / (u)) : floor((t) / (u))); \+ if ((q) != 0) (t) -= rint((q) * (u)); \+} while(0)++/* TMODULO()+ * Like FMODULO(), but work on the timestamp datatype (either int64 or float8).+ * We assume that int64 follows the C99 semantics for division (negative+ * quotients truncate towards zero).+ */+#ifdef HAVE_INT64_TIMESTAMP+#define TMODULO(t,q,u) \+do { \+ (q) = ((t) / (u)); \+ if ((q) != 0) (t) -= ((q) * (u)); \+} while(0)+#else+#define TMODULO(t,q,u) \+do { \+ (q) = (((t) < 0) ? ceil((t) / (u)) : floor((t) / (u))); \+ if ((q) != 0) (t) -= rint((q) * (u)); \+} while(0)+#endif++/*+ * Date/time validation+ * Include check for leap year.+ */++extern const char *const months[]; /* months (3-char abbreviations) */+extern const char *const days[]; /* days (full names) */+extern const int day_tab[2][13];++/*+ * These are the rules for the Gregorian calendar, which was adopted in 1582.+ * However, we use this calculation for all prior years as well because the+ * SQL standard specifies use of the Gregorian calendar. This prevents the+ * date 1500-02-29 from being stored, even though it is valid in the Julian+ * calendar.+ */+#define isleap(y) (((y) % 4) == 0 && (((y) % 100) != 0 || ((y) % 400) == 0))+++/*+ * Datetime input parsing routines (ParseDateTime, DecodeDateTime, etc)+ * return zero or a positive value on success. On failure, they return+ * one of these negative code values. DateTimeParseError may be used to+ * produce a correct ereport.+ */+#define DTERR_BAD_FORMAT (-1)+#define DTERR_FIELD_OVERFLOW (-2)+#define DTERR_MD_FIELD_OVERFLOW (-3) /* triggers hint about DateStyle */+#define DTERR_INTERVAL_OVERFLOW (-4)+#define DTERR_TZDISP_OVERFLOW (-5)+++extern void GetCurrentDateTime(struct pg_tm * tm);+extern void GetCurrentTimeUsec(struct pg_tm * tm, fsec_t *fsec, int *tzp);+extern void j2date(int jd, int *year, int *month, int *day);+extern int date2j(int year, int month, int day);++extern int ParseDateTime(const char *timestr, char *workbuf, size_t buflen,+ char **field, int *ftype,+ int maxfields, int *numfields);+extern int DecodeDateTime(char **field, int *ftype,+ int nf, int *dtype,+ struct pg_tm * tm, fsec_t *fsec, int *tzp);+extern int DecodeTimezone(char *str, int *tzp);+extern int DecodeTimeOnly(char **field, int *ftype,+ int nf, int *dtype,+ struct pg_tm * tm, fsec_t *fsec, int *tzp);+extern int DecodeInterval(char **field, int *ftype, int nf, int range,+ int *dtype, struct pg_tm * tm, fsec_t *fsec);+extern int DecodeISO8601Interval(char *str,+ int *dtype, struct pg_tm * tm, fsec_t *fsec);++extern void DateTimeParseError(int dterr, const char *str,+ const char *datatype) pg_attribute_noreturn();++extern int DetermineTimeZoneOffset(struct pg_tm * tm, pg_tz *tzp);+extern int DetermineTimeZoneAbbrevOffset(struct pg_tm * tm, const char *abbr, pg_tz *tzp);+extern int DetermineTimeZoneAbbrevOffsetTS(TimestampTz ts, const char *abbr,+ pg_tz *tzp, int *isdst);++extern void EncodeDateOnly(struct pg_tm * tm, int style, char *str);+extern void EncodeTimeOnly(struct pg_tm * tm, fsec_t fsec, bool print_tz, int tz, int style, char *str);+extern void EncodeDateTime(struct pg_tm * tm, fsec_t fsec, bool print_tz, int tz, const char *tzn, int style, char *str);+extern void EncodeInterval(struct pg_tm * tm, fsec_t fsec, int style, char *str);+extern void EncodeSpecialTimestamp(Timestamp dt, char *str);++extern int ValidateDate(int fmask, bool isjulian, bool is2digits, bool bc,+ struct pg_tm * tm);++extern int DecodeTimezoneAbbrev(int field, char *lowtoken,+ int *offset, pg_tz **tz);+extern int DecodeSpecial(int field, char *lowtoken, int *val);+extern int DecodeUnits(int field, char *lowtoken, int *val);++extern int j2day(int jd);++extern Node *TemporalTransform(int32 max_precis, Node *node);++extern bool CheckDateTokenTables(void);++extern TimeZoneAbbrevTable *ConvertTimeZoneAbbrevs(struct tzEntry *abbrevs,+ int n);+extern void InstallTimeZoneAbbrevs(TimeZoneAbbrevTable *tbl);++extern Datum pg_timezone_abbrevs(PG_FUNCTION_ARGS);+extern Datum pg_timezone_names(PG_FUNCTION_ARGS);++#endif /* DATETIME_H */
+ foreign/libpg_query/src/postgres/include/utils/datum.h view
@@ -0,0 +1,49 @@+/*-------------------------------------------------------------------------+ *+ * datum.h+ * POSTGRES Datum (abstract data type) manipulation routines.+ *+ * These routines are driven by the 'typbyval' and 'typlen' information,+ * which must previously have been obtained by the caller for the datatype+ * of the Datum. (We do it this way because in most situations the caller+ * can look up the info just once and use it for many per-datum operations.)+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/utils/datum.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef DATUM_H+#define DATUM_H++/*+ * datumGetSize - find the "real" length of a datum+ */+extern Size datumGetSize(Datum value, bool typByVal, int typLen);++/*+ * datumCopy - make a copy of a non-NULL datum.+ *+ * If the datatype is pass-by-reference, memory is obtained with palloc().+ */+extern Datum datumCopy(Datum value, bool typByVal, int typLen);++/*+ * datumTransfer - transfer a non-NULL datum into the current memory context.+ *+ * Differs from datumCopy() in its handling of read-write expanded objects.+ */+extern Datum datumTransfer(Datum value, bool typByVal, int typLen);++/*+ * datumIsEqual+ * return true if two datums of the same type are equal, false otherwise.+ *+ * XXX : See comments in the code for restrictions!+ */+extern bool datumIsEqual(Datum value1, Datum value2,+ bool typByVal, int typLen);++#endif /* DATUM_H */
+ foreign/libpg_query/src/postgres/include/utils/dynamic_loader.h view
@@ -0,0 +1,25 @@+/*-------------------------------------------------------------------------+ *+ * dynamic_loader.h+ *+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/utils/dynamic_loader.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef DYNAMIC_LOADER_H+#define DYNAMIC_LOADER_H++#include "fmgr.h"+++extern void *pg_dlopen(char *filename);+extern PGFunction pg_dlsym(void *handle, char *funcname);+extern void pg_dlclose(void *handle);+extern char *pg_dlerror(void);++#endif /* DYNAMIC_LOADER_H */
+ foreign/libpg_query/src/postgres/include/utils/elog.h view
@@ -0,0 +1,422 @@+/*-------------------------------------------------------------------------+ *+ * elog.h+ * POSTGRES error reporting/logging definitions.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/utils/elog.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef ELOG_H+#define ELOG_H++#include <setjmp.h>++/* Error level codes */+#define DEBUG5 10 /* Debugging messages, in categories of+ * decreasing detail. */+#define DEBUG4 11+#define DEBUG3 12+#define DEBUG2 13+#define DEBUG1 14 /* used by GUC debug_* variables */+#define LOG 15 /* Server operational messages; sent only to+ * server log by default. */+#define COMMERROR 16 /* Client communication problems; same as LOG+ * for server reporting, but never sent to+ * client. */+#define INFO 17 /* Messages specifically requested by user (eg+ * VACUUM VERBOSE output); always sent to+ * client regardless of client_min_messages,+ * but by default not sent to server log. */+#define NOTICE 18 /* Helpful messages to users about query+ * operation; sent to client and server log by+ * default. */+#define WARNING 19 /* Warnings. NOTICE is for expected messages+ * like implicit sequence creation by SERIAL.+ * WARNING is for unexpected messages. */+#define ERROR 20 /* user error - abort transaction; return to+ * known state */+/* Save ERROR value in PGERROR so it can be restored when Win32 includes+ * modify it. We have to use a constant rather than ERROR because macros+ * are expanded only when referenced outside macros.+ */+#ifdef WIN32+#define PGERROR 20+#endif+#define FATAL 21 /* fatal error - abort process */+#define PANIC 22 /* take down the other backends with me */++ /* #define DEBUG DEBUG1 */ /* Backward compatibility with pre-7.3 */+++/* macros for representing SQLSTATE strings compactly */+#define PGSIXBIT(ch) (((ch) - '0') & 0x3F)+#define PGUNSIXBIT(val) (((val) & 0x3F) + '0')++#define MAKE_SQLSTATE(ch1,ch2,ch3,ch4,ch5) \+ (PGSIXBIT(ch1) + (PGSIXBIT(ch2) << 6) + (PGSIXBIT(ch3) << 12) + \+ (PGSIXBIT(ch4) << 18) + (PGSIXBIT(ch5) << 24))++/* These macros depend on the fact that '0' becomes a zero in SIXBIT */+#define ERRCODE_TO_CATEGORY(ec) ((ec) & ((1 << 12) - 1))+#define ERRCODE_IS_CATEGORY(ec) (((ec) & ~((1 << 12) - 1)) == 0)++/* SQLSTATE codes for errors are defined in a separate file */+#include "utils/errcodes.h"+++/* Which __func__ symbol do we have, if any? */+#ifdef HAVE_FUNCNAME__FUNC+#define PG_FUNCNAME_MACRO __func__+#else+#ifdef HAVE_FUNCNAME__FUNCTION+#define PG_FUNCNAME_MACRO __FUNCTION__+#else+#define PG_FUNCNAME_MACRO NULL+#endif+#endif+++/*----------+ * New-style error reporting API: to be used in this way:+ * ereport(ERROR,+ * (errcode(ERRCODE_UNDEFINED_CURSOR),+ * errmsg("portal \"%s\" not found", stmt->portalname),+ * ... other errxxx() fields as needed ...));+ *+ * The error level is required, and so is a primary error message (errmsg+ * or errmsg_internal). All else is optional. errcode() defaults to+ * ERRCODE_INTERNAL_ERROR if elevel is ERROR or more, ERRCODE_WARNING+ * if elevel is WARNING, or ERRCODE_SUCCESSFUL_COMPLETION if elevel is+ * NOTICE or below.+ *+ * ereport_domain() allows a message domain to be specified, for modules that+ * wish to use a different message catalog from the backend's. To avoid having+ * one copy of the default text domain per .o file, we define it as NULL here+ * and have errstart insert the default text domain. Modules can either use+ * ereport_domain() directly, or preferably they can override the TEXTDOMAIN+ * macro.+ *+ * If elevel >= ERROR, the call will not return; we try to inform the compiler+ * of that via pg_unreachable(). However, no useful optimization effect is+ * obtained unless the compiler sees elevel as a compile-time constant, else+ * we're just adding code bloat. So, if __builtin_constant_p is available,+ * use that to cause the second if() to vanish completely for non-constant+ * cases. We avoid using a local variable because it's not necessary and+ * prevents gcc from making the unreachability deduction at optlevel -O0.+ *----------+ */+#ifdef HAVE__BUILTIN_CONSTANT_P+#define ereport_domain(elevel, domain, rest) \+ do { \+ if (errstart(elevel, __FILE__, __LINE__, PG_FUNCNAME_MACRO, domain)) \+ errfinish rest; \+ if (__builtin_constant_p(elevel) && (elevel) >= ERROR) \+ pg_unreachable(); \+ } while(0)+#else /* !HAVE__BUILTIN_CONSTANT_P */+#define ereport_domain(elevel, domain, rest) \+ do { \+ const int elevel_ = (elevel); \+ if (errstart(elevel_, __FILE__, __LINE__, PG_FUNCNAME_MACRO, domain)) \+ errfinish rest; \+ if (elevel_ >= ERROR) \+ pg_unreachable(); \+ } while(0)+#endif /* HAVE__BUILTIN_CONSTANT_P */++#define ereport(elevel, rest) \+ ereport_domain(elevel, TEXTDOMAIN, rest)++#define TEXTDOMAIN NULL++extern bool errstart(int elevel, const char *filename, int lineno,+ const char *funcname, const char *domain);+extern void errfinish(int dummy,...);++extern int errcode(int sqlerrcode);++extern int errcode_for_file_access(void);+extern int errcode_for_socket_access(void);++extern int errmsg(const char *fmt,...) pg_attribute_printf(1, 2);+extern int errmsg_internal(const char *fmt,...) pg_attribute_printf(1, 2);++extern int errmsg_plural(const char *fmt_singular, const char *fmt_plural,+ unsigned long n,...) pg_attribute_printf(1, 4) pg_attribute_printf(2, 4);++extern int errdetail(const char *fmt,...) pg_attribute_printf(1, 2);+extern int errdetail_internal(const char *fmt,...) pg_attribute_printf(1, 2);++extern int errdetail_log(const char *fmt,...) pg_attribute_printf(1, 2);++extern int errdetail_log_plural(const char *fmt_singular,+ const char *fmt_plural,+ unsigned long n,...) pg_attribute_printf(1, 4) pg_attribute_printf(2, 4);++extern int errdetail_plural(const char *fmt_singular, const char *fmt_plural,+ unsigned long n,...) pg_attribute_printf(1, 4) pg_attribute_printf(2, 4);++extern int errhint(const char *fmt,...) pg_attribute_printf(1, 2);++/*+ * errcontext() is typically called in error context callback functions, not+ * within an ereport() invocation. The callback function can be in a different+ * module than the ereport() call, so the message domain passed in errstart()+ * is not usually the correct domain for translating the context message.+ * set_errcontext_domain() first sets the domain to be used, and+ * errcontext_msg() passes the actual message.+ */+#define errcontext set_errcontext_domain(TEXTDOMAIN), errcontext_msg++extern int set_errcontext_domain(const char *domain);++extern int errcontext_msg(const char *fmt,...) pg_attribute_printf(1, 2);++extern int errhidestmt(bool hide_stmt);+extern int errhidecontext(bool hide_ctx);++extern int errfunction(const char *funcname);+extern int errposition(int cursorpos);++extern int internalerrposition(int cursorpos);+extern int internalerrquery(const char *query);++extern int err_generic_string(int field, const char *str);++extern int geterrcode(void);+extern int geterrposition(void);+extern int getinternalerrposition(void);+++/*----------+ * Old-style error reporting API: to be used in this way:+ * elog(ERROR, "portal \"%s\" not found", stmt->portalname);+ *----------+ */+#ifdef HAVE__VA_ARGS+/*+ * If we have variadic macros, we can give the compiler a hint about the+ * call not returning when elevel >= ERROR. See comments for ereport().+ * Note that historically elog() has called elog_start (which saves errno)+ * before evaluating "elevel", so we preserve that behavior here.+ */+#ifdef HAVE__BUILTIN_CONSTANT_P+#define elog(elevel, ...) \+ do { \+ elog_start(__FILE__, __LINE__, PG_FUNCNAME_MACRO); \+ elog_finish(elevel, __VA_ARGS__); \+ if (__builtin_constant_p(elevel) && (elevel) >= ERROR) \+ pg_unreachable(); \+ } while(0)+#else /* !HAVE__BUILTIN_CONSTANT_P */+#define elog(elevel, ...) \+ do { \+ int elevel_; \+ elog_start(__FILE__, __LINE__, PG_FUNCNAME_MACRO); \+ elevel_ = (elevel); \+ elog_finish(elevel_, __VA_ARGS__); \+ if (elevel_ >= ERROR) \+ pg_unreachable(); \+ } while(0)+#endif /* HAVE__BUILTIN_CONSTANT_P */+#else /* !HAVE__VA_ARGS */+#define elog \+ elog_start(__FILE__, __LINE__, PG_FUNCNAME_MACRO), \+ elog_finish+#endif /* HAVE__VA_ARGS */++extern void elog_start(const char *filename, int lineno, const char *funcname);+extern void elog_finish(int elevel, const char *fmt,...) pg_attribute_printf(2, 3);+++/* Support for constructing error strings separately from ereport() calls */++extern void pre_format_elog_string(int errnumber, const char *domain);+extern char *format_elog_string(const char *fmt,...) pg_attribute_printf(1, 2);+++/* Support for attaching context information to error reports */++typedef struct ErrorContextCallback+{+ struct ErrorContextCallback *previous;+ void (*callback) (void *arg);+ void *arg;+} ErrorContextCallback;++extern PGDLLIMPORT __thread ErrorContextCallback *error_context_stack;+++/*----------+ * API for catching ereport(ERROR) exits. Use these macros like so:+ *+ * PG_TRY();+ * {+ * ... code that might throw ereport(ERROR) ...+ * }+ * PG_CATCH();+ * {+ * ... error recovery code ...+ * }+ * PG_END_TRY();+ *+ * (The braces are not actually necessary, but are recommended so that+ * pg_indent will indent the construct nicely.) The error recovery code+ * can optionally do PG_RE_THROW() to propagate the same error outwards.+ *+ * Note: while the system will correctly propagate any new ereport(ERROR)+ * occurring in the recovery section, there is a small limit on the number+ * of levels this will work for. It's best to keep the error recovery+ * section simple enough that it can't generate any new errors, at least+ * not before popping the error stack.+ *+ * Note: an ereport(FATAL) will not be caught by this construct; control will+ * exit straight through proc_exit(). Therefore, do NOT put any cleanup+ * of non-process-local resources into the error recovery section, at least+ * not without taking thought for what will happen during ereport(FATAL).+ * The PG_ENSURE_ERROR_CLEANUP macros provided by storage/ipc.h may be+ * helpful in such cases.+ *+ * Note: if a local variable of the function containing PG_TRY is modified+ * in the PG_TRY section and used in the PG_CATCH section, that variable+ * must be declared "volatile" for POSIX compliance. This is not mere+ * pedantry; we have seen bugs from compilers improperly optimizing code+ * away when such a variable was not marked. Beware that gcc's -Wclobbered+ * warnings are just about entirely useless for catching such oversights.+ *----------+ */+#define PG_TRY() \+ do { \+ sigjmp_buf *save_exception_stack = PG_exception_stack; \+ ErrorContextCallback *save_context_stack = error_context_stack; \+ sigjmp_buf local_sigjmp_buf; \+ if (sigsetjmp(local_sigjmp_buf, 0) == 0) \+ { \+ PG_exception_stack = &local_sigjmp_buf++#define PG_CATCH() \+ } \+ else \+ { \+ PG_exception_stack = save_exception_stack; \+ error_context_stack = save_context_stack++#define PG_END_TRY() \+ } \+ PG_exception_stack = save_exception_stack; \+ error_context_stack = save_context_stack; \+ } while (0)++/*+ * Some compilers understand pg_attribute_noreturn(); for other compilers,+ * insert pg_unreachable() so that the compiler gets the point.+ */+#ifdef HAVE_PG_ATTRIBUTE_NORETURN+#define PG_RE_THROW() \+ pg_re_throw()+#else+#define PG_RE_THROW() \+ (pg_re_throw(), pg_unreachable())+#endif++extern PGDLLIMPORT __thread sigjmp_buf *PG_exception_stack;+++/* Stuff that error handlers might want to use */++/*+ * ErrorData holds the data accumulated during any one ereport() cycle.+ * Any non-NULL pointers must point to palloc'd data.+ * (The const pointers are an exception; we assume they point at non-freeable+ * constant strings.)+ */+typedef struct ErrorData+{+ int elevel; /* error level */+ bool output_to_server; /* will report to server log? */+ bool output_to_client; /* will report to client? */+ bool show_funcname; /* true to force funcname inclusion */+ bool hide_stmt; /* true to prevent STATEMENT: inclusion */+ bool hide_ctx; /* true to prevent CONTEXT: inclusion */+ const char *filename; /* __FILE__ of ereport() call */+ int lineno; /* __LINE__ of ereport() call */+ const char *funcname; /* __func__ of ereport() call */+ const char *domain; /* message domain */+ const char *context_domain; /* message domain for context message */+ int sqlerrcode; /* encoded ERRSTATE */+ char *message; /* primary error message */+ char *detail; /* detail error message */+ char *detail_log; /* detail error message for server log only */+ char *hint; /* hint message */+ char *context; /* context message */+ char *schema_name; /* name of schema */+ char *table_name; /* name of table */+ char *column_name; /* name of column */+ char *datatype_name; /* name of datatype */+ char *constraint_name; /* name of constraint */+ int cursorpos; /* cursor index into query string */+ int internalpos; /* cursor index into internalquery */+ char *internalquery; /* text of internally-generated query */+ int saved_errno; /* errno at entry */++ /* context containing associated non-constant strings */+ struct MemoryContextData *assoc_context;+} ErrorData;++extern void EmitErrorReport(void);+extern ErrorData *CopyErrorData(void);+extern void FreeErrorData(ErrorData *edata);+extern void FlushErrorState(void);+extern void ReThrowError(ErrorData *edata) pg_attribute_noreturn();+extern void ThrowErrorData(ErrorData *edata);+extern void pg_re_throw(void) pg_attribute_noreturn();++extern char *GetErrorContextStack(void);++/* Hook for intercepting messages before they are sent to the server log */+typedef void (*emit_log_hook_type) (ErrorData *edata);+extern PGDLLIMPORT __thread emit_log_hook_type emit_log_hook;+++/* GUC-configurable parameters */++typedef enum+{+ PGERROR_TERSE, /* single-line error messages */+ PGERROR_DEFAULT, /* recommended style */+ PGERROR_VERBOSE /* all the facts, ma'am */+} PGErrorVerbosity;++extern int Log_error_verbosity;+extern char *Log_line_prefix;+extern int Log_destination;+extern char *Log_destination_string;++/* Log destination bitmap */+#define LOG_DESTINATION_STDERR 1+#define LOG_DESTINATION_SYSLOG 2+#define LOG_DESTINATION_EVENTLOG 4+#define LOG_DESTINATION_CSVLOG 8++/* Other exported functions */+extern void DebugFileOpen(void);+extern char *unpack_sql_state(int sql_state);+extern bool in_error_recursion_trouble(void);++#ifdef HAVE_SYSLOG+extern void set_syslog_parameters(const char *ident, int facility);+#endif++/*+ * Write errors to stderr (or by equal means when stderr is+ * not available). Used before ereport/elog can be used+ * safely (memory context, GUC load etc)+ */+extern void write_stderr(const char *fmt,...) pg_attribute_printf(1, 2);++#endif /* ELOG_H */
+ foreign/libpg_query/src/postgres/include/utils/errcodes.h view
@@ -0,0 +1,328 @@+/* autogenerated from src/backend/utils/errcodes.txt, do not edit */+/* there is deliberately not an #ifndef ERRCODES_H here */++/* Class 00 - Successful Completion */+#define ERRCODE_SUCCESSFUL_COMPLETION MAKE_SQLSTATE('0','0','0','0','0')++/* Class 01 - Warning */+#define ERRCODE_WARNING MAKE_SQLSTATE('0','1','0','0','0')+#define ERRCODE_WARNING_DYNAMIC_RESULT_SETS_RETURNED MAKE_SQLSTATE('0','1','0','0','C')+#define ERRCODE_WARNING_IMPLICIT_ZERO_BIT_PADDING MAKE_SQLSTATE('0','1','0','0','8')+#define ERRCODE_WARNING_NULL_VALUE_ELIMINATED_IN_SET_FUNCTION MAKE_SQLSTATE('0','1','0','0','3')+#define ERRCODE_WARNING_PRIVILEGE_NOT_GRANTED MAKE_SQLSTATE('0','1','0','0','7')+#define ERRCODE_WARNING_PRIVILEGE_NOT_REVOKED MAKE_SQLSTATE('0','1','0','0','6')+#define ERRCODE_WARNING_STRING_DATA_RIGHT_TRUNCATION MAKE_SQLSTATE('0','1','0','0','4')+#define ERRCODE_WARNING_DEPRECATED_FEATURE MAKE_SQLSTATE('0','1','P','0','1')++/* Class 02 - No Data (this is also a warning class per the SQL standard) */+#define ERRCODE_NO_DATA MAKE_SQLSTATE('0','2','0','0','0')+#define ERRCODE_NO_ADDITIONAL_DYNAMIC_RESULT_SETS_RETURNED MAKE_SQLSTATE('0','2','0','0','1')++/* Class 03 - SQL Statement Not Yet Complete */+#define ERRCODE_SQL_STATEMENT_NOT_YET_COMPLETE MAKE_SQLSTATE('0','3','0','0','0')++/* Class 08 - Connection Exception */+#define ERRCODE_CONNECTION_EXCEPTION MAKE_SQLSTATE('0','8','0','0','0')+#define ERRCODE_CONNECTION_DOES_NOT_EXIST MAKE_SQLSTATE('0','8','0','0','3')+#define ERRCODE_CONNECTION_FAILURE MAKE_SQLSTATE('0','8','0','0','6')+#define ERRCODE_SQLCLIENT_UNABLE_TO_ESTABLISH_SQLCONNECTION MAKE_SQLSTATE('0','8','0','0','1')+#define ERRCODE_SQLSERVER_REJECTED_ESTABLISHMENT_OF_SQLCONNECTION MAKE_SQLSTATE('0','8','0','0','4')+#define ERRCODE_TRANSACTION_RESOLUTION_UNKNOWN MAKE_SQLSTATE('0','8','0','0','7')+#define ERRCODE_PROTOCOL_VIOLATION MAKE_SQLSTATE('0','8','P','0','1')++/* Class 09 - Triggered Action Exception */+#define ERRCODE_TRIGGERED_ACTION_EXCEPTION MAKE_SQLSTATE('0','9','0','0','0')++/* Class 0A - Feature Not Supported */+#define ERRCODE_FEATURE_NOT_SUPPORTED MAKE_SQLSTATE('0','A','0','0','0')++/* Class 0B - Invalid Transaction Initiation */+#define ERRCODE_INVALID_TRANSACTION_INITIATION MAKE_SQLSTATE('0','B','0','0','0')++/* Class 0F - Locator Exception */+#define ERRCODE_LOCATOR_EXCEPTION MAKE_SQLSTATE('0','F','0','0','0')+#define ERRCODE_L_E_INVALID_SPECIFICATION MAKE_SQLSTATE('0','F','0','0','1')++/* Class 0L - Invalid Grantor */+#define ERRCODE_INVALID_GRANTOR MAKE_SQLSTATE('0','L','0','0','0')+#define ERRCODE_INVALID_GRANT_OPERATION MAKE_SQLSTATE('0','L','P','0','1')++/* Class 0P - Invalid Role Specification */+#define ERRCODE_INVALID_ROLE_SPECIFICATION MAKE_SQLSTATE('0','P','0','0','0')++/* Class 0Z - Diagnostics Exception */+#define ERRCODE_DIAGNOSTICS_EXCEPTION MAKE_SQLSTATE('0','Z','0','0','0')+#define ERRCODE_STACKED_DIAGNOSTICS_ACCESSED_WITHOUT_ACTIVE_HANDLER MAKE_SQLSTATE('0','Z','0','0','2')++/* Class 20 - Case Not Found */+#define ERRCODE_CASE_NOT_FOUND MAKE_SQLSTATE('2','0','0','0','0')++/* Class 21 - Cardinality Violation */+#define ERRCODE_CARDINALITY_VIOLATION MAKE_SQLSTATE('2','1','0','0','0')++/* Class 22 - Data Exception */+#define ERRCODE_DATA_EXCEPTION MAKE_SQLSTATE('2','2','0','0','0')+#define ERRCODE_ARRAY_ELEMENT_ERROR MAKE_SQLSTATE('2','2','0','2','E')+#define ERRCODE_ARRAY_SUBSCRIPT_ERROR MAKE_SQLSTATE('2','2','0','2','E')+#define ERRCODE_CHARACTER_NOT_IN_REPERTOIRE MAKE_SQLSTATE('2','2','0','2','1')+#define ERRCODE_DATETIME_FIELD_OVERFLOW MAKE_SQLSTATE('2','2','0','0','8')+#define ERRCODE_DATETIME_VALUE_OUT_OF_RANGE MAKE_SQLSTATE('2','2','0','0','8')+#define ERRCODE_DIVISION_BY_ZERO MAKE_SQLSTATE('2','2','0','1','2')+#define ERRCODE_ERROR_IN_ASSIGNMENT MAKE_SQLSTATE('2','2','0','0','5')+#define ERRCODE_ESCAPE_CHARACTER_CONFLICT MAKE_SQLSTATE('2','2','0','0','B')+#define ERRCODE_INDICATOR_OVERFLOW MAKE_SQLSTATE('2','2','0','2','2')+#define ERRCODE_INTERVAL_FIELD_OVERFLOW MAKE_SQLSTATE('2','2','0','1','5')+#define ERRCODE_INVALID_ARGUMENT_FOR_LOG MAKE_SQLSTATE('2','2','0','1','E')+#define ERRCODE_INVALID_ARGUMENT_FOR_NTILE MAKE_SQLSTATE('2','2','0','1','4')+#define ERRCODE_INVALID_ARGUMENT_FOR_NTH_VALUE MAKE_SQLSTATE('2','2','0','1','6')+#define ERRCODE_INVALID_ARGUMENT_FOR_POWER_FUNCTION MAKE_SQLSTATE('2','2','0','1','F')+#define ERRCODE_INVALID_ARGUMENT_FOR_WIDTH_BUCKET_FUNCTION MAKE_SQLSTATE('2','2','0','1','G')+#define ERRCODE_INVALID_CHARACTER_VALUE_FOR_CAST MAKE_SQLSTATE('2','2','0','1','8')+#define ERRCODE_INVALID_DATETIME_FORMAT MAKE_SQLSTATE('2','2','0','0','7')+#define ERRCODE_INVALID_ESCAPE_CHARACTER MAKE_SQLSTATE('2','2','0','1','9')+#define ERRCODE_INVALID_ESCAPE_OCTET MAKE_SQLSTATE('2','2','0','0','D')+#define ERRCODE_INVALID_ESCAPE_SEQUENCE MAKE_SQLSTATE('2','2','0','2','5')+#define ERRCODE_NONSTANDARD_USE_OF_ESCAPE_CHARACTER MAKE_SQLSTATE('2','2','P','0','6')+#define ERRCODE_INVALID_INDICATOR_PARAMETER_VALUE MAKE_SQLSTATE('2','2','0','1','0')+#define ERRCODE_INVALID_PARAMETER_VALUE MAKE_SQLSTATE('2','2','0','2','3')+#define ERRCODE_INVALID_REGULAR_EXPRESSION MAKE_SQLSTATE('2','2','0','1','B')+#define ERRCODE_INVALID_ROW_COUNT_IN_LIMIT_CLAUSE MAKE_SQLSTATE('2','2','0','1','W')+#define ERRCODE_INVALID_ROW_COUNT_IN_RESULT_OFFSET_CLAUSE MAKE_SQLSTATE('2','2','0','1','X')+#define ERRCODE_INVALID_TABLESAMPLE_ARGUMENT MAKE_SQLSTATE('2','2','0','2','H')+#define ERRCODE_INVALID_TABLESAMPLE_REPEAT MAKE_SQLSTATE('2','2','0','2','G')+#define ERRCODE_INVALID_TIME_ZONE_DISPLACEMENT_VALUE MAKE_SQLSTATE('2','2','0','0','9')+#define ERRCODE_INVALID_USE_OF_ESCAPE_CHARACTER MAKE_SQLSTATE('2','2','0','0','C')+#define ERRCODE_MOST_SPECIFIC_TYPE_MISMATCH MAKE_SQLSTATE('2','2','0','0','G')+#define ERRCODE_NULL_VALUE_NOT_ALLOWED MAKE_SQLSTATE('2','2','0','0','4')+#define ERRCODE_NULL_VALUE_NO_INDICATOR_PARAMETER MAKE_SQLSTATE('2','2','0','0','2')+#define ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE MAKE_SQLSTATE('2','2','0','0','3')+#define ERRCODE_STRING_DATA_LENGTH_MISMATCH MAKE_SQLSTATE('2','2','0','2','6')+#define ERRCODE_STRING_DATA_RIGHT_TRUNCATION MAKE_SQLSTATE('2','2','0','0','1')+#define ERRCODE_SUBSTRING_ERROR MAKE_SQLSTATE('2','2','0','1','1')+#define ERRCODE_TRIM_ERROR MAKE_SQLSTATE('2','2','0','2','7')+#define ERRCODE_UNTERMINATED_C_STRING MAKE_SQLSTATE('2','2','0','2','4')+#define ERRCODE_ZERO_LENGTH_CHARACTER_STRING MAKE_SQLSTATE('2','2','0','0','F')+#define ERRCODE_FLOATING_POINT_EXCEPTION MAKE_SQLSTATE('2','2','P','0','1')+#define ERRCODE_INVALID_TEXT_REPRESENTATION MAKE_SQLSTATE('2','2','P','0','2')+#define ERRCODE_INVALID_BINARY_REPRESENTATION MAKE_SQLSTATE('2','2','P','0','3')+#define ERRCODE_BAD_COPY_FILE_FORMAT MAKE_SQLSTATE('2','2','P','0','4')+#define ERRCODE_UNTRANSLATABLE_CHARACTER MAKE_SQLSTATE('2','2','P','0','5')+#define ERRCODE_NOT_AN_XML_DOCUMENT MAKE_SQLSTATE('2','2','0','0','L')+#define ERRCODE_INVALID_XML_DOCUMENT MAKE_SQLSTATE('2','2','0','0','M')+#define ERRCODE_INVALID_XML_CONTENT MAKE_SQLSTATE('2','2','0','0','N')+#define ERRCODE_INVALID_XML_COMMENT MAKE_SQLSTATE('2','2','0','0','S')+#define ERRCODE_INVALID_XML_PROCESSING_INSTRUCTION MAKE_SQLSTATE('2','2','0','0','T')++/* Class 23 - Integrity Constraint Violation */+#define ERRCODE_INTEGRITY_CONSTRAINT_VIOLATION MAKE_SQLSTATE('2','3','0','0','0')+#define ERRCODE_RESTRICT_VIOLATION MAKE_SQLSTATE('2','3','0','0','1')+#define ERRCODE_NOT_NULL_VIOLATION MAKE_SQLSTATE('2','3','5','0','2')+#define ERRCODE_FOREIGN_KEY_VIOLATION MAKE_SQLSTATE('2','3','5','0','3')+#define ERRCODE_UNIQUE_VIOLATION MAKE_SQLSTATE('2','3','5','0','5')+#define ERRCODE_CHECK_VIOLATION MAKE_SQLSTATE('2','3','5','1','4')+#define ERRCODE_EXCLUSION_VIOLATION MAKE_SQLSTATE('2','3','P','0','1')++/* Class 24 - Invalid Cursor State */+#define ERRCODE_INVALID_CURSOR_STATE MAKE_SQLSTATE('2','4','0','0','0')++/* Class 25 - Invalid Transaction State */+#define ERRCODE_INVALID_TRANSACTION_STATE MAKE_SQLSTATE('2','5','0','0','0')+#define ERRCODE_ACTIVE_SQL_TRANSACTION MAKE_SQLSTATE('2','5','0','0','1')+#define ERRCODE_BRANCH_TRANSACTION_ALREADY_ACTIVE MAKE_SQLSTATE('2','5','0','0','2')+#define ERRCODE_HELD_CURSOR_REQUIRES_SAME_ISOLATION_LEVEL MAKE_SQLSTATE('2','5','0','0','8')+#define ERRCODE_INAPPROPRIATE_ACCESS_MODE_FOR_BRANCH_TRANSACTION MAKE_SQLSTATE('2','5','0','0','3')+#define ERRCODE_INAPPROPRIATE_ISOLATION_LEVEL_FOR_BRANCH_TRANSACTION MAKE_SQLSTATE('2','5','0','0','4')+#define ERRCODE_NO_ACTIVE_SQL_TRANSACTION_FOR_BRANCH_TRANSACTION MAKE_SQLSTATE('2','5','0','0','5')+#define ERRCODE_READ_ONLY_SQL_TRANSACTION MAKE_SQLSTATE('2','5','0','0','6')+#define ERRCODE_SCHEMA_AND_DATA_STATEMENT_MIXING_NOT_SUPPORTED MAKE_SQLSTATE('2','5','0','0','7')+#define ERRCODE_NO_ACTIVE_SQL_TRANSACTION MAKE_SQLSTATE('2','5','P','0','1')+#define ERRCODE_IN_FAILED_SQL_TRANSACTION MAKE_SQLSTATE('2','5','P','0','2')++/* Class 26 - Invalid SQL Statement Name */+#define ERRCODE_INVALID_SQL_STATEMENT_NAME MAKE_SQLSTATE('2','6','0','0','0')++/* Class 27 - Triggered Data Change Violation */+#define ERRCODE_TRIGGERED_DATA_CHANGE_VIOLATION MAKE_SQLSTATE('2','7','0','0','0')++/* Class 28 - Invalid Authorization Specification */+#define ERRCODE_INVALID_AUTHORIZATION_SPECIFICATION MAKE_SQLSTATE('2','8','0','0','0')+#define ERRCODE_INVALID_PASSWORD MAKE_SQLSTATE('2','8','P','0','1')++/* Class 2B - Dependent Privilege Descriptors Still Exist */+#define ERRCODE_DEPENDENT_PRIVILEGE_DESCRIPTORS_STILL_EXIST MAKE_SQLSTATE('2','B','0','0','0')+#define ERRCODE_DEPENDENT_OBJECTS_STILL_EXIST MAKE_SQLSTATE('2','B','P','0','1')++/* Class 2D - Invalid Transaction Termination */+#define ERRCODE_INVALID_TRANSACTION_TERMINATION MAKE_SQLSTATE('2','D','0','0','0')++/* Class 2F - SQL Routine Exception */+#define ERRCODE_SQL_ROUTINE_EXCEPTION MAKE_SQLSTATE('2','F','0','0','0')+#define ERRCODE_S_R_E_FUNCTION_EXECUTED_NO_RETURN_STATEMENT MAKE_SQLSTATE('2','F','0','0','5')+#define ERRCODE_S_R_E_MODIFYING_SQL_DATA_NOT_PERMITTED MAKE_SQLSTATE('2','F','0','0','2')+#define ERRCODE_S_R_E_PROHIBITED_SQL_STATEMENT_ATTEMPTED MAKE_SQLSTATE('2','F','0','0','3')+#define ERRCODE_S_R_E_READING_SQL_DATA_NOT_PERMITTED MAKE_SQLSTATE('2','F','0','0','4')++/* Class 34 - Invalid Cursor Name */+#define ERRCODE_INVALID_CURSOR_NAME MAKE_SQLSTATE('3','4','0','0','0')++/* Class 38 - External Routine Exception */+#define ERRCODE_EXTERNAL_ROUTINE_EXCEPTION MAKE_SQLSTATE('3','8','0','0','0')+#define ERRCODE_E_R_E_CONTAINING_SQL_NOT_PERMITTED MAKE_SQLSTATE('3','8','0','0','1')+#define ERRCODE_E_R_E_MODIFYING_SQL_DATA_NOT_PERMITTED MAKE_SQLSTATE('3','8','0','0','2')+#define ERRCODE_E_R_E_PROHIBITED_SQL_STATEMENT_ATTEMPTED MAKE_SQLSTATE('3','8','0','0','3')+#define ERRCODE_E_R_E_READING_SQL_DATA_NOT_PERMITTED MAKE_SQLSTATE('3','8','0','0','4')++/* Class 39 - External Routine Invocation Exception */+#define ERRCODE_EXTERNAL_ROUTINE_INVOCATION_EXCEPTION MAKE_SQLSTATE('3','9','0','0','0')+#define ERRCODE_E_R_I_E_INVALID_SQLSTATE_RETURNED MAKE_SQLSTATE('3','9','0','0','1')+#define ERRCODE_E_R_I_E_NULL_VALUE_NOT_ALLOWED MAKE_SQLSTATE('3','9','0','0','4')+#define ERRCODE_E_R_I_E_TRIGGER_PROTOCOL_VIOLATED MAKE_SQLSTATE('3','9','P','0','1')+#define ERRCODE_E_R_I_E_SRF_PROTOCOL_VIOLATED MAKE_SQLSTATE('3','9','P','0','2')+#define ERRCODE_E_R_I_E_EVENT_TRIGGER_PROTOCOL_VIOLATED MAKE_SQLSTATE('3','9','P','0','3')++/* Class 3B - Savepoint Exception */+#define ERRCODE_SAVEPOINT_EXCEPTION MAKE_SQLSTATE('3','B','0','0','0')+#define ERRCODE_S_E_INVALID_SPECIFICATION MAKE_SQLSTATE('3','B','0','0','1')++/* Class 3D - Invalid Catalog Name */+#define ERRCODE_INVALID_CATALOG_NAME MAKE_SQLSTATE('3','D','0','0','0')++/* Class 3F - Invalid Schema Name */+#define ERRCODE_INVALID_SCHEMA_NAME MAKE_SQLSTATE('3','F','0','0','0')++/* Class 40 - Transaction Rollback */+#define ERRCODE_TRANSACTION_ROLLBACK MAKE_SQLSTATE('4','0','0','0','0')+#define ERRCODE_T_R_INTEGRITY_CONSTRAINT_VIOLATION MAKE_SQLSTATE('4','0','0','0','2')+#define ERRCODE_T_R_SERIALIZATION_FAILURE MAKE_SQLSTATE('4','0','0','0','1')+#define ERRCODE_T_R_STATEMENT_COMPLETION_UNKNOWN MAKE_SQLSTATE('4','0','0','0','3')+#define ERRCODE_T_R_DEADLOCK_DETECTED MAKE_SQLSTATE('4','0','P','0','1')++/* Class 42 - Syntax Error or Access Rule Violation */+#define ERRCODE_SYNTAX_ERROR_OR_ACCESS_RULE_VIOLATION MAKE_SQLSTATE('4','2','0','0','0')+#define ERRCODE_SYNTAX_ERROR MAKE_SQLSTATE('4','2','6','0','1')+#define ERRCODE_INSUFFICIENT_PRIVILEGE MAKE_SQLSTATE('4','2','5','0','1')+#define ERRCODE_CANNOT_COERCE MAKE_SQLSTATE('4','2','8','4','6')+#define ERRCODE_GROUPING_ERROR MAKE_SQLSTATE('4','2','8','0','3')+#define ERRCODE_WINDOWING_ERROR MAKE_SQLSTATE('4','2','P','2','0')+#define ERRCODE_INVALID_RECURSION MAKE_SQLSTATE('4','2','P','1','9')+#define ERRCODE_INVALID_FOREIGN_KEY MAKE_SQLSTATE('4','2','8','3','0')+#define ERRCODE_INVALID_NAME MAKE_SQLSTATE('4','2','6','0','2')+#define ERRCODE_NAME_TOO_LONG MAKE_SQLSTATE('4','2','6','2','2')+#define ERRCODE_RESERVED_NAME MAKE_SQLSTATE('4','2','9','3','9')+#define ERRCODE_DATATYPE_MISMATCH MAKE_SQLSTATE('4','2','8','0','4')+#define ERRCODE_INDETERMINATE_DATATYPE MAKE_SQLSTATE('4','2','P','1','8')+#define ERRCODE_COLLATION_MISMATCH MAKE_SQLSTATE('4','2','P','2','1')+#define ERRCODE_INDETERMINATE_COLLATION MAKE_SQLSTATE('4','2','P','2','2')+#define ERRCODE_WRONG_OBJECT_TYPE MAKE_SQLSTATE('4','2','8','0','9')+#define ERRCODE_UNDEFINED_COLUMN MAKE_SQLSTATE('4','2','7','0','3')+#define ERRCODE_UNDEFINED_CURSOR MAKE_SQLSTATE('3','4','0','0','0')+#define ERRCODE_UNDEFINED_DATABASE MAKE_SQLSTATE('3','D','0','0','0')+#define ERRCODE_UNDEFINED_FUNCTION MAKE_SQLSTATE('4','2','8','8','3')+#define ERRCODE_UNDEFINED_PSTATEMENT MAKE_SQLSTATE('2','6','0','0','0')+#define ERRCODE_UNDEFINED_SCHEMA MAKE_SQLSTATE('3','F','0','0','0')+#define ERRCODE_UNDEFINED_TABLE MAKE_SQLSTATE('4','2','P','0','1')+#define ERRCODE_UNDEFINED_PARAMETER MAKE_SQLSTATE('4','2','P','0','2')+#define ERRCODE_UNDEFINED_OBJECT MAKE_SQLSTATE('4','2','7','0','4')+#define ERRCODE_DUPLICATE_COLUMN MAKE_SQLSTATE('4','2','7','0','1')+#define ERRCODE_DUPLICATE_CURSOR MAKE_SQLSTATE('4','2','P','0','3')+#define ERRCODE_DUPLICATE_DATABASE MAKE_SQLSTATE('4','2','P','0','4')+#define ERRCODE_DUPLICATE_FUNCTION MAKE_SQLSTATE('4','2','7','2','3')+#define ERRCODE_DUPLICATE_PSTATEMENT MAKE_SQLSTATE('4','2','P','0','5')+#define ERRCODE_DUPLICATE_SCHEMA MAKE_SQLSTATE('4','2','P','0','6')+#define ERRCODE_DUPLICATE_TABLE MAKE_SQLSTATE('4','2','P','0','7')+#define ERRCODE_DUPLICATE_ALIAS MAKE_SQLSTATE('4','2','7','1','2')+#define ERRCODE_DUPLICATE_OBJECT MAKE_SQLSTATE('4','2','7','1','0')+#define ERRCODE_AMBIGUOUS_COLUMN MAKE_SQLSTATE('4','2','7','0','2')+#define ERRCODE_AMBIGUOUS_FUNCTION MAKE_SQLSTATE('4','2','7','2','5')+#define ERRCODE_AMBIGUOUS_PARAMETER MAKE_SQLSTATE('4','2','P','0','8')+#define ERRCODE_AMBIGUOUS_ALIAS MAKE_SQLSTATE('4','2','P','0','9')+#define ERRCODE_INVALID_COLUMN_REFERENCE MAKE_SQLSTATE('4','2','P','1','0')+#define ERRCODE_INVALID_COLUMN_DEFINITION MAKE_SQLSTATE('4','2','6','1','1')+#define ERRCODE_INVALID_CURSOR_DEFINITION MAKE_SQLSTATE('4','2','P','1','1')+#define ERRCODE_INVALID_DATABASE_DEFINITION MAKE_SQLSTATE('4','2','P','1','2')+#define ERRCODE_INVALID_FUNCTION_DEFINITION MAKE_SQLSTATE('4','2','P','1','3')+#define ERRCODE_INVALID_PSTATEMENT_DEFINITION MAKE_SQLSTATE('4','2','P','1','4')+#define ERRCODE_INVALID_SCHEMA_DEFINITION MAKE_SQLSTATE('4','2','P','1','5')+#define ERRCODE_INVALID_TABLE_DEFINITION MAKE_SQLSTATE('4','2','P','1','6')+#define ERRCODE_INVALID_OBJECT_DEFINITION MAKE_SQLSTATE('4','2','P','1','7')++/* Class 44 - WITH CHECK OPTION Violation */+#define ERRCODE_WITH_CHECK_OPTION_VIOLATION MAKE_SQLSTATE('4','4','0','0','0')++/* Class 53 - Insufficient Resources */+#define ERRCODE_INSUFFICIENT_RESOURCES MAKE_SQLSTATE('5','3','0','0','0')+#define ERRCODE_DISK_FULL MAKE_SQLSTATE('5','3','1','0','0')+#define ERRCODE_OUT_OF_MEMORY MAKE_SQLSTATE('5','3','2','0','0')+#define ERRCODE_TOO_MANY_CONNECTIONS MAKE_SQLSTATE('5','3','3','0','0')+#define ERRCODE_CONFIGURATION_LIMIT_EXCEEDED MAKE_SQLSTATE('5','3','4','0','0')++/* Class 54 - Program Limit Exceeded */+#define ERRCODE_PROGRAM_LIMIT_EXCEEDED MAKE_SQLSTATE('5','4','0','0','0')+#define ERRCODE_STATEMENT_TOO_COMPLEX MAKE_SQLSTATE('5','4','0','0','1')+#define ERRCODE_TOO_MANY_COLUMNS MAKE_SQLSTATE('5','4','0','1','1')+#define ERRCODE_TOO_MANY_ARGUMENTS MAKE_SQLSTATE('5','4','0','2','3')++/* Class 55 - Object Not In Prerequisite State */+#define ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE MAKE_SQLSTATE('5','5','0','0','0')+#define ERRCODE_OBJECT_IN_USE MAKE_SQLSTATE('5','5','0','0','6')+#define ERRCODE_CANT_CHANGE_RUNTIME_PARAM MAKE_SQLSTATE('5','5','P','0','2')+#define ERRCODE_LOCK_NOT_AVAILABLE MAKE_SQLSTATE('5','5','P','0','3')++/* Class 57 - Operator Intervention */+#define ERRCODE_OPERATOR_INTERVENTION MAKE_SQLSTATE('5','7','0','0','0')+#define ERRCODE_QUERY_CANCELED MAKE_SQLSTATE('5','7','0','1','4')+#define ERRCODE_ADMIN_SHUTDOWN MAKE_SQLSTATE('5','7','P','0','1')+#define ERRCODE_CRASH_SHUTDOWN MAKE_SQLSTATE('5','7','P','0','2')+#define ERRCODE_CANNOT_CONNECT_NOW MAKE_SQLSTATE('5','7','P','0','3')+#define ERRCODE_DATABASE_DROPPED MAKE_SQLSTATE('5','7','P','0','4')++/* Class 58 - System Error (errors external to PostgreSQL itself) */+#define ERRCODE_SYSTEM_ERROR MAKE_SQLSTATE('5','8','0','0','0')+#define ERRCODE_IO_ERROR MAKE_SQLSTATE('5','8','0','3','0')+#define ERRCODE_UNDEFINED_FILE MAKE_SQLSTATE('5','8','P','0','1')+#define ERRCODE_DUPLICATE_FILE MAKE_SQLSTATE('5','8','P','0','2')++/* Class F0 - Configuration File Error */+#define ERRCODE_CONFIG_FILE_ERROR MAKE_SQLSTATE('F','0','0','0','0')+#define ERRCODE_LOCK_FILE_EXISTS MAKE_SQLSTATE('F','0','0','0','1')++/* Class HV - Foreign Data Wrapper Error (SQL/MED) */+#define ERRCODE_FDW_ERROR MAKE_SQLSTATE('H','V','0','0','0')+#define ERRCODE_FDW_COLUMN_NAME_NOT_FOUND MAKE_SQLSTATE('H','V','0','0','5')+#define ERRCODE_FDW_DYNAMIC_PARAMETER_VALUE_NEEDED MAKE_SQLSTATE('H','V','0','0','2')+#define ERRCODE_FDW_FUNCTION_SEQUENCE_ERROR MAKE_SQLSTATE('H','V','0','1','0')+#define ERRCODE_FDW_INCONSISTENT_DESCRIPTOR_INFORMATION MAKE_SQLSTATE('H','V','0','2','1')+#define ERRCODE_FDW_INVALID_ATTRIBUTE_VALUE MAKE_SQLSTATE('H','V','0','2','4')+#define ERRCODE_FDW_INVALID_COLUMN_NAME MAKE_SQLSTATE('H','V','0','0','7')+#define ERRCODE_FDW_INVALID_COLUMN_NUMBER MAKE_SQLSTATE('H','V','0','0','8')+#define ERRCODE_FDW_INVALID_DATA_TYPE MAKE_SQLSTATE('H','V','0','0','4')+#define ERRCODE_FDW_INVALID_DATA_TYPE_DESCRIPTORS MAKE_SQLSTATE('H','V','0','0','6')+#define ERRCODE_FDW_INVALID_DESCRIPTOR_FIELD_IDENTIFIER MAKE_SQLSTATE('H','V','0','9','1')+#define ERRCODE_FDW_INVALID_HANDLE MAKE_SQLSTATE('H','V','0','0','B')+#define ERRCODE_FDW_INVALID_OPTION_INDEX MAKE_SQLSTATE('H','V','0','0','C')+#define ERRCODE_FDW_INVALID_OPTION_NAME MAKE_SQLSTATE('H','V','0','0','D')+#define ERRCODE_FDW_INVALID_STRING_LENGTH_OR_BUFFER_LENGTH MAKE_SQLSTATE('H','V','0','9','0')+#define ERRCODE_FDW_INVALID_STRING_FORMAT MAKE_SQLSTATE('H','V','0','0','A')+#define ERRCODE_FDW_INVALID_USE_OF_NULL_POINTER MAKE_SQLSTATE('H','V','0','0','9')+#define ERRCODE_FDW_TOO_MANY_HANDLES MAKE_SQLSTATE('H','V','0','1','4')+#define ERRCODE_FDW_OUT_OF_MEMORY MAKE_SQLSTATE('H','V','0','0','1')+#define ERRCODE_FDW_NO_SCHEMAS MAKE_SQLSTATE('H','V','0','0','P')+#define ERRCODE_FDW_OPTION_NAME_NOT_FOUND MAKE_SQLSTATE('H','V','0','0','J')+#define ERRCODE_FDW_REPLY_HANDLE MAKE_SQLSTATE('H','V','0','0','K')+#define ERRCODE_FDW_SCHEMA_NOT_FOUND MAKE_SQLSTATE('H','V','0','0','Q')+#define ERRCODE_FDW_TABLE_NOT_FOUND MAKE_SQLSTATE('H','V','0','0','R')+#define ERRCODE_FDW_UNABLE_TO_CREATE_EXECUTION MAKE_SQLSTATE('H','V','0','0','L')+#define ERRCODE_FDW_UNABLE_TO_CREATE_REPLY MAKE_SQLSTATE('H','V','0','0','M')+#define ERRCODE_FDW_UNABLE_TO_ESTABLISH_CONNECTION MAKE_SQLSTATE('H','V','0','0','N')++/* Class P0 - PL/pgSQL Error */+#define ERRCODE_PLPGSQL_ERROR MAKE_SQLSTATE('P','0','0','0','0')+#define ERRCODE_RAISE_EXCEPTION MAKE_SQLSTATE('P','0','0','0','1')+#define ERRCODE_NO_DATA_FOUND MAKE_SQLSTATE('P','0','0','0','2')+#define ERRCODE_TOO_MANY_ROWS MAKE_SQLSTATE('P','0','0','0','3')+#define ERRCODE_ASSERT_FAILURE MAKE_SQLSTATE('P','0','0','0','4')++/* Class XX - Internal Error */+#define ERRCODE_INTERNAL_ERROR MAKE_SQLSTATE('X','X','0','0','0')+#define ERRCODE_DATA_CORRUPTED MAKE_SQLSTATE('X','X','0','0','1')+#define ERRCODE_INDEX_CORRUPTED MAKE_SQLSTATE('X','X','0','0','2')
+ foreign/libpg_query/src/postgres/include/utils/expandeddatum.h view
@@ -0,0 +1,151 @@+/*-------------------------------------------------------------------------+ *+ * expandeddatum.h+ * Declarations for access to "expanded" value representations.+ *+ * Complex data types, particularly container types such as arrays and+ * records, usually have on-disk representations that are compact but not+ * especially convenient to modify. What's more, when we do modify them,+ * having to recopy all the rest of the value can be extremely inefficient.+ * Therefore, we provide a notion of an "expanded" representation that is used+ * only in memory and is optimized more for computation than storage.+ * The format appearing on disk is called the data type's "flattened"+ * representation, since it is required to be a contiguous blob of bytes --+ * but the type can have an expanded representation that is not. Data types+ * must provide means to translate an expanded representation back to+ * flattened form.+ *+ * An expanded object is meant to survive across multiple operations, but+ * not to be enormously long-lived; for example it might be a local variable+ * in a PL/pgSQL procedure. So its extra bulk compared to the on-disk format+ * is a worthwhile trade-off.+ *+ * References to expanded objects are a type of TOAST pointer.+ * Because of longstanding conventions in Postgres, this means that the+ * flattened form of such an object must always be a varlena object.+ * Fortunately that's no restriction in practice.+ *+ * There are actually two kinds of TOAST pointers for expanded objects:+ * read-only and read-write pointers. Possession of one of the latter+ * authorizes a function to modify the value in-place rather than copying it+ * as would normally be required. Functions should always return a read-write+ * pointer to any new expanded object they create. Functions that modify an+ * argument value in-place must take care that they do not corrupt the old+ * value if they fail partway through.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/utils/expandeddatum.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef EXPANDEDDATUM_H+#define EXPANDEDDATUM_H++/* Size of an EXTERNAL datum that contains a pointer to an expanded object */+#define EXPANDED_POINTER_SIZE (VARHDRSZ_EXTERNAL + sizeof(varatt_expanded))++/*+ * "Methods" that must be provided for any expanded object.+ *+ * get_flat_size: compute space needed for flattened representation (total,+ * including header).+ *+ * flatten_into: construct flattened representation in the caller-allocated+ * space at *result, of size allocated_size (which will always be the result+ * of a preceding get_flat_size call; it's passed for cross-checking).+ *+ * The flattened representation must be a valid in-line, non-compressed,+ * 4-byte-header varlena object.+ *+ * Note: construction of a heap tuple from an expanded datum calls+ * get_flat_size twice, so it's worthwhile to make sure that that doesn't+ * incur too much overhead.+ */+typedef Size (*EOM_get_flat_size_method) (ExpandedObjectHeader *eohptr);+typedef void (*EOM_flatten_into_method) (ExpandedObjectHeader *eohptr,+ void *result, Size allocated_size);++/* Struct of function pointers for an expanded object's methods */+typedef struct ExpandedObjectMethods+{+ EOM_get_flat_size_method get_flat_size;+ EOM_flatten_into_method flatten_into;+} ExpandedObjectMethods;++/*+ * Every expanded object must contain this header; typically the header+ * is embedded in some larger struct that adds type-specific fields.+ *+ * It is presumed that the header object and all subsidiary data are stored+ * in eoh_context, so that the object can be freed by deleting that context,+ * or its storage lifespan can be altered by reparenting the context.+ * (In principle the object could own additional resources, such as malloc'd+ * storage, and use a memory context reset callback to free them upon reset or+ * deletion of eoh_context.)+ *+ * We set up two TOAST pointers within the standard header, one read-write+ * and one read-only. This allows functions to return either kind of pointer+ * without making an additional allocation, and in particular without worrying+ * whether a separately palloc'd object would have sufficient lifespan.+ * But note that these pointers are just a convenience; a pointer object+ * appearing somewhere else would still be legal.+ *+ * The typedef declaration for this appears in postgres.h.+ */+struct ExpandedObjectHeader+{+ /* Phony varlena header */+ int32 vl_len_; /* always EOH_HEADER_MAGIC, see below */++ /* Pointer to methods required for object type */+ const ExpandedObjectMethods *eoh_methods;++ /* Memory context containing this header and subsidiary data */+ MemoryContext eoh_context;++ /* Standard R/W TOAST pointer for this object is kept here */+ char eoh_rw_ptr[EXPANDED_POINTER_SIZE];++ /* Standard R/O TOAST pointer for this object is kept here */+ char eoh_ro_ptr[EXPANDED_POINTER_SIZE];+};++/*+ * Particularly for read-only functions, it is handy to be able to work with+ * either regular "flat" varlena inputs or expanded inputs of the same data+ * type. To allow determining which case an argument-fetching function has+ * returned, the first int32 of an ExpandedObjectHeader always contains -1+ * (EOH_HEADER_MAGIC to the code). This works since no 4-byte-header varlena+ * could have that as its first 4 bytes. Caution: we could not reliably tell+ * the difference between an ExpandedObjectHeader and a short-header object+ * with this trick. However, it works fine if the argument fetching code+ * always returns either a 4-byte-header flat object or an expanded object.+ */+#define EOH_HEADER_MAGIC (-1)+#define VARATT_IS_EXPANDED_HEADER(PTR) \+ (((ExpandedObjectHeader *) (PTR))->vl_len_ == EOH_HEADER_MAGIC)++/*+ * Generic support functions for expanded objects.+ * (More of these might be worth inlining later.)+ */++#define EOHPGetRWDatum(eohptr) PointerGetDatum((eohptr)->eoh_rw_ptr)+#define EOHPGetRODatum(eohptr) PointerGetDatum((eohptr)->eoh_ro_ptr)++extern ExpandedObjectHeader *DatumGetEOHP(Datum d);+extern void EOH_init_header(ExpandedObjectHeader *eohptr,+ const ExpandedObjectMethods *methods,+ MemoryContext obj_context);+extern Size EOH_get_flat_size(ExpandedObjectHeader *eohptr);+extern void EOH_flatten_into(ExpandedObjectHeader *eohptr,+ void *result, Size allocated_size);+extern bool DatumIsReadWriteExpandedObject(Datum d, bool isnull, int16 typlen);+extern Datum MakeExpandedObjectReadOnly(Datum d, bool isnull, int16 typlen);+extern Datum TransferExpandedObject(Datum d, MemoryContext new_parent);+extern void DeleteExpandedObject(Datum d);++#endif /* EXPANDEDDATUM_H */
+ foreign/libpg_query/src/postgres/include/utils/fmgroids.h view
@@ -0,0 +1,2450 @@+/*-------------------------------------------------------------------------+ *+ * fmgroids.h+ * Macros that define the OIDs of built-in functions.+ *+ * These macros can be used to avoid a catalog lookup when a specific+ * fmgr-callable function needs to be referenced.+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * NOTES+ * ******************************+ * *** DO NOT EDIT THIS FILE! ***+ * ******************************+ *+ * It has been GENERATED by Gen_fmgrtab.pl+ * from ../../../src/include/catalog/pg_proc.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef FMGROIDS_H+#define FMGROIDS_H++/*+ * Constant macros for the OIDs of entries in pg_proc.+ *+ * NOTE: macros are named after the prosrc value, ie the actual C name+ * of the implementing function, not the proname which may be overloaded.+ * For example, we want to be able to assign different macro names to both+ * char_text() and name_text() even though these both appear with proname+ * 'text'. If the same C function appears in more than one pg_proc entry,+ * its equivalent macro will be defined with the lowest OID among those+ * entries.+ */+#define F_BYTEAOUT 31+#define F_CHAROUT 33+#define F_NAMEIN 34+#define F_NAMEOUT 35+#define F_INT2IN 38+#define F_INT2OUT 39+#define F_INT2VECTORIN 40+#define F_INT2VECTOROUT 41+#define F_INT4IN 42+#define F_INT4OUT 43+#define F_REGPROCIN 44+#define F_REGPROCOUT 45+#define F_TEXTIN 46+#define F_TEXTOUT 47+#define F_TIDIN 48+#define F_TIDOUT 49+#define F_XIDIN 50+#define F_XIDOUT 51+#define F_CIDIN 52+#define F_CIDOUT 53+#define F_OIDVECTORIN 54+#define F_OIDVECTOROUT 55+#define F_BOOLLT 56+#define F_BOOLGT 57+#define F_BOOLEQ 60+#define F_CHAREQ 61+#define F_NAMEEQ 62+#define F_INT2EQ 63+#define F_INT2LT 64+#define F_INT4EQ 65+#define F_INT4LT 66+#define F_TEXTEQ 67+#define F_XIDEQ 68+#define F_CIDEQ 69+#define F_CHARNE 70+#define F_CHARLE 72+#define F_CHARGT 73+#define F_CHARGE 74+#define F_CHARTOI4 77+#define F_I4TOCHAR 78+#define F_NAMEREGEXEQ 79+#define F_BOOLNE 84+#define F_PG_DDL_COMMAND_IN 86+#define F_PG_DDL_COMMAND_OUT 87+#define F_PG_DDL_COMMAND_RECV 88+#define F_PGSQL_VERSION 89+#define F_PG_DDL_COMMAND_SEND 90+#define F_EQSEL 101+#define F_NEQSEL 102+#define F_SCALARLTSEL 103+#define F_SCALARGTSEL 104+#define F_EQJOINSEL 105+#define F_NEQJOINSEL 106+#define F_SCALARLTJOINSEL 107+#define F_SCALARGTJOINSEL 108+#define F_UNKNOWNIN 109+#define F_UNKNOWNOUT 110+#define F_NUMERIC_FAC 111+#define F_BOX_ABOVE_EQ 115+#define F_BOX_BELOW_EQ 116+#define F_POINT_IN 117+#define F_POINT_OUT 118+#define F_LSEG_IN 119+#define F_LSEG_OUT 120+#define F_PATH_IN 121+#define F_PATH_OUT 122+#define F_BOX_IN 123+#define F_BOX_OUT 124+#define F_BOX_OVERLAP 125+#define F_BOX_GE 126+#define F_BOX_GT 127+#define F_BOX_EQ 128+#define F_BOX_LT 129+#define F_BOX_LE 130+#define F_POINT_ABOVE 131+#define F_POINT_LEFT 132+#define F_POINT_RIGHT 133+#define F_POINT_BELOW 134+#define F_POINT_EQ 135+#define F_ON_PB 136+#define F_ON_PPATH 137+#define F_BOX_CENTER 138+#define F_AREASEL 139+#define F_AREAJOINSEL 140+#define F_INT4MUL 141+#define F_INT4NE 144+#define F_INT2NE 145+#define F_INT2GT 146+#define F_INT4GT 147+#define F_INT2LE 148+#define F_INT4LE 149+#define F_INT4GE 150+#define F_INT2GE 151+#define F_INT2MUL 152+#define F_INT2DIV 153+#define F_INT4DIV 154+#define F_INT2MOD 155+#define F_INT4MOD 156+#define F_TEXTNE 157+#define F_INT24EQ 158+#define F_INT42EQ 159+#define F_INT24LT 160+#define F_INT42LT 161+#define F_INT24GT 162+#define F_INT42GT 163+#define F_INT24NE 164+#define F_INT42NE 165+#define F_INT24LE 166+#define F_INT42LE 167+#define F_INT24GE 168+#define F_INT42GE 169+#define F_INT24MUL 170+#define F_INT42MUL 171+#define F_INT24DIV 172+#define F_INT42DIV 173+#define F_INT2PL 176+#define F_INT4PL 177+#define F_INT24PL 178+#define F_INT42PL 179+#define F_INT2MI 180+#define F_INT4MI 181+#define F_INT24MI 182+#define F_INT42MI 183+#define F_OIDEQ 184+#define F_OIDNE 185+#define F_BOX_SAME 186+#define F_BOX_CONTAIN 187+#define F_BOX_LEFT 188+#define F_BOX_OVERLEFT 189+#define F_BOX_OVERRIGHT 190+#define F_BOX_RIGHT 191+#define F_BOX_CONTAINED 192+#define F_BOX_CONTAIN_PT 193+#define F_PG_NODE_TREE_IN 195+#define F_PG_NODE_TREE_OUT 196+#define F_PG_NODE_TREE_RECV 197+#define F_PG_NODE_TREE_SEND 198+#define F_FLOAT4IN 200+#define F_FLOAT4OUT 201+#define F_FLOAT4MUL 202+#define F_FLOAT4DIV 203+#define F_FLOAT4PL 204+#define F_FLOAT4MI 205+#define F_FLOAT4UM 206+#define F_FLOAT4ABS 207+#define F_FLOAT4_ACCUM 208+#define F_FLOAT4LARGER 209+#define F_FLOAT4SMALLER 211+#define F_INT4UM 212+#define F_INT2UM 213+#define F_FLOAT8IN 214+#define F_FLOAT8OUT 215+#define F_FLOAT8MUL 216+#define F_FLOAT8DIV 217+#define F_FLOAT8PL 218+#define F_FLOAT8MI 219+#define F_FLOAT8UM 220+#define F_FLOAT8ABS 221+#define F_FLOAT8_ACCUM 222+#define F_FLOAT8LARGER 223+#define F_FLOAT8SMALLER 224+#define F_LSEG_CENTER 225+#define F_PATH_CENTER 226+#define F_POLY_CENTER 227+#define F_DROUND 228+#define F_DTRUNC 229+#define F_DSQRT 230+#define F_DCBRT 231+#define F_DPOW 232+#define F_DEXP 233+#define F_DLOG1 234+#define F_I2TOD 235+#define F_I2TOF 236+#define F_DTOI2 237+#define F_FTOI2 238+#define F_LINE_DISTANCE 239+#define F_ABSTIMEIN 240+#define F_ABSTIMEOUT 241+#define F_RELTIMEIN 242+#define F_RELTIMEOUT 243+#define F_TIMEPL 244+#define F_TIMEMI 245+#define F_TINTERVALIN 246+#define F_TINTERVALOUT 247+#define F_INTINTERVAL 248+#define F_TINTERVALREL 249+#define F_TIMENOW 250+#define F_ABSTIMEEQ 251+#define F_ABSTIMENE 252+#define F_ABSTIMELT 253+#define F_ABSTIMEGT 254+#define F_ABSTIMELE 255+#define F_ABSTIMEGE 256+#define F_RELTIMEEQ 257+#define F_RELTIMENE 258+#define F_RELTIMELT 259+#define F_RELTIMEGT 260+#define F_RELTIMELE 261+#define F_RELTIMEGE 262+#define F_TINTERVALSAME 263+#define F_TINTERVALCT 264+#define F_TINTERVALOV 265+#define F_TINTERVALLENEQ 266+#define F_TINTERVALLENNE 267+#define F_TINTERVALLENLT 268+#define F_TINTERVALLENGT 269+#define F_TINTERVALLENLE 270+#define F_TINTERVALLENGE 271+#define F_TINTERVALSTART 272+#define F_TINTERVALEND 273+#define F_TIMEOFDAY 274+#define F_ABSTIME_FINITE 275+#define F_BTCANRETURN 276+#define F_INTER_SL 277+#define F_INTER_LB 278+#define F_FLOAT48MUL 279+#define F_FLOAT48DIV 280+#define F_FLOAT48PL 281+#define F_FLOAT48MI 282+#define F_FLOAT84MUL 283+#define F_FLOAT84DIV 284+#define F_FLOAT84PL 285+#define F_FLOAT84MI 286+#define F_FLOAT4EQ 287+#define F_FLOAT4NE 288+#define F_FLOAT4LT 289+#define F_FLOAT4LE 290+#define F_FLOAT4GT 291+#define F_FLOAT4GE 292+#define F_FLOAT8EQ 293+#define F_FLOAT8NE 294+#define F_FLOAT8LT 295+#define F_FLOAT8LE 296+#define F_FLOAT8GT 297+#define F_FLOAT8GE 298+#define F_FLOAT48EQ 299+#define F_FLOAT48NE 300+#define F_FLOAT48LT 301+#define F_FLOAT48LE 302+#define F_FLOAT48GT 303+#define F_FLOAT48GE 304+#define F_FLOAT84EQ 305+#define F_FLOAT84NE 306+#define F_FLOAT84LT 307+#define F_FLOAT84LE 308+#define F_FLOAT84GT 309+#define F_FLOAT84GE 310+#define F_FTOD 311+#define F_DTOF 312+#define F_I2TOI4 313+#define F_I4TOI2 314+#define F_INT2VECTOREQ 315+#define F_I4TOD 316+#define F_DTOI4 317+#define F_I4TOF 318+#define F_FTOI4 319+#define F_WIDTH_BUCKET_FLOAT8 320+#define F_JSON_IN 321+#define F_JSON_OUT 322+#define F_JSON_RECV 323+#define F_JSON_SEND 324+#define F_GINBUILDEMPTY 325+#define F_GISTBUILDEMPTY 326+#define F_HASHBUILDEMPTY 327+#define F_BTBUILDEMPTY 328+#define F_HASH_ACLITEM 329+#define F_BTGETTUPLE 330+#define F_BTINSERT 331+#define F_BTBULKDELETE 332+#define F_BTBEGINSCAN 333+#define F_BTRESCAN 334+#define F_BTENDSCAN 335+#define F_BTMARKPOS 336+#define F_BTRESTRPOS 337+#define F_BTBUILD 338+#define F_POLY_SAME 339+#define F_POLY_CONTAIN 340+#define F_POLY_LEFT 341+#define F_POLY_OVERLEFT 342+#define F_POLY_OVERRIGHT 343+#define F_POLY_RIGHT 344+#define F_POLY_CONTAINED 345+#define F_POLY_OVERLAP 346+#define F_POLY_IN 347+#define F_POLY_OUT 348+#define F_BTINT2CMP 350+#define F_BTINT4CMP 351+#define F_BTFLOAT4CMP 354+#define F_BTFLOAT8CMP 355+#define F_BTOIDCMP 356+#define F_BTABSTIMECMP 357+#define F_BTCHARCMP 358+#define F_BTNAMECMP 359+#define F_BTTEXTCMP 360+#define F_LSEG_DISTANCE 361+#define F_LSEG_INTERPT 362+#define F_DIST_PS 363+#define F_DIST_PB 364+#define F_DIST_SB 365+#define F_CLOSE_PS 366+#define F_CLOSE_PB 367+#define F_CLOSE_SB 368+#define F_ON_PS 369+#define F_PATH_DISTANCE 370+#define F_DIST_PPATH 371+#define F_ON_SB 372+#define F_INTER_SB 373+#define F_TEXT_TO_ARRAY_NULL 376+#define F_CASH_CMP 377+#define F_ARRAY_APPEND 378+#define F_ARRAY_PREPEND 379+#define F_BTRELTIMECMP 380+#define F_BTTINTERVALCMP 381+#define F_BTARRAYCMP 382+#define F_ARRAY_CAT 383+#define F_ARRAY_TO_TEXT_NULL 384+#define F_ARRAY_NE 390+#define F_ARRAY_LT 391+#define F_ARRAY_GT 392+#define F_ARRAY_LE 393+#define F_TEXT_TO_ARRAY 394+#define F_ARRAY_TO_TEXT 395+#define F_ARRAY_GE 396+#define F_HASHINT2VECTOR 398+#define F_HASHMACADDR 399+#define F_HASHTEXT 400+#define F_RTRIM1 401+#define F_BTOIDVECTORCMP 404+#define F_NAME_TEXT 406+#define F_TEXT_NAME 407+#define F_NAME_BPCHAR 408+#define F_BPCHAR_NAME 409+#define F_HASHINET 422+#define F_HASHVACUUMCLEANUP 425+#define F_HASH_NUMERIC 432+#define F_MACADDR_IN 436+#define F_MACADDR_OUT 437+#define F_HASHCOSTESTIMATE 438+#define F_HASHGETTUPLE 440+#define F_HASHINSERT 441+#define F_HASHBULKDELETE 442+#define F_HASHBEGINSCAN 443+#define F_HASHRESCAN 444+#define F_HASHENDSCAN 445+#define F_HASHMARKPOS 446+#define F_HASHRESTRPOS 447+#define F_HASHBUILD 448+#define F_HASHINT2 449+#define F_HASHINT4 450+#define F_HASHFLOAT4 451+#define F_HASHFLOAT8 452+#define F_HASHOID 453+#define F_HASHCHAR 454+#define F_HASHNAME 455+#define F_HASHVARLENA 456+#define F_HASHOIDVECTOR 457+#define F_TEXT_LARGER 458+#define F_TEXT_SMALLER 459+#define F_INT8IN 460+#define F_INT8OUT 461+#define F_INT8UM 462+#define F_INT8PL 463+#define F_INT8MI 464+#define F_INT8MUL 465+#define F_INT8DIV 466+#define F_INT8EQ 467+#define F_INT8NE 468+#define F_INT8LT 469+#define F_INT8GT 470+#define F_INT8LE 471+#define F_INT8GE 472+#define F_INT84EQ 474+#define F_INT84NE 475+#define F_INT84LT 476+#define F_INT84GT 477+#define F_INT84LE 478+#define F_INT84GE 479+#define F_INT84 480+#define F_INT48 481+#define F_I8TOD 482+#define F_DTOI8 483+#define F_ARRAY_LARGER 515+#define F_ARRAY_SMALLER 516+#define F_INET_ABBREV 598+#define F_CIDR_ABBREV 599+#define F_INET_SET_MASKLEN 605+#define F_OIDVECTORNE 619+#define F_HASH_ARRAY 626+#define F_CIDR_SET_MASKLEN 635+#define F_BTGETBITMAP 636+#define F_HASHGETBITMAP 637+#define F_GISTGETBITMAP 638+#define F_I8TOF 652+#define F_FTOI8 653+#define F_NAMELT 655+#define F_NAMELE 656+#define F_NAMEGT 657+#define F_NAMEGE 658+#define F_NAMENE 659+#define F_BPCHAR 668+#define F_VARCHAR 669+#define F_MKTINTERVAL 676+#define F_OIDVECTORLT 677+#define F_OIDVECTORLE 678+#define F_OIDVECTOREQ 679+#define F_OIDVECTORGE 680+#define F_OIDVECTORGT 681+#define F_NETWORK_NETWORK 683+#define F_NETWORK_NETMASK 696+#define F_NETWORK_MASKLEN 697+#define F_NETWORK_BROADCAST 698+#define F_NETWORK_HOST 699+#define F_CURRENT_USER 710+#define F_NETWORK_FAMILY 711+#define F_INT82 714+#define F_LO_CREATE 715+#define F_OIDLT 716+#define F_OIDLE 717+#define F_BYTEAOCTETLEN 720+#define F_BYTEAGETBYTE 721+#define F_BYTEASETBYTE 722+#define F_BYTEAGETBIT 723+#define F_BYTEASETBIT 724+#define F_DIST_PL 725+#define F_DIST_LB 726+#define F_DIST_SL 727+#define F_DIST_CPOLY 728+#define F_POLY_DISTANCE 729+#define F_NETWORK_SHOW 730+#define F_TEXT_LT 740+#define F_TEXT_LE 741+#define F_TEXT_GT 742+#define F_TEXT_GE 743+#define F_ARRAY_EQ 744+#define F_SESSION_USER 746+#define F_ARRAY_DIMS 747+#define F_ARRAY_NDIMS 748+#define F_BYTEAOVERLAY 749+#define F_ARRAY_IN 750+#define F_ARRAY_OUT 751+#define F_BYTEAOVERLAY_NO_LEN 752+#define F_MACADDR_TRUNC 753+#define F_INT28 754+#define F_SMGRIN 760+#define F_SMGROUT 761+#define F_SMGREQ 762+#define F_SMGRNE 763+#define F_LO_IMPORT 764+#define F_LO_EXPORT 765+#define F_INT4INC 766+#define F_LO_IMPORT_WITH_OID 767+#define F_INT4LARGER 768+#define F_INT4SMALLER 769+#define F_INT2LARGER 770+#define F_INT2SMALLER 771+#define F_GISTCOSTESTIMATE 772+#define F_GISTGETTUPLE 774+#define F_GISTINSERT 775+#define F_GISTBULKDELETE 776+#define F_GISTBEGINSCAN 777+#define F_GISTRESCAN 778+#define F_GISTENDSCAN 779+#define F_GISTMARKPOS 780+#define F_GISTRESTRPOS 781+#define F_GISTBUILD 782+#define F_TINTERVALEQ 784+#define F_TINTERVALNE 785+#define F_TINTERVALLT 786+#define F_TINTERVALGT 787+#define F_TINTERVALLE 788+#define F_TINTERVALGE 789+#define F_PG_CLIENT_ENCODING 810+#define F_CURRENT_QUERY 817+#define F_MACADDR_EQ 830+#define F_MACADDR_LT 831+#define F_MACADDR_LE 832+#define F_MACADDR_GT 833+#define F_MACADDR_GE 834+#define F_MACADDR_NE 835+#define F_MACADDR_CMP 836+#define F_INT82PL 837+#define F_INT82MI 838+#define F_INT82MUL 839+#define F_INT82DIV 840+#define F_INT28PL 841+#define F_BTINT8CMP 842+#define F_CASH_MUL_FLT4 846+#define F_CASH_DIV_FLT4 847+#define F_FLT4_MUL_CASH 848+#define F_TEXTPOS 849+#define F_TEXTLIKE 850+#define F_TEXTNLIKE 851+#define F_INT48EQ 852+#define F_INT48NE 853+#define F_INT48LT 854+#define F_INT48GT 855+#define F_INT48LE 856+#define F_INT48GE 857+#define F_NAMELIKE 858+#define F_NAMENLIKE 859+#define F_CHAR_BPCHAR 860+#define F_CURRENT_DATABASE 861+#define F_INT4_MUL_CASH 862+#define F_INT2_MUL_CASH 863+#define F_CASH_MUL_INT4 864+#define F_CASH_DIV_INT4 865+#define F_CASH_MUL_INT2 866+#define F_CASH_DIV_INT2 867+#define F_LOWER 870+#define F_UPPER 871+#define F_INITCAP 872+#define F_LPAD 873+#define F_RPAD 874+#define F_LTRIM 875+#define F_RTRIM 876+#define F_TEXT_SUBSTR 877+#define F_TRANSLATE 878+#define F_LTRIM1 881+#define F_TEXT_SUBSTR_NO_LEN 883+#define F_BTRIM 884+#define F_BTRIM1 885+#define F_CASH_IN 886+#define F_CASH_OUT 887+#define F_CASH_EQ 888+#define F_CASH_NE 889+#define F_CASH_LT 890+#define F_CASH_LE 891+#define F_CASH_GT 892+#define F_CASH_GE 893+#define F_CASH_PL 894+#define F_CASH_MI 895+#define F_CASH_MUL_FLT8 896+#define F_CASH_DIV_FLT8 897+#define F_CASHLARGER 898+#define F_CASHSMALLER 899+#define F_INET_IN 910+#define F_INET_OUT 911+#define F_FLT8_MUL_CASH 919+#define F_NETWORK_EQ 920+#define F_NETWORK_LT 921+#define F_NETWORK_LE 922+#define F_NETWORK_GT 923+#define F_NETWORK_GE 924+#define F_NETWORK_NE 925+#define F_NETWORK_CMP 926+#define F_NETWORK_SUB 927+#define F_NETWORK_SUBEQ 928+#define F_NETWORK_SUP 929+#define F_NETWORK_SUPEQ 930+#define F_CASH_WORDS 935+#define F_GENERATE_SERIES_TIMESTAMP 938+#define F_GENERATE_SERIES_TIMESTAMPTZ 939+#define F_INT28MI 942+#define F_INT28MUL 943+#define F_TEXT_CHAR 944+#define F_INT8MOD 945+#define F_CHAR_TEXT 946+#define F_INT28DIV 948+#define F_HASHINT8 949+#define F_LO_OPEN 952+#define F_LO_CLOSE 953+#define F_LOREAD 954+#define F_LOWRITE 955+#define F_LO_LSEEK 956+#define F_LO_CREAT 957+#define F_LO_TELL 958+#define F_ON_PL 959+#define F_ON_SL 960+#define F_CLOSE_PL 961+#define F_CLOSE_SL 962+#define F_CLOSE_LB 963+#define F_LO_UNLINK 964+#define F_BTVACUUMCLEANUP 972+#define F_PATH_INTER 973+#define F_BOX_AREA 975+#define F_BOX_WIDTH 976+#define F_BOX_HEIGHT 977+#define F_BOX_DISTANCE 978+#define F_PATH_AREA 979+#define F_BOX_INTERSECT 980+#define F_BOX_DIAGONAL 981+#define F_PATH_N_LT 982+#define F_PATH_N_GT 983+#define F_PATH_N_EQ 984+#define F_PATH_N_LE 985+#define F_PATH_N_GE 986+#define F_PATH_LENGTH 987+#define F_POINT_NE 988+#define F_POINT_VERT 989+#define F_POINT_HORIZ 990+#define F_POINT_DISTANCE 991+#define F_POINT_SLOPE 992+#define F_LSEG_CONSTRUCT 993+#define F_LSEG_INTERSECT 994+#define F_LSEG_PARALLEL 995+#define F_LSEG_PERP 996+#define F_LSEG_VERTICAL 997+#define F_LSEG_HORIZONTAL 998+#define F_LSEG_EQ 999+#define F_LO_TRUNCATE 1004+#define F_TIMESTAMPTZ_IZONE 1026+#define F_GIST_POINT_COMPRESS 1030+#define F_ACLITEMIN 1031+#define F_ACLITEMOUT 1032+#define F_ACLINSERT 1035+#define F_ACLREMOVE 1036+#define F_ACLCONTAINS 1037+#define F_GETDATABASEENCODING 1039+#define F_BPCHARIN 1044+#define F_BPCHAROUT 1045+#define F_VARCHARIN 1046+#define F_VARCHAROUT 1047+#define F_BPCHAREQ 1048+#define F_BPCHARLT 1049+#define F_BPCHARLE 1050+#define F_BPCHARGT 1051+#define F_BPCHARGE 1052+#define F_BPCHARNE 1053+#define F_ACLITEM_EQ 1062+#define F_BPCHAR_LARGER 1063+#define F_BPCHAR_SMALLER 1064+#define F_PG_PREPARED_XACT 1065+#define F_GENERATE_SERIES_STEP_INT4 1066+#define F_GENERATE_SERIES_INT4 1067+#define F_GENERATE_SERIES_STEP_INT8 1068+#define F_GENERATE_SERIES_INT8 1069+#define F_BPCHARCMP 1078+#define F_TEXT_REGCLASS 1079+#define F_HASHBPCHAR 1080+#define F_FORMAT_TYPE 1081+#define F_DATE_IN 1084+#define F_DATE_OUT 1085+#define F_DATE_EQ 1086+#define F_DATE_LT 1087+#define F_DATE_LE 1088+#define F_DATE_GT 1089+#define F_DATE_GE 1090+#define F_DATE_NE 1091+#define F_DATE_CMP 1092+#define F_TIME_LT 1102+#define F_TIME_LE 1103+#define F_TIME_GT 1104+#define F_TIME_GE 1105+#define F_TIME_NE 1106+#define F_TIME_CMP 1107+#define F_DATE_LARGER 1138+#define F_DATE_SMALLER 1139+#define F_DATE_MI 1140+#define F_DATE_PLI 1141+#define F_DATE_MII 1142+#define F_TIME_IN 1143+#define F_TIME_OUT 1144+#define F_TIME_EQ 1145+#define F_CIRCLE_ADD_PT 1146+#define F_CIRCLE_SUB_PT 1147+#define F_CIRCLE_MUL_PT 1148+#define F_CIRCLE_DIV_PT 1149+#define F_TIMESTAMPTZ_IN 1150+#define F_TIMESTAMPTZ_OUT 1151+#define F_TIMESTAMP_EQ 1152+#define F_TIMESTAMP_NE 1153+#define F_TIMESTAMP_LT 1154+#define F_TIMESTAMP_LE 1155+#define F_TIMESTAMP_GE 1156+#define F_TIMESTAMP_GT 1157+#define F_TIMESTAMPTZ_ZONE 1159+#define F_INTERVAL_IN 1160+#define F_INTERVAL_OUT 1161+#define F_INTERVAL_EQ 1162+#define F_INTERVAL_NE 1163+#define F_INTERVAL_LT 1164+#define F_INTERVAL_LE 1165+#define F_INTERVAL_GE 1166+#define F_INTERVAL_GT 1167+#define F_INTERVAL_UM 1168+#define F_INTERVAL_PL 1169+#define F_INTERVAL_MI 1170+#define F_TIMESTAMPTZ_PART 1171+#define F_INTERVAL_PART 1172+#define F_ABSTIME_TIMESTAMPTZ 1173+#define F_DATE_TIMESTAMPTZ 1174+#define F_INTERVAL_JUSTIFY_HOURS 1175+#define F_RELTIME_INTERVAL 1177+#define F_TIMESTAMPTZ_DATE 1178+#define F_ABSTIME_DATE 1179+#define F_TIMESTAMPTZ_ABSTIME 1180+#define F_XID_AGE 1181+#define F_TIMESTAMP_MI 1188+#define F_TIMESTAMPTZ_PL_INTERVAL 1189+#define F_TIMESTAMPTZ_MI_INTERVAL 1190+#define F_GENERATE_SUBSCRIPTS 1191+#define F_GENERATE_SUBSCRIPTS_NODIR 1192+#define F_ARRAY_FILL 1193+#define F_INTERVAL_RELTIME 1194+#define F_TIMESTAMP_SMALLER 1195+#define F_TIMESTAMP_LARGER 1196+#define F_INTERVAL_SMALLER 1197+#define F_INTERVAL_LARGER 1198+#define F_TIMESTAMPTZ_AGE 1199+#define F_INTERVAL_SCALE 1200+#define F_TIMESTAMPTZ_TRUNC 1217+#define F_INTERVAL_TRUNC 1218+#define F_INT8INC 1219+#define F_INT8ABS 1230+#define F_INT8LARGER 1236+#define F_INT8SMALLER 1237+#define F_TEXTICREGEXEQ 1238+#define F_TEXTICREGEXNE 1239+#define F_NAMEICREGEXEQ 1240+#define F_NAMEICREGEXNE 1241+#define F_BOOLIN 1242+#define F_BOOLOUT 1243+#define F_BYTEAIN 1244+#define F_CHARIN 1245+#define F_CHARLT 1246+#define F_UNIQUE_KEY_RECHECK 1250+#define F_INT4ABS 1251+#define F_NAMEREGEXNE 1252+#define F_INT2ABS 1253+#define F_TEXTREGEXEQ 1254+#define F_TEXTREGEXNE 1256+#define F_TEXTLEN 1257+#define F_TEXTCAT 1258+#define F_PG_CHAR_TO_ENCODING 1264+#define F_TIDNE 1265+#define F_CIDR_IN 1267+#define F_BTCOSTESTIMATE 1268+#define F_PG_COLUMN_SIZE 1269+#define F_OVERLAPS_TIMETZ 1271+#define F_DATETIME_TIMESTAMP 1272+#define F_TIMETZ_PART 1273+#define F_INT84PL 1274+#define F_INT84MI 1275+#define F_INT84MUL 1276+#define F_INT84DIV 1277+#define F_INT48PL 1278+#define F_INT48MI 1279+#define F_INT48MUL 1280+#define F_INT48DIV 1281+#define F_QUOTE_IDENT 1282+#define F_QUOTE_LITERAL 1283+#define F_ARRAY_FILL_WITH_LOWER_BOUNDS 1286+#define F_I8TOOID 1287+#define F_OIDTOI8 1288+#define F_QUOTE_NULLABLE 1289+#define F_SUPPRESS_REDUNDANT_UPDATES_TRIGGER 1291+#define F_TIDEQ 1292+#define F_CURRTID_BYRELOID 1293+#define F_CURRTID_BYRELNAME 1294+#define F_INTERVAL_JUSTIFY_DAYS 1295+#define F_DATETIMETZ_TIMESTAMPTZ 1297+#define F_NOW 1299+#define F_POSITIONSEL 1300+#define F_POSITIONJOINSEL 1301+#define F_CONTSEL 1302+#define F_CONTJOINSEL 1303+#define F_OVERLAPS_TIMESTAMP 1304+#define F_OVERLAPS_TIME 1308+#define F_TIMESTAMP_IN 1312+#define F_TIMESTAMP_OUT 1313+#define F_TIMESTAMP_CMP 1314+#define F_INTERVAL_CMP 1315+#define F_TIMESTAMP_TIME 1316+#define F_BPCHARLEN 1318+#define F_INTERVAL_DIV 1326+#define F_DLOG10 1339+#define F_OIDVECTORTYPES 1349+#define F_TIMETZ_IN 1350+#define F_TIMETZ_OUT 1351+#define F_TIMETZ_EQ 1352+#define F_TIMETZ_NE 1353+#define F_TIMETZ_LT 1354+#define F_TIMETZ_LE 1355+#define F_TIMETZ_GE 1356+#define F_TIMETZ_GT 1357+#define F_TIMETZ_CMP 1358+#define F_NETWORK_HOSTMASK 1362+#define F_MAKEACLITEM 1365+#define F_TIME_INTERVAL 1370+#define F_PG_LOCK_STATUS 1371+#define F_DATE_FINITE 1373+#define F_TEXTOCTETLEN 1374+#define F_BPCHAROCTETLEN 1375+#define F_TIME_LARGER 1377+#define F_TIME_SMALLER 1378+#define F_TIMETZ_LARGER 1379+#define F_TIMETZ_SMALLER 1380+#define F_TIME_PART 1385+#define F_PG_GET_CONSTRAINTDEF 1387+#define F_TIMESTAMPTZ_TIMETZ 1388+#define F_TIMESTAMP_FINITE 1389+#define F_INTERVAL_FINITE 1390+#define F_PG_STAT_GET_BACKEND_START 1391+#define F_PG_STAT_GET_BACKEND_CLIENT_ADDR 1392+#define F_PG_STAT_GET_BACKEND_CLIENT_PORT 1393+#define F_CURRENT_SCHEMA 1402+#define F_CURRENT_SCHEMAS 1403+#define F_TEXTOVERLAY 1404+#define F_TEXTOVERLAY_NO_LEN 1405+#define F_LINE_PARALLEL 1412+#define F_LINE_PERP 1413+#define F_LINE_VERTICAL 1414+#define F_LINE_HORIZONTAL 1415+#define F_CIRCLE_CENTER 1416+#define F_INTERVAL_TIME 1419+#define F_POINTS_BOX 1421+#define F_BOX_ADD 1422+#define F_BOX_SUB 1423+#define F_BOX_MUL 1424+#define F_BOX_DIV 1425+#define F_CIDR_OUT 1427+#define F_POLY_CONTAIN_PT 1428+#define F_PT_CONTAINED_POLY 1429+#define F_PATH_ISCLOSED 1430+#define F_PATH_ISOPEN 1431+#define F_PATH_NPOINTS 1432+#define F_PATH_CLOSE 1433+#define F_PATH_OPEN 1434+#define F_PATH_ADD 1435+#define F_PATH_ADD_PT 1436+#define F_PATH_SUB_PT 1437+#define F_PATH_MUL_PT 1438+#define F_PATH_DIV_PT 1439+#define F_CONSTRUCT_POINT 1440+#define F_POINT_ADD 1441+#define F_POINT_SUB 1442+#define F_POINT_MUL 1443+#define F_POINT_DIV 1444+#define F_POLY_NPOINTS 1445+#define F_POLY_BOX 1446+#define F_POLY_PATH 1447+#define F_BOX_POLY 1448+#define F_PATH_POLY 1449+#define F_CIRCLE_IN 1450+#define F_CIRCLE_OUT 1451+#define F_CIRCLE_SAME 1452+#define F_CIRCLE_CONTAIN 1453+#define F_CIRCLE_LEFT 1454+#define F_CIRCLE_OVERLEFT 1455+#define F_CIRCLE_OVERRIGHT 1456+#define F_CIRCLE_RIGHT 1457+#define F_CIRCLE_CONTAINED 1458+#define F_CIRCLE_OVERLAP 1459+#define F_CIRCLE_BELOW 1460+#define F_CIRCLE_ABOVE 1461+#define F_CIRCLE_EQ 1462+#define F_CIRCLE_NE 1463+#define F_CIRCLE_LT 1464+#define F_CIRCLE_GT 1465+#define F_CIRCLE_LE 1466+#define F_CIRCLE_GE 1467+#define F_CIRCLE_AREA 1468+#define F_CIRCLE_DIAMETER 1469+#define F_CIRCLE_RADIUS 1470+#define F_CIRCLE_DISTANCE 1471+#define F_CR_CIRCLE 1473+#define F_POLY_CIRCLE 1474+#define F_CIRCLE_POLY 1475+#define F_DIST_PC 1476+#define F_CIRCLE_CONTAIN_PT 1477+#define F_PT_CONTAINED_CIRCLE 1478+#define F_BOX_CIRCLE 1479+#define F_CIRCLE_BOX 1480+#define F_LSEG_NE 1482+#define F_LSEG_LT 1483+#define F_LSEG_LE 1484+#define F_LSEG_GT 1485+#define F_LSEG_GE 1486+#define F_LSEG_LENGTH 1487+#define F_CLOSE_LS 1488+#define F_CLOSE_LSEG 1489+#define F_LINE_IN 1490+#define F_LINE_OUT 1491+#define F_LINE_EQ 1492+#define F_LINE_CONSTRUCT_PP 1493+#define F_LINE_INTERPT 1494+#define F_LINE_INTERSECT 1495+#define F_BIT_IN 1564+#define F_BIT_OUT 1565+#define F_PG_GET_RULEDEF 1573+#define F_NEXTVAL_OID 1574+#define F_CURRVAL_OID 1575+#define F_SETVAL_OID 1576+#define F_VARBIT_IN 1579+#define F_VARBIT_OUT 1580+#define F_BITEQ 1581+#define F_BITNE 1582+#define F_BITGE 1592+#define F_BITGT 1593+#define F_BITLE 1594+#define F_BITLT 1595+#define F_BITCMP 1596+#define F_PG_ENCODING_TO_CHAR 1597+#define F_DRANDOM 1598+#define F_SETSEED 1599+#define F_DASIN 1600+#define F_DACOS 1601+#define F_DATAN 1602+#define F_DATAN2 1603+#define F_DSIN 1604+#define F_DCOS 1605+#define F_DTAN 1606+#define F_DCOT 1607+#define F_DEGREES 1608+#define F_RADIANS 1609+#define F_DPI 1610+#define F_INTERVAL_MUL 1618+#define F_PG_TYPEOF 1619+#define F_ASCII 1620+#define F_CHR 1621+#define F_REPEAT 1622+#define F_SIMILAR_ESCAPE 1623+#define F_MUL_D_INTERVAL 1624+#define F_TEXTICLIKE 1633+#define F_TEXTICNLIKE 1634+#define F_NAMEICLIKE 1635+#define F_NAMEICNLIKE 1636+#define F_LIKE_ESCAPE 1637+#define F_OIDGT 1638+#define F_OIDGE 1639+#define F_PG_GET_VIEWDEF_NAME 1640+#define F_PG_GET_VIEWDEF 1641+#define F_PG_GET_USERBYID 1642+#define F_PG_GET_INDEXDEF 1643+#define F_RI_FKEY_CHECK_INS 1644+#define F_RI_FKEY_CHECK_UPD 1645+#define F_RI_FKEY_CASCADE_DEL 1646+#define F_RI_FKEY_CASCADE_UPD 1647+#define F_RI_FKEY_RESTRICT_DEL 1648+#define F_RI_FKEY_RESTRICT_UPD 1649+#define F_RI_FKEY_SETNULL_DEL 1650+#define F_RI_FKEY_SETNULL_UPD 1651+#define F_RI_FKEY_SETDEFAULT_DEL 1652+#define F_RI_FKEY_SETDEFAULT_UPD 1653+#define F_RI_FKEY_NOACTION_DEL 1654+#define F_RI_FKEY_NOACTION_UPD 1655+#define F_PG_GET_TRIGGERDEF 1662+#define F_PG_GET_SERIAL_SEQUENCE 1665+#define F_BIT_AND 1673+#define F_BIT_OR 1674+#define F_BITXOR 1675+#define F_BITNOT 1676+#define F_BITSHIFTLEFT 1677+#define F_BITSHIFTRIGHT 1678+#define F_BITCAT 1679+#define F_BITSUBSTR 1680+#define F_BITLENGTH 1681+#define F_BITOCTETLENGTH 1682+#define F_BITFROMINT4 1683+#define F_BITTOINT4 1684+#define F_BIT 1685+#define F_PG_GET_KEYWORDS 1686+#define F_VARBIT 1687+#define F_TIME_HASH 1688+#define F_ACLEXPLODE 1689+#define F_TIME_MI_TIME 1690+#define F_BOOLLE 1691+#define F_BOOLGE 1692+#define F_BTBOOLCMP 1693+#define F_TIMETZ_HASH 1696+#define F_INTERVAL_HASH 1697+#define F_BITPOSITION 1698+#define F_BITSUBSTR_NO_LEN 1699+#define F_NUMERIC_IN 1701+#define F_NUMERIC_OUT 1702+#define F_NUMERIC 1703+#define F_NUMERIC_ABS 1704+#define F_NUMERIC_SIGN 1706+#define F_NUMERIC_ROUND 1707+#define F_NUMERIC_TRUNC 1709+#define F_NUMERIC_CEIL 1711+#define F_NUMERIC_FLOOR 1712+#define F_LENGTH_IN_ENCODING 1713+#define F_PG_CONVERT_FROM 1714+#define F_INET_TO_CIDR 1715+#define F_PG_GET_EXPR 1716+#define F_PG_CONVERT_TO 1717+#define F_NUMERIC_EQ 1718+#define F_NUMERIC_NE 1719+#define F_NUMERIC_GT 1720+#define F_NUMERIC_GE 1721+#define F_NUMERIC_LT 1722+#define F_NUMERIC_LE 1723+#define F_NUMERIC_ADD 1724+#define F_NUMERIC_SUB 1725+#define F_NUMERIC_MUL 1726+#define F_NUMERIC_DIV 1727+#define F_NUMERIC_MOD 1728+#define F_NUMERIC_SQRT 1730+#define F_NUMERIC_EXP 1732+#define F_NUMERIC_LN 1734+#define F_NUMERIC_LOG 1736+#define F_NUMERIC_POWER 1738+#define F_INT4_NUMERIC 1740+#define F_FLOAT4_NUMERIC 1742+#define F_FLOAT8_NUMERIC 1743+#define F_NUMERIC_INT4 1744+#define F_NUMERIC_FLOAT4 1745+#define F_NUMERIC_FLOAT8 1746+#define F_TIME_PL_INTERVAL 1747+#define F_TIME_MI_INTERVAL 1748+#define F_TIMETZ_PL_INTERVAL 1749+#define F_TIMETZ_MI_INTERVAL 1750+#define F_NUMERIC_INC 1764+#define F_SETVAL3_OID 1765+#define F_NUMERIC_SMALLER 1766+#define F_NUMERIC_LARGER 1767+#define F_INTERVAL_TO_CHAR 1768+#define F_NUMERIC_CMP 1769+#define F_TIMESTAMPTZ_TO_CHAR 1770+#define F_NUMERIC_UMINUS 1771+#define F_NUMERIC_TO_CHAR 1772+#define F_INT4_TO_CHAR 1773+#define F_INT8_TO_CHAR 1774+#define F_FLOAT4_TO_CHAR 1775+#define F_FLOAT8_TO_CHAR 1776+#define F_NUMERIC_TO_NUMBER 1777+#define F_TO_TIMESTAMP 1778+#define F_NUMERIC_INT8 1779+#define F_TO_DATE 1780+#define F_INT8_NUMERIC 1781+#define F_INT2_NUMERIC 1782+#define F_NUMERIC_INT2 1783+#define F_OIDIN 1798+#define F_OIDOUT 1799+#define F_PG_CONVERT 1813+#define F_ICLIKESEL 1814+#define F_ICNLIKESEL 1815+#define F_ICLIKEJOINSEL 1816+#define F_ICNLIKEJOINSEL 1817+#define F_REGEXEQSEL 1818+#define F_LIKESEL 1819+#define F_ICREGEXEQSEL 1820+#define F_REGEXNESEL 1821+#define F_NLIKESEL 1822+#define F_ICREGEXNESEL 1823+#define F_REGEXEQJOINSEL 1824+#define F_LIKEJOINSEL 1825+#define F_ICREGEXEQJOINSEL 1826+#define F_REGEXNEJOINSEL 1827+#define F_NLIKEJOINSEL 1828+#define F_ICREGEXNEJOINSEL 1829+#define F_FLOAT8_AVG 1830+#define F_FLOAT8_VAR_SAMP 1831+#define F_FLOAT8_STDDEV_SAMP 1832+#define F_NUMERIC_ACCUM 1833+#define F_INT2_ACCUM 1834+#define F_INT4_ACCUM 1835+#define F_INT8_ACCUM 1836+#define F_NUMERIC_AVG 1837+#define F_NUMERIC_VAR_SAMP 1838+#define F_NUMERIC_STDDEV_SAMP 1839+#define F_INT2_SUM 1840+#define F_INT4_SUM 1841+#define F_INT8_SUM 1842+#define F_INTERVAL_ACCUM 1843+#define F_INTERVAL_AVG 1844+#define F_TO_ASCII_DEFAULT 1845+#define F_TO_ASCII_ENC 1846+#define F_TO_ASCII_ENCNAME 1847+#define F_INT28EQ 1850+#define F_INT28NE 1851+#define F_INT28LT 1852+#define F_INT28GT 1853+#define F_INT28LE 1854+#define F_INT28GE 1855+#define F_INT82EQ 1856+#define F_INT82NE 1857+#define F_INT82LT 1858+#define F_INT82GT 1859+#define F_INT82LE 1860+#define F_INT82GE 1861+#define F_INT2AND 1892+#define F_INT2OR 1893+#define F_INT2XOR 1894+#define F_INT2NOT 1895+#define F_INT2SHL 1896+#define F_INT2SHR 1897+#define F_INT4AND 1898+#define F_INT4OR 1899+#define F_INT4XOR 1900+#define F_INT4NOT 1901+#define F_INT4SHL 1902+#define F_INT4SHR 1903+#define F_INT8AND 1904+#define F_INT8OR 1905+#define F_INT8XOR 1906+#define F_INT8NOT 1907+#define F_INT8SHL 1908+#define F_INT8SHR 1909+#define F_INT8UP 1910+#define F_INT2UP 1911+#define F_INT4UP 1912+#define F_FLOAT4UP 1913+#define F_FLOAT8UP 1914+#define F_NUMERIC_UPLUS 1915+#define F_HAS_TABLE_PRIVILEGE_NAME_NAME 1922+#define F_HAS_TABLE_PRIVILEGE_NAME_ID 1923+#define F_HAS_TABLE_PRIVILEGE_ID_NAME 1924+#define F_HAS_TABLE_PRIVILEGE_ID_ID 1925+#define F_HAS_TABLE_PRIVILEGE_NAME 1926+#define F_HAS_TABLE_PRIVILEGE_ID 1927+#define F_PG_STAT_GET_NUMSCANS 1928+#define F_PG_STAT_GET_TUPLES_RETURNED 1929+#define F_PG_STAT_GET_TUPLES_FETCHED 1930+#define F_PG_STAT_GET_TUPLES_INSERTED 1931+#define F_PG_STAT_GET_TUPLES_UPDATED 1932+#define F_PG_STAT_GET_TUPLES_DELETED 1933+#define F_PG_STAT_GET_BLOCKS_FETCHED 1934+#define F_PG_STAT_GET_BLOCKS_HIT 1935+#define F_PG_STAT_GET_BACKEND_IDSET 1936+#define F_PG_STAT_GET_BACKEND_PID 1937+#define F_PG_STAT_GET_BACKEND_DBID 1938+#define F_PG_STAT_GET_BACKEND_USERID 1939+#define F_PG_STAT_GET_BACKEND_ACTIVITY 1940+#define F_PG_STAT_GET_DB_NUMBACKENDS 1941+#define F_PG_STAT_GET_DB_XACT_COMMIT 1942+#define F_PG_STAT_GET_DB_XACT_ROLLBACK 1943+#define F_PG_STAT_GET_DB_BLOCKS_FETCHED 1944+#define F_PG_STAT_GET_DB_BLOCKS_HIT 1945+#define F_BINARY_ENCODE 1946+#define F_BINARY_DECODE 1947+#define F_BYTEAEQ 1948+#define F_BYTEALT 1949+#define F_BYTEALE 1950+#define F_BYTEAGT 1951+#define F_BYTEAGE 1952+#define F_BYTEANE 1953+#define F_BYTEACMP 1954+#define F_TIMESTAMP_SCALE 1961+#define F_INT2_AVG_ACCUM 1962+#define F_INT4_AVG_ACCUM 1963+#define F_INT8_AVG 1964+#define F_OIDLARGER 1965+#define F_OIDSMALLER 1966+#define F_TIMESTAMPTZ_SCALE 1967+#define F_TIME_SCALE 1968+#define F_TIMETZ_SCALE 1969+#define F_PG_STAT_GET_TUPLES_HOT_UPDATED 1972+#define F_NUMERIC_DIV_TRUNC 1973+#define F_BYTEALIKE 2005+#define F_BYTEANLIKE 2006+#define F_LIKE_ESCAPE_BYTEA 2009+#define F_BYTEACAT 2011+#define F_BYTEA_SUBSTR 2012+#define F_BYTEA_SUBSTR_NO_LEN 2013+#define F_BYTEAPOS 2014+#define F_BYTEATRIM 2015+#define F_TIMESTAMPTZ_TIME 2019+#define F_TIMESTAMP_TRUNC 2020+#define F_TIMESTAMP_PART 2021+#define F_PG_STAT_GET_ACTIVITY 2022+#define F_ABSTIME_TIMESTAMP 2023+#define F_DATE_TIMESTAMP 2024+#define F_PG_BACKEND_PID 2026+#define F_TIMESTAMPTZ_TIMESTAMP 2027+#define F_TIMESTAMP_TIMESTAMPTZ 2028+#define F_TIMESTAMP_DATE 2029+#define F_TIMESTAMP_ABSTIME 2030+#define F_TIMESTAMP_PL_INTERVAL 2032+#define F_TIMESTAMP_MI_INTERVAL 2033+#define F_PG_CONF_LOAD_TIME 2034+#define F_TIMETZ_ZONE 2037+#define F_TIMETZ_IZONE 2038+#define F_TIMESTAMP_HASH 2039+#define F_TIMETZ_TIME 2046+#define F_TIME_TIMETZ 2047+#define F_TIMESTAMP_TO_CHAR 2049+#define F_AGGREGATE_DUMMY 2050+#define F_TIMESTAMP_AGE 2058+#define F_TIMESTAMP_ZONE 2069+#define F_TIMESTAMP_IZONE 2070+#define F_DATE_PL_INTERVAL 2071+#define F_DATE_MI_INTERVAL 2072+#define F_TEXTREGEXSUBSTR 2073+#define F_BITFROMINT8 2075+#define F_BITTOINT8 2076+#define F_SHOW_CONFIG_BY_NAME 2077+#define F_SET_CONFIG_BY_NAME 2078+#define F_PG_TABLE_IS_VISIBLE 2079+#define F_PG_TYPE_IS_VISIBLE 2080+#define F_PG_FUNCTION_IS_VISIBLE 2081+#define F_PG_OPERATOR_IS_VISIBLE 2082+#define F_PG_OPCLASS_IS_VISIBLE 2083+#define F_SHOW_ALL_SETTINGS 2084+#define F_REPLACE_TEXT 2087+#define F_SPLIT_TEXT 2088+#define F_TO_HEX32 2089+#define F_TO_HEX64 2090+#define F_ARRAY_LOWER 2091+#define F_ARRAY_UPPER 2092+#define F_PG_CONVERSION_IS_VISIBLE 2093+#define F_PG_STAT_GET_BACKEND_ACTIVITY_START 2094+#define F_PG_TERMINATE_BACKEND 2096+#define F_PG_GET_FUNCTIONDEF 2098+#define F_TEXT_PATTERN_LT 2160+#define F_TEXT_PATTERN_LE 2161+#define F_PG_GET_FUNCTION_ARGUMENTS 2162+#define F_TEXT_PATTERN_GE 2163+#define F_TEXT_PATTERN_GT 2164+#define F_PG_GET_FUNCTION_RESULT 2165+#define F_BTTEXT_PATTERN_CMP 2166+#define F_PG_DATABASE_SIZE_NAME 2168+#define F_WIDTH_BUCKET_NUMERIC 2170+#define F_PG_CANCEL_BACKEND 2171+#define F_PG_START_BACKUP 2172+#define F_PG_STOP_BACKUP 2173+#define F_BPCHAR_PATTERN_LT 2174+#define F_BPCHAR_PATTERN_LE 2175+#define F_ARRAY_LENGTH 2176+#define F_BPCHAR_PATTERN_GE 2177+#define F_BPCHAR_PATTERN_GT 2178+#define F_GIST_POINT_CONSISTENT 2179+#define F_BTBPCHAR_PATTERN_CMP 2180+#define F_HAS_SEQUENCE_PRIVILEGE_NAME_NAME 2181+#define F_HAS_SEQUENCE_PRIVILEGE_NAME_ID 2182+#define F_HAS_SEQUENCE_PRIVILEGE_ID_NAME 2183+#define F_HAS_SEQUENCE_PRIVILEGE_ID_ID 2184+#define F_HAS_SEQUENCE_PRIVILEGE_NAME 2185+#define F_HAS_SEQUENCE_PRIVILEGE_ID 2186+#define F_BTINT48CMP 2188+#define F_BTINT84CMP 2189+#define F_BTINT24CMP 2190+#define F_BTINT42CMP 2191+#define F_BTINT28CMP 2192+#define F_BTINT82CMP 2193+#define F_BTFLOAT48CMP 2194+#define F_BTFLOAT84CMP 2195+#define F_INET_CLIENT_ADDR 2196+#define F_INET_CLIENT_PORT 2197+#define F_INET_SERVER_ADDR 2198+#define F_INET_SERVER_PORT 2199+#define F_REGPROCEDUREIN 2212+#define F_REGPROCEDUREOUT 2213+#define F_REGOPERIN 2214+#define F_REGOPEROUT 2215+#define F_REGOPERATORIN 2216+#define F_REGOPERATOROUT 2217+#define F_REGCLASSIN 2218+#define F_REGCLASSOUT 2219+#define F_REGTYPEIN 2220+#define F_REGTYPEOUT 2221+#define F_PG_STAT_CLEAR_SNAPSHOT 2230+#define F_PG_GET_FUNCTION_IDENTITY_ARGUMENTS 2232+#define F_FMGR_INTERNAL_VALIDATOR 2246+#define F_FMGR_C_VALIDATOR 2247+#define F_FMGR_SQL_VALIDATOR 2248+#define F_HAS_DATABASE_PRIVILEGE_NAME_NAME 2250+#define F_HAS_DATABASE_PRIVILEGE_NAME_ID 2251+#define F_HAS_DATABASE_PRIVILEGE_ID_NAME 2252+#define F_HAS_DATABASE_PRIVILEGE_ID_ID 2253+#define F_HAS_DATABASE_PRIVILEGE_NAME 2254+#define F_HAS_DATABASE_PRIVILEGE_ID 2255+#define F_HAS_FUNCTION_PRIVILEGE_NAME_NAME 2256+#define F_HAS_FUNCTION_PRIVILEGE_NAME_ID 2257+#define F_HAS_FUNCTION_PRIVILEGE_ID_NAME 2258+#define F_HAS_FUNCTION_PRIVILEGE_ID_ID 2259+#define F_HAS_FUNCTION_PRIVILEGE_NAME 2260+#define F_HAS_FUNCTION_PRIVILEGE_ID 2261+#define F_HAS_LANGUAGE_PRIVILEGE_NAME_NAME 2262+#define F_HAS_LANGUAGE_PRIVILEGE_NAME_ID 2263+#define F_HAS_LANGUAGE_PRIVILEGE_ID_NAME 2264+#define F_HAS_LANGUAGE_PRIVILEGE_ID_ID 2265+#define F_HAS_LANGUAGE_PRIVILEGE_NAME 2266+#define F_HAS_LANGUAGE_PRIVILEGE_ID 2267+#define F_HAS_SCHEMA_PRIVILEGE_NAME_NAME 2268+#define F_HAS_SCHEMA_PRIVILEGE_NAME_ID 2269+#define F_HAS_SCHEMA_PRIVILEGE_ID_NAME 2270+#define F_HAS_SCHEMA_PRIVILEGE_ID_ID 2271+#define F_HAS_SCHEMA_PRIVILEGE_NAME 2272+#define F_HAS_SCHEMA_PRIVILEGE_ID 2273+#define F_PG_STAT_RESET 2274+#define F_TEXTREGEXREPLACE_NOOPT 2284+#define F_TEXTREGEXREPLACE 2285+#define F_PG_TOTAL_RELATION_SIZE 2286+#define F_PG_SIZE_PRETTY 2288+#define F_PG_OPTIONS_TO_TABLE 2289+#define F_RECORD_IN 2290+#define F_RECORD_OUT 2291+#define F_CSTRING_IN 2292+#define F_CSTRING_OUT 2293+#define F_ANY_IN 2294+#define F_ANY_OUT 2295+#define F_ANYARRAY_IN 2296+#define F_ANYARRAY_OUT 2297+#define F_VOID_IN 2298+#define F_VOID_OUT 2299+#define F_TRIGGER_IN 2300+#define F_TRIGGER_OUT 2301+#define F_LANGUAGE_HANDLER_IN 2302+#define F_LANGUAGE_HANDLER_OUT 2303+#define F_INTERNAL_IN 2304+#define F_INTERNAL_OUT 2305+#define F_OPAQUE_IN 2306+#define F_OPAQUE_OUT 2307+#define F_DCEIL 2308+#define F_DFLOOR 2309+#define F_DSIGN 2310+#define F_MD5_TEXT 2311+#define F_ANYELEMENT_IN 2312+#define F_ANYELEMENT_OUT 2313+#define F_POSTGRESQL_FDW_VALIDATOR 2316+#define F_PG_ENCODING_MAX_LENGTH_SQL 2319+#define F_MD5_BYTEA 2321+#define F_PG_TABLESPACE_SIZE_OID 2322+#define F_PG_TABLESPACE_SIZE_NAME 2323+#define F_PG_DATABASE_SIZE_OID 2324+#define F_ARRAY_UNNEST 2331+#define F_PG_RELATION_SIZE 2332+#define F_ARRAY_AGG_TRANSFN 2333+#define F_ARRAY_AGG_FINALFN 2334+#define F_DATE_LT_TIMESTAMP 2338+#define F_DATE_LE_TIMESTAMP 2339+#define F_DATE_EQ_TIMESTAMP 2340+#define F_DATE_GT_TIMESTAMP 2341+#define F_DATE_GE_TIMESTAMP 2342+#define F_DATE_NE_TIMESTAMP 2343+#define F_DATE_CMP_TIMESTAMP 2344+#define F_DATE_LT_TIMESTAMPTZ 2351+#define F_DATE_LE_TIMESTAMPTZ 2352+#define F_DATE_EQ_TIMESTAMPTZ 2353+#define F_DATE_GT_TIMESTAMPTZ 2354+#define F_DATE_GE_TIMESTAMPTZ 2355+#define F_DATE_NE_TIMESTAMPTZ 2356+#define F_DATE_CMP_TIMESTAMPTZ 2357+#define F_TIMESTAMP_LT_DATE 2364+#define F_TIMESTAMP_LE_DATE 2365+#define F_TIMESTAMP_EQ_DATE 2366+#define F_TIMESTAMP_GT_DATE 2367+#define F_TIMESTAMP_GE_DATE 2368+#define F_TIMESTAMP_NE_DATE 2369+#define F_TIMESTAMP_CMP_DATE 2370+#define F_TIMESTAMPTZ_LT_DATE 2377+#define F_TIMESTAMPTZ_LE_DATE 2378+#define F_TIMESTAMPTZ_EQ_DATE 2379+#define F_TIMESTAMPTZ_GT_DATE 2380+#define F_TIMESTAMPTZ_GE_DATE 2381+#define F_TIMESTAMPTZ_NE_DATE 2382+#define F_TIMESTAMPTZ_CMP_DATE 2383+#define F_HAS_TABLESPACE_PRIVILEGE_NAME_NAME 2390+#define F_HAS_TABLESPACE_PRIVILEGE_NAME_ID 2391+#define F_HAS_TABLESPACE_PRIVILEGE_ID_NAME 2392+#define F_HAS_TABLESPACE_PRIVILEGE_ID_ID 2393+#define F_HAS_TABLESPACE_PRIVILEGE_NAME 2394+#define F_HAS_TABLESPACE_PRIVILEGE_ID 2395+#define F_SHELL_IN 2398+#define F_SHELL_OUT 2399+#define F_ARRAY_RECV 2400+#define F_ARRAY_SEND 2401+#define F_RECORD_RECV 2402+#define F_RECORD_SEND 2403+#define F_INT2RECV 2404+#define F_INT2SEND 2405+#define F_INT4RECV 2406+#define F_INT4SEND 2407+#define F_INT8RECV 2408+#define F_INT8SEND 2409+#define F_INT2VECTORRECV 2410+#define F_INT2VECTORSEND 2411+#define F_BYTEARECV 2412+#define F_BYTEASEND 2413+#define F_TEXTRECV 2414+#define F_TEXTSEND 2415+#define F_UNKNOWNRECV 2416+#define F_UNKNOWNSEND 2417+#define F_OIDRECV 2418+#define F_OIDSEND 2419+#define F_OIDVECTORRECV 2420+#define F_OIDVECTORSEND 2421+#define F_NAMERECV 2422+#define F_NAMESEND 2423+#define F_FLOAT4RECV 2424+#define F_FLOAT4SEND 2425+#define F_FLOAT8RECV 2426+#define F_FLOAT8SEND 2427+#define F_POINT_RECV 2428+#define F_POINT_SEND 2429+#define F_BPCHARRECV 2430+#define F_BPCHARSEND 2431+#define F_VARCHARRECV 2432+#define F_VARCHARSEND 2433+#define F_CHARRECV 2434+#define F_CHARSEND 2435+#define F_BOOLRECV 2436+#define F_BOOLSEND 2437+#define F_TIDRECV 2438+#define F_TIDSEND 2439+#define F_XIDRECV 2440+#define F_XIDSEND 2441+#define F_CIDRECV 2442+#define F_CIDSEND 2443+#define F_REGPROCRECV 2444+#define F_REGPROCSEND 2445+#define F_REGPROCEDURERECV 2446+#define F_REGPROCEDURESEND 2447+#define F_REGOPERRECV 2448+#define F_REGOPERSEND 2449+#define F_REGOPERATORRECV 2450+#define F_REGOPERATORSEND 2451+#define F_REGCLASSRECV 2452+#define F_REGCLASSSEND 2453+#define F_REGTYPERECV 2454+#define F_REGTYPESEND 2455+#define F_BIT_RECV 2456+#define F_BIT_SEND 2457+#define F_VARBIT_RECV 2458+#define F_VARBIT_SEND 2459+#define F_NUMERIC_RECV 2460+#define F_NUMERIC_SEND 2461+#define F_ABSTIMERECV 2462+#define F_ABSTIMESEND 2463+#define F_RELTIMERECV 2464+#define F_RELTIMESEND 2465+#define F_TINTERVALRECV 2466+#define F_TINTERVALSEND 2467+#define F_DATE_RECV 2468+#define F_DATE_SEND 2469+#define F_TIME_RECV 2470+#define F_TIME_SEND 2471+#define F_TIMETZ_RECV 2472+#define F_TIMETZ_SEND 2473+#define F_TIMESTAMP_RECV 2474+#define F_TIMESTAMP_SEND 2475+#define F_TIMESTAMPTZ_RECV 2476+#define F_TIMESTAMPTZ_SEND 2477+#define F_INTERVAL_RECV 2478+#define F_INTERVAL_SEND 2479+#define F_LSEG_RECV 2480+#define F_LSEG_SEND 2481+#define F_PATH_RECV 2482+#define F_PATH_SEND 2483+#define F_BOX_RECV 2484+#define F_BOX_SEND 2485+#define F_POLY_RECV 2486+#define F_POLY_SEND 2487+#define F_LINE_RECV 2488+#define F_LINE_SEND 2489+#define F_CIRCLE_RECV 2490+#define F_CIRCLE_SEND 2491+#define F_CASH_RECV 2492+#define F_CASH_SEND 2493+#define F_MACADDR_RECV 2494+#define F_MACADDR_SEND 2495+#define F_INET_RECV 2496+#define F_INET_SEND 2497+#define F_CIDR_RECV 2498+#define F_CIDR_SEND 2499+#define F_CSTRING_RECV 2500+#define F_CSTRING_SEND 2501+#define F_ANYARRAY_RECV 2502+#define F_ANYARRAY_SEND 2503+#define F_PG_GET_RULEDEF_EXT 2504+#define F_PG_GET_VIEWDEF_NAME_EXT 2505+#define F_PG_GET_VIEWDEF_EXT 2506+#define F_PG_GET_INDEXDEF_EXT 2507+#define F_PG_GET_CONSTRAINTDEF_EXT 2508+#define F_PG_GET_EXPR_EXT 2509+#define F_PG_PREPARED_STATEMENT 2510+#define F_PG_CURSOR 2511+#define F_FLOAT8_VAR_POP 2512+#define F_FLOAT8_STDDEV_POP 2513+#define F_NUMERIC_VAR_POP 2514+#define F_BOOLAND_STATEFUNC 2515+#define F_BOOLOR_STATEFUNC 2516+#define F_TIMESTAMP_LT_TIMESTAMPTZ 2520+#define F_TIMESTAMP_LE_TIMESTAMPTZ 2521+#define F_TIMESTAMP_EQ_TIMESTAMPTZ 2522+#define F_TIMESTAMP_GT_TIMESTAMPTZ 2523+#define F_TIMESTAMP_GE_TIMESTAMPTZ 2524+#define F_TIMESTAMP_NE_TIMESTAMPTZ 2525+#define F_TIMESTAMP_CMP_TIMESTAMPTZ 2526+#define F_TIMESTAMPTZ_LT_TIMESTAMP 2527+#define F_TIMESTAMPTZ_LE_TIMESTAMP 2528+#define F_TIMESTAMPTZ_EQ_TIMESTAMP 2529+#define F_TIMESTAMPTZ_GT_TIMESTAMP 2530+#define F_TIMESTAMPTZ_GE_TIMESTAMP 2531+#define F_TIMESTAMPTZ_NE_TIMESTAMP 2532+#define F_TIMESTAMPTZ_CMP_TIMESTAMP 2533+#define F_PG_TABLESPACE_DATABASES 2556+#define F_INT4_BOOL 2557+#define F_BOOL_INT4 2558+#define F_LASTVAL 2559+#define F_PG_POSTMASTER_START_TIME 2560+#define F_GISTVACUUMCLEANUP 2561+#define F_BOX_BELOW 2562+#define F_BOX_OVERBELOW 2563+#define F_BOX_OVERABOVE 2564+#define F_BOX_ABOVE 2565+#define F_POLY_BELOW 2566+#define F_POLY_OVERBELOW 2567+#define F_POLY_OVERABOVE 2568+#define F_POLY_ABOVE 2569+#define F_GIST_BOX_CONSISTENT 2578+#define F_GIST_BOX_COMPRESS 2579+#define F_GIST_BOX_DECOMPRESS 2580+#define F_GIST_BOX_PENALTY 2581+#define F_GIST_BOX_PICKSPLIT 2582+#define F_GIST_BOX_UNION 2583+#define F_GIST_BOX_SAME 2584+#define F_GIST_POLY_CONSISTENT 2585+#define F_GIST_POLY_COMPRESS 2586+#define F_CIRCLE_OVERBELOW 2587+#define F_CIRCLE_OVERABOVE 2588+#define F_GIST_CIRCLE_CONSISTENT 2591+#define F_GIST_CIRCLE_COMPRESS 2592+#define F_NUMERIC_STDDEV_POP 2596+#define F_DOMAIN_IN 2597+#define F_DOMAIN_RECV 2598+#define F_PG_TIMEZONE_ABBREVS 2599+#define F_XMLEXISTS 2614+#define F_PG_RELOAD_CONF 2621+#define F_PG_ROTATE_LOGFILE 2622+#define F_PG_STAT_FILE_1ARG 2623+#define F_PG_READ_FILE_OFF_LEN 2624+#define F_PG_LS_DIR_1ARG 2625+#define F_PG_SLEEP 2626+#define F_INETNOT 2627+#define F_INETAND 2628+#define F_INETOR 2629+#define F_INETPL 2630+#define F_INETMI_INT8 2632+#define F_INETMI 2633+#define F_STATEMENT_TIMESTAMP 2648+#define F_CLOCK_TIMESTAMP 2649+#define F_GIN_CMP_PREFIX 2700+#define F_PG_HAS_ROLE_NAME_NAME 2705+#define F_PG_HAS_ROLE_NAME_ID 2706+#define F_PG_HAS_ROLE_ID_NAME 2707+#define F_PG_HAS_ROLE_ID_ID 2708+#define F_PG_HAS_ROLE_NAME 2709+#define F_PG_HAS_ROLE_ID 2710+#define F_INTERVAL_JUSTIFY_INTERVAL 2711+#define F_PG_GET_TRIGGERDEF_EXT 2730+#define F_GINGETBITMAP 2731+#define F_GININSERT 2732+#define F_GINBEGINSCAN 2733+#define F_GINRESCAN 2734+#define F_GINENDSCAN 2735+#define F_GINMARKPOS 2736+#define F_GINRESTRPOS 2737+#define F_GINBUILD 2738+#define F_GINBULKDELETE 2739+#define F_GINVACUUMCLEANUP 2740+#define F_GINCOSTESTIMATE 2741+#define F_GINARRAYEXTRACT 2743+#define F_GINARRAYCONSISTENT 2744+#define F_INT8_AVG_ACCUM 2746+#define F_ARRAYOVERLAP 2747+#define F_ARRAYCONTAINS 2748+#define F_ARRAYCONTAINED 2749+#define F_PG_STAT_GET_DB_TUPLES_RETURNED 2758+#define F_PG_STAT_GET_DB_TUPLES_FETCHED 2759+#define F_PG_STAT_GET_DB_TUPLES_INSERTED 2760+#define F_PG_STAT_GET_DB_TUPLES_UPDATED 2761+#define F_PG_STAT_GET_DB_TUPLES_DELETED 2762+#define F_REGEXP_MATCHES_NO_FLAGS 2763+#define F_REGEXP_MATCHES 2764+#define F_REGEXP_SPLIT_TO_TABLE_NO_FLAGS 2765+#define F_REGEXP_SPLIT_TO_TABLE 2766+#define F_REGEXP_SPLIT_TO_ARRAY_NO_FLAGS 2767+#define F_REGEXP_SPLIT_TO_ARRAY 2768+#define F_PG_STAT_GET_BGWRITER_TIMED_CHECKPOINTS 2769+#define F_PG_STAT_GET_BGWRITER_REQUESTED_CHECKPOINTS 2770+#define F_PG_STAT_GET_BGWRITER_BUF_WRITTEN_CHECKPOINTS 2771+#define F_PG_STAT_GET_BGWRITER_BUF_WRITTEN_CLEAN 2772+#define F_PG_STAT_GET_BGWRITER_MAXWRITTEN_CLEAN 2773+#define F_GINQUERYARRAYEXTRACT 2774+#define F_PG_STAT_GET_BUF_WRITTEN_BACKEND 2775+#define F_ANYNONARRAY_IN 2777+#define F_ANYNONARRAY_OUT 2778+#define F_PG_STAT_GET_LAST_VACUUM_TIME 2781+#define F_PG_STAT_GET_LAST_AUTOVACUUM_TIME 2782+#define F_PG_STAT_GET_LAST_ANALYZE_TIME 2783+#define F_PG_STAT_GET_LAST_AUTOANALYZE_TIME 2784+#define F_BTOPTIONS 2785+#define F_HASHOPTIONS 2786+#define F_GISTOPTIONS 2787+#define F_GINOPTIONS 2788+#define F_TIDGT 2790+#define F_TIDLT 2791+#define F_TIDGE 2792+#define F_TIDLE 2793+#define F_BTTIDCMP 2794+#define F_TIDLARGER 2795+#define F_TIDSMALLER 2796+#define F_INT8INC_ANY 2804+#define F_INT8INC_FLOAT8_FLOAT8 2805+#define F_FLOAT8_REGR_ACCUM 2806+#define F_FLOAT8_REGR_SXX 2807+#define F_FLOAT8_REGR_SYY 2808+#define F_FLOAT8_REGR_SXY 2809+#define F_FLOAT8_REGR_AVGX 2810+#define F_FLOAT8_REGR_AVGY 2811+#define F_FLOAT8_REGR_R2 2812+#define F_FLOAT8_REGR_SLOPE 2813+#define F_FLOAT8_REGR_INTERCEPT 2814+#define F_FLOAT8_COVAR_POP 2815+#define F_FLOAT8_COVAR_SAMP 2816+#define F_FLOAT8_CORR 2817+#define F_PG_STAT_GET_DB_BLK_READ_TIME 2844+#define F_PG_STAT_GET_DB_BLK_WRITE_TIME 2845+#define F_PG_SWITCH_XLOG 2848+#define F_PG_CURRENT_XLOG_LOCATION 2849+#define F_PG_XLOGFILE_NAME_OFFSET 2850+#define F_PG_XLOGFILE_NAME 2851+#define F_PG_CURRENT_XLOG_INSERT_LOCATION 2852+#define F_PG_STAT_GET_BACKEND_WAITING 2853+#define F_PG_MY_TEMP_SCHEMA 2854+#define F_PG_IS_OTHER_TEMP_SCHEMA 2855+#define F_PG_TIMEZONE_NAMES 2856+#define F_PG_STAT_GET_BACKEND_XACT_START 2857+#define F_NUMERIC_AVG_ACCUM 2858+#define F_PG_STAT_GET_BUF_ALLOC 2859+#define F_PG_STAT_GET_LIVE_TUPLES 2878+#define F_PG_STAT_GET_DEAD_TUPLES 2879+#define F_PG_ADVISORY_LOCK_INT8 2880+#define F_PG_ADVISORY_LOCK_SHARED_INT8 2881+#define F_PG_TRY_ADVISORY_LOCK_INT8 2882+#define F_PG_TRY_ADVISORY_LOCK_SHARED_INT8 2883+#define F_PG_ADVISORY_UNLOCK_INT8 2884+#define F_PG_ADVISORY_UNLOCK_SHARED_INT8 2885+#define F_PG_ADVISORY_LOCK_INT4 2886+#define F_PG_ADVISORY_LOCK_SHARED_INT4 2887+#define F_PG_TRY_ADVISORY_LOCK_INT4 2888+#define F_PG_TRY_ADVISORY_LOCK_SHARED_INT4 2889+#define F_PG_ADVISORY_UNLOCK_INT4 2890+#define F_PG_ADVISORY_UNLOCK_SHARED_INT4 2891+#define F_PG_ADVISORY_UNLOCK_ALL 2892+#define F_XML_IN 2893+#define F_XML_OUT 2894+#define F_XMLCOMMENT 2895+#define F_TEXTTOXML 2896+#define F_XMLVALIDATE 2897+#define F_XML_RECV 2898+#define F_XML_SEND 2899+#define F_XMLCONCAT2 2900+#define F_VARBITTYPMODIN 2902+#define F_INTERVALTYPMODIN 2903+#define F_INTERVALTYPMODOUT 2904+#define F_TIMESTAMPTYPMODIN 2905+#define F_TIMESTAMPTYPMODOUT 2906+#define F_TIMESTAMPTZTYPMODIN 2907+#define F_TIMESTAMPTZTYPMODOUT 2908+#define F_TIMETYPMODIN 2909+#define F_TIMETYPMODOUT 2910+#define F_TIMETZTYPMODIN 2911+#define F_TIMETZTYPMODOUT 2912+#define F_BPCHARTYPMODIN 2913+#define F_BPCHARTYPMODOUT 2914+#define F_VARCHARTYPMODIN 2915+#define F_VARCHARTYPMODOUT 2916+#define F_NUMERICTYPMODIN 2917+#define F_NUMERICTYPMODOUT 2918+#define F_BITTYPMODIN 2919+#define F_BITTYPMODOUT 2920+#define F_VARBITTYPMODOUT 2921+#define F_XMLTOTEXT 2922+#define F_TABLE_TO_XML 2923+#define F_QUERY_TO_XML 2924+#define F_CURSOR_TO_XML 2925+#define F_TABLE_TO_XMLSCHEMA 2926+#define F_QUERY_TO_XMLSCHEMA 2927+#define F_CURSOR_TO_XMLSCHEMA 2928+#define F_TABLE_TO_XML_AND_XMLSCHEMA 2929+#define F_QUERY_TO_XML_AND_XMLSCHEMA 2930+#define F_XPATH 2931+#define F_SCHEMA_TO_XML 2933+#define F_SCHEMA_TO_XMLSCHEMA 2934+#define F_SCHEMA_TO_XML_AND_XMLSCHEMA 2935+#define F_DATABASE_TO_XML 2936+#define F_DATABASE_TO_XMLSCHEMA 2937+#define F_DATABASE_TO_XML_AND_XMLSCHEMA 2938+#define F_TXID_SNAPSHOT_IN 2939+#define F_TXID_SNAPSHOT_OUT 2940+#define F_TXID_SNAPSHOT_RECV 2941+#define F_TXID_SNAPSHOT_SEND 2942+#define F_TXID_CURRENT 2943+#define F_TXID_CURRENT_SNAPSHOT 2944+#define F_TXID_SNAPSHOT_XMIN 2945+#define F_TXID_SNAPSHOT_XMAX 2946+#define F_TXID_SNAPSHOT_XIP 2947+#define F_TXID_VISIBLE_IN_SNAPSHOT 2948+#define F_UUID_IN 2952+#define F_UUID_OUT 2953+#define F_UUID_LT 2954+#define F_UUID_LE 2955+#define F_UUID_EQ 2956+#define F_UUID_GE 2957+#define F_UUID_GT 2958+#define F_UUID_NE 2959+#define F_UUID_CMP 2960+#define F_UUID_RECV 2961+#define F_UUID_SEND 2962+#define F_UUID_HASH 2963+#define F_BOOLTEXT 2971+#define F_PG_STAT_GET_FUNCTION_CALLS 2978+#define F_PG_STAT_GET_FUNCTION_TOTAL_TIME 2979+#define F_PG_STAT_GET_FUNCTION_SELF_TIME 2980+#define F_RECORD_EQ 2981+#define F_RECORD_NE 2982+#define F_RECORD_LT 2983+#define F_RECORD_GT 2984+#define F_RECORD_LE 2985+#define F_RECORD_GE 2986+#define F_BTRECORDCMP 2987+#define F_PG_TABLE_SIZE 2997+#define F_PG_INDEXES_SIZE 2998+#define F_PG_RELATION_FILENODE 2999+#define F_HAS_FOREIGN_DATA_WRAPPER_PRIVILEGE_NAME_NAME 3000+#define F_HAS_FOREIGN_DATA_WRAPPER_PRIVILEGE_NAME_ID 3001+#define F_HAS_FOREIGN_DATA_WRAPPER_PRIVILEGE_ID_NAME 3002+#define F_HAS_FOREIGN_DATA_WRAPPER_PRIVILEGE_ID_ID 3003+#define F_HAS_FOREIGN_DATA_WRAPPER_PRIVILEGE_NAME 3004+#define F_HAS_FOREIGN_DATA_WRAPPER_PRIVILEGE_ID 3005+#define F_HAS_SERVER_PRIVILEGE_NAME_NAME 3006+#define F_HAS_SERVER_PRIVILEGE_NAME_ID 3007+#define F_HAS_SERVER_PRIVILEGE_ID_NAME 3008+#define F_HAS_SERVER_PRIVILEGE_ID_ID 3009+#define F_HAS_SERVER_PRIVILEGE_NAME 3010+#define F_HAS_SERVER_PRIVILEGE_ID 3011+#define F_HAS_COLUMN_PRIVILEGE_NAME_NAME_NAME 3012+#define F_HAS_COLUMN_PRIVILEGE_NAME_NAME_ATTNUM 3013+#define F_HAS_COLUMN_PRIVILEGE_NAME_ID_NAME 3014+#define F_HAS_COLUMN_PRIVILEGE_NAME_ID_ATTNUM 3015+#define F_HAS_COLUMN_PRIVILEGE_ID_NAME_NAME 3016+#define F_HAS_COLUMN_PRIVILEGE_ID_NAME_ATTNUM 3017+#define F_HAS_COLUMN_PRIVILEGE_ID_ID_NAME 3018+#define F_HAS_COLUMN_PRIVILEGE_ID_ID_ATTNUM 3019+#define F_HAS_COLUMN_PRIVILEGE_NAME_NAME 3020+#define F_HAS_COLUMN_PRIVILEGE_NAME_ATTNUM 3021+#define F_HAS_COLUMN_PRIVILEGE_ID_NAME 3022+#define F_HAS_COLUMN_PRIVILEGE_ID_ATTNUM 3023+#define F_HAS_ANY_COLUMN_PRIVILEGE_NAME_NAME 3024+#define F_HAS_ANY_COLUMN_PRIVILEGE_NAME_ID 3025+#define F_HAS_ANY_COLUMN_PRIVILEGE_ID_NAME 3026+#define F_HAS_ANY_COLUMN_PRIVILEGE_ID_ID 3027+#define F_HAS_ANY_COLUMN_PRIVILEGE_NAME 3028+#define F_HAS_ANY_COLUMN_PRIVILEGE_ID 3029+#define F_BITOVERLAY 3030+#define F_BITOVERLAY_NO_LEN 3031+#define F_BITGETBIT 3032+#define F_BITSETBIT 3033+#define F_PG_RELATION_FILEPATH 3034+#define F_PG_LISTENING_CHANNELS 3035+#define F_PG_NOTIFY 3036+#define F_PG_STAT_GET_XACT_NUMSCANS 3037+#define F_PG_STAT_GET_XACT_TUPLES_RETURNED 3038+#define F_PG_STAT_GET_XACT_TUPLES_FETCHED 3039+#define F_PG_STAT_GET_XACT_TUPLES_INSERTED 3040+#define F_PG_STAT_GET_XACT_TUPLES_UPDATED 3041+#define F_PG_STAT_GET_XACT_TUPLES_DELETED 3042+#define F_PG_STAT_GET_XACT_TUPLES_HOT_UPDATED 3043+#define F_PG_STAT_GET_XACT_BLOCKS_FETCHED 3044+#define F_PG_STAT_GET_XACT_BLOCKS_HIT 3045+#define F_PG_STAT_GET_XACT_FUNCTION_CALLS 3046+#define F_PG_STAT_GET_XACT_FUNCTION_TOTAL_TIME 3047+#define F_PG_STAT_GET_XACT_FUNCTION_SELF_TIME 3048+#define F_XPATH_EXISTS 3049+#define F_XML_IS_WELL_FORMED 3051+#define F_XML_IS_WELL_FORMED_DOCUMENT 3052+#define F_XML_IS_WELL_FORMED_CONTENT 3053+#define F_PG_STAT_GET_VACUUM_COUNT 3054+#define F_PG_STAT_GET_AUTOVACUUM_COUNT 3055+#define F_PG_STAT_GET_ANALYZE_COUNT 3056+#define F_PG_STAT_GET_AUTOANALYZE_COUNT 3057+#define F_TEXT_CONCAT 3058+#define F_TEXT_CONCAT_WS 3059+#define F_TEXT_LEFT 3060+#define F_TEXT_RIGHT 3061+#define F_TEXT_REVERSE 3062+#define F_PG_STAT_GET_BUF_FSYNC_BACKEND 3063+#define F_GIST_POINT_DISTANCE 3064+#define F_PG_STAT_GET_DB_CONFLICT_TABLESPACE 3065+#define F_PG_STAT_GET_DB_CONFLICT_LOCK 3066+#define F_PG_STAT_GET_DB_CONFLICT_SNAPSHOT 3067+#define F_PG_STAT_GET_DB_CONFLICT_BUFFERPIN 3068+#define F_PG_STAT_GET_DB_CONFLICT_STARTUP_DEADLOCK 3069+#define F_PG_STAT_GET_DB_CONFLICT_ALL 3070+#define F_PG_XLOG_REPLAY_PAUSE 3071+#define F_PG_XLOG_REPLAY_RESUME 3072+#define F_PG_IS_XLOG_REPLAY_PAUSED 3073+#define F_PG_STAT_GET_DB_STAT_RESET_TIME 3074+#define F_PG_STAT_GET_BGWRITER_STAT_RESET_TIME 3075+#define F_GINARRAYEXTRACT_2ARGS 3076+#define F_GIN_EXTRACT_TSVECTOR_2ARGS 3077+#define F_PG_SEQUENCE_PARAMETERS 3078+#define F_PG_AVAILABLE_EXTENSIONS 3082+#define F_PG_AVAILABLE_EXTENSION_VERSIONS 3083+#define F_PG_EXTENSION_UPDATE_PATHS 3084+#define F_PG_EXTENSION_CONFIG_DUMP 3086+#define F_GIN_EXTRACT_TSQUERY_5ARGS 3087+#define F_GIN_TSQUERY_CONSISTENT_6ARGS 3088+#define F_PG_ADVISORY_XACT_LOCK_INT8 3089+#define F_PG_ADVISORY_XACT_LOCK_SHARED_INT8 3090+#define F_PG_TRY_ADVISORY_XACT_LOCK_INT8 3091+#define F_PG_TRY_ADVISORY_XACT_LOCK_SHARED_INT8 3092+#define F_PG_ADVISORY_XACT_LOCK_INT4 3093+#define F_PG_ADVISORY_XACT_LOCK_SHARED_INT4 3094+#define F_PG_TRY_ADVISORY_XACT_LOCK_INT4 3095+#define F_PG_TRY_ADVISORY_XACT_LOCK_SHARED_INT4 3096+#define F_VARCHAR_TRANSFORM 3097+#define F_PG_CREATE_RESTORE_POINT 3098+#define F_PG_STAT_GET_WAL_SENDERS 3099+#define F_WINDOW_ROW_NUMBER 3100+#define F_WINDOW_RANK 3101+#define F_WINDOW_DENSE_RANK 3102+#define F_WINDOW_PERCENT_RANK 3103+#define F_WINDOW_CUME_DIST 3104+#define F_WINDOW_NTILE 3105+#define F_WINDOW_LAG 3106+#define F_WINDOW_LAG_WITH_OFFSET 3107+#define F_WINDOW_LAG_WITH_OFFSET_AND_DEFAULT 3108+#define F_WINDOW_LEAD 3109+#define F_WINDOW_LEAD_WITH_OFFSET 3110+#define F_WINDOW_LEAD_WITH_OFFSET_AND_DEFAULT 3111+#define F_WINDOW_FIRST_VALUE 3112+#define F_WINDOW_LAST_VALUE 3113+#define F_WINDOW_NTH_VALUE 3114+#define F_FDW_HANDLER_IN 3116+#define F_FDW_HANDLER_OUT 3117+#define F_VOID_RECV 3120+#define F_VOID_SEND 3121+#define F_BTINT2SORTSUPPORT 3129+#define F_BTINT4SORTSUPPORT 3130+#define F_BTINT8SORTSUPPORT 3131+#define F_BTFLOAT4SORTSUPPORT 3132+#define F_BTFLOAT8SORTSUPPORT 3133+#define F_BTOIDSORTSUPPORT 3134+#define F_BTNAMESORTSUPPORT 3135+#define F_DATE_SORTSUPPORT 3136+#define F_TIMESTAMP_SORTSUPPORT 3137+#define F_HAS_TYPE_PRIVILEGE_NAME_NAME 3138+#define F_HAS_TYPE_PRIVILEGE_NAME_ID 3139+#define F_HAS_TYPE_PRIVILEGE_ID_NAME 3140+#define F_HAS_TYPE_PRIVILEGE_ID_ID 3141+#define F_HAS_TYPE_PRIVILEGE_NAME 3142+#define F_HAS_TYPE_PRIVILEGE_ID 3143+#define F_MACADDR_NOT 3144+#define F_MACADDR_AND 3145+#define F_MACADDR_OR 3146+#define F_PG_STAT_GET_DB_TEMP_FILES 3150+#define F_PG_STAT_GET_DB_TEMP_BYTES 3151+#define F_PG_STAT_GET_DB_DEADLOCKS 3152+#define F_ARRAY_TO_JSON 3153+#define F_ARRAY_TO_JSON_PRETTY 3154+#define F_ROW_TO_JSON 3155+#define F_ROW_TO_JSON_PRETTY 3156+#define F_NUMERIC_TRANSFORM 3157+#define F_VARBIT_TRANSFORM 3158+#define F_PG_GET_VIEWDEF_WRAP 3159+#define F_PG_STAT_GET_CHECKPOINT_WRITE_TIME 3160+#define F_PG_STAT_GET_CHECKPOINT_SYNC_TIME 3161+#define F_PG_COLLATION_FOR 3162+#define F_PG_TRIGGER_DEPTH 3163+#define F_PG_XLOG_LOCATION_DIFF 3165+#define F_PG_SIZE_PRETTY_NUMERIC 3166+#define F_ARRAY_REMOVE 3167+#define F_ARRAY_REPLACE 3168+#define F_RANGESEL 3169+#define F_LO_LSEEK64 3170+#define F_LO_TELL64 3171+#define F_LO_TRUNCATE64 3172+#define F_JSON_AGG_TRANSFN 3173+#define F_JSON_AGG_FINALFN 3174+#define F_TO_JSON 3176+#define F_PG_STAT_GET_MOD_SINCE_ANALYZE 3177+#define F_NUMERIC_SUM 3178+#define F_ARRAY_CARDINALITY 3179+#define F_JSON_OBJECT_AGG_TRANSFN 3180+#define F_RECORD_IMAGE_EQ 3181+#define F_RECORD_IMAGE_NE 3182+#define F_RECORD_IMAGE_LT 3183+#define F_RECORD_IMAGE_GT 3184+#define F_RECORD_IMAGE_LE 3185+#define F_RECORD_IMAGE_GE 3186+#define F_BTRECORDIMAGECMP 3187+#define F_PG_STAT_GET_ARCHIVER 3195+#define F_JSON_OBJECT_AGG_FINALFN 3196+#define F_JSON_BUILD_ARRAY 3198+#define F_JSON_BUILD_ARRAY_NOARGS 3199+#define F_JSON_BUILD_OBJECT 3200+#define F_JSON_BUILD_OBJECT_NOARGS 3201+#define F_JSON_OBJECT 3202+#define F_JSON_OBJECT_TWO_ARG 3203+#define F_JSON_TO_RECORD 3204+#define F_JSON_TO_RECORDSET 3205+#define F_JSONB_ARRAY_LENGTH 3207+#define F_JSONB_EACH 3208+#define F_JSONB_POPULATE_RECORD 3209+#define F_JSONB_TYPEOF 3210+#define F_JSONB_OBJECT_FIELD_TEXT 3214+#define F_JSONB_ARRAY_ELEMENT 3215+#define F_JSONB_ARRAY_ELEMENT_TEXT 3216+#define F_JSONB_EXTRACT_PATH 3217+#define F_WIDTH_BUCKET_ARRAY 3218+#define F_JSONB_ARRAY_ELEMENTS 3219+#define F_PG_LSN_IN 3229+#define F_PG_LSN_OUT 3230+#define F_PG_LSN_LT 3231+#define F_PG_LSN_LE 3232+#define F_PG_LSN_EQ 3233+#define F_PG_LSN_GE 3234+#define F_PG_LSN_GT 3235+#define F_PG_LSN_NE 3236+#define F_PG_LSN_MI 3237+#define F_PG_LSN_RECV 3238+#define F_PG_LSN_SEND 3239+#define F_PG_LSN_CMP 3251+#define F_PG_LSN_HASH 3252+#define F_BTTEXTSORTSUPPORT 3255+#define F_GENERATE_SERIES_STEP_NUMERIC 3259+#define F_GENERATE_SERIES_NUMERIC 3260+#define F_JSON_STRIP_NULLS 3261+#define F_JSONB_STRIP_NULLS 3262+#define F_JSONB_OBJECT 3263+#define F_JSONB_OBJECT_TWO_ARG 3264+#define F_JSONB_AGG_TRANSFN 3265+#define F_JSONB_AGG_FINALFN 3266+#define F_JSONB_OBJECT_AGG_TRANSFN 3268+#define F_JSONB_OBJECT_AGG_FINALFN 3269+#define F_JSONB_BUILD_ARRAY 3271+#define F_JSONB_BUILD_ARRAY_NOARGS 3272+#define F_JSONB_BUILD_OBJECT 3273+#define F_JSONB_BUILD_OBJECT_NOARGS 3274+#define F_DIST_PPOLY 3275+#define F_ARRAY_POSITION 3277+#define F_ARRAY_POSITION_START 3278+#define F_ARRAY_POSITIONS 3279+#define F_GISTCANRETURN 3280+#define F_GIST_BOX_FETCH 3281+#define F_GIST_POINT_FETCH 3282+#define F_NUMERIC_SORTSUPPORT 3283+#define F_GIST_BBOX_DISTANCE 3288+#define F_DIST_CPOINT 3290+#define F_DIST_POLYP 3292+#define F_PG_READ_FILE 3293+#define F_PG_READ_BINARY_FILE 3295+#define F_PG_LS_DIR 3297+#define F_ROW_SECURITY_ACTIVE 3298+#define F_ROW_SECURITY_ACTIVE_NAME 3299+#define F_JSONB_CONCAT 3301+#define F_JSONB_DELETE 3302+#define F_JSONB_DELETE_IDX 3303+#define F_JSONB_DELETE_PATH 3304+#define F_JSONB_SET 3305+#define F_JSONB_PRETTY 3306+#define F_PG_STAT_FILE 3307+#define F_TSM_HANDLER_IN 3311+#define F_TSM_HANDLER_OUT 3312+#define F_TSM_BERNOULLI_HANDLER 3313+#define F_TSM_SYSTEM_HANDLER 3314+#define F_SHOW_ALL_FILE_SETTINGS 3329+#define F_PG_IDENTIFY_OBJECT_AS_ADDRESS 3382+#define F_BRIN_MINMAX_OPCINFO 3383+#define F_BRIN_MINMAX_ADD_VALUE 3384+#define F_BRIN_MINMAX_CONSISTENT 3385+#define F_BRIN_MINMAX_UNION 3386+#define F_INT8_AVG_ACCUM_INV 3387+#define F_NUMERIC_POLY_SUM 3388+#define F_NUMERIC_POLY_AVG 3389+#define F_NUMERIC_POLY_VAR_POP 3390+#define F_NUMERIC_POLY_VAR_SAMP 3391+#define F_NUMERIC_POLY_STDDEV_POP 3392+#define F_NUMERIC_POLY_STDDEV_SAMP 3393+#define F_PG_FILENODE_RELATION 3454+#define F_LO_FROM_BYTEA 3457+#define F_LO_GET 3458+#define F_LO_GET_FRAGMENT 3459+#define F_LO_PUT 3460+#define F_MAKE_TIMESTAMP 3461+#define F_MAKE_TIMESTAMPTZ 3462+#define F_MAKE_TIMESTAMPTZ_AT_TIMEZONE 3463+#define F_MAKE_INTERVAL 3464+#define F_JSONB_ARRAY_ELEMENTS_TEXT 3465+#define F_SPG_RANGE_QUAD_CONFIG 3469+#define F_SPG_RANGE_QUAD_CHOOSE 3470+#define F_SPG_RANGE_QUAD_PICKSPLIT 3471+#define F_SPG_RANGE_QUAD_INNER_CONSISTENT 3472+#define F_SPG_RANGE_QUAD_LEAF_CONSISTENT 3473+#define F_JSONB_POPULATE_RECORDSET 3475+#define F_TO_REGOPERATOR 3476+#define F_JSONB_OBJECT_FIELD 3478+#define F_TO_REGPROCEDURE 3479+#define F_GIN_COMPARE_JSONB 3480+#define F_GIN_EXTRACT_JSONB 3482+#define F_GIN_EXTRACT_JSONB_QUERY 3483+#define F_GIN_CONSISTENT_JSONB 3484+#define F_GIN_EXTRACT_JSONB_PATH 3485+#define F_GIN_EXTRACT_JSONB_QUERY_PATH 3486+#define F_GIN_CONSISTENT_JSONB_PATH 3487+#define F_GIN_TRICONSISTENT_JSONB 3488+#define F_GIN_TRICONSISTENT_JSONB_PATH 3489+#define F_JSONB_TO_RECORD 3490+#define F_JSONB_TO_RECORDSET 3491+#define F_TO_REGOPER 3492+#define F_TO_REGTYPE 3493+#define F_TO_REGPROC 3494+#define F_TO_REGCLASS 3495+#define F_BOOL_ACCUM 3496+#define F_BOOL_ACCUM_INV 3497+#define F_BOOL_ALLTRUE 3498+#define F_BOOL_ANYTRUE 3499+#define F_ANYENUM_IN 3504+#define F_ANYENUM_OUT 3505+#define F_ENUM_IN 3506+#define F_ENUM_OUT 3507+#define F_ENUM_EQ 3508+#define F_ENUM_NE 3509+#define F_ENUM_LT 3510+#define F_ENUM_GT 3511+#define F_ENUM_LE 3512+#define F_ENUM_GE 3513+#define F_ENUM_CMP 3514+#define F_HASHENUM 3515+#define F_ENUM_SMALLER 3524+#define F_ENUM_LARGER 3525+#define F_ENUM_FIRST 3528+#define F_ENUM_LAST 3529+#define F_ENUM_RANGE_BOUNDS 3530+#define F_ENUM_RANGE_ALL 3531+#define F_ENUM_RECV 3532+#define F_ENUM_SEND 3533+#define F_STRING_AGG_TRANSFN 3535+#define F_STRING_AGG_FINALFN 3536+#define F_PG_DESCRIBE_OBJECT 3537+#define F_TEXT_FORMAT 3539+#define F_TEXT_FORMAT_NV 3540+#define F_BYTEA_STRING_AGG_TRANSFN 3543+#define F_BYTEA_STRING_AGG_FINALFN 3544+#define F_INT8DEC 3546+#define F_INT8DEC_ANY 3547+#define F_NUMERIC_ACCUM_INV 3548+#define F_INTERVAL_ACCUM_INV 3549+#define F_NETWORK_OVERLAP 3551+#define F_INET_GIST_CONSISTENT 3553+#define F_INET_GIST_UNION 3554+#define F_INET_GIST_COMPRESS 3555+#define F_INET_GIST_DECOMPRESS 3556+#define F_INET_GIST_PENALTY 3557+#define F_INET_GIST_PICKSPLIT 3558+#define F_INET_GIST_SAME 3559+#define F_NETWORKSEL 3560+#define F_NETWORKJOINSEL 3561+#define F_NETWORK_LARGER 3562+#define F_NETWORK_SMALLER 3563+#define F_PG_EVENT_TRIGGER_DROPPED_OBJECTS 3566+#define F_INT2_ACCUM_INV 3567+#define F_INT4_ACCUM_INV 3568+#define F_INT8_ACCUM_INV 3569+#define F_INT2_AVG_ACCUM_INV 3570+#define F_INT4_AVG_ACCUM_INV 3571+#define F_INT2INT4_SUM 3572+#define F_INET_GIST_FETCH 3573+#define F_PG_XACT_COMMIT_TIMESTAMP 3581+#define F_BINARY_UPGRADE_SET_NEXT_PG_TYPE_OID 3582+#define F_PG_LAST_COMMITTED_XACT 3583+#define F_BINARY_UPGRADE_SET_NEXT_ARRAY_PG_TYPE_OID 3584+#define F_BINARY_UPGRADE_SET_NEXT_TOAST_PG_TYPE_OID 3585+#define F_BINARY_UPGRADE_SET_NEXT_HEAP_PG_CLASS_OID 3586+#define F_BINARY_UPGRADE_SET_NEXT_INDEX_PG_CLASS_OID 3587+#define F_BINARY_UPGRADE_SET_NEXT_TOAST_PG_CLASS_OID 3588+#define F_BINARY_UPGRADE_SET_NEXT_PG_ENUM_OID 3589+#define F_BINARY_UPGRADE_SET_NEXT_PG_AUTHID_OID 3590+#define F_BINARY_UPGRADE_CREATE_EMPTY_EXTENSION 3591+#define F_EVENT_TRIGGER_IN 3594+#define F_EVENT_TRIGGER_OUT 3595+#define F_TSVECTORIN 3610+#define F_TSVECTOROUT 3611+#define F_TSQUERYIN 3612+#define F_TSQUERYOUT 3613+#define F_TSVECTOR_LT 3616+#define F_TSVECTOR_LE 3617+#define F_TSVECTOR_EQ 3618+#define F_TSVECTOR_NE 3619+#define F_TSVECTOR_GE 3620+#define F_TSVECTOR_GT 3621+#define F_TSVECTOR_CMP 3622+#define F_TSVECTOR_STRIP 3623+#define F_TSVECTOR_SETWEIGHT 3624+#define F_TSVECTOR_CONCAT 3625+#define F_TS_MATCH_VQ 3634+#define F_TS_MATCH_QV 3635+#define F_TSVECTORSEND 3638+#define F_TSVECTORRECV 3639+#define F_TSQUERYSEND 3640+#define F_TSQUERYRECV 3641+#define F_GTSVECTORIN 3646+#define F_GTSVECTOROUT 3647+#define F_GTSVECTOR_COMPRESS 3648+#define F_GTSVECTOR_DECOMPRESS 3649+#define F_GTSVECTOR_PICKSPLIT 3650+#define F_GTSVECTOR_UNION 3651+#define F_GTSVECTOR_SAME 3652+#define F_GTSVECTOR_PENALTY 3653+#define F_GTSVECTOR_CONSISTENT 3654+#define F_GIN_EXTRACT_TSVECTOR 3656+#define F_GIN_EXTRACT_TSQUERY 3657+#define F_GIN_TSQUERY_CONSISTENT 3658+#define F_TSQUERY_LT 3662+#define F_TSQUERY_LE 3663+#define F_TSQUERY_EQ 3664+#define F_TSQUERY_NE 3665+#define F_TSQUERY_GE 3666+#define F_TSQUERY_GT 3667+#define F_TSQUERY_CMP 3668+#define F_TSQUERY_AND 3669+#define F_TSQUERY_OR 3670+#define F_TSQUERY_NOT 3671+#define F_TSQUERY_NUMNODE 3672+#define F_TSQUERYTREE 3673+#define F_TSQUERY_REWRITE 3684+#define F_TSQUERY_REWRITE_QUERY 3685+#define F_TSMATCHSEL 3686+#define F_TSMATCHJOINSEL 3687+#define F_TS_TYPANALYZE 3688+#define F_TS_STAT1 3689+#define F_TS_STAT2 3690+#define F_TSQ_MCONTAINS 3691+#define F_TSQ_MCONTAINED 3692+#define F_GTSQUERY_COMPRESS 3695+#define F_GTSQUERY_DECOMPRESS 3696+#define F_GTSQUERY_PICKSPLIT 3697+#define F_GTSQUERY_UNION 3698+#define F_GTSQUERY_SAME 3699+#define F_GTSQUERY_PENALTY 3700+#define F_GTSQUERY_CONSISTENT 3701+#define F_TS_RANK_WTTF 3703+#define F_TS_RANK_WTT 3704+#define F_TS_RANK_TTF 3705+#define F_TS_RANK_TT 3706+#define F_TS_RANKCD_WTTF 3707+#define F_TS_RANKCD_WTT 3708+#define F_TS_RANKCD_TTF 3709+#define F_TS_RANKCD_TT 3710+#define F_TSVECTOR_LENGTH 3711+#define F_TS_TOKEN_TYPE_BYID 3713+#define F_TS_TOKEN_TYPE_BYNAME 3714+#define F_TS_PARSE_BYID 3715+#define F_TS_PARSE_BYNAME 3716+#define F_PRSD_START 3717+#define F_PRSD_NEXTTOKEN 3718+#define F_PRSD_END 3719+#define F_PRSD_HEADLINE 3720+#define F_PRSD_LEXTYPE 3721+#define F_TS_LEXIZE 3723+#define F_GIN_CMP_TSLEXEME 3724+#define F_DSIMPLE_INIT 3725+#define F_DSIMPLE_LEXIZE 3726+#define F_DSYNONYM_INIT 3728+#define F_DSYNONYM_LEXIZE 3729+#define F_DISPELL_INIT 3731+#define F_DISPELL_LEXIZE 3732+#define F_REGCONFIGIN 3736+#define F_REGCONFIGOUT 3737+#define F_REGCONFIGRECV 3738+#define F_REGCONFIGSEND 3739+#define F_THESAURUS_INIT 3740+#define F_THESAURUS_LEXIZE 3741+#define F_TS_HEADLINE_BYID_OPT 3743+#define F_TS_HEADLINE_BYID 3744+#define F_TO_TSVECTOR_BYID 3745+#define F_TO_TSQUERY_BYID 3746+#define F_PLAINTO_TSQUERY_BYID 3747+#define F_TO_TSVECTOR 3749+#define F_TO_TSQUERY 3750+#define F_PLAINTO_TSQUERY 3751+#define F_TSVECTOR_UPDATE_TRIGGER_BYID 3752+#define F_TSVECTOR_UPDATE_TRIGGER_BYCOLUMN 3753+#define F_TS_HEADLINE_OPT 3754+#define F_TS_HEADLINE 3755+#define F_PG_TS_PARSER_IS_VISIBLE 3756+#define F_PG_TS_DICT_IS_VISIBLE 3757+#define F_PG_TS_CONFIG_IS_VISIBLE 3758+#define F_GET_CURRENT_TS_CONFIG 3759+#define F_TS_MATCH_TT 3760+#define F_TS_MATCH_TQ 3761+#define F_PG_TS_TEMPLATE_IS_VISIBLE 3768+#define F_REGDICTIONARYIN 3771+#define F_REGDICTIONARYOUT 3772+#define F_REGDICTIONARYRECV 3773+#define F_REGDICTIONARYSEND 3774+#define F_PG_STAT_RESET_SHARED 3775+#define F_PG_STAT_RESET_SINGLE_TABLE_COUNTERS 3776+#define F_PG_STAT_RESET_SINGLE_FUNCTION_COUNTERS 3777+#define F_PG_TABLESPACE_LOCATION 3778+#define F_PG_CREATE_PHYSICAL_REPLICATION_SLOT 3779+#define F_PG_DROP_REPLICATION_SLOT 3780+#define F_PG_GET_REPLICATION_SLOTS 3781+#define F_PG_LOGICAL_SLOT_GET_CHANGES 3782+#define F_PG_LOGICAL_SLOT_GET_BINARY_CHANGES 3783+#define F_PG_LOGICAL_SLOT_PEEK_CHANGES 3784+#define F_PG_LOGICAL_SLOT_PEEK_BINARY_CHANGES 3785+#define F_PG_CREATE_LOGICAL_REPLICATION_SLOT 3786+#define F_TO_JSONB 3787+#define F_PG_STAT_GET_SNAPSHOT_TIMESTAMP 3788+#define F_BRINGETBITMAP 3789+#define F_BRININSERT 3790+#define F_BRINBEGINSCAN 3791+#define F_BRINRESCAN 3792+#define F_BRINENDSCAN 3793+#define F_BRINMARKPOS 3794+#define F_BRINRESTRPOS 3795+#define F_BRINBUILD 3796+#define F_BRINBUILDEMPTY 3797+#define F_BRINBULKDELETE 3798+#define F_BRINVACUUMCLEANUP 3799+#define F_BRINCOSTESTIMATE 3800+#define F_BRINOPTIONS 3801+#define F_JSONB_SEND 3803+#define F_JSONB_OUT 3804+#define F_JSONB_RECV 3805+#define F_JSONB_IN 3806+#define F_PG_GET_FUNCTION_ARG_DEFAULT 3808+#define F_PG_EXPORT_SNAPSHOT 3809+#define F_PG_IS_IN_RECOVERY 3810+#define F_INT4_CASH 3811+#define F_INT8_CASH 3812+#define F_PG_IS_IN_BACKUP 3813+#define F_PG_BACKUP_START_TIME 3814+#define F_PG_COLLATION_IS_VISIBLE 3815+#define F_ARRAY_TYPANALYZE 3816+#define F_ARRAYCONTSEL 3817+#define F_ARRAYCONTJOINSEL 3818+#define F_PG_GET_MULTIXACT_MEMBERS 3819+#define F_PG_LAST_XLOG_RECEIVE_LOCATION 3820+#define F_PG_LAST_XLOG_REPLAY_LOCATION 3821+#define F_CASH_DIV_CASH 3822+#define F_CASH_NUMERIC 3823+#define F_NUMERIC_CASH 3824+#define F_PG_READ_FILE_ALL 3826+#define F_PG_READ_BINARY_FILE_OFF_LEN 3827+#define F_PG_READ_BINARY_FILE_ALL 3828+#define F_PG_OPFAMILY_IS_VISIBLE 3829+#define F_PG_LAST_XACT_REPLAY_TIMESTAMP 3830+#define F_ANYRANGE_IN 3832+#define F_ANYRANGE_OUT 3833+#define F_RANGE_IN 3834+#define F_RANGE_OUT 3835+#define F_RANGE_RECV 3836+#define F_RANGE_SEND 3837+#define F_PG_IDENTIFY_OBJECT 3839+#define F_RANGE_CONSTRUCTOR2 3840+#define F_RANGE_CONSTRUCTOR3 3841+#define F_PG_RELATION_IS_UPDATABLE 3842+#define F_PG_COLUMN_IS_UPDATABLE 3843+#define F_MAKE_DATE 3846+#define F_MAKE_TIME 3847+#define F_RANGE_LOWER 3848+#define F_RANGE_UPPER 3849+#define F_RANGE_EMPTY 3850+#define F_RANGE_LOWER_INC 3851+#define F_RANGE_UPPER_INC 3852+#define F_RANGE_LOWER_INF 3853+#define F_RANGE_UPPER_INF 3854+#define F_RANGE_EQ 3855+#define F_RANGE_NE 3856+#define F_RANGE_OVERLAPS 3857+#define F_RANGE_CONTAINS_ELEM 3858+#define F_RANGE_CONTAINS 3859+#define F_ELEM_CONTAINED_BY_RANGE 3860+#define F_RANGE_CONTAINED_BY 3861+#define F_RANGE_ADJACENT 3862+#define F_RANGE_BEFORE 3863+#define F_RANGE_AFTER 3864+#define F_RANGE_OVERLEFT 3865+#define F_RANGE_OVERRIGHT 3866+#define F_RANGE_UNION 3867+#define F_RANGE_INTERSECT 3868+#define F_RANGE_MINUS 3869+#define F_RANGE_CMP 3870+#define F_RANGE_LT 3871+#define F_RANGE_LE 3872+#define F_RANGE_GE 3873+#define F_RANGE_GT 3874+#define F_RANGE_GIST_CONSISTENT 3875+#define F_RANGE_GIST_UNION 3876+#define F_RANGE_GIST_COMPRESS 3877+#define F_RANGE_GIST_DECOMPRESS 3878+#define F_RANGE_GIST_PENALTY 3879+#define F_RANGE_GIST_PICKSPLIT 3880+#define F_RANGE_GIST_SAME 3881+#define F_HASH_RANGE 3902+#define F_INT4RANGE_CANONICAL 3914+#define F_DATERANGE_CANONICAL 3915+#define F_RANGE_TYPANALYZE 3916+#define F_TIMESTAMP_TRANSFORM 3917+#define F_INTERVAL_TRANSFORM 3918+#define F_GINARRAYTRICONSISTENT 3920+#define F_GIN_TSQUERY_TRICONSISTENT 3921+#define F_INT4RANGE_SUBDIFF 3922+#define F_INT8RANGE_SUBDIFF 3923+#define F_NUMRANGE_SUBDIFF 3924+#define F_DATERANGE_SUBDIFF 3925+#define F_INT8RANGE_CANONICAL 3928+#define F_TSRANGE_SUBDIFF 3929+#define F_TSTZRANGE_SUBDIFF 3930+#define F_JSONB_OBJECT_KEYS 3931+#define F_JSONB_EACH_TEXT 3932+#define F_MXID_AGE 3939+#define F_JSONB_EXTRACT_PATH_TEXT 3940+#define F_ACLDEFAULT_SQL 3943+#define F_TIME_TRANSFORM 3944+#define F_JSON_OBJECT_FIELD 3947+#define F_JSON_OBJECT_FIELD_TEXT 3948+#define F_JSON_ARRAY_ELEMENT 3949+#define F_JSON_ARRAY_ELEMENT_TEXT 3950+#define F_JSON_EXTRACT_PATH 3951+#define F_BRIN_SUMMARIZE_NEW_VALUES 3952+#define F_JSON_EXTRACT_PATH_TEXT 3953+#define F_PG_GET_OBJECT_ADDRESS 3954+#define F_JSON_ARRAY_ELEMENTS 3955+#define F_JSON_ARRAY_LENGTH 3956+#define F_JSON_OBJECT_KEYS 3957+#define F_JSON_EACH 3958+#define F_JSON_EACH_TEXT 3959+#define F_JSON_POPULATE_RECORD 3960+#define F_JSON_POPULATE_RECORDSET 3961+#define F_JSON_TYPEOF 3968+#define F_JSON_ARRAY_ELEMENTS_TEXT 3969+#define F_ORDERED_SET_TRANSITION 3970+#define F_ORDERED_SET_TRANSITION_MULTI 3971+#define F_PERCENTILE_DISC_FINAL 3973+#define F_PERCENTILE_CONT_FLOAT8_FINAL 3975+#define F_PERCENTILE_CONT_INTERVAL_FINAL 3977+#define F_PERCENTILE_DISC_MULTI_FINAL 3979+#define F_PERCENTILE_CONT_FLOAT8_MULTI_FINAL 3981+#define F_PERCENTILE_CONT_INTERVAL_MULTI_FINAL 3983+#define F_MODE_FINAL 3985+#define F_HYPOTHETICAL_RANK_FINAL 3987+#define F_HYPOTHETICAL_PERCENT_RANK_FINAL 3989+#define F_HYPOTHETICAL_CUME_DIST_FINAL 3991+#define F_HYPOTHETICAL_DENSE_RANK_FINAL 3993+#define F_TIMESTAMP_IZONE_TRANSFORM 3994+#define F_TIMESTAMP_ZONE_TRANSFORM 3995+#define F_RANGE_GIST_FETCH 3996+#define F_SPGGETTUPLE 4001+#define F_SPGGETBITMAP 4002+#define F_SPGINSERT 4003+#define F_SPGBEGINSCAN 4004+#define F_SPGRESCAN 4005+#define F_SPGENDSCAN 4006+#define F_SPGMARKPOS 4007+#define F_SPGRESTRPOS 4008+#define F_SPGBUILD 4009+#define F_SPGBUILDEMPTY 4010+#define F_SPGBULKDELETE 4011+#define F_SPGVACUUMCLEANUP 4012+#define F_SPGCOSTESTIMATE 4013+#define F_SPGOPTIONS 4014+#define F_SPG_QUAD_CONFIG 4018+#define F_SPG_QUAD_CHOOSE 4019+#define F_SPG_QUAD_PICKSPLIT 4020+#define F_SPG_QUAD_INNER_CONSISTENT 4021+#define F_SPG_QUAD_LEAF_CONSISTENT 4022+#define F_SPG_KD_CONFIG 4023+#define F_SPG_KD_CHOOSE 4024+#define F_SPG_KD_PICKSPLIT 4025+#define F_SPG_KD_INNER_CONSISTENT 4026+#define F_SPG_TEXT_CONFIG 4027+#define F_SPG_TEXT_CHOOSE 4028+#define F_SPG_TEXT_PICKSPLIT 4029+#define F_SPG_TEXT_INNER_CONSISTENT 4030+#define F_SPG_TEXT_LEAF_CONSISTENT 4031+#define F_SPGCANRETURN 4032+#define F_JSONB_NE 4038+#define F_JSONB_LT 4039+#define F_JSONB_GT 4040+#define F_JSONB_LE 4041+#define F_JSONB_GE 4042+#define F_JSONB_EQ 4043+#define F_JSONB_CMP 4044+#define F_JSONB_HASH 4045+#define F_JSONB_CONTAINS 4046+#define F_JSONB_EXISTS 4047+#define F_JSONB_EXISTS_ANY 4048+#define F_JSONB_EXISTS_ALL 4049+#define F_JSONB_CONTAINED 4050+#define F_ARRAY_AGG_ARRAY_TRANSFN 4051+#define F_ARRAY_AGG_ARRAY_FINALFN 4052+#define F_RANGE_MERGE 4057+#define F_INET_MERGE 4063+#define F_BOXES_BOUND_BOX 4067+#define F_INET_SAME_FAMILY 4071+#define F_REGNAMESPACEIN 4084+#define F_REGNAMESPACEOUT 4085+#define F_TO_REGNAMESPACE 4086+#define F_REGNAMESPACERECV 4087+#define F_REGNAMESPACESEND 4088+#define F_POINT_BOX 4091+#define F_REGROLEOUT 4092+#define F_TO_REGROLE 4093+#define F_REGROLERECV 4094+#define F_REGROLESEND 4095+#define F_REGROLEIN 4098+#define F_BRIN_INCLUSION_OPCINFO 4105+#define F_BRIN_INCLUSION_ADD_VALUE 4106+#define F_BRIN_INCLUSION_CONSISTENT 4107+#define F_BRIN_INCLUSION_UNION 4108+#define F_PG_EVENT_TRIGGER_TABLE_REWRITE_OID 4566+#define F_PG_EVENT_TRIGGER_TABLE_REWRITE_REASON 4567+#define F_PG_EVENT_TRIGGER_DDL_COMMANDS 4568+#define F_PG_REPLICATION_ORIGIN_CREATE 6003+#define F_PG_REPLICATION_ORIGIN_DROP 6004+#define F_PG_REPLICATION_ORIGIN_OID 6005+#define F_PG_REPLICATION_ORIGIN_SESSION_SETUP 6006+#define F_PG_REPLICATION_ORIGIN_SESSION_RESET 6007+#define F_PG_REPLICATION_ORIGIN_SESSION_IS_SETUP 6008+#define F_PG_REPLICATION_ORIGIN_SESSION_PROGRESS 6009+#define F_PG_REPLICATION_ORIGIN_XACT_SETUP 6010+#define F_PG_REPLICATION_ORIGIN_XACT_RESET 6011+#define F_PG_REPLICATION_ORIGIN_ADVANCE 6012+#define F_PG_REPLICATION_ORIGIN_PROGRESS 6013+#define F_PG_SHOW_REPLICATION_ORIGIN_STATUS 6014++#endif /* FMGROIDS_H */
+ foreign/libpg_query/src/postgres/include/utils/guc.h view
@@ -0,0 +1,435 @@+/*--------------------------------------------------------------------+ * guc.h+ *+ * External declarations pertaining to backend/utils/misc/guc.c and+ * backend/utils/misc/guc-file.l+ *+ * Copyright (c) 2000-2015, PostgreSQL Global Development Group+ * Written by Peter Eisentraut <peter_e@gmx.net>.+ *+ * src/include/utils/guc.h+ *--------------------------------------------------------------------+ */+#ifndef GUC_H+#define GUC_H++#include "nodes/parsenodes.h"+#include "tcop/dest.h"+#include "utils/array.h"+++/* upper limit for GUC variables measured in kilobytes of memory */+/* note that various places assume the byte size fits in a "long" variable */+#if SIZEOF_SIZE_T > 4 && SIZEOF_LONG > 4+#define MAX_KILOBYTES INT_MAX+#else+#define MAX_KILOBYTES (INT_MAX / 1024)+#endif++/*+ * Automatic configuration file name for ALTER SYSTEM.+ * This file will be used to store values of configuration parameters+ * set by ALTER SYSTEM command.+ */+#define PG_AUTOCONF_FILENAME "postgresql.auto.conf"++/*+ * Certain options can only be set at certain times. The rules are+ * like this:+ *+ * INTERNAL options cannot be set by the user at all, but only through+ * internal processes ("server_version" is an example). These are GUC+ * variables only so they can be shown by SHOW, etc.+ *+ * POSTMASTER options can only be set when the postmaster starts,+ * either from the configuration file or the command line.+ *+ * SIGHUP options can only be set at postmaster startup or by changing+ * the configuration file and sending the HUP signal to the postmaster+ * or a backend process. (Notice that the signal receipt will not be+ * evaluated immediately. The postmaster and the backend check it at a+ * certain point in their main loop. It's safer to wait than to read a+ * file asynchronously.)+ *+ * BACKEND and SU_BACKEND options can only be set at postmaster startup,+ * from the configuration file, or by client request in the connection+ * startup packet (e.g., from libpq's PGOPTIONS variable). SU_BACKEND+ * options can be set from the startup packet only when the user is a+ * superuser. Furthermore, an already-started backend will ignore changes+ * to such an option in the configuration file. The idea is that these+ * options are fixed for a given backend once it's started, but they can+ * vary across backends.+ *+ * SUSET options can be set at postmaster startup, with the SIGHUP+ * mechanism, or from the startup packet or SQL if you're a superuser.+ *+ * USERSET options can be set by anyone any time.+ */+typedef enum+{+ PGC_INTERNAL,+ PGC_POSTMASTER,+ PGC_SIGHUP,+ PGC_SU_BACKEND,+ PGC_BACKEND,+ PGC_SUSET,+ PGC_USERSET+} GucContext;++/*+ * The following type records the source of the current setting. A+ * new setting can only take effect if the previous setting had the+ * same or lower level. (E.g, changing the config file doesn't+ * override the postmaster command line.) Tracking the source allows us+ * to process sources in any convenient order without affecting results.+ * Sources <= PGC_S_OVERRIDE will set the default used by RESET, as well+ * as the current value. Note that source == PGC_S_OVERRIDE should be+ * used when setting a PGC_INTERNAL option.+ *+ * PGC_S_INTERACTIVE isn't actually a source value, but is the+ * dividing line between "interactive" and "non-interactive" sources for+ * error reporting purposes.+ *+ * PGC_S_TEST is used when testing values to be used later ("doit" will always+ * be false, so this never gets stored as the actual source of any value).+ * For example, ALTER DATABASE/ROLE tests proposed per-database or per-user+ * defaults this way, and CREATE FUNCTION tests proposed function SET clauses+ * this way. This is an interactive case, but it needs its own source value+ * because some assign hooks need to make different validity checks in this+ * case. In particular, references to nonexistent database objects generally+ * shouldn't throw hard errors in this case, at most NOTICEs, since the+ * objects might exist by the time the setting is used for real.+ *+ * NB: see GucSource_Names in guc.c if you change this.+ */+typedef enum+{+ PGC_S_DEFAULT, /* hard-wired default ("boot_val") */+ PGC_S_DYNAMIC_DEFAULT, /* default computed during initialization */+ PGC_S_ENV_VAR, /* postmaster environment variable */+ PGC_S_FILE, /* postgresql.conf */+ PGC_S_ARGV, /* postmaster command line */+ PGC_S_GLOBAL, /* global in-database setting */+ PGC_S_DATABASE, /* per-database setting */+ PGC_S_USER, /* per-user setting */+ PGC_S_DATABASE_USER, /* per-user-and-database setting */+ PGC_S_CLIENT, /* from client connection request */+ PGC_S_OVERRIDE, /* special case to forcibly set default */+ PGC_S_INTERACTIVE, /* dividing line for error reporting */+ PGC_S_TEST, /* test per-database or per-user setting */+ PGC_S_SESSION /* SET command */+} GucSource;++/*+ * Parsing the configuration file(s) will return a list of name-value pairs+ * with source location info. We also abuse this data structure to carry+ * error reports about the config files. An entry reporting an error will+ * have errmsg != NULL, and might have NULLs for name, value, and/or filename.+ *+ * If "ignore" is true, don't attempt to apply the item (it might be an error+ * report, or an item we determined to be duplicate). "applied" is set true+ * if we successfully applied, or could have applied, the setting.+ */+typedef struct ConfigVariable+{+ char *name;+ char *value;+ char *errmsg;+ char *filename;+ int sourceline;+ bool ignore;+ bool applied;+ struct ConfigVariable *next;+} ConfigVariable;++extern bool ParseConfigFile(const char *config_file, bool strict,+ const char *calling_file, int calling_lineno,+ int depth, int elevel,+ ConfigVariable **head_p, ConfigVariable **tail_p);+extern bool ParseConfigFp(FILE *fp, const char *config_file,+ int depth, int elevel,+ ConfigVariable **head_p, ConfigVariable **tail_p);+extern bool ParseConfigDirectory(const char *includedir,+ const char *calling_file, int calling_lineno,+ int depth, int elevel,+ ConfigVariable **head_p,+ ConfigVariable **tail_p);+extern void FreeConfigVariables(ConfigVariable *list);++/*+ * The possible values of an enum variable are specified by an array of+ * name-value pairs. The "hidden" flag means the value is accepted but+ * won't be displayed when guc.c is asked for a list of acceptable values.+ */+struct config_enum_entry+{+ const char *name;+ int val;+ bool hidden;+};++/*+ * Signatures for per-variable check/assign/show hook functions+ */+typedef bool (*GucBoolCheckHook) (bool *newval, void **extra, GucSource source);+typedef bool (*GucIntCheckHook) (int *newval, void **extra, GucSource source);+typedef bool (*GucRealCheckHook) (double *newval, void **extra, GucSource source);+typedef bool (*GucStringCheckHook) (char **newval, void **extra, GucSource source);+typedef bool (*GucEnumCheckHook) (int *newval, void **extra, GucSource source);++typedef void (*GucBoolAssignHook) (bool newval, void *extra);+typedef void (*GucIntAssignHook) (int newval, void *extra);+typedef void (*GucRealAssignHook) (double newval, void *extra);+typedef void (*GucStringAssignHook) (const char *newval, void *extra);+typedef void (*GucEnumAssignHook) (int newval, void *extra);++typedef const char *(*GucShowHook) (void);++/*+ * Miscellaneous+ */+typedef enum+{+ /* Types of set_config_option actions */+ GUC_ACTION_SET, /* regular SET command */+ GUC_ACTION_LOCAL, /* SET LOCAL command */+ GUC_ACTION_SAVE /* function SET option, or temp assignment */+} GucAction;++#define GUC_QUALIFIER_SEPARATOR '.'++/*+ * bit values in "flags" of a GUC variable+ */+#define GUC_LIST_INPUT 0x0001 /* input can be list format */+#define GUC_LIST_QUOTE 0x0002 /* double-quote list elements */+#define GUC_NO_SHOW_ALL 0x0004 /* exclude from SHOW ALL */+#define GUC_NO_RESET_ALL 0x0008 /* exclude from RESET ALL */+#define GUC_REPORT 0x0010 /* auto-report changes to client */+#define GUC_NOT_IN_SAMPLE 0x0020 /* not in postgresql.conf.sample */+#define GUC_DISALLOW_IN_FILE 0x0040 /* can't set in postgresql.conf */+#define GUC_CUSTOM_PLACEHOLDER 0x0080 /* placeholder for custom variable */+#define GUC_SUPERUSER_ONLY 0x0100 /* show only to superusers */+#define GUC_IS_NAME 0x0200 /* limit string to NAMEDATALEN-1 */+#define GUC_NOT_WHILE_SEC_REST 0x0400 /* can't set if security restricted */+#define GUC_DISALLOW_IN_AUTO_FILE 0x0800 /* can't set in+ * PG_AUTOCONF_FILENAME */++#define GUC_UNIT_KB 0x1000 /* value is in kilobytes */+#define GUC_UNIT_BLOCKS 0x2000 /* value is in blocks */+#define GUC_UNIT_XBLOCKS 0x3000 /* value is in xlog blocks */+#define GUC_UNIT_XSEGS 0x4000 /* value is in xlog segments */+#define GUC_UNIT_MEMORY 0xF000 /* mask for KB, BLOCKS, XBLOCKS */++#define GUC_UNIT_MS 0x10000 /* value is in milliseconds */+#define GUC_UNIT_S 0x20000 /* value is in seconds */+#define GUC_UNIT_MIN 0x30000 /* value is in minutes */+#define GUC_UNIT_TIME 0xF0000 /* mask for MS, S, MIN */++#define GUC_UNIT (GUC_UNIT_MEMORY | GUC_UNIT_TIME)+++/* GUC vars that are actually declared in guc.c, rather than elsewhere */+extern bool log_duration;+extern bool Debug_print_plan;+extern bool Debug_print_parse;+extern bool Debug_print_rewritten;+extern bool Debug_pretty_print;++extern bool log_parser_stats;+extern bool log_planner_stats;+extern bool log_executor_stats;+extern bool log_statement_stats;+extern bool log_btree_build_stats;++extern PGDLLIMPORT __thread bool check_function_bodies;+extern bool default_with_oids;+extern bool SQL_inheritance;++extern int log_min_error_statement;+extern __thread int log_min_messages;+extern __thread int client_min_messages;+extern int log_min_duration_statement;+extern int log_temp_files;++extern int temp_file_limit;++extern int num_temp_buffers;++extern char *cluster_name;+extern char *ConfigFileName;+extern char *HbaFileName;+extern char *IdentFileName;+extern char *external_pid_file;++extern char *application_name;++extern int tcp_keepalives_idle;+extern int tcp_keepalives_interval;+extern int tcp_keepalives_count;++#ifdef TRACE_SORT+extern bool trace_sort;+#endif++/*+ * Functions exported by guc.c+ */+extern void SetConfigOption(const char *name, const char *value,+ GucContext context, GucSource source);++extern void DefineCustomBoolVariable(+ const char *name,+ const char *short_desc,+ const char *long_desc,+ bool *valueAddr,+ bool bootValue,+ GucContext context,+ int flags,+ GucBoolCheckHook check_hook,+ GucBoolAssignHook assign_hook,+ GucShowHook show_hook);++extern void DefineCustomIntVariable(+ const char *name,+ const char *short_desc,+ const char *long_desc,+ int *valueAddr,+ int bootValue,+ int minValue,+ int maxValue,+ GucContext context,+ int flags,+ GucIntCheckHook check_hook,+ GucIntAssignHook assign_hook,+ GucShowHook show_hook);++extern void DefineCustomRealVariable(+ const char *name,+ const char *short_desc,+ const char *long_desc,+ double *valueAddr,+ double bootValue,+ double minValue,+ double maxValue,+ GucContext context,+ int flags,+ GucRealCheckHook check_hook,+ GucRealAssignHook assign_hook,+ GucShowHook show_hook);++extern void DefineCustomStringVariable(+ const char *name,+ const char *short_desc,+ const char *long_desc,+ char **valueAddr,+ const char *bootValue,+ GucContext context,+ int flags,+ GucStringCheckHook check_hook,+ GucStringAssignHook assign_hook,+ GucShowHook show_hook);++extern void DefineCustomEnumVariable(+ const char *name,+ const char *short_desc,+ const char *long_desc,+ int *valueAddr,+ int bootValue,+ const struct config_enum_entry * options,+ GucContext context,+ int flags,+ GucEnumCheckHook check_hook,+ GucEnumAssignHook assign_hook,+ GucShowHook show_hook);++extern void EmitWarningsOnPlaceholders(const char *className);++extern const char *GetConfigOption(const char *name, bool missing_ok,+ bool restrict_superuser);+extern const char *GetConfigOptionResetString(const char *name);+extern void ProcessConfigFile(GucContext context);+extern void InitializeGUCOptions(void);+extern bool SelectConfigFiles(const char *userDoption, const char *progname);+extern void ResetAllOptions(void);+extern void AtStart_GUC(void);+extern int NewGUCNestLevel(void);+extern void AtEOXact_GUC(bool isCommit, int nestLevel);+extern void BeginReportingGUCOptions(void);+extern void ParseLongOption(const char *string, char **name, char **value);+extern bool parse_int(const char *value, int *result, int flags,+ const char **hintmsg);+extern bool parse_real(const char *value, double *result);+extern int set_config_option(const char *name, const char *value,+ GucContext context, GucSource source,+ GucAction action, bool changeVal, int elevel,+ bool is_reload);+extern void AlterSystemSetConfigFile(AlterSystemStmt *setstmt);+extern char *GetConfigOptionByName(const char *name, const char **varname);+extern void GetConfigOptionByNum(int varnum, const char **values, bool *noshow);+extern int GetNumConfigOptions(void);++extern void SetPGVariable(const char *name, List *args, bool is_local);+extern void GetPGVariable(const char *name, DestReceiver *dest);+extern TupleDesc GetPGVariableResultDesc(const char *name);++extern void ExecSetVariableStmt(VariableSetStmt *stmt, bool isTopLevel);+extern char *ExtractSetVariableArgs(VariableSetStmt *stmt);++extern void ProcessGUCArray(ArrayType *array,+ GucContext context, GucSource source, GucAction action);+extern ArrayType *GUCArrayAdd(ArrayType *array, const char *name, const char *value);+extern ArrayType *GUCArrayDelete(ArrayType *array, const char *name);+extern ArrayType *GUCArrayReset(ArrayType *array);++#ifdef EXEC_BACKEND+extern void write_nondefault_variables(GucContext context);+extern void read_nondefault_variables(void);+#endif++/* GUC serialization */+extern Size EstimateGUCStateSpace(void);+extern void SerializeGUCState(Size maxsize, char *start_address);+extern void RestoreGUCState(void *gucstate);++/* Support for messages reported from GUC check hooks */++extern PGDLLIMPORT char *GUC_check_errmsg_string;+extern PGDLLIMPORT char *GUC_check_errdetail_string;+extern PGDLLIMPORT char *GUC_check_errhint_string;++extern void GUC_check_errcode(int sqlerrcode);++#define GUC_check_errmsg \+ pre_format_elog_string(errno, TEXTDOMAIN), \+ GUC_check_errmsg_string = format_elog_string++#define GUC_check_errdetail \+ pre_format_elog_string(errno, TEXTDOMAIN), \+ GUC_check_errdetail_string = format_elog_string++#define GUC_check_errhint \+ pre_format_elog_string(errno, TEXTDOMAIN), \+ GUC_check_errhint_string = format_elog_string+++/*+ * The following functions are not in guc.c, but are declared here to avoid+ * having to include guc.h in some widely used headers that it really doesn't+ * belong in.+ */++/* in commands/tablespace.c */+extern bool check_default_tablespace(char **newval, void **extra, GucSource source);+extern bool check_temp_tablespaces(char **newval, void **extra, GucSource source);+extern void assign_temp_tablespaces(const char *newval, void *extra);++/* in catalog/namespace.c */+extern bool check_search_path(char **newval, void **extra, GucSource source);+extern void assign_search_path(const char *newval, void *extra);++/* in access/transam/xlog.c */+extern bool check_wal_buffers(int *newval, void **extra, GucSource source);+extern void assign_xlog_sync_method(int new_sync_method, void *extra);++#endif /* GUC_H */
+ foreign/libpg_query/src/postgres/include/utils/guc_tables.h view
@@ -0,0 +1,267 @@+/*-------------------------------------------------------------------------+ *+ * guc_tables.h+ * Declarations of tables used by GUC.+ *+ * See src/backend/utils/misc/README for design notes.+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ *+ * src/include/utils/guc_tables.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef GUC_TABLES_H+#define GUC_TABLES_H 1++#include "utils/guc.h"++/*+ * GUC supports these types of variables:+ */+enum config_type+{+ PGC_BOOL,+ PGC_INT,+ PGC_REAL,+ PGC_STRING,+ PGC_ENUM+};++union config_var_val+{+ bool boolval;+ int intval;+ double realval;+ char *stringval;+ int enumval;+};++/*+ * The actual value of a GUC variable can include a malloc'd opaque struct+ * "extra", which is created by its check_hook and used by its assign_hook.+ */+typedef struct config_var_value+{+ union config_var_val val;+ void *extra;+} config_var_value;++/*+ * Groupings to help organize all the run-time options for display+ */+enum config_group+{+ UNGROUPED,+ FILE_LOCATIONS,+ CONN_AUTH,+ CONN_AUTH_SETTINGS,+ CONN_AUTH_SECURITY,+ RESOURCES,+ RESOURCES_MEM,+ RESOURCES_DISK,+ RESOURCES_KERNEL,+ RESOURCES_VACUUM_DELAY,+ RESOURCES_BGWRITER,+ RESOURCES_ASYNCHRONOUS,+ WAL,+ WAL_SETTINGS,+ WAL_CHECKPOINTS,+ WAL_ARCHIVING,+ REPLICATION,+ REPLICATION_SENDING,+ REPLICATION_MASTER,+ REPLICATION_STANDBY,+ QUERY_TUNING,+ QUERY_TUNING_METHOD,+ QUERY_TUNING_COST,+ QUERY_TUNING_GEQO,+ QUERY_TUNING_OTHER,+ LOGGING,+ LOGGING_WHERE,+ LOGGING_WHEN,+ LOGGING_WHAT,+ PROCESS_TITLE,+ STATS,+ STATS_MONITORING,+ STATS_COLLECTOR,+ AUTOVACUUM,+ CLIENT_CONN,+ CLIENT_CONN_STATEMENT,+ CLIENT_CONN_LOCALE,+ CLIENT_CONN_PRELOAD,+ CLIENT_CONN_OTHER,+ LOCK_MANAGEMENT,+ COMPAT_OPTIONS,+ COMPAT_OPTIONS_PREVIOUS,+ COMPAT_OPTIONS_CLIENT,+ ERROR_HANDLING_OPTIONS,+ PRESET_OPTIONS,+ CUSTOM_OPTIONS,+ DEVELOPER_OPTIONS+};++/*+ * Stack entry for saving the state a variable had prior to an uncommitted+ * transactional change+ */+typedef enum+{+ /* This is almost GucAction, but we need a fourth state for SET+LOCAL */+ GUC_SAVE, /* entry caused by function SET option */+ GUC_SET, /* entry caused by plain SET command */+ GUC_LOCAL, /* entry caused by SET LOCAL command */+ GUC_SET_LOCAL /* entry caused by SET then SET LOCAL */+} GucStackState;++typedef struct guc_stack+{+ struct guc_stack *prev; /* previous stack item, if any */+ int nest_level; /* nesting depth at which we made entry */+ GucStackState state; /* see enum above */+ GucSource source; /* source of the prior value */+ /* masked value's source must be PGC_S_SESSION, so no need to store it */+ GucContext scontext; /* context that set the prior value */+ GucContext masked_scontext; /* context that set the masked value */+ config_var_value prior; /* previous value of variable */+ config_var_value masked; /* SET value in a GUC_SET_LOCAL entry */+} GucStack;++/*+ * Generic fields applicable to all types of variables+ *+ * The short description should be less than 80 chars in length. Some+ * applications may use the long description as well, and will append+ * it to the short description. (separated by a newline or '. ')+ *+ * Note that sourcefile/sourceline are kept here, and not pushed into stacked+ * values, although in principle they belong with some stacked value if the+ * active value is session- or transaction-local. This is to avoid bloating+ * stack entries. We know they are only relevant when source == PGC_S_FILE.+ */+struct config_generic+{+ /* constant fields, must be set correctly in initial value: */+ const char *name; /* name of variable - MUST BE FIRST */+ GucContext context; /* context required to set the variable */+ enum config_group group; /* to help organize variables by function */+ const char *short_desc; /* short desc. of this variable's purpose */+ const char *long_desc; /* long desc. of this variable's purpose */+ int flags; /* flag bits, see guc.h */+ /* variable fields, initialized at runtime: */+ enum config_type vartype; /* type of variable (set only at startup) */+ int status; /* status bits, see below */+ GucSource source; /* source of the current actual value */+ GucSource reset_source; /* source of the reset_value */+ GucContext scontext; /* context that set the current value */+ GucContext reset_scontext; /* context that set the reset value */+ GucStack *stack; /* stacked prior values */+ void *extra; /* "extra" pointer for current actual value */+ char *sourcefile; /* file current setting is from (NULL if not+ * set in config file) */+ int sourceline; /* line in source file */+};++/* bit values in status field */+#define GUC_IS_IN_FILE 0x0001 /* found it in config file */+/*+ * Caution: the GUC_IS_IN_FILE bit is transient state for ProcessConfigFile.+ * Do not assume that its value represents useful information elsewhere.+ */+#define GUC_PENDING_RESTART 0x0002+++/* GUC records for specific variable types */++struct config_bool+{+ struct config_generic gen;+ /* constant fields, must be set correctly in initial value: */+ bool *variable;+ bool boot_val;+ GucBoolCheckHook check_hook;+ GucBoolAssignHook assign_hook;+ GucShowHook show_hook;+ /* variable fields, initialized at runtime: */+ bool reset_val;+ void *reset_extra;+};++struct config_int+{+ struct config_generic gen;+ /* constant fields, must be set correctly in initial value: */+ int *variable;+ int boot_val;+ int min;+ int max;+ GucIntCheckHook check_hook;+ GucIntAssignHook assign_hook;+ GucShowHook show_hook;+ /* variable fields, initialized at runtime: */+ int reset_val;+ void *reset_extra;+};++struct config_real+{+ struct config_generic gen;+ /* constant fields, must be set correctly in initial value: */+ double *variable;+ double boot_val;+ double min;+ double max;+ GucRealCheckHook check_hook;+ GucRealAssignHook assign_hook;+ GucShowHook show_hook;+ /* variable fields, initialized at runtime: */+ double reset_val;+ void *reset_extra;+};++struct config_string+{+ struct config_generic gen;+ /* constant fields, must be set correctly in initial value: */+ char **variable;+ const char *boot_val;+ GucStringCheckHook check_hook;+ GucStringAssignHook assign_hook;+ GucShowHook show_hook;+ /* variable fields, initialized at runtime: */+ char *reset_val;+ void *reset_extra;+};++struct config_enum+{+ struct config_generic gen;+ /* constant fields, must be set correctly in initial value: */+ int *variable;+ int boot_val;+ const struct config_enum_entry *options;+ GucEnumCheckHook check_hook;+ GucEnumAssignHook assign_hook;+ GucShowHook show_hook;+ /* variable fields, initialized at runtime: */+ int reset_val;+ void *reset_extra;+};++/* constant tables corresponding to enums above and in guc.h */+extern const char *const config_group_names[];+extern const char *const config_type_names[];+extern const char *const GucContext_Names[];+extern const char *const GucSource_Names[];++/* get the current set of variables */+extern struct config_generic **get_guc_variables(void);++extern void build_guc_variables(void);++/* search in enum options */+extern const char *config_enum_lookup_by_value(struct config_enum * record, int val);+extern bool config_enum_lookup_by_name(struct config_enum * record,+ const char *value, int *retval);++#endif /* GUC_TABLES_H */
+ foreign/libpg_query/src/postgres/include/utils/hsearch.h view
@@ -0,0 +1,160 @@+/*-------------------------------------------------------------------------+ *+ * hsearch.h+ * exported definitions for utils/hash/dynahash.c; see notes therein+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/utils/hsearch.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef HSEARCH_H+#define HSEARCH_H+++/*+ * Hash functions must have this signature.+ */+typedef uint32 (*HashValueFunc) (const void *key, Size keysize);++/*+ * Key comparison functions must have this signature. Comparison functions+ * return zero for match, nonzero for no match. (The comparison function+ * definition is designed to allow memcmp() and strncmp() to be used directly+ * as key comparison functions.)+ */+typedef int (*HashCompareFunc) (const void *key1, const void *key2,+ Size keysize);++/*+ * Key copying functions must have this signature. The return value is not+ * used. (The definition is set up to allow memcpy() and strlcpy() to be+ * used directly.)+ */+typedef void *(*HashCopyFunc) (void *dest, const void *src, Size keysize);++/*+ * Space allocation function for a hashtable --- designed to match malloc().+ * Note: there is no free function API; can't destroy a hashtable unless you+ * use the default allocator.+ */+typedef void *(*HashAllocFunc) (Size request);++/*+ * HASHELEMENT is the private part of a hashtable entry. The caller's data+ * follows the HASHELEMENT structure (on a MAXALIGN'd boundary). The hash key+ * is expected to be at the start of the caller's hash entry data structure.+ */+typedef struct HASHELEMENT+{+ struct HASHELEMENT *link; /* link to next entry in same bucket */+ uint32 hashvalue; /* hash function result for this entry */+} HASHELEMENT;++/* Hash table header struct is an opaque type known only within dynahash.c */+typedef struct HASHHDR HASHHDR;++/* Hash table control struct is an opaque type known only within dynahash.c */+typedef struct HTAB HTAB;++/* Parameter data structure for hash_create */+/* Only those fields indicated by hash_flags need be set */+typedef struct HASHCTL+{+ long num_partitions; /* # partitions (must be power of 2) */+ long ssize; /* segment size */+ long dsize; /* (initial) directory size */+ long max_dsize; /* limit to dsize if dir size is limited */+ long ffactor; /* fill factor */+ Size keysize; /* hash key length in bytes */+ Size entrysize; /* total user element size in bytes */+ HashValueFunc hash; /* hash function */+ HashCompareFunc match; /* key comparison function */+ HashCopyFunc keycopy; /* key copying function */+ HashAllocFunc alloc; /* memory allocator */+ MemoryContext hcxt; /* memory context to use for allocations */+ HASHHDR *hctl; /* location of header in shared mem */+} HASHCTL;++/* Flags to indicate which parameters are supplied */+#define HASH_PARTITION 0x0001 /* Hashtable is used w/partitioned locking */+#define HASH_SEGMENT 0x0002 /* Set segment size */+#define HASH_DIRSIZE 0x0004 /* Set directory size (initial and max) */+#define HASH_FFACTOR 0x0008 /* Set fill factor */+#define HASH_ELEM 0x0010 /* Set keysize and entrysize */+#define HASH_BLOBS 0x0020 /* Select support functions for binary keys */+#define HASH_FUNCTION 0x0040 /* Set user defined hash function */+#define HASH_COMPARE 0x0080 /* Set user defined comparison function */+#define HASH_KEYCOPY 0x0100 /* Set user defined key-copying function */+#define HASH_ALLOC 0x0200 /* Set memory allocator */+#define HASH_CONTEXT 0x0400 /* Set memory allocation context */+#define HASH_SHARED_MEM 0x0800 /* Hashtable is in shared memory */+#define HASH_ATTACH 0x1000 /* Do not initialize hctl */+#define HASH_FIXED_SIZE 0x2000 /* Initial size is a hard limit */+++/* max_dsize value to indicate expansible directory */+#define NO_MAX_DSIZE (-1)++/* hash_search operations */+typedef enum+{+ HASH_FIND,+ HASH_ENTER,+ HASH_REMOVE,+ HASH_ENTER_NULL+} HASHACTION;++/* hash_seq status (should be considered an opaque type by callers) */+typedef struct+{+ HTAB *hashp;+ uint32 curBucket; /* index of current bucket */+ HASHELEMENT *curEntry; /* current entry in bucket */+} HASH_SEQ_STATUS;++/*+ * prototypes for functions in dynahash.c+ */+extern HTAB *hash_create(const char *tabname, long nelem,+ HASHCTL *info, int flags);+extern void hash_destroy(HTAB *hashp);+extern void hash_stats(const char *where, HTAB *hashp);+extern void *hash_search(HTAB *hashp, const void *keyPtr, HASHACTION action,+ bool *foundPtr);+extern uint32 get_hash_value(HTAB *hashp, const void *keyPtr);+extern void *hash_search_with_hash_value(HTAB *hashp, const void *keyPtr,+ uint32 hashvalue, HASHACTION action,+ bool *foundPtr);+extern bool hash_update_hash_key(HTAB *hashp, void *existingEntry,+ const void *newKeyPtr);+extern long hash_get_num_entries(HTAB *hashp);+extern void hash_seq_init(HASH_SEQ_STATUS *status, HTAB *hashp);+extern void *hash_seq_search(HASH_SEQ_STATUS *status);+extern void hash_seq_term(HASH_SEQ_STATUS *status);+extern void hash_freeze(HTAB *hashp);+extern Size hash_estimate_size(long num_entries, Size entrysize);+extern long hash_select_dirsize(long num_entries);+extern Size hash_get_shared_size(HASHCTL *info, int flags);+extern void AtEOXact_HashTables(bool isCommit);+extern void AtEOSubXact_HashTables(bool isCommit, int nestDepth);++/*+ * prototypes for functions in hashfn.c+ *+ * Note: It is deprecated for callers of hash_create to explicitly specify+ * string_hash, tag_hash, uint32_hash, or oid_hash. Just set HASH_BLOBS or+ * not. Use HASH_FUNCTION only when you want something other than those.+ */+extern uint32 string_hash(const void *key, Size keysize);+extern uint32 tag_hash(const void *key, Size keysize);+extern uint32 uint32_hash(const void *key, Size keysize);+extern uint32 bitmap_hash(const void *key, Size keysize);+extern int bitmap_match(const void *key1, const void *key2, Size keysize);++#define oid_hash uint32_hash /* Remove me eventually */++#endif /* HSEARCH_H */
+ foreign/libpg_query/src/postgres/include/utils/int8.h view
@@ -0,0 +1,129 @@+/*-------------------------------------------------------------------------+ *+ * int8.h+ * Declarations for operations on 64-bit integers.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/utils/int8.h+ *+ * NOTES+ * These data types are supported on all 64-bit architectures, and may+ * be supported through libraries on some 32-bit machines. If your machine+ * is not currently supported, then please try to make it so, then post+ * patches to the postgresql.org hackers mailing list.+ *+ *-------------------------------------------------------------------------+ */+#ifndef INT8_H+#define INT8_H++#include "fmgr.h"+++extern bool scanint8(const char *str, bool errorOK, int64 *result);++extern Datum int8in(PG_FUNCTION_ARGS);+extern Datum int8out(PG_FUNCTION_ARGS);+extern Datum int8recv(PG_FUNCTION_ARGS);+extern Datum int8send(PG_FUNCTION_ARGS);++extern Datum int8eq(PG_FUNCTION_ARGS);+extern Datum int8ne(PG_FUNCTION_ARGS);+extern Datum int8lt(PG_FUNCTION_ARGS);+extern Datum int8gt(PG_FUNCTION_ARGS);+extern Datum int8le(PG_FUNCTION_ARGS);+extern Datum int8ge(PG_FUNCTION_ARGS);++extern Datum int84eq(PG_FUNCTION_ARGS);+extern Datum int84ne(PG_FUNCTION_ARGS);+extern Datum int84lt(PG_FUNCTION_ARGS);+extern Datum int84gt(PG_FUNCTION_ARGS);+extern Datum int84le(PG_FUNCTION_ARGS);+extern Datum int84ge(PG_FUNCTION_ARGS);++extern Datum int48eq(PG_FUNCTION_ARGS);+extern Datum int48ne(PG_FUNCTION_ARGS);+extern Datum int48lt(PG_FUNCTION_ARGS);+extern Datum int48gt(PG_FUNCTION_ARGS);+extern Datum int48le(PG_FUNCTION_ARGS);+extern Datum int48ge(PG_FUNCTION_ARGS);++extern Datum int82eq(PG_FUNCTION_ARGS);+extern Datum int82ne(PG_FUNCTION_ARGS);+extern Datum int82lt(PG_FUNCTION_ARGS);+extern Datum int82gt(PG_FUNCTION_ARGS);+extern Datum int82le(PG_FUNCTION_ARGS);+extern Datum int82ge(PG_FUNCTION_ARGS);++extern Datum int28eq(PG_FUNCTION_ARGS);+extern Datum int28ne(PG_FUNCTION_ARGS);+extern Datum int28lt(PG_FUNCTION_ARGS);+extern Datum int28gt(PG_FUNCTION_ARGS);+extern Datum int28le(PG_FUNCTION_ARGS);+extern Datum int28ge(PG_FUNCTION_ARGS);++extern Datum int8um(PG_FUNCTION_ARGS);+extern Datum int8up(PG_FUNCTION_ARGS);+extern Datum int8pl(PG_FUNCTION_ARGS);+extern Datum int8mi(PG_FUNCTION_ARGS);+extern Datum int8mul(PG_FUNCTION_ARGS);+extern Datum int8div(PG_FUNCTION_ARGS);+extern Datum int8abs(PG_FUNCTION_ARGS);+extern Datum int8mod(PG_FUNCTION_ARGS);+extern Datum int8inc(PG_FUNCTION_ARGS);+extern Datum int8dec(PG_FUNCTION_ARGS);+extern Datum int8inc_any(PG_FUNCTION_ARGS);+extern Datum int8inc_float8_float8(PG_FUNCTION_ARGS);+extern Datum int8dec_any(PG_FUNCTION_ARGS);+extern Datum int8larger(PG_FUNCTION_ARGS);+extern Datum int8smaller(PG_FUNCTION_ARGS);++extern Datum int8and(PG_FUNCTION_ARGS);+extern Datum int8or(PG_FUNCTION_ARGS);+extern Datum int8xor(PG_FUNCTION_ARGS);+extern Datum int8not(PG_FUNCTION_ARGS);+extern Datum int8shl(PG_FUNCTION_ARGS);+extern Datum int8shr(PG_FUNCTION_ARGS);++extern Datum int84pl(PG_FUNCTION_ARGS);+extern Datum int84mi(PG_FUNCTION_ARGS);+extern Datum int84mul(PG_FUNCTION_ARGS);+extern Datum int84div(PG_FUNCTION_ARGS);++extern Datum int48pl(PG_FUNCTION_ARGS);+extern Datum int48mi(PG_FUNCTION_ARGS);+extern Datum int48mul(PG_FUNCTION_ARGS);+extern Datum int48div(PG_FUNCTION_ARGS);++extern Datum int82pl(PG_FUNCTION_ARGS);+extern Datum int82mi(PG_FUNCTION_ARGS);+extern Datum int82mul(PG_FUNCTION_ARGS);+extern Datum int82div(PG_FUNCTION_ARGS);++extern Datum int28pl(PG_FUNCTION_ARGS);+extern Datum int28mi(PG_FUNCTION_ARGS);+extern Datum int28mul(PG_FUNCTION_ARGS);+extern Datum int28div(PG_FUNCTION_ARGS);++extern Datum int48(PG_FUNCTION_ARGS);+extern Datum int84(PG_FUNCTION_ARGS);++extern Datum int28(PG_FUNCTION_ARGS);+extern Datum int82(PG_FUNCTION_ARGS);++extern Datum i8tod(PG_FUNCTION_ARGS);+extern Datum dtoi8(PG_FUNCTION_ARGS);++extern Datum i8tof(PG_FUNCTION_ARGS);+extern Datum ftoi8(PG_FUNCTION_ARGS);++extern Datum i8tooid(PG_FUNCTION_ARGS);+extern Datum oidtoi8(PG_FUNCTION_ARGS);++extern Datum generate_series_int8(PG_FUNCTION_ARGS);+extern Datum generate_series_step_int8(PG_FUNCTION_ARGS);++#endif /* INT8_H */
+ foreign/libpg_query/src/postgres/include/utils/inval.h view
@@ -0,0 +1,64 @@+/*-------------------------------------------------------------------------+ *+ * inval.h+ * POSTGRES cache invalidation dispatcher definitions.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/utils/inval.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef INVAL_H+#define INVAL_H++#include "access/htup.h"+#include "storage/relfilenode.h"+#include "utils/relcache.h"+++typedef void (*SyscacheCallbackFunction) (Datum arg, int cacheid, uint32 hashvalue);+typedef void (*RelcacheCallbackFunction) (Datum arg, Oid relid);+++extern void AcceptInvalidationMessages(void);++extern void AtEOXact_Inval(bool isCommit);++extern void AtEOSubXact_Inval(bool isCommit);++extern void AtPrepare_Inval(void);++extern void PostPrepare_Inval(void);++extern void CommandEndInvalidationMessages(void);++extern void CacheInvalidateHeapTuple(Relation relation,+ HeapTuple tuple,+ HeapTuple newtuple);++extern void CacheInvalidateCatalog(Oid catalogId);++extern void CacheInvalidateRelcache(Relation relation);++extern void CacheInvalidateRelcacheByTuple(HeapTuple classTuple);++extern void CacheInvalidateRelcacheByRelid(Oid relid);++extern void CacheInvalidateSmgr(RelFileNodeBackend rnode);++extern void CacheInvalidateRelmap(Oid databaseId);++extern void CacheRegisterSyscacheCallback(int cacheid,+ SyscacheCallbackFunction func,+ Datum arg);++extern void CacheRegisterRelcacheCallback(RelcacheCallbackFunction func,+ Datum arg);++extern void CallSyscacheCallbacks(int cacheid, uint32 hashvalue);++extern void InvalidateSystemCaches(void);+#endif /* INVAL_H */
+ foreign/libpg_query/src/postgres/include/utils/lsyscache.h view
@@ -0,0 +1,166 @@+/*-------------------------------------------------------------------------+ *+ * lsyscache.h+ * Convenience routines for common queries in the system catalog cache.+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/utils/lsyscache.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef LSYSCACHE_H+#define LSYSCACHE_H++#include "access/attnum.h"+#include "access/htup.h"+#include "nodes/pg_list.h"++/* Result list element for get_op_btree_interpretation */+typedef struct OpBtreeInterpretation+{+ Oid opfamily_id; /* btree opfamily containing operator */+ int strategy; /* its strategy number */+ Oid oplefttype; /* declared left input datatype */+ Oid oprighttype; /* declared right input datatype */+} OpBtreeInterpretation;++/* I/O function selector for get_type_io_data */+typedef enum IOFuncSelector+{+ IOFunc_input,+ IOFunc_output,+ IOFunc_receive,+ IOFunc_send+} IOFuncSelector;++/* Hook for plugins to get control in get_attavgwidth() */+typedef int32 (*get_attavgwidth_hook_type) (Oid relid, AttrNumber attnum);+extern PGDLLIMPORT get_attavgwidth_hook_type get_attavgwidth_hook;++extern bool op_in_opfamily(Oid opno, Oid opfamily);+extern int get_op_opfamily_strategy(Oid opno, Oid opfamily);+extern Oid get_op_opfamily_sortfamily(Oid opno, Oid opfamily);+extern void get_op_opfamily_properties(Oid opno, Oid opfamily, bool ordering_op,+ int *strategy,+ Oid *lefttype,+ Oid *righttype);+extern Oid get_opfamily_member(Oid opfamily, Oid lefttype, Oid righttype,+ int16 strategy);+extern bool get_ordering_op_properties(Oid opno,+ Oid *opfamily, Oid *opcintype, int16 *strategy);+extern Oid get_equality_op_for_ordering_op(Oid opno, bool *reverse);+extern Oid get_ordering_op_for_equality_op(Oid opno, bool use_lhs_type);+extern List *get_mergejoin_opfamilies(Oid opno);+extern bool get_compatible_hash_operators(Oid opno,+ Oid *lhs_opno, Oid *rhs_opno);+extern bool get_op_hash_functions(Oid opno,+ RegProcedure *lhs_procno, RegProcedure *rhs_procno);+extern List *get_op_btree_interpretation(Oid opno);+extern bool equality_ops_are_compatible(Oid opno1, Oid opno2);+extern Oid get_opfamily_proc(Oid opfamily, Oid lefttype, Oid righttype,+ int16 procnum);+extern char *get_attname(Oid relid, AttrNumber attnum);+extern char *get_relid_attribute_name(Oid relid, AttrNumber attnum);+extern AttrNumber get_attnum(Oid relid, const char *attname);+extern Oid get_atttype(Oid relid, AttrNumber attnum);+extern int32 get_atttypmod(Oid relid, AttrNumber attnum);+extern void get_atttypetypmodcoll(Oid relid, AttrNumber attnum,+ Oid *typid, int32 *typmod, Oid *collid);+extern char *get_collation_name(Oid colloid);+extern char *get_constraint_name(Oid conoid);+extern char *get_language_name(Oid langoid, bool missing_ok);+extern Oid get_opclass_family(Oid opclass);+extern Oid get_opclass_input_type(Oid opclass);+extern RegProcedure get_opcode(Oid opno);+extern char *get_opname(Oid opno);+extern void op_input_types(Oid opno, Oid *lefttype, Oid *righttype);+extern bool op_mergejoinable(Oid opno, Oid inputtype);+extern bool op_hashjoinable(Oid opno, Oid inputtype);+extern bool op_strict(Oid opno);+extern char op_volatile(Oid opno);+extern Oid get_commutator(Oid opno);+extern Oid get_negator(Oid opno);+extern RegProcedure get_oprrest(Oid opno);+extern RegProcedure get_oprjoin(Oid opno);+extern char *get_func_name(Oid funcid);+extern Oid get_func_namespace(Oid funcid);+extern Oid get_func_rettype(Oid funcid);+extern int get_func_nargs(Oid funcid);+extern Oid get_func_signature(Oid funcid, Oid **argtypes, int *nargs);+extern Oid get_func_variadictype(Oid funcid);+extern bool get_func_retset(Oid funcid);+extern bool func_strict(Oid funcid);+extern char func_volatile(Oid funcid);+extern bool get_func_leakproof(Oid funcid);+extern float4 get_func_cost(Oid funcid);+extern float4 get_func_rows(Oid funcid);+extern Oid get_relname_relid(const char *relname, Oid relnamespace);+extern char *get_rel_name(Oid relid);+extern Oid get_rel_namespace(Oid relid);+extern Oid get_rel_type_id(Oid relid);+extern char get_rel_relkind(Oid relid);+extern Oid get_rel_tablespace(Oid relid);+extern Oid get_transform_fromsql(Oid typid, Oid langid, List *trftypes);+extern Oid get_transform_tosql(Oid typid, Oid langid, List *trftypes);+extern bool get_typisdefined(Oid typid);+extern int16 get_typlen(Oid typid);+extern bool get_typbyval(Oid typid);+extern void get_typlenbyval(Oid typid, int16 *typlen, bool *typbyval);+extern void get_typlenbyvalalign(Oid typid, int16 *typlen, bool *typbyval,+ char *typalign);+extern Oid getTypeIOParam(HeapTuple typeTuple);+extern void get_type_io_data(Oid typid,+ IOFuncSelector which_func,+ int16 *typlen,+ bool *typbyval,+ char *typalign,+ char *typdelim,+ Oid *typioparam,+ Oid *func);+extern char get_typstorage(Oid typid);+extern Node *get_typdefault(Oid typid);+extern char get_typtype(Oid typid);+extern bool type_is_rowtype(Oid typid);+extern bool type_is_enum(Oid typid);+extern bool type_is_range(Oid typid);+extern void get_type_category_preferred(Oid typid,+ char *typcategory,+ bool *typispreferred);+extern Oid get_typ_typrelid(Oid typid);+extern Oid get_element_type(Oid typid);+extern Oid get_array_type(Oid typid);+extern Oid get_promoted_array_type(Oid typid);+extern Oid get_base_element_type(Oid typid);+extern void getTypeInputInfo(Oid type, Oid *typInput, Oid *typIOParam);+extern void getTypeOutputInfo(Oid type, Oid *typOutput, bool *typIsVarlena);+extern void getTypeBinaryInputInfo(Oid type, Oid *typReceive, Oid *typIOParam);+extern void getTypeBinaryOutputInfo(Oid type, Oid *typSend, bool *typIsVarlena);+extern Oid get_typmodin(Oid typid);+extern Oid get_typcollation(Oid typid);+extern bool type_is_collatable(Oid typid);+extern Oid getBaseType(Oid typid);+extern Oid getBaseTypeAndTypmod(Oid typid, int32 *typmod);+extern int32 get_typavgwidth(Oid typid, int32 typmod);+extern int32 get_attavgwidth(Oid relid, AttrNumber attnum);+extern bool get_attstatsslot(HeapTuple statstuple,+ Oid atttype, int32 atttypmod,+ int reqkind, Oid reqop,+ Oid *actualop,+ Datum **values, int *nvalues,+ float4 **numbers, int *nnumbers);+extern void free_attstatsslot(Oid atttype,+ Datum *values, int nvalues,+ float4 *numbers, int nnumbers);+extern char *get_namespace_name(Oid nspid);+extern char *get_namespace_name_or_temp(Oid nspid);+extern Oid get_range_subtype(Oid rangeOid);++#define type_is_array(typid) (get_element_type(typid) != InvalidOid)+/* type_is_array_domain accepts both plain arrays and domains over arrays */+#define type_is_array_domain(typid) (get_base_element_type(typid) != InvalidOid)++#define TypeIsToastable(typid) (get_typstorage(typid) != 'p')++#endif /* LSYSCACHE_H */
+ foreign/libpg_query/src/postgres/include/utils/memdebug.h view
@@ -0,0 +1,34 @@+/*-------------------------------------------------------------------------+ *+ * memdebug.h+ * Memory debugging support.+ *+ * Currently, this file either wraps <valgrind/memcheck.h> or substitutes+ * empty definitions for Valgrind client request macros we use.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/utils/memdebug.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef MEMDEBUG_H+#define MEMDEBUG_H++#ifdef USE_VALGRIND+#include <valgrind/memcheck.h>+#else+#define VALGRIND_CHECK_MEM_IS_DEFINED(addr, size) do {} while (0)+#define VALGRIND_CREATE_MEMPOOL(context, redzones, zeroed) do {} while (0)+#define VALGRIND_DESTROY_MEMPOOL(context) do {} while (0)+#define VALGRIND_MAKE_MEM_DEFINED(addr, size) do {} while (0)+#define VALGRIND_MAKE_MEM_NOACCESS(addr, size) do {} while (0)+#define VALGRIND_MAKE_MEM_UNDEFINED(addr, size) do {} while (0)+#define VALGRIND_MEMPOOL_ALLOC(context, addr, size) do {} while (0)+#define VALGRIND_MEMPOOL_FREE(context, addr) do {} while (0)+#define VALGRIND_MEMPOOL_CHANGE(context, optr, nptr, size) do {} while (0)+#endif++#endif /* MEMDEBUG_H */
+ foreign/libpg_query/src/postgres/include/utils/memutils.h view
@@ -0,0 +1,161 @@+/*-------------------------------------------------------------------------+ *+ * memutils.h+ * This file contains declarations for memory allocation utility+ * functions. These are functions that are not quite widely used+ * enough to justify going in utils/palloc.h, but are still part+ * of the API of the memory management subsystem.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/utils/memutils.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef MEMUTILS_H+#define MEMUTILS_H++#include "nodes/memnodes.h"+++/*+ * MaxAllocSize, MaxAllocHugeSize+ * Quasi-arbitrary limits on size of allocations.+ *+ * Note:+ * There is no guarantee that smaller allocations will succeed, but+ * larger requests will be summarily denied.+ *+ * palloc() enforces MaxAllocSize, chosen to correspond to the limiting size+ * of varlena objects under TOAST. See VARSIZE_4B() and related macros in+ * postgres.h. Many datatypes assume that any allocatable size can be+ * represented in a varlena header. This limit also permits a caller to use+ * an "int" variable for an index into or length of an allocation. Callers+ * careful to avoid these hazards can access the higher limit with+ * MemoryContextAllocHuge(). Both limits permit code to assume that it may+ * compute twice an allocation's size without overflow.+ */+#define MaxAllocSize ((Size) 0x3fffffff) /* 1 gigabyte - 1 */++#define AllocSizeIsValid(size) ((Size) (size) <= MaxAllocSize)++#define MaxAllocHugeSize ((Size) -1 >> 1) /* SIZE_MAX / 2 */++#define AllocHugeSizeIsValid(size) ((Size) (size) <= MaxAllocHugeSize)++/*+ * All chunks allocated by any memory context manager are required to be+ * preceded by a StandardChunkHeader at a spacing of STANDARDCHUNKHEADERSIZE.+ * A currently-allocated chunk must contain a backpointer to its owning+ * context as well as the allocated size of the chunk. The backpointer is+ * used by pfree() and repalloc() to find the context to call. The allocated+ * size is not absolutely essential, but it's expected to be needed by any+ * reasonable implementation.+ */+typedef struct StandardChunkHeader+{+ MemoryContext context; /* owning context */+ Size size; /* size of data space allocated in chunk */+#ifdef MEMORY_CONTEXT_CHECKING+ /* when debugging memory usage, also store actual requested size */+ Size requested_size;+#endif+} StandardChunkHeader;++#define STANDARDCHUNKHEADERSIZE MAXALIGN(sizeof(StandardChunkHeader))+++/*+ * Standard top-level memory contexts.+ *+ * Only TopMemoryContext and ErrorContext are initialized by+ * MemoryContextInit() itself.+ */+extern PGDLLIMPORT __thread MemoryContext TopMemoryContext;+extern PGDLLIMPORT __thread MemoryContext ErrorContext;+extern PGDLLIMPORT MemoryContext PostmasterContext;+extern PGDLLIMPORT MemoryContext CacheMemoryContext;+extern PGDLLIMPORT MemoryContext MessageContext;+extern PGDLLIMPORT MemoryContext TopTransactionContext;+extern PGDLLIMPORT MemoryContext CurTransactionContext;++/* This is a transient link to the active portal's memory context: */+extern PGDLLIMPORT MemoryContext PortalContext;++/* Backwards compatibility macro */+#define MemoryContextResetAndDeleteChildren(ctx) MemoryContextReset(ctx)+++/*+ * Memory-context-type-independent functions in mcxt.c+ */+extern void MemoryContextInit(void);+extern void MemoryContextReset(MemoryContext context);+extern void MemoryContextDelete(MemoryContext context);+extern void MemoryContextResetOnly(MemoryContext context);+extern void MemoryContextResetChildren(MemoryContext context);+extern void MemoryContextDeleteChildren(MemoryContext context);+extern void MemoryContextSetParent(MemoryContext context,+ MemoryContext new_parent);+extern Size GetMemoryChunkSpace(void *pointer);+extern MemoryContext GetMemoryChunkContext(void *pointer);+extern MemoryContext MemoryContextGetParent(MemoryContext context);+extern bool MemoryContextIsEmpty(MemoryContext context);+extern void MemoryContextStats(MemoryContext context);+extern void MemoryContextAllowInCriticalSection(MemoryContext context,+ bool allow);++#ifdef MEMORY_CONTEXT_CHECKING+extern void MemoryContextCheck(MemoryContext context);+#endif+extern bool MemoryContextContains(MemoryContext context, void *pointer);++/*+ * This routine handles the context-type-independent part of memory+ * context creation. It's intended to be called from context-type-+ * specific creation routines, and noplace else.+ */+extern MemoryContext MemoryContextCreate(NodeTag tag, Size size,+ MemoryContextMethods *methods,+ MemoryContext parent,+ const char *name);+++/*+ * Memory-context-type-specific functions+ */++/* aset.c */+extern MemoryContext AllocSetContextCreate(MemoryContext parent,+ const char *name,+ Size minContextSize,+ Size initBlockSize,+ Size maxBlockSize);++/*+ * Recommended default alloc parameters, suitable for "ordinary" contexts+ * that might hold quite a lot of data.+ */+#define ALLOCSET_DEFAULT_MINSIZE 0+#define ALLOCSET_DEFAULT_INITSIZE (8 * 1024)+#define ALLOCSET_DEFAULT_MAXSIZE (8 * 1024 * 1024)++/*+ * Recommended alloc parameters for "small" contexts that are not expected+ * to contain much data (for example, a context to contain a query plan).+ */+#define ALLOCSET_SMALL_MINSIZE 0+#define ALLOCSET_SMALL_INITSIZE (1 * 1024)+#define ALLOCSET_SMALL_MAXSIZE (8 * 1024)++/*+ * Threshold above which a request in an AllocSet context is certain to be+ * allocated separately (and thereby have constant allocation overhead).+ * Few callers should be interested in this, but tuplesort/tuplestore need+ * to know it.+ */+#define ALLOCSET_SEPARATE_THRESHOLD 8192++#endif /* MEMUTILS_H */
+ foreign/libpg_query/src/postgres/include/utils/numeric.h view
@@ -0,0 +1,63 @@+/*-------------------------------------------------------------------------+ *+ * numeric.h+ * Definitions for the exact numeric data type of Postgres+ *+ * Original coding 1998, Jan Wieck. Heavily revised 2003, Tom Lane.+ *+ * Copyright (c) 1998-2015, PostgreSQL Global Development Group+ *+ * src/include/utils/numeric.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef _PG_NUMERIC_H_+#define _PG_NUMERIC_H_++#include "fmgr.h"++/*+ * Hardcoded precision limit - arbitrary, but must be small enough that+ * dscale values will fit in 14 bits.+ */+#define NUMERIC_MAX_PRECISION 1000++/*+ * Internal limits on the scales chosen for calculation results+ */+#define NUMERIC_MAX_DISPLAY_SCALE NUMERIC_MAX_PRECISION+#define NUMERIC_MIN_DISPLAY_SCALE 0++#define NUMERIC_MAX_RESULT_SCALE (NUMERIC_MAX_PRECISION * 2)++/*+ * For inherently inexact calculations such as division and square root,+ * we try to get at least this many significant digits; the idea is to+ * deliver a result no worse than float8 would.+ */+#define NUMERIC_MIN_SIG_DIGITS 16++/* The actual contents of Numeric are private to numeric.c */+struct NumericData;+typedef struct NumericData *Numeric;++/*+ * fmgr interface macros+ */++#define DatumGetNumeric(X) ((Numeric) PG_DETOAST_DATUM(X))+#define DatumGetNumericCopy(X) ((Numeric) PG_DETOAST_DATUM_COPY(X))+#define NumericGetDatum(X) PointerGetDatum(X)+#define PG_GETARG_NUMERIC(n) DatumGetNumeric(PG_GETARG_DATUM(n))+#define PG_GETARG_NUMERIC_COPY(n) DatumGetNumericCopy(PG_GETARG_DATUM(n))+#define PG_RETURN_NUMERIC(x) return NumericGetDatum(x)++/*+ * Utility functions in numeric.c+ */+extern bool numeric_is_nan(Numeric num);+int32 numeric_maximum_size(int32 typmod);+extern char *numeric_out_sci(Numeric num, int scale);+extern char *numeric_normalize(Numeric num);++#endif /* _PG_NUMERIC_H_ */
+ foreign/libpg_query/src/postgres/include/utils/palloc.h view
@@ -0,0 +1,143 @@+/*-------------------------------------------------------------------------+ *+ * palloc.h+ * POSTGRES memory allocator definitions.+ *+ * This file contains the basic memory allocation interface that is+ * needed by almost every backend module. It is included directly by+ * postgres.h, so the definitions here are automatically available+ * everywhere. Keep it lean!+ *+ * Memory allocation occurs within "contexts". Every chunk obtained from+ * palloc()/MemoryContextAlloc() is allocated within a specific context.+ * The entire contents of a context can be freed easily and quickly by+ * resetting or deleting the context --- this is both faster and less+ * prone to memory-leakage bugs than releasing chunks individually.+ * We organize contexts into context trees to allow fine-grain control+ * over chunk lifetime while preserving the certainty that we will free+ * everything that should be freed. See utils/mmgr/README for more info.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/utils/palloc.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef PALLOC_H+#define PALLOC_H++/*+ * Type MemoryContextData is declared in nodes/memnodes.h. Most users+ * of memory allocation should just treat it as an abstract type, so we+ * do not provide the struct contents here.+ */+typedef struct MemoryContextData *MemoryContext;++/*+ * A memory context can have callback functions registered on it. Any such+ * function will be called once just before the context is next reset or+ * deleted. The MemoryContextCallback struct describing such a callback+ * typically would be allocated within the context itself, thereby avoiding+ * any need to manage it explicitly (the reset/delete action will free it).+ */+typedef void (*MemoryContextCallbackFunction) (void *arg);++typedef struct MemoryContextCallback+{+ MemoryContextCallbackFunction func; /* function to call */+ void *arg; /* argument to pass it */+ struct MemoryContextCallback *next; /* next in list of callbacks */+} MemoryContextCallback;++/*+ * CurrentMemoryContext is the default allocation context for palloc().+ * Avoid accessing it directly! Instead, use MemoryContextSwitchTo()+ * to change the setting.+ */+extern PGDLLIMPORT __thread MemoryContext CurrentMemoryContext;++/*+ * Flags for MemoryContextAllocExtended.+ */+#define MCXT_ALLOC_HUGE 0x01 /* allow huge allocation (> 1 GB) */+#define MCXT_ALLOC_NO_OOM 0x02 /* no failure if out-of-memory */+#define MCXT_ALLOC_ZERO 0x04 /* zero allocated memory */++/*+ * Fundamental memory-allocation operations (more are in utils/memutils.h)+ */+extern void *MemoryContextAlloc(MemoryContext context, Size size);+extern void *MemoryContextAllocZero(MemoryContext context, Size size);+extern void *MemoryContextAllocZeroAligned(MemoryContext context, Size size);+extern void *MemoryContextAllocExtended(MemoryContext context,+ Size size, int flags);++extern void *palloc(Size size);+extern void *palloc0(Size size);+extern void *palloc_extended(Size size, int flags);+extern void *repalloc(void *pointer, Size size);+extern void pfree(void *pointer);++/*+ * The result of palloc() is always word-aligned, so we can skip testing+ * alignment of the pointer when deciding which MemSet variant to use.+ * Note that this variant does not offer any advantage, and should not be+ * used, unless its "sz" argument is a compile-time constant; therefore, the+ * issue that it evaluates the argument multiple times isn't a problem in+ * practice.+ */+#define palloc0fast(sz) \+ ( MemSetTest(0, sz) ? \+ MemoryContextAllocZeroAligned(CurrentMemoryContext, sz) : \+ MemoryContextAllocZero(CurrentMemoryContext, sz) )++/* Higher-limit allocators. */+extern void *MemoryContextAllocHuge(MemoryContext context, Size size);+extern void *repalloc_huge(void *pointer, Size size);++/*+ * MemoryContextSwitchTo can't be a macro in standard C compilers.+ * But we can make it an inline function if the compiler supports it.+ * See STATIC_IF_INLINE in c.h.+ *+ * Although this header file is nominally backend-only, certain frontend+ * programs like pg_controldata include it via postgres.h. For some compilers+ * it's necessary to hide the inline definition of MemoryContextSwitchTo in+ * this scenario; hence the #ifndef FRONTEND.+ */++#ifndef FRONTEND+#ifndef PG_USE_INLINE+extern MemoryContext MemoryContextSwitchTo(MemoryContext context);+#endif /* !PG_USE_INLINE */+#if defined(PG_USE_INLINE) || defined(MCXT_INCLUDE_DEFINITIONS)+STATIC_IF_INLINE MemoryContext+MemoryContextSwitchTo(MemoryContext context)+{+ MemoryContext old = CurrentMemoryContext;++ CurrentMemoryContext = context;+ return old;+}+#endif /* PG_USE_INLINE || MCXT_INCLUDE_DEFINITIONS */+#endif /* FRONTEND */++/* Registration of memory context reset/delete callbacks */+extern void MemoryContextRegisterResetCallback(MemoryContext context,+ MemoryContextCallback *cb);++/*+ * These are like standard strdup() except the copied string is+ * allocated in a context, not with malloc().+ */+extern char *MemoryContextStrdup(MemoryContext context, const char *string);+extern char *pstrdup(const char *in);+extern char *pnstrdup(const char *in, Size len);++/* sprintf into a palloc'd buffer --- these are in psprintf.c */+extern char *psprintf(const char *fmt,...) pg_attribute_printf(1, 2);+extern size_t pvsnprintf(char *buf, size_t len, const char *fmt, va_list args) pg_attribute_printf(3, 0);++#endif /* PALLOC_H */
+ foreign/libpg_query/src/postgres/include/utils/pg_locale.h view
@@ -0,0 +1,84 @@+/*-----------------------------------------------------------------------+ *+ * PostgreSQL locale utilities+ *+ * src/include/utils/pg_locale.h+ *+ * Copyright (c) 2002-2015, PostgreSQL Global Development Group+ *+ *-----------------------------------------------------------------------+ */++#ifndef _PG_LOCALE_+#define _PG_LOCALE_++#include <locale.h>+#if defined(LOCALE_T_IN_XLOCALE) || defined(WCSTOMBS_L_IN_XLOCALE)+#include <xlocale.h>+#endif++#include "utils/guc.h"+++/* GUC settings */+extern char *locale_messages;+extern char *locale_monetary;+extern char *locale_numeric;+extern char *locale_time;++/* lc_time localization cache */+extern char *localized_abbrev_days[];+extern char *localized_full_days[];+extern char *localized_abbrev_months[];+extern char *localized_full_months[];+++extern bool check_locale_messages(char **newval, void **extra, GucSource source);+extern void assign_locale_messages(const char *newval, void *extra);+extern bool check_locale_monetary(char **newval, void **extra, GucSource source);+extern void assign_locale_monetary(const char *newval, void *extra);+extern bool check_locale_numeric(char **newval, void **extra, GucSource source);+extern void assign_locale_numeric(const char *newval, void *extra);+extern bool check_locale_time(char **newval, void **extra, GucSource source);+extern void assign_locale_time(const char *newval, void *extra);++extern bool check_locale(int category, const char *locale, char **canonname);+extern char *pg_perm_setlocale(int category, const char *locale);+extern void check_strxfrm_bug(void);++extern bool lc_collate_is_c(Oid collation);+extern bool lc_ctype_is_c(Oid collation);++/*+ * Return the POSIX lconv struct (contains number/money formatting+ * information) with locale information for all categories.+ */+extern struct lconv *PGLC_localeconv(void);++extern void cache_locale_time(void);+++/*+ * We define our own wrapper around locale_t so we can keep the same+ * function signatures for all builds, while not having to create a+ * fake version of the standard type locale_t in the global namespace.+ * The fake version of pg_locale_t can be checked for truth; that's+ * about all it will be needed for.+ */+#ifdef HAVE_LOCALE_T+typedef locale_t pg_locale_t;+#else+typedef int pg_locale_t;+#endif++extern pg_locale_t pg_newlocale_from_collation(Oid collid);++/* These functions convert from/to libc's wchar_t, *not* pg_wchar_t */+#ifdef USE_WIDE_UPPER_LOWER+extern size_t wchar2char(char *to, const wchar_t *from, size_t tolen,+ pg_locale_t locale);+extern size_t char2wchar(wchar_t *to, size_t tolen,+ const char *from, size_t fromlen, pg_locale_t locale);+#endif++#endif /* _PG_LOCALE_ */
+ foreign/libpg_query/src/postgres/include/utils/plancache.h view
@@ -0,0 +1,178 @@+/*-------------------------------------------------------------------------+ *+ * plancache.h+ * Plan cache definitions.+ *+ * See plancache.c for comments.+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/utils/plancache.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef PLANCACHE_H+#define PLANCACHE_H++#include "access/tupdesc.h"+#include "nodes/params.h"++#define CACHEDPLANSOURCE_MAGIC 195726186+#define CACHEDPLAN_MAGIC 953717834++/*+ * CachedPlanSource (which might better have been called CachedQuery)+ * represents a SQL query that we expect to use multiple times. It stores+ * the query source text, the raw parse tree, and the analyzed-and-rewritten+ * query tree, as well as adjunct data. Cache invalidation can happen as a+ * result of DDL affecting objects used by the query. In that case we discard+ * the analyzed-and-rewritten query tree, and rebuild it when next needed.+ *+ * An actual execution plan, represented by CachedPlan, is derived from the+ * CachedPlanSource when we need to execute the query. The plan could be+ * either generic (usable with any set of plan parameters) or custom (for a+ * specific set of parameters). plancache.c contains the logic that decides+ * which way to do it for any particular execution. If we are using a generic+ * cached plan then it is meant to be re-used across multiple executions, so+ * callers must always treat CachedPlans as read-only.+ *+ * Once successfully built and "saved", CachedPlanSources typically live+ * for the life of the backend, although they can be dropped explicitly.+ * CachedPlans are reference-counted and go away automatically when the last+ * reference is dropped. A CachedPlan can outlive the CachedPlanSource it+ * was created from.+ *+ * An "unsaved" CachedPlanSource can be used for generating plans, but it+ * lives in transient storage and will not be updated in response to sinval+ * events.+ *+ * CachedPlans made from saved CachedPlanSources are likewise in permanent+ * storage, so to avoid memory leaks, the reference-counted references to them+ * must be held in permanent data structures or ResourceOwners. CachedPlans+ * made from unsaved CachedPlanSources are in children of the caller's+ * memory context, so references to them should not be longer-lived than+ * that context. (Reference counting is somewhat pro forma in that case,+ * though it may be useful if the CachedPlan can be discarded early.)+ *+ * A CachedPlanSource has two associated memory contexts: one that holds the+ * struct itself, the query source text and the raw parse tree, and another+ * context that holds the rewritten query tree and associated data. This+ * allows the query tree to be discarded easily when it is invalidated.+ *+ * Some callers wish to use the CachedPlan API even with one-shot queries+ * that have no reason to be saved at all. We therefore support a "oneshot"+ * variant that does no data copying or invalidation checking. In this case+ * there are no separate memory contexts: the CachedPlanSource struct and+ * all subsidiary data live in the caller's CurrentMemoryContext, and there+ * is no way to free memory short of clearing that entire context. A oneshot+ * plan is always treated as unsaved.+ *+ * Note: the string referenced by commandTag is not subsidiary storage;+ * it is assumed to be a compile-time-constant string. As with portals,+ * commandTag shall be NULL if and only if the original query string (before+ * rewriting) was an empty string.+ */+typedef struct CachedPlanSource+{+ int magic; /* should equal CACHEDPLANSOURCE_MAGIC */+ Node *raw_parse_tree; /* output of raw_parser(), or NULL */+ const char *query_string; /* source text of query */+ const char *commandTag; /* command tag (a constant!), or NULL */+ Oid *param_types; /* array of parameter type OIDs, or NULL */+ int num_params; /* length of param_types array */+ ParserSetupHook parserSetup; /* alternative parameter spec method */+ void *parserSetupArg;+ int cursor_options; /* cursor options used for planning */+ bool fixed_result; /* disallow change in result tupdesc? */+ TupleDesc resultDesc; /* result type; NULL = doesn't return tuples */+ MemoryContext context; /* memory context holding all above */+ /* These fields describe the current analyzed-and-rewritten query tree: */+ List *query_list; /* list of Query nodes, or NIL if not valid */+ List *relationOids; /* OIDs of relations the queries depend on */+ List *invalItems; /* other dependencies, as PlanInvalItems */+ struct OverrideSearchPath *search_path; /* search_path used for+ * parsing and planning */+ Oid planUserId; /* User-id that the plan depends on */+ MemoryContext query_context; /* context holding the above, or NULL */+ /* If we have a generic plan, this is a reference-counted link to it: */+ struct CachedPlan *gplan; /* generic plan, or NULL if not valid */+ /* Some state flags: */+ bool is_oneshot; /* is it a "oneshot" plan? */+ bool is_complete; /* has CompleteCachedPlan been done? */+ bool is_saved; /* has CachedPlanSource been "saved"? */+ bool is_valid; /* is the query_list currently valid? */+ int generation; /* increments each time we create a plan */+ /* If CachedPlanSource has been saved, it is a member of a global list */+ struct CachedPlanSource *next_saved; /* list link, if so */+ /* State kept to help decide whether to use custom or generic plans: */+ double generic_cost; /* cost of generic plan, or -1 if not known */+ double total_custom_cost; /* total cost of custom plans so far */+ int num_custom_plans; /* number of plans included in total */+ bool hasRowSecurity; /* planned with row security? */+ bool row_security_env; /* row security setting when planned */+} CachedPlanSource;++/*+ * CachedPlan represents an execution plan derived from a CachedPlanSource.+ * The reference count includes both the link from the parent CachedPlanSource+ * (if any), and any active plan executions, so the plan can be discarded+ * exactly when refcount goes to zero. Both the struct itself and the+ * subsidiary data live in the context denoted by the context field.+ * This makes it easy to free a no-longer-needed cached plan. (However,+ * if is_oneshot is true, the context does not belong solely to the CachedPlan+ * so no freeing is possible.)+ */+typedef struct CachedPlan+{+ int magic; /* should equal CACHEDPLAN_MAGIC */+ List *stmt_list; /* list of statement nodes (PlannedStmts and+ * bare utility statements) */+ bool is_oneshot; /* is it a "oneshot" plan? */+ bool is_saved; /* is CachedPlan in a long-lived context? */+ bool is_valid; /* is the stmt_list currently valid? */+ TransactionId saved_xmin; /* if valid, replan when TransactionXmin+ * changes from this value */+ int generation; /* parent's generation number for this plan */+ int refcount; /* count of live references to this struct */+ MemoryContext context; /* context containing this CachedPlan */+} CachedPlan;+++extern void InitPlanCache(void);+extern void ResetPlanCache(void);++extern CachedPlanSource *CreateCachedPlan(Node *raw_parse_tree,+ const char *query_string,+ const char *commandTag);+extern CachedPlanSource *CreateOneShotCachedPlan(Node *raw_parse_tree,+ const char *query_string,+ const char *commandTag);+extern void CompleteCachedPlan(CachedPlanSource *plansource,+ List *querytree_list,+ MemoryContext querytree_context,+ Oid *param_types,+ int num_params,+ ParserSetupHook parserSetup,+ void *parserSetupArg,+ int cursor_options,+ bool fixed_result);++extern void SaveCachedPlan(CachedPlanSource *plansource);+extern void DropCachedPlan(CachedPlanSource *plansource);++extern void CachedPlanSetParentContext(CachedPlanSource *plansource,+ MemoryContext newcontext);++extern CachedPlanSource *CopyCachedPlan(CachedPlanSource *plansource);++extern bool CachedPlanIsValid(CachedPlanSource *plansource);++extern List *CachedPlanGetTargetList(CachedPlanSource *plansource);++extern CachedPlan *GetCachedPlan(CachedPlanSource *plansource,+ ParamListInfo boundParams,+ bool useResOwner);+extern void ReleaseCachedPlan(CachedPlan *plan, bool useResOwner);++#endif /* PLANCACHE_H */
+ foreign/libpg_query/src/postgres/include/utils/portal.h view
@@ -0,0 +1,231 @@+/*-------------------------------------------------------------------------+ *+ * portal.h+ * POSTGRES portal definitions.+ *+ * A portal is an abstraction which represents the execution state of+ * a running or runnable query. Portals support both SQL-level CURSORs+ * and protocol-level portals.+ *+ * Scrolling (nonsequential access) and suspension of execution are allowed+ * only for portals that contain a single SELECT-type query. We do not want+ * to let the client suspend an update-type query partway through! Because+ * the query rewriter does not allow arbitrary ON SELECT rewrite rules,+ * only queries that were originally update-type could produce multiple+ * plan trees; so the restriction to a single query is not a problem+ * in practice.+ *+ * For SQL cursors, we support three kinds of scroll behavior:+ *+ * (1) Neither NO SCROLL nor SCROLL was specified: to remain backward+ * compatible, we allow backward fetches here, unless it would+ * impose additional runtime overhead to do so.+ *+ * (2) NO SCROLL was specified: don't allow any backward fetches.+ *+ * (3) SCROLL was specified: allow all kinds of backward fetches, even+ * if we need to take a performance hit to do so. (The planner sticks+ * a Materialize node atop the query plan if needed.)+ *+ * Case #1 is converted to #2 or #3 by looking at the query itself and+ * determining if scrollability can be supported without additional+ * overhead.+ *+ * Protocol-level portals have no nonsequential-fetch API and so the+ * distinction doesn't matter for them. They are always initialized+ * to look like NO SCROLL cursors.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/utils/portal.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef PORTAL_H+#define PORTAL_H++#include "datatype/timestamp.h"+#include "executor/execdesc.h"+#include "utils/plancache.h"+#include "utils/resowner.h"++/*+ * We have several execution strategies for Portals, depending on what+ * query or queries are to be executed. (Note: in all cases, a Portal+ * executes just a single source-SQL query, and thus produces just a+ * single result from the user's viewpoint. However, the rule rewriter+ * may expand the single source query to zero or many actual queries.)+ *+ * PORTAL_ONE_SELECT: the portal contains one single SELECT query. We run+ * the Executor incrementally as results are demanded. This strategy also+ * supports holdable cursors (the Executor results can be dumped into a+ * tuplestore for access after transaction completion).+ *+ * PORTAL_ONE_RETURNING: the portal contains a single INSERT/UPDATE/DELETE+ * query with a RETURNING clause (plus possibly auxiliary queries added by+ * rule rewriting). On first execution, we run the portal to completion+ * and dump the primary query's results into the portal tuplestore; the+ * results are then returned to the client as demanded. (We can't support+ * suspension of the query partway through, because the AFTER TRIGGER code+ * can't cope, and also because we don't want to risk failing to execute+ * all the auxiliary queries.)+ *+ * PORTAL_ONE_MOD_WITH: the portal contains one single SELECT query, but+ * it has data-modifying CTEs. This is currently treated the same as the+ * PORTAL_ONE_RETURNING case because of the possibility of needing to fire+ * triggers. It may act more like PORTAL_ONE_SELECT in future.+ *+ * PORTAL_UTIL_SELECT: the portal contains a utility statement that returns+ * a SELECT-like result (for example, EXPLAIN or SHOW). On first execution,+ * we run the statement and dump its results into the portal tuplestore;+ * the results are then returned to the client as demanded.+ *+ * PORTAL_MULTI_QUERY: all other cases. Here, we do not support partial+ * execution: the portal's queries will be run to completion on first call.+ */+typedef enum PortalStrategy+{+ PORTAL_ONE_SELECT,+ PORTAL_ONE_RETURNING,+ PORTAL_ONE_MOD_WITH,+ PORTAL_UTIL_SELECT,+ PORTAL_MULTI_QUERY+} PortalStrategy;++/*+ * A portal is always in one of these states. It is possible to transit+ * from ACTIVE back to READY if the query is not run to completion;+ * otherwise we never back up in status.+ */+typedef enum PortalStatus+{+ PORTAL_NEW, /* freshly created */+ PORTAL_DEFINED, /* PortalDefineQuery done */+ PORTAL_READY, /* PortalStart complete, can run it */+ PORTAL_ACTIVE, /* portal is running (can't delete it) */+ PORTAL_DONE, /* portal is finished (don't re-run it) */+ PORTAL_FAILED /* portal got error (can't re-run it) */+} PortalStatus;++typedef struct PortalData *Portal;++typedef struct PortalData+{+ /* Bookkeeping data */+ const char *name; /* portal's name */+ const char *prepStmtName; /* source prepared statement (NULL if none) */+ MemoryContext heap; /* subsidiary memory for portal */+ ResourceOwner resowner; /* resources owned by portal */+ void (*cleanup) (Portal portal); /* cleanup hook */++ /*+ * State data for remembering which subtransaction(s) the portal was+ * created or used in. If the portal is held over from a previous+ * transaction, both subxids are InvalidSubTransactionId. Otherwise,+ * createSubid is the creating subxact and activeSubid is the last subxact+ * in which we ran the portal.+ */+ SubTransactionId createSubid; /* the creating subxact */+ SubTransactionId activeSubid; /* the last subxact with activity */++ /* The query or queries the portal will execute */+ const char *sourceText; /* text of query (as of 8.4, never NULL) */+ const char *commandTag; /* command tag for original query */+ List *stmts; /* PlannedStmts and/or utility statements */+ CachedPlan *cplan; /* CachedPlan, if stmts are from one */++ ParamListInfo portalParams; /* params to pass to query */++ /* Features/options */+ PortalStrategy strategy; /* see above */+ int cursorOptions; /* DECLARE CURSOR option bits */++ /* Status data */+ PortalStatus status; /* see above */+ bool portalPinned; /* a pinned portal can't be dropped */++ /* If not NULL, Executor is active; call ExecutorEnd eventually: */+ QueryDesc *queryDesc; /* info needed for executor invocation */++ /* If portal returns tuples, this is their tupdesc: */+ TupleDesc tupDesc; /* descriptor for result tuples */+ /* and these are the format codes to use for the columns: */+ int16 *formats; /* a format code for each column */++ /*+ * Where we store tuples for a held cursor or a PORTAL_ONE_RETURNING or+ * PORTAL_UTIL_SELECT query. (A cursor held past the end of its+ * transaction no longer has any active executor state.)+ */+ Tuplestorestate *holdStore; /* store for holdable cursors */+ MemoryContext holdContext; /* memory containing holdStore */++ /*+ * atStart, atEnd and portalPos indicate the current cursor position.+ * portalPos is zero before the first row, N after fetching N'th row of+ * query. After we run off the end, portalPos = # of rows in query, and+ * atEnd is true. If portalPos overflows, set posOverflow (this causes us+ * to stop relying on its value for navigation). Note that atStart+ * implies portalPos == 0, but not the reverse (portalPos could have+ * overflowed).+ */+ bool atStart;+ bool atEnd;+ bool posOverflow;+ long portalPos;++ /* Presentation data, primarily used by the pg_cursors system view */+ TimestampTz creation_time; /* time at which this portal was defined */+ bool visible; /* include this portal in pg_cursors? */+} PortalData;++/*+ * PortalIsValid+ * True iff portal is valid.+ */+#define PortalIsValid(p) PointerIsValid(p)++/*+ * Access macros for Portal ... use these in preference to field access.+ */+#define PortalGetQueryDesc(portal) ((portal)->queryDesc)+#define PortalGetHeapMemory(portal) ((portal)->heap)+#define PortalGetPrimaryStmt(portal) PortalListGetPrimaryStmt((portal)->stmts)+++/* Prototypes for functions in utils/mmgr/portalmem.c */+extern void EnablePortalManager(void);+extern bool PreCommit_Portals(bool isPrepare);+extern void AtAbort_Portals(void);+extern void AtCleanup_Portals(void);+extern void AtSubCommit_Portals(SubTransactionId mySubid,+ SubTransactionId parentSubid,+ ResourceOwner parentXactOwner);+extern void AtSubAbort_Portals(SubTransactionId mySubid,+ SubTransactionId parentSubid,+ ResourceOwner myXactOwner,+ ResourceOwner parentXactOwner);+extern void AtSubCleanup_Portals(SubTransactionId mySubid);+extern Portal CreatePortal(const char *name, bool allowDup, bool dupSilent);+extern Portal CreateNewPortal(void);+extern void PinPortal(Portal portal);+extern void UnpinPortal(Portal portal);+extern void MarkPortalActive(Portal portal);+extern void MarkPortalDone(Portal portal);+extern void MarkPortalFailed(Portal portal);+extern void PortalDrop(Portal portal, bool isTopCommit);+extern Portal GetPortalByName(const char *name);+extern void PortalDefineQuery(Portal portal,+ const char *prepStmtName,+ const char *sourceText,+ const char *commandTag,+ List *stmts,+ CachedPlan *cplan);+extern Node *PortalListGetPrimaryStmt(List *stmts);+extern void PortalCreateHoldStore(Portal portal);+extern void PortalHashTableDeleteAll(void);+extern bool ThereAreNoReadyPortals(void);++#endif /* PORTAL_H */
+ foreign/libpg_query/src/postgres/include/utils/probes.h view
@@ -0,0 +1,114 @@+#define TRACE_POSTGRESQL_TRANSACTION_START(INT1)+#define TRACE_POSTGRESQL_TRANSACTION_START_ENABLED() (0)+#define TRACE_POSTGRESQL_TRANSACTION_COMMIT(INT1)+#define TRACE_POSTGRESQL_TRANSACTION_COMMIT_ENABLED() (0)+#define TRACE_POSTGRESQL_TRANSACTION_ABORT(INT1)+#define TRACE_POSTGRESQL_TRANSACTION_ABORT_ENABLED() (0)+#define TRACE_POSTGRESQL_LWLOCK_ACQUIRE(INT1, INT2, INT3)+#define TRACE_POSTGRESQL_LWLOCK_ACQUIRE_ENABLED() (0)+#define TRACE_POSTGRESQL_LWLOCK_RELEASE(INT1, INT2)+#define TRACE_POSTGRESQL_LWLOCK_RELEASE_ENABLED() (0)+#define TRACE_POSTGRESQL_LWLOCK_WAIT_START(INT1, INT2, INT3)+#define TRACE_POSTGRESQL_LWLOCK_WAIT_START_ENABLED() (0)+#define TRACE_POSTGRESQL_LWLOCK_WAIT_DONE(INT1, INT2, INT3)+#define TRACE_POSTGRESQL_LWLOCK_WAIT_DONE_ENABLED() (0)+#define TRACE_POSTGRESQL_LWLOCK_CONDACQUIRE(INT1, INT2, INT3)+#define TRACE_POSTGRESQL_LWLOCK_CONDACQUIRE_ENABLED() (0)+#define TRACE_POSTGRESQL_LWLOCK_CONDACQUIRE_FAIL(INT1, INT2, INT3)+#define TRACE_POSTGRESQL_LWLOCK_CONDACQUIRE_FAIL_ENABLED() (0)+#define TRACE_POSTGRESQL_LWLOCK_ACQUIRE_OR_WAIT(INT1, INT2, INT3)+#define TRACE_POSTGRESQL_LWLOCK_ACQUIRE_OR_WAIT_ENABLED() (0)+#define TRACE_POSTGRESQL_LWLOCK_ACQUIRE_OR_WAIT_FAIL(INT1, INT2, INT3)+#define TRACE_POSTGRESQL_LWLOCK_ACQUIRE_OR_WAIT_FAIL_ENABLED() (0)+#define TRACE_POSTGRESQL_LOCK_WAIT_START(INT1, INT2, INT3, INT4, INT5, INT6)+#define TRACE_POSTGRESQL_LOCK_WAIT_START_ENABLED() (0)+#define TRACE_POSTGRESQL_LOCK_WAIT_DONE(INT1, INT2, INT3, INT4, INT5, INT6)+#define TRACE_POSTGRESQL_LOCK_WAIT_DONE_ENABLED() (0)+#define TRACE_POSTGRESQL_QUERY_PARSE_START(INT1)+#define TRACE_POSTGRESQL_QUERY_PARSE_START_ENABLED() (0)+#define TRACE_POSTGRESQL_QUERY_PARSE_DONE(INT1)+#define TRACE_POSTGRESQL_QUERY_PARSE_DONE_ENABLED() (0)+#define TRACE_POSTGRESQL_QUERY_REWRITE_START(INT1)+#define TRACE_POSTGRESQL_QUERY_REWRITE_START_ENABLED() (0)+#define TRACE_POSTGRESQL_QUERY_REWRITE_DONE(INT1)+#define TRACE_POSTGRESQL_QUERY_REWRITE_DONE_ENABLED() (0)+#define TRACE_POSTGRESQL_QUERY_PLAN_START()+#define TRACE_POSTGRESQL_QUERY_PLAN_START_ENABLED() (0)+#define TRACE_POSTGRESQL_QUERY_PLAN_DONE()+#define TRACE_POSTGRESQL_QUERY_PLAN_DONE_ENABLED() (0)+#define TRACE_POSTGRESQL_QUERY_EXECUTE_START()+#define TRACE_POSTGRESQL_QUERY_EXECUTE_START_ENABLED() (0)+#define TRACE_POSTGRESQL_QUERY_EXECUTE_DONE()+#define TRACE_POSTGRESQL_QUERY_EXECUTE_DONE_ENABLED() (0)+#define TRACE_POSTGRESQL_QUERY_START(INT1)+#define TRACE_POSTGRESQL_QUERY_START_ENABLED() (0)+#define TRACE_POSTGRESQL_QUERY_DONE(INT1)+#define TRACE_POSTGRESQL_QUERY_DONE_ENABLED() (0)+#define TRACE_POSTGRESQL_STATEMENT_STATUS(INT1)+#define TRACE_POSTGRESQL_STATEMENT_STATUS_ENABLED() (0)+#define TRACE_POSTGRESQL_SORT_START(INT1, INT2, INT3, INT4, INT5)+#define TRACE_POSTGRESQL_SORT_START_ENABLED() (0)+#define TRACE_POSTGRESQL_SORT_DONE(INT1, INT2)+#define TRACE_POSTGRESQL_SORT_DONE_ENABLED() (0)+#define TRACE_POSTGRESQL_BUFFER_READ_START(INT1, INT2, INT3, INT4, INT5, INT6, INT7)+#define TRACE_POSTGRESQL_BUFFER_READ_START_ENABLED() (0)+#define TRACE_POSTGRESQL_BUFFER_READ_DONE(INT1, INT2, INT3, INT4, INT5, INT6, INT7, INT8)+#define TRACE_POSTGRESQL_BUFFER_READ_DONE_ENABLED() (0)+#define TRACE_POSTGRESQL_BUFFER_FLUSH_START(INT1, INT2, INT3, INT4, INT5)+#define TRACE_POSTGRESQL_BUFFER_FLUSH_START_ENABLED() (0)+#define TRACE_POSTGRESQL_BUFFER_FLUSH_DONE(INT1, INT2, INT3, INT4, INT5)+#define TRACE_POSTGRESQL_BUFFER_FLUSH_DONE_ENABLED() (0)+#define TRACE_POSTGRESQL_BUFFER_CHECKPOINT_START(INT1)+#define TRACE_POSTGRESQL_BUFFER_CHECKPOINT_START_ENABLED() (0)+#define TRACE_POSTGRESQL_BUFFER_CHECKPOINT_SYNC_START()+#define TRACE_POSTGRESQL_BUFFER_CHECKPOINT_SYNC_START_ENABLED() (0)+#define TRACE_POSTGRESQL_BUFFER_CHECKPOINT_DONE()+#define TRACE_POSTGRESQL_BUFFER_CHECKPOINT_DONE_ENABLED() (0)+#define TRACE_POSTGRESQL_BUFFER_SYNC_START(INT1, INT2)+#define TRACE_POSTGRESQL_BUFFER_SYNC_START_ENABLED() (0)+#define TRACE_POSTGRESQL_BUFFER_SYNC_WRITTEN(INT1)+#define TRACE_POSTGRESQL_BUFFER_SYNC_WRITTEN_ENABLED() (0)+#define TRACE_POSTGRESQL_BUFFER_SYNC_DONE(INT1, INT2, INT3)+#define TRACE_POSTGRESQL_BUFFER_SYNC_DONE_ENABLED() (0)+#define TRACE_POSTGRESQL_BUFFER_WRITE_DIRTY_START(INT1, INT2, INT3, INT4, INT5)+#define TRACE_POSTGRESQL_BUFFER_WRITE_DIRTY_START_ENABLED() (0)+#define TRACE_POSTGRESQL_BUFFER_WRITE_DIRTY_DONE(INT1, INT2, INT3, INT4, INT5)+#define TRACE_POSTGRESQL_BUFFER_WRITE_DIRTY_DONE_ENABLED() (0)+#define TRACE_POSTGRESQL_DEADLOCK_FOUND()+#define TRACE_POSTGRESQL_DEADLOCK_FOUND_ENABLED() (0)+#define TRACE_POSTGRESQL_CHECKPOINT_START(INT1)+#define TRACE_POSTGRESQL_CHECKPOINT_START_ENABLED() (0)+#define TRACE_POSTGRESQL_CHECKPOINT_DONE(INT1, INT2, INT3, INT4, INT5)+#define TRACE_POSTGRESQL_CHECKPOINT_DONE_ENABLED() (0)+#define TRACE_POSTGRESQL_CLOG_CHECKPOINT_START(INT1)+#define TRACE_POSTGRESQL_CLOG_CHECKPOINT_START_ENABLED() (0)+#define TRACE_POSTGRESQL_CLOG_CHECKPOINT_DONE(INT1)+#define TRACE_POSTGRESQL_CLOG_CHECKPOINT_DONE_ENABLED() (0)+#define TRACE_POSTGRESQL_SUBTRANS_CHECKPOINT_START(INT1)+#define TRACE_POSTGRESQL_SUBTRANS_CHECKPOINT_START_ENABLED() (0)+#define TRACE_POSTGRESQL_SUBTRANS_CHECKPOINT_DONE(INT1)+#define TRACE_POSTGRESQL_SUBTRANS_CHECKPOINT_DONE_ENABLED() (0)+#define TRACE_POSTGRESQL_MULTIXACT_CHECKPOINT_START(INT1)+#define TRACE_POSTGRESQL_MULTIXACT_CHECKPOINT_START_ENABLED() (0)+#define TRACE_POSTGRESQL_MULTIXACT_CHECKPOINT_DONE(INT1)+#define TRACE_POSTGRESQL_MULTIXACT_CHECKPOINT_DONE_ENABLED() (0)+#define TRACE_POSTGRESQL_TWOPHASE_CHECKPOINT_START()+#define TRACE_POSTGRESQL_TWOPHASE_CHECKPOINT_START_ENABLED() (0)+#define TRACE_POSTGRESQL_TWOPHASE_CHECKPOINT_DONE()+#define TRACE_POSTGRESQL_TWOPHASE_CHECKPOINT_DONE_ENABLED() (0)+#define TRACE_POSTGRESQL_SMGR_MD_READ_START(INT1, INT2, INT3, INT4, INT5, INT6)+#define TRACE_POSTGRESQL_SMGR_MD_READ_START_ENABLED() (0)+#define TRACE_POSTGRESQL_SMGR_MD_READ_DONE(INT1, INT2, INT3, INT4, INT5, INT6, INT7, INT8)+#define TRACE_POSTGRESQL_SMGR_MD_READ_DONE_ENABLED() (0)+#define TRACE_POSTGRESQL_SMGR_MD_WRITE_START(INT1, INT2, INT3, INT4, INT5, INT6)+#define TRACE_POSTGRESQL_SMGR_MD_WRITE_START_ENABLED() (0)+#define TRACE_POSTGRESQL_SMGR_MD_WRITE_DONE(INT1, INT2, INT3, INT4, INT5, INT6, INT7, INT8)+#define TRACE_POSTGRESQL_SMGR_MD_WRITE_DONE_ENABLED() (0)+#define TRACE_POSTGRESQL_XLOG_INSERT(INT1, INT2)+#define TRACE_POSTGRESQL_XLOG_INSERT_ENABLED() (0)+#define TRACE_POSTGRESQL_XLOG_SWITCH()+#define TRACE_POSTGRESQL_XLOG_SWITCH_ENABLED() (0)+#define TRACE_POSTGRESQL_WAL_BUFFER_WRITE_DIRTY_START()+#define TRACE_POSTGRESQL_WAL_BUFFER_WRITE_DIRTY_START_ENABLED() (0)+#define TRACE_POSTGRESQL_WAL_BUFFER_WRITE_DIRTY_DONE()+#define TRACE_POSTGRESQL_WAL_BUFFER_WRITE_DIRTY_DONE_ENABLED() (0)
+ foreign/libpg_query/src/postgres/include/utils/ps_status.h view
@@ -0,0 +1,26 @@+/*-------------------------------------------------------------------------+ *+ * ps_status.h+ *+ * Declarations for backend/utils/misc/ps_status.c+ *+ * src/include/utils/ps_status.h+ *+ *-------------------------------------------------------------------------+ */++#ifndef PS_STATUS_H+#define PS_STATUS_H++extern bool update_process_title;++extern char **save_ps_display_args(int argc, char **argv);++extern void init_ps_display(const char *username, const char *dbname,+ const char *host_info, const char *initial_str);++extern void set_ps_display(const char *activity, bool force);++extern const char *get_ps_display(int *displen);++#endif /* PS_STATUS_H */
+ foreign/libpg_query/src/postgres/include/utils/rel.h view
@@ -0,0 +1,513 @@+/*-------------------------------------------------------------------------+ *+ * rel.h+ * POSTGRES relation descriptor (a/k/a relcache entry) definitions.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/utils/rel.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef REL_H+#define REL_H++#include "access/tupdesc.h"+#include "catalog/pg_am.h"+#include "catalog/pg_class.h"+#include "catalog/pg_index.h"+#include "fmgr.h"+#include "nodes/bitmapset.h"+#include "rewrite/prs2lock.h"+#include "storage/block.h"+#include "storage/relfilenode.h"+#include "utils/relcache.h"+#include "utils/reltrigger.h"+++/*+ * LockRelId and LockInfo really belong to lmgr.h, but it's more convenient+ * to declare them here so we can have a LockInfoData field in a Relation.+ */++typedef struct LockRelId+{+ Oid relId; /* a relation identifier */+ Oid dbId; /* a database identifier */+} LockRelId;++typedef struct LockInfoData+{+ LockRelId lockRelId;+} LockInfoData;++typedef LockInfoData *LockInfo;+++/*+ * Cached lookup information for the frequently used index access method+ * functions, defined by the pg_am row associated with an index relation.+ */+typedef struct RelationAmInfo+{+ FmgrInfo aminsert;+ FmgrInfo ambeginscan;+ FmgrInfo amgettuple;+ FmgrInfo amgetbitmap;+ FmgrInfo amrescan;+ FmgrInfo amendscan;+ FmgrInfo ammarkpos;+ FmgrInfo amrestrpos;+ FmgrInfo amcanreturn;+} RelationAmInfo;++/*+ * Here are the contents of a relation cache entry.+ */++typedef struct RelationData+{+ RelFileNode rd_node; /* relation physical identifier */+ /* use "struct" here to avoid needing to include smgr.h: */+ struct SMgrRelationData *rd_smgr; /* cached file handle, or NULL */+ int rd_refcnt; /* reference count */+ BackendId rd_backend; /* owning backend id, if temporary relation */+ bool rd_islocaltemp; /* rel is a temp rel of this session */+ bool rd_isnailed; /* rel is nailed in cache */+ bool rd_isvalid; /* relcache entry is valid */+ char rd_indexvalid; /* state of rd_indexlist: 0 = not valid, 1 =+ * valid, 2 = temporarily forced */++ /*+ * rd_createSubid is the ID of the highest subtransaction the rel has+ * survived into; or zero if the rel was not created in the current top+ * transaction. This can be now be relied on, whereas previously it could+ * be "forgotten" in earlier releases. Likewise, rd_newRelfilenodeSubid is+ * the ID of the highest subtransaction the relfilenode change has+ * survived into, or zero if not changed in the current transaction (or we+ * have forgotten changing it). rd_newRelfilenodeSubid can be forgotten+ * when a relation has multiple new relfilenodes within a single+ * transaction, with one of them occurring in a subsequently aborted+ * subtransaction, e.g. BEGIN; TRUNCATE t; SAVEPOINT save; TRUNCATE t;+ * ROLLBACK TO save; -- rd_newRelfilenode is now forgotten+ */+ SubTransactionId rd_createSubid; /* rel was created in current xact */+ SubTransactionId rd_newRelfilenodeSubid; /* new relfilenode assigned in+ * current xact */++ Form_pg_class rd_rel; /* RELATION tuple */+ TupleDesc rd_att; /* tuple descriptor */+ Oid rd_id; /* relation's object id */+ LockInfoData rd_lockInfo; /* lock mgr's info for locking relation */+ RuleLock *rd_rules; /* rewrite rules */+ MemoryContext rd_rulescxt; /* private memory cxt for rd_rules, if any */+ TriggerDesc *trigdesc; /* Trigger info, or NULL if rel has none */+ /* use "struct" here to avoid needing to include rowsecurity.h: */+ struct RowSecurityDesc *rd_rsdesc; /* row security policies, or NULL */++ /* data managed by RelationGetIndexList: */+ List *rd_indexlist; /* list of OIDs of indexes on relation */+ Oid rd_oidindex; /* OID of unique index on OID, if any */+ Oid rd_replidindex; /* OID of replica identity index, if any */++ /* data managed by RelationGetIndexAttrBitmap: */+ Bitmapset *rd_indexattr; /* identifies columns used in indexes */+ Bitmapset *rd_keyattr; /* cols that can be ref'd by foreign keys */+ Bitmapset *rd_idattr; /* included in replica identity index */++ /*+ * rd_options is set whenever rd_rel is loaded into the relcache entry.+ * Note that you can NOT look into rd_rel for this data. NULL means "use+ * defaults".+ */+ bytea *rd_options; /* parsed pg_class.reloptions */++ /* These are non-NULL only for an index relation: */+ Form_pg_index rd_index; /* pg_index tuple describing this index */+ /* use "struct" here to avoid needing to include htup.h: */+ struct HeapTupleData *rd_indextuple; /* all of pg_index tuple */+ Form_pg_am rd_am; /* pg_am tuple for index's AM */++ /*+ * index access support info (used only for an index relation)+ *+ * Note: only default support procs for each opclass are cached, namely+ * those with lefttype and righttype equal to the opclass's opcintype. The+ * arrays are indexed by support function number, which is a sufficient+ * identifier given that restriction.+ *+ * Note: rd_amcache is available for index AMs to cache private data about+ * an index. This must be just a cache since it may get reset at any time+ * (in particular, it will get reset by a relcache inval message for the+ * index). If used, it must point to a single memory chunk palloc'd in+ * rd_indexcxt. A relcache reset will include freeing that chunk and+ * setting rd_amcache = NULL.+ */+ MemoryContext rd_indexcxt; /* private memory cxt for this stuff */+ RelationAmInfo *rd_aminfo; /* lookup info for funcs found in pg_am */+ Oid *rd_opfamily; /* OIDs of op families for each index col */+ Oid *rd_opcintype; /* OIDs of opclass declared input data types */+ RegProcedure *rd_support; /* OIDs of support procedures */+ FmgrInfo *rd_supportinfo; /* lookup info for support procedures */+ int16 *rd_indoption; /* per-column AM-specific flags */+ List *rd_indexprs; /* index expression trees, if any */+ List *rd_indpred; /* index predicate tree, if any */+ Oid *rd_exclops; /* OIDs of exclusion operators, if any */+ Oid *rd_exclprocs; /* OIDs of exclusion ops' procs, if any */+ uint16 *rd_exclstrats; /* exclusion ops' strategy numbers, if any */+ void *rd_amcache; /* available for use by index AM */+ Oid *rd_indcollation; /* OIDs of index collations */++ /*+ * foreign-table support+ *+ * rd_fdwroutine must point to a single memory chunk palloc'd in+ * CacheMemoryContext. It will be freed and reset to NULL on a relcache+ * reset.+ */++ /* use "struct" here to avoid needing to include fdwapi.h: */+ struct FdwRoutine *rd_fdwroutine; /* cached function pointers, or NULL */++ /*+ * Hack for CLUSTER, rewriting ALTER TABLE, etc: when writing a new+ * version of a table, we need to make any toast pointers inserted into it+ * have the existing toast table's OID, not the OID of the transient toast+ * table. If rd_toastoid isn't InvalidOid, it is the OID to place in+ * toast pointers inserted into this rel. (Note it's set on the new+ * version of the main heap, not the toast table itself.) This also+ * causes toast_save_datum() to try to preserve toast value OIDs.+ */+ Oid rd_toastoid; /* Real TOAST table's OID, or InvalidOid */++ /* use "struct" here to avoid needing to include pgstat.h: */+ struct PgStat_TableStatus *pgstat_info; /* statistics collection area */+} RelationData;++/*+ * StdRdOptions+ * Standard contents of rd_options for heaps and generic indexes.+ *+ * RelationGetFillFactor() and RelationGetTargetPageFreeSpace() can only+ * be applied to relations that use this format or a superset for+ * private options data.+ */+ /* autovacuum-related reloptions. */+typedef struct AutoVacOpts+{+ bool enabled;+ int vacuum_threshold;+ int analyze_threshold;+ int vacuum_cost_delay;+ int vacuum_cost_limit;+ int freeze_min_age;+ int freeze_max_age;+ int freeze_table_age;+ int multixact_freeze_min_age;+ int multixact_freeze_max_age;+ int multixact_freeze_table_age;+ int log_min_duration;+ float8 vacuum_scale_factor;+ float8 analyze_scale_factor;+} AutoVacOpts;++typedef struct StdRdOptions+{+ int32 vl_len_; /* varlena header (do not touch directly!) */+ int fillfactor; /* page fill factor in percent (0..100) */+ AutoVacOpts autovacuum; /* autovacuum-related options */+ bool user_catalog_table; /* use as an additional catalog+ * relation */+} StdRdOptions;++#define HEAP_MIN_FILLFACTOR 10+#define HEAP_DEFAULT_FILLFACTOR 100++/*+ * RelationGetFillFactor+ * Returns the relation's fillfactor. Note multiple eval of argument!+ */+#define RelationGetFillFactor(relation, defaultff) \+ ((relation)->rd_options ? \+ ((StdRdOptions *) (relation)->rd_options)->fillfactor : (defaultff))++/*+ * RelationGetTargetPageUsage+ * Returns the relation's desired space usage per page in bytes.+ */+#define RelationGetTargetPageUsage(relation, defaultff) \+ (BLCKSZ * RelationGetFillFactor(relation, defaultff) / 100)++/*+ * RelationGetTargetPageFreeSpace+ * Returns the relation's desired freespace per page in bytes.+ */+#define RelationGetTargetPageFreeSpace(relation, defaultff) \+ (BLCKSZ * (100 - RelationGetFillFactor(relation, defaultff)) / 100)++/*+ * RelationIsUsedAsCatalogTable+ * Returns whether the relation should be treated as a catalog table+ * from the pov of logical decoding. Note multiple eval or argument!+ */+#define RelationIsUsedAsCatalogTable(relation) \+ ((relation)->rd_options ? \+ ((StdRdOptions *) (relation)->rd_options)->user_catalog_table : false)+++/*+ * ViewOptions+ * Contents of rd_options for views+ */+typedef struct ViewOptions+{+ int32 vl_len_; /* varlena header (do not touch directly!) */+ bool security_barrier;+ int check_option_offset;+} ViewOptions;++/*+ * RelationIsSecurityView+ * Returns whether the relation is security view, or not. Note multiple+ * eval of argument!+ */+#define RelationIsSecurityView(relation) \+ ((relation)->rd_options ? \+ ((ViewOptions *) (relation)->rd_options)->security_barrier : false)++/*+ * RelationHasCheckOption+ * Returns true if the relation is a view defined with either the local+ * or the cascaded check option. Note multiple eval of argument!+ */+#define RelationHasCheckOption(relation) \+ ((relation)->rd_options && \+ ((ViewOptions *) (relation)->rd_options)->check_option_offset != 0)++/*+ * RelationHasLocalCheckOption+ * Returns true if the relation is a view defined with the local check+ * option. Note multiple eval of argument!+ */+#define RelationHasLocalCheckOption(relation) \+ ((relation)->rd_options && \+ ((ViewOptions *) (relation)->rd_options)->check_option_offset != 0 ? \+ strcmp((char *) (relation)->rd_options + \+ ((ViewOptions *) (relation)->rd_options)->check_option_offset, \+ "local") == 0 : false)++/*+ * RelationHasCascadedCheckOption+ * Returns true if the relation is a view defined with the cascaded check+ * option. Note multiple eval of argument!+ */+#define RelationHasCascadedCheckOption(relation) \+ ((relation)->rd_options && \+ ((ViewOptions *) (relation)->rd_options)->check_option_offset != 0 ? \+ strcmp((char *) (relation)->rd_options + \+ ((ViewOptions *) (relation)->rd_options)->check_option_offset, \+ "cascaded") == 0 : false)+++/*+ * RelationIsValid+ * True iff relation descriptor is valid.+ */+#define RelationIsValid(relation) PointerIsValid(relation)++#define InvalidRelation ((Relation) NULL)++/*+ * RelationHasReferenceCountZero+ * True iff relation reference count is zero.+ *+ * Note:+ * Assumes relation descriptor is valid.+ */+#define RelationHasReferenceCountZero(relation) \+ ((bool)((relation)->rd_refcnt == 0))++/*+ * RelationGetForm+ * Returns pg_class tuple for a relation.+ *+ * Note:+ * Assumes relation descriptor is valid.+ */+#define RelationGetForm(relation) ((relation)->rd_rel)++/*+ * RelationGetRelid+ * Returns the OID of the relation+ */+#define RelationGetRelid(relation) ((relation)->rd_id)++/*+ * RelationGetNumberOfAttributes+ * Returns the number of attributes in a relation.+ */+#define RelationGetNumberOfAttributes(relation) ((relation)->rd_rel->relnatts)++/*+ * RelationGetDescr+ * Returns tuple descriptor for a relation.+ */+#define RelationGetDescr(relation) ((relation)->rd_att)++/*+ * RelationGetRelationName+ * Returns the rel's name.+ *+ * Note that the name is only unique within the containing namespace.+ */+#define RelationGetRelationName(relation) \+ (NameStr((relation)->rd_rel->relname))++/*+ * RelationGetNamespace+ * Returns the rel's namespace OID.+ */+#define RelationGetNamespace(relation) \+ ((relation)->rd_rel->relnamespace)++/*+ * RelationIsMapped+ * True if the relation uses the relfilenode map.+ *+ * NB: this is only meaningful for relkinds that have storage, else it+ * will misleadingly say "true".+ */+#define RelationIsMapped(relation) \+ ((relation)->rd_rel->relfilenode == InvalidOid)++/*+ * RelationOpenSmgr+ * Open the relation at the smgr level, if not already done.+ */+#define RelationOpenSmgr(relation) \+ do { \+ if ((relation)->rd_smgr == NULL) \+ smgrsetowner(&((relation)->rd_smgr), smgropen((relation)->rd_node, (relation)->rd_backend)); \+ } while (0)++/*+ * RelationCloseSmgr+ * Close the relation at the smgr level, if not already done.+ *+ * Note: smgrclose should unhook from owner pointer, hence the Assert.+ */+#define RelationCloseSmgr(relation) \+ do { \+ if ((relation)->rd_smgr != NULL) \+ { \+ smgrclose((relation)->rd_smgr); \+ Assert((relation)->rd_smgr == NULL); \+ } \+ } while (0)++/*+ * RelationGetTargetBlock+ * Fetch relation's current insertion target block.+ *+ * Returns InvalidBlockNumber if there is no current target block. Note+ * that the target block status is discarded on any smgr-level invalidation.+ */+#define RelationGetTargetBlock(relation) \+ ( (relation)->rd_smgr != NULL ? (relation)->rd_smgr->smgr_targblock : InvalidBlockNumber )++/*+ * RelationSetTargetBlock+ * Set relation's current insertion target block.+ */+#define RelationSetTargetBlock(relation, targblock) \+ do { \+ RelationOpenSmgr(relation); \+ (relation)->rd_smgr->smgr_targblock = (targblock); \+ } while (0)++/*+ * RelationNeedsWAL+ * True if relation needs WAL.+ */+#define RelationNeedsWAL(relation) \+ ((relation)->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT)++/*+ * RelationUsesLocalBuffers+ * True if relation's pages are stored in local buffers.+ */+#define RelationUsesLocalBuffers(relation) \+ ((relation)->rd_rel->relpersistence == RELPERSISTENCE_TEMP)++/*+ * RELATION_IS_LOCAL+ * If a rel is either temp or newly created in the current transaction,+ * it can be assumed to be accessible only to the current backend.+ * This is typically used to decide that we can skip acquiring locks.+ *+ * Beware of multiple eval of argument+ */+#define RELATION_IS_LOCAL(relation) \+ ((relation)->rd_islocaltemp || \+ (relation)->rd_createSubid != InvalidSubTransactionId)++/*+ * RELATION_IS_OTHER_TEMP+ * Test for a temporary relation that belongs to some other session.+ *+ * Beware of multiple eval of argument+ */+#define RELATION_IS_OTHER_TEMP(relation) \+ ((relation)->rd_rel->relpersistence == RELPERSISTENCE_TEMP && \+ !(relation)->rd_islocaltemp)+++/*+ * RelationIsScannable+ * Currently can only be false for a materialized view which has not been+ * populated by its query. This is likely to get more complicated later,+ * so use a macro which looks like a function.+ */+#define RelationIsScannable(relation) ((relation)->rd_rel->relispopulated)++/*+ * RelationIsPopulated+ * Currently, we don't physically distinguish the "populated" and+ * "scannable" properties of matviews, but that may change later.+ * Hence, use the appropriate one of these macros in code tests.+ */+#define RelationIsPopulated(relation) ((relation)->rd_rel->relispopulated)++/*+ * RelationIsAccessibleInLogicalDecoding+ * True if we need to log enough information to have access via+ * decoding snapshot.+ */+#define RelationIsAccessibleInLogicalDecoding(relation) \+ (XLogLogicalInfoActive() && \+ RelationNeedsWAL(relation) && \+ (IsCatalogRelation(relation) || RelationIsUsedAsCatalogTable(relation)))++/*+ * RelationIsLogicallyLogged+ * True if we need to log enough information to extract the data from the+ * WAL stream.+ *+ * We don't log information for unlogged tables (since they don't WAL log+ * anyway) and for system tables (their content is hard to make sense of, and+ * it would complicate decoding slightly for little gain). Note that we *do*+ * log information for user defined catalog tables since they presumably are+ * interesting to the user...+ */+#define RelationIsLogicallyLogged(relation) \+ (XLogLogicalInfoActive() && \+ RelationNeedsWAL(relation) && \+ !IsCatalogRelation(relation))++/* routines in utils/cache/relcache.c */+extern void RelationIncrementReferenceCount(Relation rel);+extern void RelationDecrementReferenceCount(Relation rel);++#endif /* REL_H */
+ foreign/libpg_query/src/postgres/include/utils/relcache.h view
@@ -0,0 +1,130 @@+/*-------------------------------------------------------------------------+ *+ * relcache.h+ * Relation descriptor cache definitions.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/utils/relcache.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef RELCACHE_H+#define RELCACHE_H++#include "access/tupdesc.h"+#include "nodes/bitmapset.h"+++typedef struct RelationData *Relation;++/* ----------------+ * RelationPtr is used in the executor to support index scans+ * where we have to keep track of several index relations in an+ * array. -cim 9/10/89+ * ----------------+ */+typedef Relation *RelationPtr;++/*+ * Routines to open (lookup) and close a relcache entry+ */+extern Relation RelationIdGetRelation(Oid relationId);+extern void RelationClose(Relation relation);++/*+ * Routines to compute/retrieve additional cached information+ */+extern List *RelationGetIndexList(Relation relation);+extern Oid RelationGetOidIndex(Relation relation);+extern Oid RelationGetReplicaIndex(Relation relation);+extern List *RelationGetIndexExpressions(Relation relation);+extern List *RelationGetIndexPredicate(Relation relation);++typedef enum IndexAttrBitmapKind+{+ INDEX_ATTR_BITMAP_ALL,+ INDEX_ATTR_BITMAP_KEY,+ INDEX_ATTR_BITMAP_IDENTITY_KEY+} IndexAttrBitmapKind;++extern Bitmapset *RelationGetIndexAttrBitmap(Relation relation,+ IndexAttrBitmapKind keyAttrs);++extern void RelationGetExclusionInfo(Relation indexRelation,+ Oid **operators,+ Oid **procs,+ uint16 **strategies);++extern void RelationSetIndexList(Relation relation,+ List *indexIds, Oid oidIndex);++extern void RelationInitIndexAccessInfo(Relation relation);++/*+ * Routines to support ereport() reports of relation-related errors+ */+extern int errtable(Relation rel);+extern int errtablecol(Relation rel, int attnum);+extern int errtablecolname(Relation rel, const char *colname);+extern int errtableconstraint(Relation rel, const char *conname);++/*+ * Routines for backend startup+ */+extern void RelationCacheInitialize(void);+extern void RelationCacheInitializePhase2(void);+extern void RelationCacheInitializePhase3(void);++/*+ * Routine to create a relcache entry for an about-to-be-created relation+ */+extern Relation RelationBuildLocalRelation(const char *relname,+ Oid relnamespace,+ TupleDesc tupDesc,+ Oid relid,+ Oid relfilenode,+ Oid reltablespace,+ bool shared_relation,+ bool mapped_relation,+ char relpersistence,+ char relkind);++/*+ * Routine to manage assignment of new relfilenode to a relation+ */+extern void RelationSetNewRelfilenode(Relation relation, char persistence,+ TransactionId freezeXid, MultiXactId minmulti);++/*+ * Routines for flushing/rebuilding relcache entries in various scenarios+ */+extern void RelationForgetRelation(Oid rid);++extern void RelationCacheInvalidateEntry(Oid relationId);++extern void RelationCacheInvalidate(void);++extern void RelationCloseSmgrByOid(Oid relationId);++extern void AtEOXact_RelationCache(bool isCommit);+extern void AtEOSubXact_RelationCache(bool isCommit, SubTransactionId mySubid,+ SubTransactionId parentSubid);++/*+ * Routines to help manage rebuilding of relcache init files+ */+extern bool RelationIdIsInInitFile(Oid relationId);+extern void RelationCacheInitFilePreInvalidate(void);+extern void RelationCacheInitFilePostInvalidate(void);+extern void RelationCacheInitFileRemove(void);++/* should be used only by relcache.c and catcache.c */+extern bool criticalRelcachesBuilt;++/* should be used only by relcache.c and postinit.c */+extern bool criticalSharedRelcachesBuilt;++#endif /* RELCACHE_H */
+ foreign/libpg_query/src/postgres/include/utils/reltrigger.h view
@@ -0,0 +1,73 @@+/*-------------------------------------------------------------------------+ *+ * reltrigger.h+ * POSTGRES relation trigger definitions.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/utils/reltrigger.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef RELTRIGGER_H+#define RELTRIGGER_H+++/*+ * These struct really belongs to trigger.h, but we put it separately so that+ * it can be cleanly included in rel.h and other places.+ */++typedef struct Trigger+{+ Oid tgoid; /* OID of trigger (pg_trigger row) */+ /* Remaining fields are copied from pg_trigger, see pg_trigger.h */+ char *tgname;+ Oid tgfoid;+ int16 tgtype;+ char tgenabled;+ bool tgisinternal;+ Oid tgconstrrelid;+ Oid tgconstrindid;+ Oid tgconstraint;+ bool tgdeferrable;+ bool tginitdeferred;+ int16 tgnargs;+ int16 tgnattr;+ int16 *tgattr;+ char **tgargs;+ char *tgqual;+} Trigger;++typedef struct TriggerDesc+{+ Trigger *triggers; /* array of Trigger structs */+ int numtriggers; /* number of array entries */++ /*+ * These flags indicate whether the array contains at least one of each+ * type of trigger. We use these to skip searching the array if not.+ */+ bool trig_insert_before_row;+ bool trig_insert_after_row;+ bool trig_insert_instead_row;+ bool trig_insert_before_statement;+ bool trig_insert_after_statement;+ bool trig_update_before_row;+ bool trig_update_after_row;+ bool trig_update_instead_row;+ bool trig_update_before_statement;+ bool trig_update_after_statement;+ bool trig_delete_before_row;+ bool trig_delete_after_row;+ bool trig_delete_instead_row;+ bool trig_delete_before_statement;+ bool trig_delete_after_statement;+ /* there are no row-level truncate triggers */+ bool trig_truncate_before_statement;+ bool trig_truncate_after_statement;+} TriggerDesc;++#endif /* RELTRIGGER_H */
+ foreign/libpg_query/src/postgres/include/utils/resowner.h view
@@ -0,0 +1,82 @@+/*-------------------------------------------------------------------------+ *+ * resowner.h+ * POSTGRES resource owner definitions.+ *+ * Query-lifespan resources are tracked by associating them with+ * ResourceOwner objects. This provides a simple mechanism for ensuring+ * that such resources are freed at the right time.+ * See utils/resowner/README for more info.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/utils/resowner.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef RESOWNER_H+#define RESOWNER_H+++/*+ * ResourceOwner objects are an opaque data structure known only within+ * resowner.c.+ */+typedef struct ResourceOwnerData *ResourceOwner;+++/*+ * Globally known ResourceOwners+ */+extern PGDLLIMPORT ResourceOwner CurrentResourceOwner;+extern PGDLLIMPORT ResourceOwner CurTransactionResourceOwner;+extern PGDLLIMPORT ResourceOwner TopTransactionResourceOwner;++/*+ * Resource releasing is done in three phases: pre-locks, locks, and+ * post-locks. The pre-lock phase must release any resources that are+ * visible to other backends (such as pinned buffers); this ensures that+ * when we release a lock that another backend may be waiting on, it will+ * see us as being fully out of our transaction. The post-lock phase+ * should be used for backend-internal cleanup.+ */+typedef enum+{+ RESOURCE_RELEASE_BEFORE_LOCKS,+ RESOURCE_RELEASE_LOCKS,+ RESOURCE_RELEASE_AFTER_LOCKS+} ResourceReleasePhase;++/*+ * Dynamically loaded modules can get control during ResourceOwnerRelease+ * by providing a callback of this form.+ */+typedef void (*ResourceReleaseCallback) (ResourceReleasePhase phase,+ bool isCommit,+ bool isTopLevel,+ void *arg);+++/*+ * Functions in resowner.c+ */++/* generic routines */+extern ResourceOwner ResourceOwnerCreate(ResourceOwner parent,+ const char *name);+extern void ResourceOwnerRelease(ResourceOwner owner,+ ResourceReleasePhase phase,+ bool isCommit,+ bool isTopLevel);+extern void ResourceOwnerDelete(ResourceOwner owner);+extern ResourceOwner ResourceOwnerGetParent(ResourceOwner owner);+extern void ResourceOwnerNewParent(ResourceOwner owner,+ ResourceOwner newparent);+extern void RegisterResourceReleaseCallback(ResourceReleaseCallback callback,+ void *arg);+extern void UnregisterResourceReleaseCallback(ResourceReleaseCallback callback,+ void *arg);++#endif /* RESOWNER_H */
+ foreign/libpg_query/src/postgres/include/utils/rls.h view
@@ -0,0 +1,50 @@+/*-------------------------------------------------------------------------+ *+ * rls.h+ * Header file for Row Level Security (RLS) utility commands to be used+ * with the rowsecurity feature.+ *+ * Copyright (c) 2007-2015, PostgreSQL Global Development Group+ *+ * src/include/utils/rls.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef RLS_H+#define RLS_H++/* GUC variable */+extern bool row_security;++/*+ * Used by callers of check_enable_rls.+ *+ * RLS could be completely disabled on the tables involved in the query,+ * which is the simple case, or it may depend on the current environment+ * (the role which is running the query or the value of the row_security+ * GUC), or it might be simply enabled as usual.+ *+ * If RLS isn't on the table involved then RLS_NONE is returned to indicate+ * that we don't need to worry about invalidating the query plan for RLS+ * reasons. If RLS is on the table, but we are bypassing it for now, then+ * we return RLS_NONE_ENV to indicate that, if the environment changes,+ * we need to invalidate and replan. Finally, if RLS should be turned on+ * for the query, then we return RLS_ENABLED, which means we also need to+ * invalidate if the environment changes.+ *+ * Note that RLS_ENABLED will also be returned if noError is true+ * (indicating that the caller simply want to know if RLS should be applied+ * for this user but doesn't want an error thrown if it is; this is used+ * by other error cases where we're just trying to decide if data from the+ * table should be passed back to the user or not).+ */+enum CheckEnableRlsResult+{+ RLS_NONE,+ RLS_NONE_ENV,+ RLS_ENABLED+};++extern int check_enable_rls(Oid relid, Oid checkAsUser, bool noError);++#endif /* RLS_H */
+ foreign/libpg_query/src/postgres/include/utils/ruleutils.h view
@@ -0,0 +1,35 @@+/*-------------------------------------------------------------------------+ *+ * ruleutils.h+ * Declarations for ruleutils.c+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/utils/ruleutils.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef RULEUTILS_H+#define RULEUTILS_H++#include "nodes/nodes.h"+#include "nodes/parsenodes.h"+#include "nodes/pg_list.h"+++extern char *pg_get_indexdef_string(Oid indexrelid);+extern char *pg_get_indexdef_columns(Oid indexrelid, bool pretty);++extern char *pg_get_constraintdef_command(Oid constraintId);+extern char *deparse_expression(Node *expr, List *dpcontext,+ bool forceprefix, bool showimplicit);+extern List *deparse_context_for(const char *aliasname, Oid relid);+extern List *deparse_context_for_plan_rtable(List *rtable, List *rtable_names);+extern List *set_deparse_context_planstate(List *dpcontext,+ Node *planstate, List *ancestors);+extern List *select_rtable_names_for_explain(List *rtable,+ Bitmapset *rels_used);+extern char *generate_collation_name(Oid collid);++#endif /* RULEUTILS_H */
+ foreign/libpg_query/src/postgres/include/utils/snapmgr.h view
@@ -0,0 +1,72 @@+/*-------------------------------------------------------------------------+ *+ * snapmgr.h+ * POSTGRES snapshot manager+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/utils/snapmgr.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef SNAPMGR_H+#define SNAPMGR_H++#include "fmgr.h"+#include "utils/resowner.h"+#include "utils/snapshot.h"+++extern bool FirstSnapshotSet;++extern TransactionId TransactionXmin;+extern TransactionId RecentXmin;+extern TransactionId RecentGlobalXmin;+extern TransactionId RecentGlobalDataXmin;++extern Snapshot GetTransactionSnapshot(void);+extern Snapshot GetLatestSnapshot(void);+extern void SnapshotSetCommandId(CommandId curcid);++extern Snapshot GetCatalogSnapshot(Oid relid);+extern Snapshot GetNonHistoricCatalogSnapshot(Oid relid);+extern void InvalidateCatalogSnapshot(void);++extern void PushActiveSnapshot(Snapshot snapshot);+extern void PushCopiedSnapshot(Snapshot snapshot);+extern void UpdateActiveSnapshotCommandId(void);+extern void PopActiveSnapshot(void);+extern Snapshot GetActiveSnapshot(void);+extern bool ActiveSnapshotSet(void);++extern Snapshot RegisterSnapshot(Snapshot snapshot);+extern void UnregisterSnapshot(Snapshot snapshot);+extern Snapshot RegisterSnapshotOnOwner(Snapshot snapshot, ResourceOwner owner);+extern void UnregisterSnapshotFromOwner(Snapshot snapshot, ResourceOwner owner);++extern void AtSubCommit_Snapshot(int level);+extern void AtSubAbort_Snapshot(int level);+extern void AtEOXact_Snapshot(bool isCommit);++extern Datum pg_export_snapshot(PG_FUNCTION_ARGS);+extern void ImportSnapshot(const char *idstr);+extern bool XactHasExportedSnapshots(void);+extern void DeleteAllExportedSnapshotFiles(void);+extern bool ThereAreNoPriorRegisteredSnapshots(void);++extern char *ExportSnapshot(Snapshot snapshot);++/* Support for catalog timetravel for logical decoding */+struct HTAB;+extern struct HTAB *HistoricSnapshotGetTupleCids(void);+extern void SetupHistoricSnapshot(Snapshot snapshot_now, struct HTAB *tuplecids);+extern void TeardownHistoricSnapshot(bool is_error);+extern bool HistoricSnapshotActive(void);++extern Size EstimateSnapshotSpace(Snapshot snapshot);+extern void SerializeSnapshot(Snapshot snapshot, char *start_address);+extern Snapshot RestoreSnapshot(char *start_address);+extern void RestoreTransactionSnapshot(Snapshot snapshot, void *master_pgproc);++#endif /* SNAPMGR_H */
+ foreign/libpg_query/src/postgres/include/utils/snapshot.h view
@@ -0,0 +1,124 @@+/*-------------------------------------------------------------------------+ *+ * snapshot.h+ * POSTGRES snapshot definition+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/utils/snapshot.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef SNAPSHOT_H+#define SNAPSHOT_H++#include "access/htup.h"+#include "lib/pairingheap.h"+#include "storage/buf.h"+++typedef struct SnapshotData *Snapshot;++#define InvalidSnapshot ((Snapshot) NULL)++/*+ * We use SnapshotData structures to represent both "regular" (MVCC)+ * snapshots and "special" snapshots that have non-MVCC semantics.+ * The specific semantics of a snapshot are encoded by the "satisfies"+ * function.+ */+typedef bool (*SnapshotSatisfiesFunc) (HeapTuple htup,+ Snapshot snapshot, Buffer buffer);++/*+ * Struct representing all kind of possible snapshots.+ *+ * There are several different kinds of snapshots:+ * * Normal MVCC snapshots+ * * MVCC snapshots taken during recovery (in Hot-Standby mode)+ * * Historic MVCC snapshots used during logical decoding+ * * snapshots passed to HeapTupleSatisfiesDirty()+ * * snapshots used for SatisfiesAny, Toast, Self where no members are+ * accessed.+ *+ * TODO: It's probably a good idea to split this struct using a NodeTag+ * similar to how parser and executor nodes are handled, with one type for+ * each different kind of snapshot to avoid overloading the meaning of+ * individual fields.+ */+typedef struct SnapshotData+{+ SnapshotSatisfiesFunc satisfies; /* tuple test function */++ /*+ * The remaining fields are used only for MVCC snapshots, and are normally+ * just zeroes in special snapshots. (But xmin and xmax are used+ * specially by HeapTupleSatisfiesDirty.)+ *+ * An MVCC snapshot can never see the effects of XIDs >= xmax. It can see+ * the effects of all older XIDs except those listed in the snapshot. xmin+ * is stored as an optimization to avoid needing to search the XID arrays+ * for most tuples.+ */+ TransactionId xmin; /* all XID < xmin are visible to me */+ TransactionId xmax; /* all XID >= xmax are invisible to me */++ /*+ * For normal MVCC snapshot this contains the all xact IDs that are in+ * progress, unless the snapshot was taken during recovery in which case+ * it's empty. For historic MVCC snapshots, the meaning is inverted, i.e.+ * it contains *committed* transactions between xmin and xmax.+ *+ * note: all ids in xip[] satisfy xmin <= xip[i] < xmax+ */+ TransactionId *xip;+ uint32 xcnt; /* # of xact ids in xip[] */++ /*+ * For non-historic MVCC snapshots, this contains subxact IDs that are in+ * progress (and other transactions that are in progress if taken during+ * recovery). For historic snapshot it contains *all* xids assigned to the+ * replayed transaction, including the toplevel xid.+ *+ * note: all ids in subxip[] are >= xmin, but we don't bother filtering+ * out any that are >= xmax+ */+ TransactionId *subxip;+ int32 subxcnt; /* # of xact ids in subxip[] */+ bool suboverflowed; /* has the subxip array overflowed? */++ bool takenDuringRecovery; /* recovery-shaped snapshot? */+ bool copied; /* false if it's a static snapshot */++ CommandId curcid; /* in my xact, CID < curcid are visible */++ /*+ * An extra return value for HeapTupleSatisfiesDirty, not used in MVCC+ * snapshots.+ */+ uint32 speculativeToken;++ /*+ * Book-keeping information, used by the snapshot manager+ */+ uint32 active_count; /* refcount on ActiveSnapshot stack */+ uint32 regd_count; /* refcount on RegisteredSnapshots */+ pairingheap_node ph_node; /* link in the RegisteredSnapshots heap */+} SnapshotData;++/*+ * Result codes for HeapTupleSatisfiesUpdate. This should really be in+ * tqual.h, but we want to avoid including that file elsewhere.+ */+typedef enum+{+ HeapTupleMayBeUpdated,+ HeapTupleInvisible,+ HeapTupleSelfUpdated,+ HeapTupleUpdated,+ HeapTupleBeingUpdated,+ HeapTupleWouldBlock /* can be returned by heap_tuple_lock */+} HTSU_Result;++#endif /* SNAPSHOT_H */
+ foreign/libpg_query/src/postgres/include/utils/sortsupport.h view
@@ -0,0 +1,291 @@+/*-------------------------------------------------------------------------+ *+ * sortsupport.h+ * Framework for accelerated sorting.+ *+ * Traditionally, PostgreSQL has implemented sorting by repeatedly invoking+ * an SQL-callable comparison function "cmp(x, y) returns int" on pairs of+ * values to be compared, where the comparison function is the BTORDER_PROC+ * pg_amproc support function of the appropriate btree index opclass.+ *+ * This file defines alternative APIs that allow sorting to be performed with+ * reduced overhead. To support lower-overhead sorting, a btree opclass may+ * provide a BTSORTSUPPORT_PROC pg_amproc entry, which must take a single+ * argument of type internal and return void. The argument is actually a+ * pointer to a SortSupportData struct, which is defined below.+ *+ * If provided, the BTSORTSUPPORT function will be called during sort setup,+ * and it must initialize the provided struct with pointers to function(s)+ * that can be called to perform sorting. This API is defined to allow+ * multiple acceleration mechanisms to be supported, but no opclass is+ * required to provide all of them. The BTSORTSUPPORT function should+ * simply not set any function pointers for mechanisms it doesn't support.+ * Opclasses that provide BTSORTSUPPORT and don't provide a comparator+ * function will have a shim set up by sort support automatically. However,+ * opclasses that support the optional additional abbreviated key capability+ * must always provide an authoritative comparator used to tie-break+ * inconclusive abbreviated comparisons and also used when aborting+ * abbreviation. Furthermore, a converter and abort/costing function must be+ * provided.+ *+ * All sort support functions will be passed the address of the+ * SortSupportData struct when called, so they can use it to store+ * additional private data as needed. In particular, for collation-aware+ * datatypes, the ssup_collation field is set before calling BTSORTSUPPORT+ * and is available to all support functions. Additional opclass-dependent+ * data can be stored using the ssup_extra field. Any such data+ * should be allocated in the ssup_cxt memory context.+ *+ * Note: since pg_amproc functions are indexed by (lefttype, righttype)+ * it is possible to associate a BTSORTSUPPORT function with a cross-type+ * comparison. This could sensibly be used to provide a fast comparator+ * function for such cases, but probably not any other acceleration method.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/utils/sortsupport.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef SORTSUPPORT_H+#define SORTSUPPORT_H++#include "access/attnum.h"+#include "utils/relcache.h"++typedef struct SortSupportData *SortSupport;++typedef struct SortSupportData+{+ /*+ * These fields are initialized before calling the BTSORTSUPPORT function+ * and should not be changed later.+ */+ MemoryContext ssup_cxt; /* Context containing sort info */+ Oid ssup_collation; /* Collation to use, or InvalidOid */++ /*+ * Additional sorting parameters; but unlike ssup_collation, these can be+ * changed after BTSORTSUPPORT is called, so don't use them in selecting+ * sort support functions.+ */+ bool ssup_reverse; /* descending-order sort? */+ bool ssup_nulls_first; /* sort nulls first? */++ /*+ * These fields are workspace for callers, and should not be touched by+ * opclass-specific functions.+ */+ AttrNumber ssup_attno; /* column number to sort */++ /*+ * ssup_extra is zeroed before calling the BTSORTSUPPORT function, and is+ * not touched subsequently by callers.+ */+ void *ssup_extra; /* Workspace for opclass functions */++ /*+ * Function pointers are zeroed before calling the BTSORTSUPPORT function,+ * and must be set by it for any acceleration methods it wants to supply.+ * The comparator pointer must be set, others are optional.+ */++ /*+ * Comparator function has the same API as the traditional btree+ * comparison function, ie, return <0, 0, or >0 according as x is less+ * than, equal to, or greater than y. Note that x and y are guaranteed+ * not null, and there is no way to return null either. Do not return+ * INT_MIN, as callers are allowed to negate the result before using it.+ *+ * This may be either the authoritative comparator, or the abbreviated+ * comparator. Core code may switch this over the initial preference of+ * an opclass support function despite originally indicating abbreviation+ * was applicable, by assigning the authoritative comparator back.+ */+ int (*comparator) (Datum x, Datum y, SortSupport ssup);++ /*+ * "Abbreviated key" infrastructure follows.+ *+ * All callbacks must be set by sortsupport opclasses that make use of+ * this optional additional infrastructure (unless for whatever reasons+ * the opclass doesn't proceed with abbreviation, in which case+ * abbrev_converter must not be set).+ *+ * This allows opclass authors to supply a conversion routine, used to+ * create an alternative representation of the underlying type (an+ * "abbreviated key"). This representation must be pass-by-value and+ * typically will use some ad-hoc format that only the opclass has+ * knowledge of. An alternative comparator, used only with this+ * alternative representation must also be provided (which is assigned to+ * "comparator"). This representation is a simple approximation of the+ * original Datum. It must be possible to compare datums of this+ * representation with each other using the supplied alternative+ * comparator, and have any non-zero return value be a reliable proxy for+ * what a proper comparison would indicate. Returning zero from the+ * alternative comparator does not indicate equality, as with a+ * conventional support routine 1, though -- it indicates that it wasn't+ * possible to determine how the two abbreviated values compared. A+ * proper comparison, using "abbrev_full_comparator"/+ * ApplySortAbbrevFullComparator() is therefore required. In many cases+ * this results in most or all comparisons only using the cheap+ * alternative comparison func, which is typically implemented as code+ * that compiles to just a few CPU instructions. CPU cache miss penalties+ * are expensive; to get good overall performance, sort infrastructure+ * must heavily weigh cache performance.+ *+ * Opclass authors must consider the final cardinality of abbreviated keys+ * when devising an encoding scheme. It's possible for a strategy to work+ * better than an alternative strategy with one usage pattern, while the+ * reverse might be true for another usage pattern. All of these factors+ * must be considered.+ */++ /*+ * "abbreviate" concerns whether or not the abbreviated key optimization+ * is applicable in principle (that is, the sortsupport routine needs to+ * know if its dealing with a key where an abbreviated representation can+ * usefully be packed together. Conventionally, this is the leading+ * attribute key). Note, however, that in order to determine that+ * abbreviation is not in play, the core code always checks whether or not+ * the opclass has set abbrev_converter. This is a one way, one time+ * message to the opclass.+ */+ bool abbreviate;++ /*+ * Converter to abbreviated format, from original representation. Core+ * code uses this callback to convert from a pass-by-reference "original"+ * Datum to a pass-by-value abbreviated key Datum. Note that original is+ * guaranteed NOT NULL, because it doesn't make sense to factor NULLness+ * into ad-hoc cost model.+ *+ * abbrev_converter is tested to see if abbreviation is in play. Core+ * code may set it to NULL to indicate abbreviation should not be used+ * (which is something sortsupport routines need not concern themselves+ * with). However, sortsupport routines must not set it when it is+ * immediately established that abbreviation should not proceed (e.g., for+ * !abbreviate calls, or due to platform-specific impediments to using+ * abbreviation).+ */+ Datum (*abbrev_converter) (Datum original, SortSupport ssup);++ /*+ * abbrev_abort callback allows clients to verify that the current+ * strategy is working out, using a sortsupport routine defined ad-hoc+ * cost model. If there is a lot of duplicate abbreviated keys in+ * practice, it's useful to be able to abandon the strategy before paying+ * too high a cost in conversion (perhaps certain opclass-specific+ * adaptations are useful too).+ */+ bool (*abbrev_abort) (int memtupcount, SortSupport ssup);++ /*+ * Full, authoritative comparator for key that an abbreviated+ * representation was generated for, used when an abbreviated comparison+ * was inconclusive (by calling ApplySortComparatorFull()), or used to+ * replace "comparator" when core system ultimately decides against+ * abbreviation.+ */+ int (*abbrev_full_comparator) (Datum x, Datum y, SortSupport ssup);+} SortSupportData;+++/*+ * ApplySortComparator should be inlined if possible. See STATIC_IF_INLINE+ * in c.h.+ */+#ifndef PG_USE_INLINE+extern int ApplySortComparator(Datum datum1, bool isNull1,+ Datum datum2, bool isNull2,+ SortSupport ssup);+extern int ApplySortAbbrevFullComparator(Datum datum1, bool isNull1,+ Datum datum2, bool isNull2,+ SortSupport ssup);+#endif /* !PG_USE_INLINE */+#if defined(PG_USE_INLINE) || defined(SORTSUPPORT_INCLUDE_DEFINITIONS)+/*+ * Apply a sort comparator function and return a 3-way comparison result.+ * This takes care of handling reverse-sort and NULLs-ordering properly.+ */+STATIC_IF_INLINE int+ApplySortComparator(Datum datum1, bool isNull1,+ Datum datum2, bool isNull2,+ SortSupport ssup)+{+ int compare;++ if (isNull1)+ {+ if (isNull2)+ compare = 0; /* NULL "=" NULL */+ else if (ssup->ssup_nulls_first)+ compare = -1; /* NULL "<" NOT_NULL */+ else+ compare = 1; /* NULL ">" NOT_NULL */+ }+ else if (isNull2)+ {+ if (ssup->ssup_nulls_first)+ compare = 1; /* NOT_NULL ">" NULL */+ else+ compare = -1; /* NOT_NULL "<" NULL */+ }+ else+ {+ compare = (*ssup->comparator) (datum1, datum2, ssup);+ if (ssup->ssup_reverse)+ compare = -compare;+ }++ return compare;+}++/*+ * Apply a sort comparator function and return a 3-way comparison using full,+ * authoritative comparator. This takes care of handling reverse-sort and+ * NULLs-ordering properly.+ */+STATIC_IF_INLINE int+ApplySortAbbrevFullComparator(Datum datum1, bool isNull1,+ Datum datum2, bool isNull2,+ SortSupport ssup)+{+ int compare;++ if (isNull1)+ {+ if (isNull2)+ compare = 0; /* NULL "=" NULL */+ else if (ssup->ssup_nulls_first)+ compare = -1; /* NULL "<" NOT_NULL */+ else+ compare = 1; /* NULL ">" NOT_NULL */+ }+ else if (isNull2)+ {+ if (ssup->ssup_nulls_first)+ compare = 1; /* NOT_NULL ">" NULL */+ else+ compare = -1; /* NOT_NULL "<" NULL */+ }+ else+ {+ compare = (*ssup->abbrev_full_comparator) (datum1, datum2, ssup);+ if (ssup->ssup_reverse)+ compare = -compare;+ }++ return compare;+}+#endif /*-- PG_USE_INLINE || SORTSUPPORT_INCLUDE_DEFINITIONS */++/* Other functions in utils/sort/sortsupport.c */+extern void PrepareSortSupportComparisonShim(Oid cmpFunc, SortSupport ssup);+extern void PrepareSortSupportFromOrderingOp(Oid orderingOp, SortSupport ssup);+extern void PrepareSortSupportFromIndexRel(Relation indexRel, int16 strategy,+ SortSupport ssup);++#endif /* SORTSUPPORT_H */
+ foreign/libpg_query/src/postgres/include/utils/syscache.h view
@@ -0,0 +1,197 @@+/*-------------------------------------------------------------------------+ *+ * syscache.h+ * System catalog cache definitions.+ *+ * See also lsyscache.h, which provides convenience routines for+ * common cache-lookup operations.+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/utils/syscache.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef SYSCACHE_H+#define SYSCACHE_H++#include "access/attnum.h"+#include "access/htup.h"+/* we intentionally do not include utils/catcache.h here */++/*+ * SysCache identifiers.+ *+ * The order of these identifiers must match the order+ * of the entries in the array cacheinfo[] in syscache.c.+ * Keep them in alphabetical order (renumbering only costs a+ * backend rebuild).+ */++enum SysCacheIdentifier+{+ AGGFNOID = 0,+ AMNAME,+ AMOID,+ AMOPOPID,+ AMOPSTRATEGY,+ AMPROCNUM,+ ATTNAME,+ ATTNUM,+ AUTHMEMMEMROLE,+ AUTHMEMROLEMEM,+ AUTHNAME,+ AUTHOID,+ CASTSOURCETARGET,+ CLAAMNAMENSP,+ CLAOID,+ COLLNAMEENCNSP,+ COLLOID,+ CONDEFAULT,+ CONNAMENSP,+ CONSTROID,+ CONVOID,+ DATABASEOID,+ DEFACLROLENSPOBJ,+ ENUMOID,+ ENUMTYPOIDNAME,+ EVENTTRIGGERNAME,+ EVENTTRIGGEROID,+ FOREIGNDATAWRAPPERNAME,+ FOREIGNDATAWRAPPEROID,+ FOREIGNSERVERNAME,+ FOREIGNSERVEROID,+ FOREIGNTABLEREL,+ INDEXRELID,+ LANGNAME,+ LANGOID,+ NAMESPACENAME,+ NAMESPACEOID,+ OPERNAMENSP,+ OPEROID,+ OPFAMILYAMNAMENSP,+ OPFAMILYOID,+ PROCNAMEARGSNSP,+ PROCOID,+ RANGETYPE,+ RELNAMENSP,+ RELOID,+ REPLORIGIDENT,+ REPLORIGNAME,+ RULERELNAME,+ STATRELATTINH,+ TABLESPACEOID,+ TRFOID,+ TRFTYPELANG,+ TSCONFIGMAP,+ TSCONFIGNAMENSP,+ TSCONFIGOID,+ TSDICTNAMENSP,+ TSDICTOID,+ TSPARSERNAMENSP,+ TSPARSEROID,+ TSTEMPLATENAMENSP,+ TSTEMPLATEOID,+ TYPENAMENSP,+ TYPEOID,+ USERMAPPINGOID,+ USERMAPPINGUSERSERVER+};++extern void InitCatalogCache(void);+extern void InitCatalogCachePhase2(void);++extern HeapTuple SearchSysCache(int cacheId,+ Datum key1, Datum key2, Datum key3, Datum key4);+extern void ReleaseSysCache(HeapTuple tuple);++/* convenience routines */+extern HeapTuple SearchSysCacheCopy(int cacheId,+ Datum key1, Datum key2, Datum key3, Datum key4);+extern bool SearchSysCacheExists(int cacheId,+ Datum key1, Datum key2, Datum key3, Datum key4);+extern Oid GetSysCacheOid(int cacheId,+ Datum key1, Datum key2, Datum key3, Datum key4);++extern HeapTuple SearchSysCacheAttName(Oid relid, const char *attname);+extern HeapTuple SearchSysCacheCopyAttName(Oid relid, const char *attname);+extern bool SearchSysCacheExistsAttName(Oid relid, const char *attname);++extern Datum SysCacheGetAttr(int cacheId, HeapTuple tup,+ AttrNumber attributeNumber, bool *isNull);++extern uint32 GetSysCacheHashValue(int cacheId,+ Datum key1, Datum key2, Datum key3, Datum key4);++/* list-search interface. Users of this must import catcache.h too */+struct catclist;+extern struct catclist *SearchSysCacheList(int cacheId, int nkeys,+ Datum key1, Datum key2, Datum key3, Datum key4);++extern bool RelationInvalidatesSnapshotsOnly(Oid relid);+extern bool RelationHasSysCache(Oid relid);+extern bool RelationSupportsSysCache(Oid relid);++/*+ * The use of the macros below rather than direct calls to the corresponding+ * functions is encouraged, as it insulates the caller from changes in the+ * maximum number of keys.+ */+#define SearchSysCache1(cacheId, key1) \+ SearchSysCache(cacheId, key1, 0, 0, 0)+#define SearchSysCache2(cacheId, key1, key2) \+ SearchSysCache(cacheId, key1, key2, 0, 0)+#define SearchSysCache3(cacheId, key1, key2, key3) \+ SearchSysCache(cacheId, key1, key2, key3, 0)+#define SearchSysCache4(cacheId, key1, key2, key3, key4) \+ SearchSysCache(cacheId, key1, key2, key3, key4)++#define SearchSysCacheCopy1(cacheId, key1) \+ SearchSysCacheCopy(cacheId, key1, 0, 0, 0)+#define SearchSysCacheCopy2(cacheId, key1, key2) \+ SearchSysCacheCopy(cacheId, key1, key2, 0, 0)+#define SearchSysCacheCopy3(cacheId, key1, key2, key3) \+ SearchSysCacheCopy(cacheId, key1, key2, key3, 0)+#define SearchSysCacheCopy4(cacheId, key1, key2, key3, key4) \+ SearchSysCacheCopy(cacheId, key1, key2, key3, key4)++#define SearchSysCacheExists1(cacheId, key1) \+ SearchSysCacheExists(cacheId, key1, 0, 0, 0)+#define SearchSysCacheExists2(cacheId, key1, key2) \+ SearchSysCacheExists(cacheId, key1, key2, 0, 0)+#define SearchSysCacheExists3(cacheId, key1, key2, key3) \+ SearchSysCacheExists(cacheId, key1, key2, key3, 0)+#define SearchSysCacheExists4(cacheId, key1, key2, key3, key4) \+ SearchSysCacheExists(cacheId, key1, key2, key3, key4)++#define GetSysCacheOid1(cacheId, key1) \+ GetSysCacheOid(cacheId, key1, 0, 0, 0)+#define GetSysCacheOid2(cacheId, key1, key2) \+ GetSysCacheOid(cacheId, key1, key2, 0, 0)+#define GetSysCacheOid3(cacheId, key1, key2, key3) \+ GetSysCacheOid(cacheId, key1, key2, key3, 0)+#define GetSysCacheOid4(cacheId, key1, key2, key3, key4) \+ GetSysCacheOid(cacheId, key1, key2, key3, key4)++#define GetSysCacheHashValue1(cacheId, key1) \+ GetSysCacheHashValue(cacheId, key1, 0, 0, 0)+#define GetSysCacheHashValue2(cacheId, key1, key2) \+ GetSysCacheHashValue(cacheId, key1, key2, 0, 0)+#define GetSysCacheHashValue3(cacheId, key1, key2, key3) \+ GetSysCacheHashValue(cacheId, key1, key2, key3, 0)+#define GetSysCacheHashValue4(cacheId, key1, key2, key3, key4) \+ GetSysCacheHashValue(cacheId, key1, key2, key3, key4)++#define SearchSysCacheList1(cacheId, key1) \+ SearchSysCacheList(cacheId, 1, key1, 0, 0, 0)+#define SearchSysCacheList2(cacheId, key1, key2) \+ SearchSysCacheList(cacheId, 2, key1, key2, 0, 0)+#define SearchSysCacheList3(cacheId, key1, key2, key3) \+ SearchSysCacheList(cacheId, 3, key1, key2, key3, 0)+#define SearchSysCacheList4(cacheId, key1, key2, key3, key4) \+ SearchSysCacheList(cacheId, 4, key1, key2, key3, key4)++#define ReleaseSysCacheList(x) ReleaseCatCacheList(x)++#endif /* SYSCACHE_H */
+ foreign/libpg_query/src/postgres/include/utils/timeout.h view
@@ -0,0 +1,84 @@+/*-------------------------------------------------------------------------+ *+ * timeout.h+ * Routines to multiplex SIGALRM interrupts for multiple timeout reasons.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/utils/timeout.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef TIMEOUT_H+#define TIMEOUT_H++#include "datatype/timestamp.h"++/*+ * Identifiers for timeout reasons. Note that in case multiple timeouts+ * trigger at the same time, they are serviced in the order of this enum.+ */+typedef enum TimeoutId+{+ /* Predefined timeout reasons */+ STARTUP_PACKET_TIMEOUT,+ DEADLOCK_TIMEOUT,+ LOCK_TIMEOUT,+ STATEMENT_TIMEOUT,+ STANDBY_DEADLOCK_TIMEOUT,+ STANDBY_TIMEOUT,+ /* First user-definable timeout reason */+ USER_TIMEOUT,+ /* Maximum number of timeout reasons */+ MAX_TIMEOUTS = 16+} TimeoutId;++/* callback function signature */+typedef void (*timeout_handler_proc) (void);++/*+ * Parameter structure for setting multiple timeouts at once+ */+typedef enum TimeoutType+{+ TMPARAM_AFTER,+ TMPARAM_AT+} TimeoutType;++typedef struct+{+ TimeoutId id; /* timeout to set */+ TimeoutType type; /* TMPARAM_AFTER or TMPARAM_AT */+ int delay_ms; /* only used for TMPARAM_AFTER */+ TimestampTz fin_time; /* only used for TMPARAM_AT */+} EnableTimeoutParams;++/*+ * Parameter structure for clearing multiple timeouts at once+ */+typedef struct+{+ TimeoutId id; /* timeout to clear */+ bool keep_indicator; /* keep the indicator flag? */+} DisableTimeoutParams;++/* timeout setup */+extern void InitializeTimeouts(void);+extern TimeoutId RegisterTimeout(TimeoutId id, timeout_handler_proc handler);+extern void reschedule_timeouts(void);++/* timeout operation */+extern void enable_timeout_after(TimeoutId id, int delay_ms);+extern void enable_timeout_at(TimeoutId id, TimestampTz fin_time);+extern void enable_timeouts(const EnableTimeoutParams *timeouts, int count);+extern void disable_timeout(TimeoutId id, bool keep_indicator);+extern void disable_timeouts(const DisableTimeoutParams *timeouts, int count);+extern void disable_all_timeouts(bool keep_indicators);++/* accessors */+extern bool get_timeout_indicator(TimeoutId id, bool reset_indicator);+extern TimestampTz get_timeout_start_time(TimeoutId id);++#endif /* TIMEOUT_H */
+ foreign/libpg_query/src/postgres/include/utils/timestamp.h view
@@ -0,0 +1,263 @@+/*-------------------------------------------------------------------------+ *+ * timestamp.h+ * Definitions for the SQL "timestamp" and "interval" types.+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/utils/timestamp.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef TIMESTAMP_H+#define TIMESTAMP_H++#include "datatype/timestamp.h"+#include "fmgr.h"+#include "pgtime.h"+++/*+ * Macros for fmgr-callable functions.+ *+ * For Timestamp, we make use of the same support routines as for int64+ * or float8. Therefore Timestamp is pass-by-reference if and only if+ * int64 or float8 is!+ */+#ifdef HAVE_INT64_TIMESTAMP++#define DatumGetTimestamp(X) ((Timestamp) DatumGetInt64(X))+#define DatumGetTimestampTz(X) ((TimestampTz) DatumGetInt64(X))+#define DatumGetIntervalP(X) ((Interval *) DatumGetPointer(X))++#define TimestampGetDatum(X) Int64GetDatum(X)+#define TimestampTzGetDatum(X) Int64GetDatum(X)+#define IntervalPGetDatum(X) PointerGetDatum(X)++#define PG_GETARG_TIMESTAMP(n) DatumGetTimestamp(PG_GETARG_DATUM(n))+#define PG_GETARG_TIMESTAMPTZ(n) DatumGetTimestampTz(PG_GETARG_DATUM(n))+#define PG_GETARG_INTERVAL_P(n) DatumGetIntervalP(PG_GETARG_DATUM(n))++#define PG_RETURN_TIMESTAMP(x) return TimestampGetDatum(x)+#define PG_RETURN_TIMESTAMPTZ(x) return TimestampTzGetDatum(x)+#define PG_RETURN_INTERVAL_P(x) return IntervalPGetDatum(x)+#else /* !HAVE_INT64_TIMESTAMP */++#define DatumGetTimestamp(X) ((Timestamp) DatumGetFloat8(X))+#define DatumGetTimestampTz(X) ((TimestampTz) DatumGetFloat8(X))+#define DatumGetIntervalP(X) ((Interval *) DatumGetPointer(X))++#define TimestampGetDatum(X) Float8GetDatum(X)+#define TimestampTzGetDatum(X) Float8GetDatum(X)+#define IntervalPGetDatum(X) PointerGetDatum(X)++#define PG_GETARG_TIMESTAMP(n) DatumGetTimestamp(PG_GETARG_DATUM(n))+#define PG_GETARG_TIMESTAMPTZ(n) DatumGetTimestampTz(PG_GETARG_DATUM(n))+#define PG_GETARG_INTERVAL_P(n) DatumGetIntervalP(PG_GETARG_DATUM(n))++#define PG_RETURN_TIMESTAMP(x) return TimestampGetDatum(x)+#define PG_RETURN_TIMESTAMPTZ(x) return TimestampTzGetDatum(x)+#define PG_RETURN_INTERVAL_P(x) return IntervalPGetDatum(x)+#endif /* HAVE_INT64_TIMESTAMP */+++#define TIMESTAMP_MASK(b) (1 << (b))+#define INTERVAL_MASK(b) (1 << (b))++/* Macros to handle packing and unpacking the typmod field for intervals */+#define INTERVAL_FULL_RANGE (0x7FFF)+#define INTERVAL_RANGE_MASK (0x7FFF)+#define INTERVAL_FULL_PRECISION (0xFFFF)+#define INTERVAL_PRECISION_MASK (0xFFFF)+#define INTERVAL_TYPMOD(p,r) ((((r) & INTERVAL_RANGE_MASK) << 16) | ((p) & INTERVAL_PRECISION_MASK))+#define INTERVAL_PRECISION(t) ((t) & INTERVAL_PRECISION_MASK)+#define INTERVAL_RANGE(t) (((t) >> 16) & INTERVAL_RANGE_MASK)++#ifdef HAVE_INT64_TIMESTAMP+#define TimestampTzPlusMilliseconds(tz,ms) ((tz) + ((ms) * (int64) 1000))+#else+#define TimestampTzPlusMilliseconds(tz,ms) ((tz) + ((ms) / 1000.0))+#endif+++/* Set at postmaster start */+extern TimestampTz PgStartTime;++/* Set at configuration reload */+extern TimestampTz PgReloadTime;+++/*+ * timestamp.c prototypes+ */++extern Datum timestamp_in(PG_FUNCTION_ARGS);+extern Datum timestamp_out(PG_FUNCTION_ARGS);+extern Datum timestamp_recv(PG_FUNCTION_ARGS);+extern Datum timestamp_send(PG_FUNCTION_ARGS);+extern Datum timestamptypmodin(PG_FUNCTION_ARGS);+extern Datum timestamptypmodout(PG_FUNCTION_ARGS);+extern Datum timestamp_transform(PG_FUNCTION_ARGS);+extern Datum timestamp_scale(PG_FUNCTION_ARGS);+extern Datum timestamp_eq(PG_FUNCTION_ARGS);+extern Datum timestamp_ne(PG_FUNCTION_ARGS);+extern Datum timestamp_lt(PG_FUNCTION_ARGS);+extern Datum timestamp_le(PG_FUNCTION_ARGS);+extern Datum timestamp_ge(PG_FUNCTION_ARGS);+extern Datum timestamp_gt(PG_FUNCTION_ARGS);+extern Datum timestamp_finite(PG_FUNCTION_ARGS);+extern Datum timestamp_cmp(PG_FUNCTION_ARGS);+extern Datum timestamp_sortsupport(PG_FUNCTION_ARGS);+extern Datum timestamp_hash(PG_FUNCTION_ARGS);+extern Datum timestamp_smaller(PG_FUNCTION_ARGS);+extern Datum timestamp_larger(PG_FUNCTION_ARGS);++extern Datum timestamp_eq_timestamptz(PG_FUNCTION_ARGS);+extern Datum timestamp_ne_timestamptz(PG_FUNCTION_ARGS);+extern Datum timestamp_lt_timestamptz(PG_FUNCTION_ARGS);+extern Datum timestamp_le_timestamptz(PG_FUNCTION_ARGS);+extern Datum timestamp_gt_timestamptz(PG_FUNCTION_ARGS);+extern Datum timestamp_ge_timestamptz(PG_FUNCTION_ARGS);+extern Datum timestamp_cmp_timestamptz(PG_FUNCTION_ARGS);++extern Datum make_timestamp(PG_FUNCTION_ARGS);+extern Datum make_timestamptz(PG_FUNCTION_ARGS);+extern Datum make_timestamptz_at_timezone(PG_FUNCTION_ARGS);++extern Datum timestamptz_eq_timestamp(PG_FUNCTION_ARGS);+extern Datum timestamptz_ne_timestamp(PG_FUNCTION_ARGS);+extern Datum timestamptz_lt_timestamp(PG_FUNCTION_ARGS);+extern Datum timestamptz_le_timestamp(PG_FUNCTION_ARGS);+extern Datum timestamptz_gt_timestamp(PG_FUNCTION_ARGS);+extern Datum timestamptz_ge_timestamp(PG_FUNCTION_ARGS);+extern Datum timestamptz_cmp_timestamp(PG_FUNCTION_ARGS);++extern Datum interval_in(PG_FUNCTION_ARGS);+extern Datum interval_out(PG_FUNCTION_ARGS);+extern Datum interval_recv(PG_FUNCTION_ARGS);+extern Datum interval_send(PG_FUNCTION_ARGS);+extern Datum intervaltypmodin(PG_FUNCTION_ARGS);+extern Datum intervaltypmodout(PG_FUNCTION_ARGS);+extern Datum interval_transform(PG_FUNCTION_ARGS);+extern Datum interval_scale(PG_FUNCTION_ARGS);+extern Datum interval_eq(PG_FUNCTION_ARGS);+extern Datum interval_ne(PG_FUNCTION_ARGS);+extern Datum interval_lt(PG_FUNCTION_ARGS);+extern Datum interval_le(PG_FUNCTION_ARGS);+extern Datum interval_ge(PG_FUNCTION_ARGS);+extern Datum interval_gt(PG_FUNCTION_ARGS);+extern Datum interval_finite(PG_FUNCTION_ARGS);+extern Datum interval_cmp(PG_FUNCTION_ARGS);+extern Datum interval_hash(PG_FUNCTION_ARGS);+extern Datum interval_smaller(PG_FUNCTION_ARGS);+extern Datum interval_larger(PG_FUNCTION_ARGS);+extern Datum interval_justify_interval(PG_FUNCTION_ARGS);+extern Datum interval_justify_hours(PG_FUNCTION_ARGS);+extern Datum interval_justify_days(PG_FUNCTION_ARGS);+extern Datum make_interval(PG_FUNCTION_ARGS);++extern Datum timestamp_trunc(PG_FUNCTION_ARGS);+extern Datum interval_trunc(PG_FUNCTION_ARGS);+extern Datum timestamp_part(PG_FUNCTION_ARGS);+extern Datum interval_part(PG_FUNCTION_ARGS);+extern Datum timestamp_zone_transform(PG_FUNCTION_ARGS);+extern Datum timestamp_zone(PG_FUNCTION_ARGS);+extern Datum timestamp_izone_transform(PG_FUNCTION_ARGS);+extern Datum timestamp_izone(PG_FUNCTION_ARGS);+extern Datum timestamp_timestamptz(PG_FUNCTION_ARGS);++extern Datum timestamptz_in(PG_FUNCTION_ARGS);+extern Datum timestamptz_out(PG_FUNCTION_ARGS);+extern Datum timestamptz_recv(PG_FUNCTION_ARGS);+extern Datum timestamptz_send(PG_FUNCTION_ARGS);+extern Datum timestamptztypmodin(PG_FUNCTION_ARGS);+extern Datum timestamptztypmodout(PG_FUNCTION_ARGS);+extern Datum timestamptz_scale(PG_FUNCTION_ARGS);+extern Datum timestamptz_timestamp(PG_FUNCTION_ARGS);+extern Datum timestamptz_zone(PG_FUNCTION_ARGS);+extern Datum timestamptz_izone(PG_FUNCTION_ARGS);+extern Datum timestamptz_timestamptz(PG_FUNCTION_ARGS);++extern Datum interval_um(PG_FUNCTION_ARGS);+extern Datum interval_pl(PG_FUNCTION_ARGS);+extern Datum interval_mi(PG_FUNCTION_ARGS);+extern Datum interval_mul(PG_FUNCTION_ARGS);+extern Datum mul_d_interval(PG_FUNCTION_ARGS);+extern Datum interval_div(PG_FUNCTION_ARGS);+extern Datum interval_accum(PG_FUNCTION_ARGS);+extern Datum interval_accum_inv(PG_FUNCTION_ARGS);+extern Datum interval_avg(PG_FUNCTION_ARGS);++extern Datum timestamp_mi(PG_FUNCTION_ARGS);+extern Datum timestamp_pl_interval(PG_FUNCTION_ARGS);+extern Datum timestamp_mi_interval(PG_FUNCTION_ARGS);+extern Datum timestamp_age(PG_FUNCTION_ARGS);+extern Datum overlaps_timestamp(PG_FUNCTION_ARGS);++extern Datum timestamptz_pl_interval(PG_FUNCTION_ARGS);+extern Datum timestamptz_mi_interval(PG_FUNCTION_ARGS);+extern Datum timestamptz_age(PG_FUNCTION_ARGS);+extern Datum timestamptz_trunc(PG_FUNCTION_ARGS);+extern Datum timestamptz_part(PG_FUNCTION_ARGS);++extern Datum now(PG_FUNCTION_ARGS);+extern Datum statement_timestamp(PG_FUNCTION_ARGS);+extern Datum clock_timestamp(PG_FUNCTION_ARGS);++extern Datum pg_postmaster_start_time(PG_FUNCTION_ARGS);+extern Datum pg_conf_load_time(PG_FUNCTION_ARGS);++extern Datum generate_series_timestamp(PG_FUNCTION_ARGS);+extern Datum generate_series_timestamptz(PG_FUNCTION_ARGS);++/* Internal routines (not fmgr-callable) */++extern TimestampTz GetCurrentTimestamp(void);+extern void TimestampDifference(TimestampTz start_time, TimestampTz stop_time,+ long *secs, int *microsecs);+extern bool TimestampDifferenceExceeds(TimestampTz start_time,+ TimestampTz stop_time,+ int msec);++/*+ * Prototypes for functions to deal with integer timestamps, when the native+ * format is float timestamps.+ */+#ifndef HAVE_INT64_TIMESTAMP+extern int64 GetCurrentIntegerTimestamp(void);+extern TimestampTz IntegerTimestampToTimestampTz(int64 timestamp);+#else+#define GetCurrentIntegerTimestamp() GetCurrentTimestamp()+#define IntegerTimestampToTimestampTz(timestamp) (timestamp)+#endif++extern TimestampTz time_t_to_timestamptz(pg_time_t tm);+extern pg_time_t timestamptz_to_time_t(TimestampTz t);++extern const char *timestamptz_to_str(TimestampTz t);++extern int tm2timestamp(struct pg_tm * tm, fsec_t fsec, int *tzp, Timestamp *dt);+extern int timestamp2tm(Timestamp dt, int *tzp, struct pg_tm * tm,+ fsec_t *fsec, const char **tzn, pg_tz *attimezone);+extern void dt2time(Timestamp dt, int *hour, int *min, int *sec, fsec_t *fsec);++extern int interval2tm(Interval span, struct pg_tm * tm, fsec_t *fsec);+extern int tm2interval(struct pg_tm * tm, fsec_t fsec, Interval *span);++extern Timestamp SetEpochTimestamp(void);+extern void GetEpochTime(struct pg_tm * tm);++extern int timestamp_cmp_internal(Timestamp dt1, Timestamp dt2);++/* timestamp comparison works for timestamptz also */+#define timestamptz_cmp_internal(dt1,dt2) timestamp_cmp_internal(dt1, dt2)++extern int isoweek2j(int year, int week);+extern void isoweek2date(int woy, int *year, int *mon, int *mday);+extern void isoweekdate2date(int isoweek, int wday, int *year, int *mon, int *mday);+extern int date2isoweek(int year, int mon, int mday);+extern int date2isoyear(int year, int mon, int mday);+extern int date2isoyearday(int year, int mon, int mday);++#endif /* TIMESTAMP_H */
+ foreign/libpg_query/src/postgres/include/utils/tqual.h view
@@ -0,0 +1,103 @@+/*-------------------------------------------------------------------------+ *+ * tqual.h+ * POSTGRES "time qualification" definitions, ie, tuple visibility rules.+ *+ * Should be moved/renamed... - vadim 07/28/98+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/utils/tqual.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef TQUAL_H+#define TQUAL_H++#include "utils/snapshot.h"+++/* Static variables representing various special snapshot semantics */+extern PGDLLIMPORT SnapshotData SnapshotSelfData;+extern PGDLLIMPORT SnapshotData SnapshotAnyData;+extern PGDLLIMPORT SnapshotData SnapshotToastData;+extern PGDLLIMPORT SnapshotData CatalogSnapshotData;++#define SnapshotSelf (&SnapshotSelfData)+#define SnapshotAny (&SnapshotAnyData)+#define SnapshotToast (&SnapshotToastData)++/*+ * We don't provide a static SnapshotDirty variable because it would be+ * non-reentrant. Instead, users of that snapshot type should declare a+ * local variable of type SnapshotData, and initialize it with this macro.+ */+#define InitDirtySnapshot(snapshotdata) \+ ((snapshotdata).satisfies = HeapTupleSatisfiesDirty)++/* This macro encodes the knowledge of which snapshots are MVCC-safe */+#define IsMVCCSnapshot(snapshot) \+ ((snapshot)->satisfies == HeapTupleSatisfiesMVCC || \+ (snapshot)->satisfies == HeapTupleSatisfiesHistoricMVCC)++/*+ * HeapTupleSatisfiesVisibility+ * True iff heap tuple satisfies a time qual.+ *+ * Notes:+ * Assumes heap tuple is valid.+ * Beware of multiple evaluations of snapshot argument.+ * Hint bits in the HeapTuple's t_infomask may be updated as a side effect;+ * if so, the indicated buffer is marked dirty.+ */+#define HeapTupleSatisfiesVisibility(tuple, snapshot, buffer) \+ ((*(snapshot)->satisfies) (tuple, snapshot, buffer))++/* Result codes for HeapTupleSatisfiesVacuum */+typedef enum+{+ HEAPTUPLE_DEAD, /* tuple is dead and deletable */+ HEAPTUPLE_LIVE, /* tuple is live (committed, no deleter) */+ HEAPTUPLE_RECENTLY_DEAD, /* tuple is dead, but not deletable yet */+ HEAPTUPLE_INSERT_IN_PROGRESS, /* inserting xact is still in progress */+ HEAPTUPLE_DELETE_IN_PROGRESS /* deleting xact is still in progress */+} HTSV_Result;++/* These are the "satisfies" test routines for the various snapshot types */+extern bool HeapTupleSatisfiesMVCC(HeapTuple htup,+ Snapshot snapshot, Buffer buffer);+extern bool HeapTupleSatisfiesSelf(HeapTuple htup,+ Snapshot snapshot, Buffer buffer);+extern bool HeapTupleSatisfiesAny(HeapTuple htup,+ Snapshot snapshot, Buffer buffer);+extern bool HeapTupleSatisfiesToast(HeapTuple htup,+ Snapshot snapshot, Buffer buffer);+extern bool HeapTupleSatisfiesDirty(HeapTuple htup,+ Snapshot snapshot, Buffer buffer);+extern bool HeapTupleSatisfiesHistoricMVCC(HeapTuple htup,+ Snapshot snapshot, Buffer buffer);++/* Special "satisfies" routines with different APIs */+extern HTSU_Result HeapTupleSatisfiesUpdate(HeapTuple htup,+ CommandId curcid, Buffer buffer);+extern HTSV_Result HeapTupleSatisfiesVacuum(HeapTuple htup,+ TransactionId OldestXmin, Buffer buffer);+extern bool HeapTupleIsSurelyDead(HeapTuple htup,+ TransactionId OldestXmin);++extern void HeapTupleSetHintBits(HeapTupleHeader tuple, Buffer buffer,+ uint16 infomask, TransactionId xid);+extern bool HeapTupleHeaderIsOnlyLocked(HeapTupleHeader tuple);++/*+ * To avoid leaking too much knowledge about reorderbuffer implementation+ * details this is implemented in reorderbuffer.c not tqual.c.+ */+struct HTAB;+extern bool ResolveCminCmaxDuringDecoding(struct HTAB *tuplecid_data,+ Snapshot snapshot,+ HeapTuple htup,+ Buffer buffer,+ CommandId *cmin, CommandId *cmax);+#endif /* TQUAL_H */
+ foreign/libpg_query/src/postgres/include/utils/tuplesort.h view
@@ -0,0 +1,126 @@+/*-------------------------------------------------------------------------+ *+ * tuplesort.h+ * Generalized tuple sorting routines.+ *+ * This module handles sorting of heap tuples, index tuples, or single+ * Datums (and could easily support other kinds of sortable objects,+ * if necessary). It works efficiently for both small and large amounts+ * of data. Small amounts are sorted in-memory using qsort(). Large+ * amounts are sorted using temporary files and a standard external sort+ * algorithm.+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/utils/tuplesort.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef TUPLESORT_H+#define TUPLESORT_H++#include "access/itup.h"+#include "executor/tuptable.h"+#include "fmgr.h"+#include "utils/relcache.h"+++/* Tuplesortstate is an opaque type whose details are not known outside+ * tuplesort.c.+ */+typedef struct Tuplesortstate Tuplesortstate;++/*+ * We provide multiple interfaces to what is essentially the same code,+ * since different callers have different data to be sorted and want to+ * specify the sort key information differently. There are two APIs for+ * sorting HeapTuples and two more for sorting IndexTuples. Yet another+ * API supports sorting bare Datums.+ *+ * The "heap" API actually stores/sorts MinimalTuples, which means it doesn't+ * preserve the system columns (tuple identity and transaction visibility+ * info). The sort keys are specified by column numbers within the tuples+ * and sort operator OIDs. We save some cycles by passing and returning the+ * tuples in TupleTableSlots, rather than forming actual HeapTuples (which'd+ * have to be converted to MinimalTuples). This API works well for sorts+ * executed as parts of plan trees.+ *+ * The "cluster" API stores/sorts full HeapTuples including all visibility+ * info. The sort keys are specified by reference to a btree index that is+ * defined on the relation to be sorted. Note that putheaptuple/getheaptuple+ * go with this API, not the "begin_heap" one!+ *+ * The "index_btree" API stores/sorts IndexTuples (preserving all their+ * header fields). The sort keys are specified by a btree index definition.+ *+ * The "index_hash" API is similar to index_btree, but the tuples are+ * actually sorted by their hash codes not the raw data.+ */++extern Tuplesortstate *tuplesort_begin_heap(TupleDesc tupDesc,+ int nkeys, AttrNumber *attNums,+ Oid *sortOperators, Oid *sortCollations,+ bool *nullsFirstFlags,+ int workMem, bool randomAccess);+extern Tuplesortstate *tuplesort_begin_cluster(TupleDesc tupDesc,+ Relation indexRel,+ int workMem, bool randomAccess);+extern Tuplesortstate *tuplesort_begin_index_btree(Relation heapRel,+ Relation indexRel,+ bool enforceUnique,+ int workMem, bool randomAccess);+extern Tuplesortstate *tuplesort_begin_index_hash(Relation heapRel,+ Relation indexRel,+ uint32 hash_mask,+ int workMem, bool randomAccess);+extern Tuplesortstate *tuplesort_begin_datum(Oid datumType,+ Oid sortOperator, Oid sortCollation,+ bool nullsFirstFlag,+ int workMem, bool randomAccess);++extern void tuplesort_set_bound(Tuplesortstate *state, int64 bound);++extern void tuplesort_puttupleslot(Tuplesortstate *state,+ TupleTableSlot *slot);+extern void tuplesort_putheaptuple(Tuplesortstate *state, HeapTuple tup);+extern void tuplesort_putindextuplevalues(Tuplesortstate *state,+ Relation rel, ItemPointer self,+ Datum *values, bool *isnull);+extern void tuplesort_putdatum(Tuplesortstate *state, Datum val,+ bool isNull);++extern void tuplesort_performsort(Tuplesortstate *state);++extern bool tuplesort_gettupleslot(Tuplesortstate *state, bool forward,+ TupleTableSlot *slot);+extern HeapTuple tuplesort_getheaptuple(Tuplesortstate *state, bool forward,+ bool *should_free);+extern IndexTuple tuplesort_getindextuple(Tuplesortstate *state, bool forward,+ bool *should_free);+extern bool tuplesort_getdatum(Tuplesortstate *state, bool forward,+ Datum *val, bool *isNull);++extern bool tuplesort_skiptuples(Tuplesortstate *state, int64 ntuples,+ bool forward);++extern void tuplesort_end(Tuplesortstate *state);++extern void tuplesort_get_stats(Tuplesortstate *state,+ const char **sortMethod,+ const char **spaceType,+ long *spaceUsed);++extern int tuplesort_merge_order(int64 allowedMem);++/*+ * These routines may only be called if randomAccess was specified 'true'.+ * Likewise, backwards scan in gettuple/getdatum is only allowed if+ * randomAccess was specified.+ */++extern void tuplesort_rescan(Tuplesortstate *state);+extern void tuplesort_markpos(Tuplesortstate *state);+extern void tuplesort_restorepos(Tuplesortstate *state);++#endif /* TUPLESORT_H */
+ foreign/libpg_query/src/postgres/include/utils/tuplestore.h view
@@ -0,0 +1,89 @@+/*-------------------------------------------------------------------------+ *+ * tuplestore.h+ * Generalized routines for temporary tuple storage.+ *+ * This module handles temporary storage of tuples for purposes such+ * as Materialize nodes, hashjoin batch files, etc. It is essentially+ * a dumbed-down version of tuplesort.c; it does no sorting of tuples+ * but can only store and regurgitate a sequence of tuples. However,+ * because no sort is required, it is allowed to start reading the sequence+ * before it has all been written. This is particularly useful for cursors,+ * because it allows random access within the already-scanned portion of+ * a query without having to process the underlying scan to completion.+ * Also, it is possible to support multiple independent read pointers.+ *+ * A temporary file is used to handle the data if it exceeds the+ * space limit specified by the caller.+ *+ * Beginning in Postgres 8.2, what is stored is just MinimalTuples;+ * callers cannot expect valid system columns in regurgitated tuples.+ * Also, we have changed the API to return tuples in TupleTableSlots,+ * so that there is a check to prevent attempted access to system columns.+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/utils/tuplestore.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef TUPLESTORE_H+#define TUPLESTORE_H++#include "executor/tuptable.h"+++/* Tuplestorestate is an opaque type whose details are not known outside+ * tuplestore.c.+ */+typedef struct Tuplestorestate Tuplestorestate;++/*+ * Currently we only need to store MinimalTuples, but it would be easy+ * to support the same behavior for IndexTuples and/or bare Datums.+ */++extern Tuplestorestate *tuplestore_begin_heap(bool randomAccess,+ bool interXact,+ int maxKBytes);++extern void tuplestore_set_eflags(Tuplestorestate *state, int eflags);++extern void tuplestore_puttupleslot(Tuplestorestate *state,+ TupleTableSlot *slot);+extern void tuplestore_puttuple(Tuplestorestate *state, HeapTuple tuple);+extern void tuplestore_putvalues(Tuplestorestate *state, TupleDesc tdesc,+ Datum *values, bool *isnull);++/* tuplestore_donestoring() used to be required, but is no longer used */+#define tuplestore_donestoring(state) ((void) 0)++extern int tuplestore_alloc_read_pointer(Tuplestorestate *state, int eflags);++extern void tuplestore_select_read_pointer(Tuplestorestate *state, int ptr);++extern void tuplestore_copy_read_pointer(Tuplestorestate *state,+ int srcptr, int destptr);++extern void tuplestore_trim(Tuplestorestate *state);++extern bool tuplestore_in_memory(Tuplestorestate *state);++extern bool tuplestore_gettupleslot(Tuplestorestate *state, bool forward,+ bool copy, TupleTableSlot *slot);++extern bool tuplestore_advance(Tuplestorestate *state, bool forward);++extern bool tuplestore_skiptuples(Tuplestorestate *state,+ int64 ntuples, bool forward);++extern bool tuplestore_ateof(Tuplestorestate *state);++extern void tuplestore_rescan(Tuplestorestate *state);++extern void tuplestore_clear(Tuplestorestate *state);++extern void tuplestore_end(Tuplestorestate *state);++#endif /* TUPLESTORE_H */
+ foreign/libpg_query/src/postgres/include/utils/typcache.h view
@@ -0,0 +1,162 @@+/*-------------------------------------------------------------------------+ *+ * typcache.h+ * Type cache definitions.+ *+ * The type cache exists to speed lookup of certain information about data+ * types that is not directly available from a type's pg_type row.+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/utils/typcache.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef TYPCACHE_H+#define TYPCACHE_H++#include "access/tupdesc.h"+#include "fmgr.h"+++/* DomainConstraintCache is an opaque struct known only within typcache.c */+typedef struct DomainConstraintCache DomainConstraintCache;++/* TypeCacheEnumData is an opaque struct known only within typcache.c */+struct TypeCacheEnumData;++typedef struct TypeCacheEntry+{+ /* typeId is the hash lookup key and MUST BE FIRST */+ Oid type_id; /* OID of the data type */++ /* some subsidiary information copied from the pg_type row */+ int16 typlen;+ bool typbyval;+ char typalign;+ char typstorage;+ char typtype;+ Oid typrelid;++ /*+ * Information obtained from opfamily entries+ *+ * These will be InvalidOid if no match could be found, or if the+ * information hasn't yet been requested. Also note that for array and+ * composite types, typcache.c checks that the contained types are+ * comparable or hashable before allowing eq_opr etc to become set.+ */+ Oid btree_opf; /* the default btree opclass' family */+ Oid btree_opintype; /* the default btree opclass' opcintype */+ Oid hash_opf; /* the default hash opclass' family */+ Oid hash_opintype; /* the default hash opclass' opcintype */+ Oid eq_opr; /* the equality operator */+ Oid lt_opr; /* the less-than operator */+ Oid gt_opr; /* the greater-than operator */+ Oid cmp_proc; /* the btree comparison function */+ Oid hash_proc; /* the hash calculation function */++ /*+ * Pre-set-up fmgr call info for the equality operator, the btree+ * comparison function, and the hash calculation function. These are kept+ * in the type cache to avoid problems with memory leaks in repeated calls+ * to functions such as array_eq, array_cmp, hash_array. There is not+ * currently a need to maintain call info for the lt_opr or gt_opr.+ */+ FmgrInfo eq_opr_finfo;+ FmgrInfo cmp_proc_finfo;+ FmgrInfo hash_proc_finfo;++ /*+ * Tuple descriptor if it's a composite type (row type). NULL if not+ * composite or information hasn't yet been requested. (NOTE: this is a+ * reference-counted tupledesc.)+ */+ TupleDesc tupDesc;++ /*+ * Fields computed when TYPECACHE_RANGE_INFO is requested. Zeroes if not+ * a range type or information hasn't yet been requested. Note that+ * rng_cmp_proc_finfo could be different from the element type's default+ * btree comparison function.+ */+ struct TypeCacheEntry *rngelemtype; /* range's element type */+ Oid rng_collation; /* collation for comparisons, if any */+ FmgrInfo rng_cmp_proc_finfo; /* comparison function */+ FmgrInfo rng_canonical_finfo; /* canonicalization function, if any */+ FmgrInfo rng_subdiff_finfo; /* difference function, if any */++ /*+ * Domain constraint data if it's a domain type. NULL if not domain, or+ * if domain has no constraints, or if information hasn't been requested.+ */+ DomainConstraintCache *domainData;++ /* Private data, for internal use of typcache.c only */+ int flags; /* flags about what we've computed */++ /*+ * Private information about an enum type. NULL if not enum or+ * information hasn't been requested.+ */+ struct TypeCacheEnumData *enumData;++ /* We also maintain a list of all known domain-type cache entries */+ struct TypeCacheEntry *nextDomain;+} TypeCacheEntry;++/* Bit flags to indicate which fields a given caller needs to have set */+#define TYPECACHE_EQ_OPR 0x0001+#define TYPECACHE_LT_OPR 0x0002+#define TYPECACHE_GT_OPR 0x0004+#define TYPECACHE_CMP_PROC 0x0008+#define TYPECACHE_HASH_PROC 0x0010+#define TYPECACHE_EQ_OPR_FINFO 0x0020+#define TYPECACHE_CMP_PROC_FINFO 0x0040+#define TYPECACHE_HASH_PROC_FINFO 0x0080+#define TYPECACHE_TUPDESC 0x0100+#define TYPECACHE_BTREE_OPFAMILY 0x0200+#define TYPECACHE_HASH_OPFAMILY 0x0400+#define TYPECACHE_RANGE_INFO 0x0800+#define TYPECACHE_DOMAIN_INFO 0x1000++/*+ * Callers wishing to maintain a long-lived reference to a domain's constraint+ * set must store it in one of these. Use InitDomainConstraintRef() and+ * UpdateDomainConstraintRef() to manage it. Note: DomainConstraintState is+ * considered an executable expression type, so it's defined in execnodes.h.+ */+typedef struct DomainConstraintRef+{+ List *constraints; /* list of DomainConstraintState nodes */+ MemoryContext refctx; /* context holding DomainConstraintRef */++ /* Management data --- treat these fields as private to typcache.c */+ TypeCacheEntry *tcache; /* owning typcache entry */+ DomainConstraintCache *dcc; /* current constraints, or NULL if none */+ MemoryContextCallback callback; /* used to release refcount when done */+} DomainConstraintRef;+++extern TypeCacheEntry *lookup_type_cache(Oid type_id, int flags);++extern void InitDomainConstraintRef(Oid type_id, DomainConstraintRef *ref,+ MemoryContext refctx);++extern void UpdateDomainConstraintRef(DomainConstraintRef *ref);++extern bool DomainHasConstraints(Oid type_id);++extern TupleDesc lookup_rowtype_tupdesc(Oid type_id, int32 typmod);++extern TupleDesc lookup_rowtype_tupdesc_noerror(Oid type_id, int32 typmod,+ bool noError);++extern TupleDesc lookup_rowtype_tupdesc_copy(Oid type_id, int32 typmod);++extern void assign_record_type_typmod(TupleDesc tupDesc);++extern int compare_values_of_enum(TypeCacheEntry *tcache, Oid arg1, Oid arg2);++#endif /* TYPCACHE_H */
+ foreign/libpg_query/src/postgres/include/utils/tzparser.h view
@@ -0,0 +1,39 @@+/*-------------------------------------------------------------------------+ *+ * tzparser.h+ * Timezone offset file parsing definitions.+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/utils/tzparser.h+ *+ *-------------------------------------------------------------------------+ */+#ifndef TZPARSER_H+#define TZPARSER_H++#include "utils/datetime.h"++/*+ * The result of parsing a timezone configuration file is an array of+ * these structs, in order by abbrev. We export this because datetime.c+ * needs it.+ */+typedef struct tzEntry+{+ /* the actual data */+ char *abbrev; /* TZ abbreviation (downcased) */+ char *zone; /* zone name if dynamic abbrev, else NULL */+ /* for a dynamic abbreviation, offset/is_dst are not used */+ int offset; /* offset in seconds from UTC */+ bool is_dst; /* true if a DST abbreviation */+ /* source information (for error messages) */+ int lineno;+ const char *filename;+} tzEntry;+++extern TimeZoneAbbrevTable *load_tzoffsets(const char *filename);++#endif /* TZPARSER_H */
+ foreign/libpg_query/src/postgres/include/utils/xml.h view
@@ -0,0 +1,112 @@+/*-------------------------------------------------------------------------+ *+ * xml.h+ * Declarations for XML data type support.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/include/utils/xml.h+ *+ *-------------------------------------------------------------------------+ */++#ifndef XML_H+#define XML_H++#include "fmgr.h"+#include "nodes/execnodes.h"+#include "nodes/primnodes.h"++typedef struct varlena xmltype;++typedef enum+{+ XML_STANDALONE_YES,+ XML_STANDALONE_NO,+ XML_STANDALONE_NO_VALUE,+ XML_STANDALONE_OMITTED+} XmlStandaloneType;++typedef enum+{+ XMLBINARY_BASE64,+ XMLBINARY_HEX+} XmlBinaryType;++typedef enum+{+ PG_XML_STRICTNESS_LEGACY, /* ignore errors unless function result+ * indicates error condition */+ PG_XML_STRICTNESS_WELLFORMED, /* ignore non-parser messages */+ PG_XML_STRICTNESS_ALL /* report all notices/warnings/errors */+} PgXmlStrictness;++/* struct PgXmlErrorContext is private to xml.c */+typedef struct PgXmlErrorContext PgXmlErrorContext;++#define DatumGetXmlP(X) ((xmltype *) PG_DETOAST_DATUM(X))+#define XmlPGetDatum(X) PointerGetDatum(X)++#define PG_GETARG_XML_P(n) DatumGetXmlP(PG_GETARG_DATUM(n))+#define PG_RETURN_XML_P(x) PG_RETURN_POINTER(x)++extern Datum xml_in(PG_FUNCTION_ARGS);+extern Datum xml_out(PG_FUNCTION_ARGS);+extern Datum xml_recv(PG_FUNCTION_ARGS);+extern Datum xml_send(PG_FUNCTION_ARGS);+extern Datum xmlcomment(PG_FUNCTION_ARGS);+extern Datum xmlconcat2(PG_FUNCTION_ARGS);+extern Datum texttoxml(PG_FUNCTION_ARGS);+extern Datum xmltotext(PG_FUNCTION_ARGS);+extern Datum xmlvalidate(PG_FUNCTION_ARGS);+extern Datum xpath(PG_FUNCTION_ARGS);+extern Datum xpath_exists(PG_FUNCTION_ARGS);+extern Datum xmlexists(PG_FUNCTION_ARGS);+extern Datum xml_is_well_formed(PG_FUNCTION_ARGS);+extern Datum xml_is_well_formed_document(PG_FUNCTION_ARGS);+extern Datum xml_is_well_formed_content(PG_FUNCTION_ARGS);++extern Datum table_to_xml(PG_FUNCTION_ARGS);+extern Datum query_to_xml(PG_FUNCTION_ARGS);+extern Datum cursor_to_xml(PG_FUNCTION_ARGS);+extern Datum table_to_xmlschema(PG_FUNCTION_ARGS);+extern Datum query_to_xmlschema(PG_FUNCTION_ARGS);+extern Datum cursor_to_xmlschema(PG_FUNCTION_ARGS);+extern Datum table_to_xml_and_xmlschema(PG_FUNCTION_ARGS);+extern Datum query_to_xml_and_xmlschema(PG_FUNCTION_ARGS);++extern Datum schema_to_xml(PG_FUNCTION_ARGS);+extern Datum schema_to_xmlschema(PG_FUNCTION_ARGS);+extern Datum schema_to_xml_and_xmlschema(PG_FUNCTION_ARGS);++extern Datum database_to_xml(PG_FUNCTION_ARGS);+extern Datum database_to_xmlschema(PG_FUNCTION_ARGS);+extern Datum database_to_xml_and_xmlschema(PG_FUNCTION_ARGS);++extern void pg_xml_init_library(void);+extern PgXmlErrorContext *pg_xml_init(PgXmlStrictness strictness);+extern void pg_xml_done(PgXmlErrorContext *errcxt, bool isError);+extern bool pg_xml_error_occurred(PgXmlErrorContext *errcxt);+extern void xml_ereport(PgXmlErrorContext *errcxt, int level, int sqlcode,+ const char *msg);++extern xmltype *xmlconcat(List *args);+extern xmltype *xmlelement(XmlExprState *xmlExpr, ExprContext *econtext);+extern xmltype *xmlparse(text *data, XmlOptionType xmloption, bool preserve_whitespace);+extern xmltype *xmlpi(char *target, text *arg, bool arg_is_null, bool *result_is_null);+extern xmltype *xmlroot(xmltype *data, text *version, int standalone);+extern bool xml_is_document(xmltype *arg);+extern text *xmltotext_with_xmloption(xmltype *data, XmlOptionType xmloption_arg);+extern char *escape_xml(const char *str);++extern char *map_sql_identifier_to_xml_name(char *ident, bool fully_escaped, bool escape_period);+extern char *map_xml_name_to_sql_identifier(char *name);+extern char *map_sql_value_to_xml_value(Datum value, Oid type, bool xml_escape_strings);++extern int xmlbinary; /* XmlBinaryType, but int for guc enum */++extern int xmloption; /* XmlOptionType, but int for guc enum */++#endif /* XML_H */
+ foreign/libpg_query/src/postgres/scan.c view
@@ -0,0 +1,11483 @@+/*--------------------------------------------------------------------+ * Symbols referenced in this file:+ * - scanner_init+ * - core_yylex_init+ * - core_yyalloc+ * - yy_init_globals+ * - core_yyset_extra+ * - backslash_quote+ * - escape_string_warning+ * - standard_conforming_strings+ * - core_yy_scan_buffer+ * - core_yy_switch_to_buffer+ * - core_yyensure_buffer_stack+ * - core_yyrealloc+ * - core_yy_load_buffer_state+ * - yy_fatal_error+ * - fprintf_to_ereport+ * - core_yylex+ * - core_yy_create_buffer+ * - core_yy_init_buffer+ * - core_yy_flush_buffer+ * - core_yyrestart+ * - yy_start_state_list+ * - yy_transition+ * - addlitchar+ * - litbufdup+ * - addlit+ * - litbuf_udeescape+ * - hexval+ * - check_unicode_value+ * - check_uescapechar+ * - check_escape_warning+ * - is_utf16_surrogate_first+ * - is_utf16_surrogate_second+ * - addunicode+ * - surrogate_pair_to_codepoint+ * - check_string_escape_warning+ * - unescape_single_char+ * - process_integer_literal+ * - yy_get_previous_state+ * - yy_try_NUL_trans+ * - yy_get_next_buffer+ * - scanner_errposition+ * - scanner_yyerror+ * - scanner_finish+ *--------------------------------------------------------------------+ */++#line 2 "scan.c"++#line 4 "scan.c"++#define YY_INT_ALIGNED short int++/* A lexical scanner generated by flex */++#define FLEX_SCANNER+#define YY_FLEX_MAJOR_VERSION 2+#define YY_FLEX_MINOR_VERSION 5+#define YY_FLEX_SUBMINOR_VERSION 35+#if YY_FLEX_SUBMINOR_VERSION > 0+#define FLEX_BETA+#endif++/* First, we deal with platform-specific or compiler-specific issues. */++/* begin standard C headers. */+#include <stdio.h>+#include <string.h>+#include <errno.h>+#include <stdlib.h>++/* end standard C headers. */++/* flex integer type definitions */++#ifndef FLEXINT_H+#define FLEXINT_H++/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */++#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L++/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h,+ * if you want the limit (max/min) macros for int types. + */+#ifndef __STDC_LIMIT_MACROS+#define __STDC_LIMIT_MACROS 1+#endif++#include <inttypes.h>+typedef int8_t flex_int8_t;+typedef uint8_t flex_uint8_t;+typedef int16_t flex_int16_t;+typedef uint16_t flex_uint16_t;+typedef int32_t flex_int32_t;+typedef uint32_t flex_uint32_t;+typedef uint64_t flex_uint64_t;+#else+typedef signed char flex_int8_t;+typedef short int flex_int16_t;+typedef int flex_int32_t;+typedef unsigned char flex_uint8_t; +typedef unsigned short int flex_uint16_t;+typedef unsigned int flex_uint32_t;+#endif /* ! C99 */++/* Limits of integral types. */+#ifndef INT8_MIN+#define INT8_MIN (-128)+#endif+#ifndef INT16_MIN+#define INT16_MIN (-32767-1)+#endif+#ifndef INT32_MIN+#define INT32_MIN (-2147483647-1)+#endif+#ifndef INT8_MAX+#define INT8_MAX (127)+#endif+#ifndef INT16_MAX+#define INT16_MAX (32767)+#endif+#ifndef INT32_MAX+#define INT32_MAX (2147483647)+#endif+#ifndef UINT8_MAX+#define UINT8_MAX (255U)+#endif+#ifndef UINT16_MAX+#define UINT16_MAX (65535U)+#endif+#ifndef UINT32_MAX+#define UINT32_MAX (4294967295U)+#endif++#endif /* ! FLEXINT_H */++#ifdef __cplusplus++/* The "const" storage-class-modifier is valid. */+#define YY_USE_CONST++#else /* ! __cplusplus */++/* C99 requires __STDC__ to be defined as 1. */+#if defined (__STDC__)++#define YY_USE_CONST++#endif /* defined (__STDC__) */+#endif /* ! __cplusplus */++#ifdef YY_USE_CONST+#define yyconst const+#else+#define yyconst+#endif++/* Returned upon end-of-file. */+#define YY_NULL 0++/* Promotes a possibly negative, possibly signed char to an unsigned+ * integer for use as an array index. If the signed char is negative,+ * we want to instead treat it as an 8-bit unsigned char, hence the+ * double cast.+ */+#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)++/* An opaque pointer. */+#ifndef YY_TYPEDEF_YY_SCANNER_T+#define YY_TYPEDEF_YY_SCANNER_T+typedef void* yyscan_t;+#endif++/* For convenience, these vars (plus the bison vars far below)+ are macros in the reentrant scanner. */+#define yyin yyg->yyin_r+#define yyout yyg->yyout_r+#define yyextra yyg->yyextra_r+#define yyleng yyg->yyleng_r+#define yytext yyg->yytext_r+#define yylineno (YY_CURRENT_BUFFER_LVALUE->yy_bs_lineno)+#define yycolumn (YY_CURRENT_BUFFER_LVALUE->yy_bs_column)+#define yy_flex_debug yyg->yy_flex_debug_r++/* Enter a start condition. This macro really ought to take a parameter,+ * but we do it the disgusting crufty way forced on us by the ()-less+ * definition of BEGIN.+ */+#define BEGIN yyg->yy_start = 1 + 2 *++/* Translate the current start state into a value that can be later handed+ * to BEGIN to return to the state. The YYSTATE alias is for lex+ * compatibility.+ */+#define YY_START ((yyg->yy_start - 1) / 2)+#define YYSTATE YY_START++/* Action number for EOF rule of a given start state. */+#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)++/* Special action meaning "start processing a new file". */+#define YY_NEW_FILE core_yyrestart(yyin ,yyscanner )++#define YY_END_OF_BUFFER_CHAR 0++/* Size of default input buffer. */+#ifndef YY_BUF_SIZE+#define YY_BUF_SIZE 16384+#endif++/* The state buf must be large enough to hold one state per character in the main buffer.+ */+#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type))++#ifndef YY_TYPEDEF_YY_BUFFER_STATE+#define YY_TYPEDEF_YY_BUFFER_STATE+typedef struct yy_buffer_state *YY_BUFFER_STATE;+#endif++#ifndef YY_TYPEDEF_YY_SIZE_T+#define YY_TYPEDEF_YY_SIZE_T+typedef size_t yy_size_t;+#endif++#define EOB_ACT_CONTINUE_SCAN 0+#define EOB_ACT_END_OF_FILE 1+#define EOB_ACT_LAST_MATCH 2++ #define YY_LESS_LINENO(n)+ +/* Return all but the first "n" matched characters back to the input stream. */+#define yyless(n) \+ do \+ { \+ /* Undo effects of setting up yytext. */ \+ int yyless_macro_arg = (n); \+ YY_LESS_LINENO(yyless_macro_arg);\+ *yy_cp = yyg->yy_hold_char; \+ YY_RESTORE_YY_MORE_OFFSET \+ yyg->yy_c_buf_p = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \+ YY_DO_BEFORE_ACTION; /* set up yytext again */ \+ } \+ while ( 0 )++#define unput(c) yyunput( c, yyg->yytext_ptr , yyscanner )++#ifndef YY_STRUCT_YY_BUFFER_STATE+#define YY_STRUCT_YY_BUFFER_STATE+struct yy_buffer_state+ {+ FILE *yy_input_file;++ char *yy_ch_buf; /* input buffer */+ char *yy_buf_pos; /* current position in input buffer */++ /* Size of input buffer in bytes, not including room for EOB+ * characters.+ */+ yy_size_t yy_buf_size;++ /* Number of characters read into yy_ch_buf, not including EOB+ * characters.+ */+ yy_size_t yy_n_chars;++ /* Whether we "own" the buffer - i.e., we know we created it,+ * and can realloc() it to grow it, and should free() it to+ * delete it.+ */+ int yy_is_our_buffer;++ /* Whether this is an "interactive" input source; if so, and+ * if we're using stdio for input, then we want to use getc()+ * instead of fread(), to make sure we stop fetching input after+ * each newline.+ */+ int yy_is_interactive;++ /* Whether we're considered to be at the beginning of a line.+ * If so, '^' rules will be active on the next match, otherwise+ * not.+ */+ int yy_at_bol;++ int yy_bs_lineno; /**< The line count. */+ int yy_bs_column; /**< The column count. */+ + /* Whether to try to fill the input buffer when we reach the+ * end of it.+ */+ int yy_fill_buffer;++ int yy_buffer_status;++#define YY_BUFFER_NEW 0+#define YY_BUFFER_NORMAL 1+ /* When an EOF's been seen but there's still some text to process+ * then we mark the buffer as YY_EOF_PENDING, to indicate that we+ * shouldn't try reading from the input source any more. We might+ * still have a bunch of tokens to match, though, because of+ * possible backing-up.+ *+ * When we actually see the EOF, we change the status to "new"+ * (via core_yyrestart()), so that the user can continue scanning by+ * just pointing yyin at a new input file.+ */+#define YY_BUFFER_EOF_PENDING 2++ };+#endif /* !YY_STRUCT_YY_BUFFER_STATE */++/* We provide macros for accessing buffer states in case in the+ * future we want to put the buffer states in a more general+ * "scanner state".+ *+ * Returns the top of the stack, or NULL.+ */+#define YY_CURRENT_BUFFER ( yyg->yy_buffer_stack \+ ? yyg->yy_buffer_stack[yyg->yy_buffer_stack_top] \+ : NULL)++/* Same as previous macro, but useful when we know that the buffer stack is not+ * NULL or when we need an lvalue. For internal use only.+ */+#define YY_CURRENT_BUFFER_LVALUE yyg->yy_buffer_stack[yyg->yy_buffer_stack_top]++void core_yyrestart (FILE *input_file ,yyscan_t yyscanner );+void core_yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ,yyscan_t yyscanner );+YY_BUFFER_STATE core_yy_create_buffer (FILE *file,int size ,yyscan_t yyscanner );+void core_yy_delete_buffer (YY_BUFFER_STATE b ,yyscan_t yyscanner );+void core_yy_flush_buffer (YY_BUFFER_STATE b ,yyscan_t yyscanner );+void core_yypush_buffer_state (YY_BUFFER_STATE new_buffer ,yyscan_t yyscanner );+void core_yypop_buffer_state (yyscan_t yyscanner );++static void core_yyensure_buffer_stack (yyscan_t yyscanner );+static void core_yy_load_buffer_state (yyscan_t yyscanner );+static void core_yy_init_buffer (YY_BUFFER_STATE b,FILE *file ,yyscan_t yyscanner );++#define YY_FLUSH_BUFFER core_yy_flush_buffer(YY_CURRENT_BUFFER ,yyscanner)++YY_BUFFER_STATE core_yy_scan_buffer (char *base,yy_size_t size ,yyscan_t yyscanner );+YY_BUFFER_STATE core_yy_scan_string (yyconst char *yy_str ,yyscan_t yyscanner );+YY_BUFFER_STATE core_yy_scan_bytes (yyconst char *bytes,yy_size_t len ,yyscan_t yyscanner );++void *core_yyalloc (yy_size_t ,yyscan_t yyscanner );+void *core_yyrealloc (void *,yy_size_t ,yyscan_t yyscanner );+void core_yyfree (void * ,yyscan_t yyscanner );++#define yy_new_buffer core_yy_create_buffer++#define yy_set_interactive(is_interactive) \+ { \+ if ( ! YY_CURRENT_BUFFER ){ \+ core_yyensure_buffer_stack (yyscanner); \+ YY_CURRENT_BUFFER_LVALUE = \+ core_yy_create_buffer(yyin,YY_BUF_SIZE ,yyscanner); \+ } \+ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \+ }++#define yy_set_bol(at_bol) \+ { \+ if ( ! YY_CURRENT_BUFFER ){\+ core_yyensure_buffer_stack (yyscanner); \+ YY_CURRENT_BUFFER_LVALUE = \+ core_yy_create_buffer(yyin,YY_BUF_SIZE ,yyscanner); \+ } \+ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \+ }++#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)++/* Begin user sect3 */++#define core_yywrap(n) 1+#define YY_SKIP_YYWRAP++typedef unsigned char YY_CHAR;++typedef yyconst struct yy_trans_info *yy_state_type;++#define yytext_ptr yytext_r++static yy_state_type yy_get_previous_state (yyscan_t yyscanner );+static yy_state_type yy_try_NUL_trans (yy_state_type current_state ,yyscan_t yyscanner);+static int yy_get_next_buffer (yyscan_t yyscanner );+static void yy_fatal_error (yyconst char msg[] ,yyscan_t yyscanner );++/* Done after the current pattern has been matched and before the+ * corresponding action - sets up yytext.+ */+#define YY_DO_BEFORE_ACTION \+ yyg->yytext_ptr = yy_bp; \+ yyleng = (yy_size_t) (yy_cp - yy_bp); \+ yyg->yy_hold_char = *yy_cp; \+ *yy_cp = '\0'; \+ yyg->yy_c_buf_p = yy_cp;++#define YY_NUM_RULES 80+#define YY_END_OF_BUFFER 81+struct yy_trans_info+ {+ flex_int32_t yy_verify;+ flex_int32_t yy_nxt;+ };+static yyconst struct yy_trans_info yy_transition[37005] =+ {+ { 0, 0 }, { 0,36749 }, { 0, 0 }, { 0,36747 }, { 1,6708 },+ { 2,6708 }, { 3,6708 }, { 4,6708 }, { 5,6708 }, { 6,6708 },+ { 7,6708 }, { 8,6708 }, { 9,6710 }, { 10,6715 }, { 11,6708 },+ { 12,6710 }, { 13,6710 }, { 14,6708 }, { 15,6708 }, { 16,6708 },+ { 17,6708 }, { 18,6708 }, { 19,6708 }, { 20,6708 }, { 21,6708 },+ { 22,6708 }, { 23,6708 }, { 24,6708 }, { 25,6708 }, { 26,6708 },+ { 27,6708 }, { 28,6708 }, { 29,6708 }, { 30,6708 }, { 31,6708 },+ { 32,6710 }, { 33,6717 }, { 34,6712 }, { 35,6757 }, { 36,6823 },+ { 37,7080 }, { 38,6757 }, { 39,6730 }, { 40,6732 }, { 41,6732 },+ { 42,7080 }, { 43,7080 }, { 44,6732 }, { 45,7091 }, { 46,7110 },++ { 47,7181 }, { 48,7183 }, { 49,7183 }, { 50,7183 }, { 51,7183 },+ { 52,7183 }, { 53,7183 }, { 54,7183 }, { 55,7183 }, { 56,7183 },+ { 57,7183 }, { 58,6735 }, { 59,6732 }, { 60,7248 }, { 61,7259 },+ { 62,7326 }, { 63,7080 }, { 64,6757 }, { 65,7358 }, { 66,7615 },+ { 67,7358 }, { 68,7358 }, { 69,7872 }, { 70,7358 }, { 71,7358 },+ { 72,7358 }, { 73,7358 }, { 74,7358 }, { 75,7358 }, { 76,7358 },+ { 77,7358 }, { 78,8129 }, { 79,7358 }, { 80,7358 }, { 81,7358 },+ { 82,7358 }, { 83,7358 }, { 84,7358 }, { 85,8386 }, { 86,7358 },+ { 87,7358 }, { 88,8643 }, { 89,7358 }, { 90,7358 }, { 91,6732 },+ { 92,6708 }, { 93,6732 }, { 94,7080 }, { 95,7358 }, { 96,6757 },++ { 97,7358 }, { 98,7615 }, { 99,7358 }, { 100,7358 }, { 101,7872 },+ { 102,7358 }, { 103,7358 }, { 104,7358 }, { 105,7358 }, { 106,7358 },+ { 107,7358 }, { 108,7358 }, { 109,7358 }, { 110,8129 }, { 111,7358 },+ { 112,7358 }, { 113,7358 }, { 114,7358 }, { 115,7358 }, { 116,7358 },+ { 117,8386 }, { 118,7358 }, { 119,7358 }, { 120,8643 }, { 121,7358 },+ { 122,7358 }, { 123,6708 }, { 124,6757 }, { 125,6708 }, { 126,6757 },+ { 127,6708 }, { 128,7358 }, { 129,7358 }, { 130,7358 }, { 131,7358 },+ { 132,7358 }, { 133,7358 }, { 134,7358 }, { 135,7358 }, { 136,7358 },+ { 137,7358 }, { 138,7358 }, { 139,7358 }, { 140,7358 }, { 141,7358 },+ { 142,7358 }, { 143,7358 }, { 144,7358 }, { 145,7358 }, { 146,7358 },++ { 147,7358 }, { 148,7358 }, { 149,7358 }, { 150,7358 }, { 151,7358 },+ { 152,7358 }, { 153,7358 }, { 154,7358 }, { 155,7358 }, { 156,7358 },+ { 157,7358 }, { 158,7358 }, { 159,7358 }, { 160,7358 }, { 161,7358 },+ { 162,7358 }, { 163,7358 }, { 164,7358 }, { 165,7358 }, { 166,7358 },+ { 167,7358 }, { 168,7358 }, { 169,7358 }, { 170,7358 }, { 171,7358 },+ { 172,7358 }, { 173,7358 }, { 174,7358 }, { 175,7358 }, { 176,7358 },+ { 177,7358 }, { 178,7358 }, { 179,7358 }, { 180,7358 }, { 181,7358 },+ { 182,7358 }, { 183,7358 }, { 184,7358 }, { 185,7358 }, { 186,7358 },+ { 187,7358 }, { 188,7358 }, { 189,7358 }, { 190,7358 }, { 191,7358 },+ { 192,7358 }, { 193,7358 }, { 194,7358 }, { 195,7358 }, { 196,7358 },++ { 197,7358 }, { 198,7358 }, { 199,7358 }, { 200,7358 }, { 201,7358 },+ { 202,7358 }, { 203,7358 }, { 204,7358 }, { 205,7358 }, { 206,7358 },+ { 207,7358 }, { 208,7358 }, { 209,7358 }, { 210,7358 }, { 211,7358 },+ { 212,7358 }, { 213,7358 }, { 214,7358 }, { 215,7358 }, { 216,7358 },+ { 217,7358 }, { 218,7358 }, { 219,7358 }, { 220,7358 }, { 221,7358 },+ { 222,7358 }, { 223,7358 }, { 224,7358 }, { 225,7358 }, { 226,7358 },+ { 227,7358 }, { 228,7358 }, { 229,7358 }, { 230,7358 }, { 231,7358 },+ { 232,7358 }, { 233,7358 }, { 234,7358 }, { 235,7358 }, { 236,7358 },+ { 237,7358 }, { 238,7358 }, { 239,7358 }, { 240,7358 }, { 241,7358 },+ { 242,7358 }, { 243,7358 }, { 244,7358 }, { 245,7358 }, { 246,7358 },++ { 247,7358 }, { 248,7358 }, { 249,7358 }, { 250,7358 }, { 251,7358 },+ { 252,7358 }, { 253,7358 }, { 254,7358 }, { 255,7358 }, { 256,6708 },+ { 0, 0 }, { 0,36489 }, { 1,6450 }, { 2,6450 }, { 3,6450 },+ { 4,6450 }, { 5,6450 }, { 6,6450 }, { 7,6450 }, { 8,6450 },+ { 9,6452 }, { 10,6457 }, { 11,6450 }, { 12,6452 }, { 13,6452 },+ { 14,6450 }, { 15,6450 }, { 16,6450 }, { 17,6450 }, { 18,6450 },+ { 19,6450 }, { 20,6450 }, { 21,6450 }, { 22,6450 }, { 23,6450 },+ { 24,6450 }, { 25,6450 }, { 26,6450 }, { 27,6450 }, { 28,6450 },+ { 29,6450 }, { 30,6450 }, { 31,6450 }, { 32,6452 }, { 33,6459 },+ { 34,6454 }, { 35,6499 }, { 36,6565 }, { 37,6822 }, { 38,6499 },++ { 39,6472 }, { 40,6474 }, { 41,6474 }, { 42,6822 }, { 43,6822 },+ { 44,6474 }, { 45,6833 }, { 46,6852 }, { 47,6923 }, { 48,6925 },+ { 49,6925 }, { 50,6925 }, { 51,6925 }, { 52,6925 }, { 53,6925 },+ { 54,6925 }, { 55,6925 }, { 56,6925 }, { 57,6925 }, { 58,6477 },+ { 59,6474 }, { 60,6990 }, { 61,7001 }, { 62,7068 }, { 63,6822 },+ { 64,6499 }, { 65,7100 }, { 66,7357 }, { 67,7100 }, { 68,7100 },+ { 69,7614 }, { 70,7100 }, { 71,7100 }, { 72,7100 }, { 73,7100 },+ { 74,7100 }, { 75,7100 }, { 76,7100 }, { 77,7100 }, { 78,7871 },+ { 79,7100 }, { 80,7100 }, { 81,7100 }, { 82,7100 }, { 83,7100 },+ { 84,7100 }, { 85,8128 }, { 86,7100 }, { 87,7100 }, { 88,8385 },++ { 89,7100 }, { 90,7100 }, { 91,6474 }, { 92,6450 }, { 93,6474 },+ { 94,6822 }, { 95,7100 }, { 96,6499 }, { 97,7100 }, { 98,7357 },+ { 99,7100 }, { 100,7100 }, { 101,7614 }, { 102,7100 }, { 103,7100 },+ { 104,7100 }, { 105,7100 }, { 106,7100 }, { 107,7100 }, { 108,7100 },+ { 109,7100 }, { 110,7871 }, { 111,7100 }, { 112,7100 }, { 113,7100 },+ { 114,7100 }, { 115,7100 }, { 116,7100 }, { 117,8128 }, { 118,7100 },+ { 119,7100 }, { 120,8385 }, { 121,7100 }, { 122,7100 }, { 123,6450 },+ { 124,6499 }, { 125,6450 }, { 126,6499 }, { 127,6450 }, { 128,7100 },+ { 129,7100 }, { 130,7100 }, { 131,7100 }, { 132,7100 }, { 133,7100 },+ { 134,7100 }, { 135,7100 }, { 136,7100 }, { 137,7100 }, { 138,7100 },++ { 139,7100 }, { 140,7100 }, { 141,7100 }, { 142,7100 }, { 143,7100 },+ { 144,7100 }, { 145,7100 }, { 146,7100 }, { 147,7100 }, { 148,7100 },+ { 149,7100 }, { 150,7100 }, { 151,7100 }, { 152,7100 }, { 153,7100 },+ { 154,7100 }, { 155,7100 }, { 156,7100 }, { 157,7100 }, { 158,7100 },+ { 159,7100 }, { 160,7100 }, { 161,7100 }, { 162,7100 }, { 163,7100 },+ { 164,7100 }, { 165,7100 }, { 166,7100 }, { 167,7100 }, { 168,7100 },+ { 169,7100 }, { 170,7100 }, { 171,7100 }, { 172,7100 }, { 173,7100 },+ { 174,7100 }, { 175,7100 }, { 176,7100 }, { 177,7100 }, { 178,7100 },+ { 179,7100 }, { 180,7100 }, { 181,7100 }, { 182,7100 }, { 183,7100 },+ { 184,7100 }, { 185,7100 }, { 186,7100 }, { 187,7100 }, { 188,7100 },++ { 189,7100 }, { 190,7100 }, { 191,7100 }, { 192,7100 }, { 193,7100 },+ { 194,7100 }, { 195,7100 }, { 196,7100 }, { 197,7100 }, { 198,7100 },+ { 199,7100 }, { 200,7100 }, { 201,7100 }, { 202,7100 }, { 203,7100 },+ { 204,7100 }, { 205,7100 }, { 206,7100 }, { 207,7100 }, { 208,7100 },+ { 209,7100 }, { 210,7100 }, { 211,7100 }, { 212,7100 }, { 213,7100 },+ { 214,7100 }, { 215,7100 }, { 216,7100 }, { 217,7100 }, { 218,7100 },+ { 219,7100 }, { 220,7100 }, { 221,7100 }, { 222,7100 }, { 223,7100 },+ { 224,7100 }, { 225,7100 }, { 226,7100 }, { 227,7100 }, { 228,7100 },+ { 229,7100 }, { 230,7100 }, { 231,7100 }, { 232,7100 }, { 233,7100 },+ { 234,7100 }, { 235,7100 }, { 236,7100 }, { 237,7100 }, { 238,7100 },++ { 239,7100 }, { 240,7100 }, { 241,7100 }, { 242,7100 }, { 243,7100 },+ { 244,7100 }, { 245,7100 }, { 246,7100 }, { 247,7100 }, { 248,7100 },+ { 249,7100 }, { 250,7100 }, { 251,7100 }, { 252,7100 }, { 253,7100 },+ { 254,7100 }, { 255,7100 }, { 256,6450 }, { 0, 12 }, { 0,36231 },+ { 1,8384 }, { 2,8384 }, { 3,8384 }, { 4,8384 }, { 5,8384 },+ { 6,8384 }, { 7,8384 }, { 8,8384 }, { 9,8384 }, { 10,8384 },+ { 11,8384 }, { 12,8384 }, { 13,8384 }, { 14,8384 }, { 15,8384 },+ { 16,8384 }, { 17,8384 }, { 18,8384 }, { 19,8384 }, { 20,8384 },+ { 21,8384 }, { 22,8384 }, { 23,8384 }, { 24,8384 }, { 25,8384 },+ { 26,8384 }, { 27,8384 }, { 28,8384 }, { 29,8384 }, { 30,8384 },++ { 31,8384 }, { 32,8384 }, { 33,8384 }, { 34,8384 }, { 35,8384 },+ { 36,8384 }, { 37,8384 }, { 38,8384 }, { 39,8642 }, { 40,8384 },+ { 41,8384 }, { 42,8384 }, { 43,8384 }, { 44,8384 }, { 45,8384 },+ { 46,8384 }, { 47,8384 }, { 48,8384 }, { 49,8384 }, { 50,8384 },+ { 51,8384 }, { 52,8384 }, { 53,8384 }, { 54,8384 }, { 55,8384 },+ { 56,8384 }, { 57,8384 }, { 58,8384 }, { 59,8384 }, { 60,8384 },+ { 61,8384 }, { 62,8384 }, { 63,8384 }, { 64,8384 }, { 65,8384 },+ { 66,8384 }, { 67,8384 }, { 68,8384 }, { 69,8384 }, { 70,8384 },+ { 71,8384 }, { 72,8384 }, { 73,8384 }, { 74,8384 }, { 75,8384 },+ { 76,8384 }, { 77,8384 }, { 78,8384 }, { 79,8384 }, { 80,8384 },++ { 81,8384 }, { 82,8384 }, { 83,8384 }, { 84,8384 }, { 85,8384 },+ { 86,8384 }, { 87,8384 }, { 88,8384 }, { 89,8384 }, { 90,8384 },+ { 91,8384 }, { 92,8384 }, { 93,8384 }, { 94,8384 }, { 95,8384 },+ { 96,8384 }, { 97,8384 }, { 98,8384 }, { 99,8384 }, { 100,8384 },+ { 101,8384 }, { 102,8384 }, { 103,8384 }, { 104,8384 }, { 105,8384 },+ { 106,8384 }, { 107,8384 }, { 108,8384 }, { 109,8384 }, { 110,8384 },+ { 111,8384 }, { 112,8384 }, { 113,8384 }, { 114,8384 }, { 115,8384 },+ { 116,8384 }, { 117,8384 }, { 118,8384 }, { 119,8384 }, { 120,8384 },+ { 121,8384 }, { 122,8384 }, { 123,8384 }, { 124,8384 }, { 125,8384 },+ { 126,8384 }, { 127,8384 }, { 128,8384 }, { 129,8384 }, { 130,8384 },++ { 131,8384 }, { 132,8384 }, { 133,8384 }, { 134,8384 }, { 135,8384 },+ { 136,8384 }, { 137,8384 }, { 138,8384 }, { 139,8384 }, { 140,8384 },+ { 141,8384 }, { 142,8384 }, { 143,8384 }, { 144,8384 }, { 145,8384 },+ { 146,8384 }, { 147,8384 }, { 148,8384 }, { 149,8384 }, { 150,8384 },+ { 151,8384 }, { 152,8384 }, { 153,8384 }, { 154,8384 }, { 155,8384 },+ { 156,8384 }, { 157,8384 }, { 158,8384 }, { 159,8384 }, { 160,8384 },+ { 161,8384 }, { 162,8384 }, { 163,8384 }, { 164,8384 }, { 165,8384 },+ { 166,8384 }, { 167,8384 }, { 168,8384 }, { 169,8384 }, { 170,8384 },+ { 171,8384 }, { 172,8384 }, { 173,8384 }, { 174,8384 }, { 175,8384 },+ { 176,8384 }, { 177,8384 }, { 178,8384 }, { 179,8384 }, { 180,8384 },++ { 181,8384 }, { 182,8384 }, { 183,8384 }, { 184,8384 }, { 185,8384 },+ { 186,8384 }, { 187,8384 }, { 188,8384 }, { 189,8384 }, { 190,8384 },+ { 191,8384 }, { 192,8384 }, { 193,8384 }, { 194,8384 }, { 195,8384 },+ { 196,8384 }, { 197,8384 }, { 198,8384 }, { 199,8384 }, { 200,8384 },+ { 201,8384 }, { 202,8384 }, { 203,8384 }, { 204,8384 }, { 205,8384 },+ { 206,8384 }, { 207,8384 }, { 208,8384 }, { 209,8384 }, { 210,8384 },+ { 211,8384 }, { 212,8384 }, { 213,8384 }, { 214,8384 }, { 215,8384 },+ { 216,8384 }, { 217,8384 }, { 218,8384 }, { 219,8384 }, { 220,8384 },+ { 221,8384 }, { 222,8384 }, { 223,8384 }, { 224,8384 }, { 225,8384 },+ { 226,8384 }, { 227,8384 }, { 228,8384 }, { 229,8384 }, { 230,8384 },++ { 231,8384 }, { 232,8384 }, { 233,8384 }, { 234,8384 }, { 235,8384 },+ { 236,8384 }, { 237,8384 }, { 238,8384 }, { 239,8384 }, { 240,8384 },+ { 241,8384 }, { 242,8384 }, { 243,8384 }, { 244,8384 }, { 245,8384 },+ { 246,8384 }, { 247,8384 }, { 248,8384 }, { 249,8384 }, { 250,8384 },+ { 251,8384 }, { 252,8384 }, { 253,8384 }, { 254,8384 }, { 255,8384 },+ { 256,8384 }, { 0, 12 }, { 0,35973 }, { 1,8126 }, { 2,8126 },+ { 3,8126 }, { 4,8126 }, { 5,8126 }, { 6,8126 }, { 7,8126 },+ { 8,8126 }, { 9,8126 }, { 10,8126 }, { 11,8126 }, { 12,8126 },+ { 13,8126 }, { 14,8126 }, { 15,8126 }, { 16,8126 }, { 17,8126 },+ { 18,8126 }, { 19,8126 }, { 20,8126 }, { 21,8126 }, { 22,8126 },++ { 23,8126 }, { 24,8126 }, { 25,8126 }, { 26,8126 }, { 27,8126 },+ { 28,8126 }, { 29,8126 }, { 30,8126 }, { 31,8126 }, { 32,8126 },+ { 33,8126 }, { 34,8126 }, { 35,8126 }, { 36,8126 }, { 37,8126 },+ { 38,8126 }, { 39,8384 }, { 40,8126 }, { 41,8126 }, { 42,8126 },+ { 43,8126 }, { 44,8126 }, { 45,8126 }, { 46,8126 }, { 47,8126 },+ { 48,8126 }, { 49,8126 }, { 50,8126 }, { 51,8126 }, { 52,8126 },+ { 53,8126 }, { 54,8126 }, { 55,8126 }, { 56,8126 }, { 57,8126 },+ { 58,8126 }, { 59,8126 }, { 60,8126 }, { 61,8126 }, { 62,8126 },+ { 63,8126 }, { 64,8126 }, { 65,8126 }, { 66,8126 }, { 67,8126 },+ { 68,8126 }, { 69,8126 }, { 70,8126 }, { 71,8126 }, { 72,8126 },++ { 73,8126 }, { 74,8126 }, { 75,8126 }, { 76,8126 }, { 77,8126 },+ { 78,8126 }, { 79,8126 }, { 80,8126 }, { 81,8126 }, { 82,8126 },+ { 83,8126 }, { 84,8126 }, { 85,8126 }, { 86,8126 }, { 87,8126 },+ { 88,8126 }, { 89,8126 }, { 90,8126 }, { 91,8126 }, { 92,8126 },+ { 93,8126 }, { 94,8126 }, { 95,8126 }, { 96,8126 }, { 97,8126 },+ { 98,8126 }, { 99,8126 }, { 100,8126 }, { 101,8126 }, { 102,8126 },+ { 103,8126 }, { 104,8126 }, { 105,8126 }, { 106,8126 }, { 107,8126 },+ { 108,8126 }, { 109,8126 }, { 110,8126 }, { 111,8126 }, { 112,8126 },+ { 113,8126 }, { 114,8126 }, { 115,8126 }, { 116,8126 }, { 117,8126 },+ { 118,8126 }, { 119,8126 }, { 120,8126 }, { 121,8126 }, { 122,8126 },++ { 123,8126 }, { 124,8126 }, { 125,8126 }, { 126,8126 }, { 127,8126 },+ { 128,8126 }, { 129,8126 }, { 130,8126 }, { 131,8126 }, { 132,8126 },+ { 133,8126 }, { 134,8126 }, { 135,8126 }, { 136,8126 }, { 137,8126 },+ { 138,8126 }, { 139,8126 }, { 140,8126 }, { 141,8126 }, { 142,8126 },+ { 143,8126 }, { 144,8126 }, { 145,8126 }, { 146,8126 }, { 147,8126 },+ { 148,8126 }, { 149,8126 }, { 150,8126 }, { 151,8126 }, { 152,8126 },+ { 153,8126 }, { 154,8126 }, { 155,8126 }, { 156,8126 }, { 157,8126 },+ { 158,8126 }, { 159,8126 }, { 160,8126 }, { 161,8126 }, { 162,8126 },+ { 163,8126 }, { 164,8126 }, { 165,8126 }, { 166,8126 }, { 167,8126 },+ { 168,8126 }, { 169,8126 }, { 170,8126 }, { 171,8126 }, { 172,8126 },++ { 173,8126 }, { 174,8126 }, { 175,8126 }, { 176,8126 }, { 177,8126 },+ { 178,8126 }, { 179,8126 }, { 180,8126 }, { 181,8126 }, { 182,8126 },+ { 183,8126 }, { 184,8126 }, { 185,8126 }, { 186,8126 }, { 187,8126 },+ { 188,8126 }, { 189,8126 }, { 190,8126 }, { 191,8126 }, { 192,8126 },+ { 193,8126 }, { 194,8126 }, { 195,8126 }, { 196,8126 }, { 197,8126 },+ { 198,8126 }, { 199,8126 }, { 200,8126 }, { 201,8126 }, { 202,8126 },+ { 203,8126 }, { 204,8126 }, { 205,8126 }, { 206,8126 }, { 207,8126 },+ { 208,8126 }, { 209,8126 }, { 210,8126 }, { 211,8126 }, { 212,8126 },+ { 213,8126 }, { 214,8126 }, { 215,8126 }, { 216,8126 }, { 217,8126 },+ { 218,8126 }, { 219,8126 }, { 220,8126 }, { 221,8126 }, { 222,8126 },++ { 223,8126 }, { 224,8126 }, { 225,8126 }, { 226,8126 }, { 227,8126 },+ { 228,8126 }, { 229,8126 }, { 230,8126 }, { 231,8126 }, { 232,8126 },+ { 233,8126 }, { 234,8126 }, { 235,8126 }, { 236,8126 }, { 237,8126 },+ { 238,8126 }, { 239,8126 }, { 240,8126 }, { 241,8126 }, { 242,8126 },+ { 243,8126 }, { 244,8126 }, { 245,8126 }, { 246,8126 }, { 247,8126 },+ { 248,8126 }, { 249,8126 }, { 250,8126 }, { 251,8126 }, { 252,8126 },+ { 253,8126 }, { 254,8126 }, { 255,8126 }, { 256,8126 }, { 0, 0 },+ { 0,35715 }, { 1,8173 }, { 2,8173 }, { 3,8173 }, { 4,8173 },+ { 5,8173 }, { 6,8173 }, { 7,8173 }, { 8,8173 }, { 9,8173 },+ { 10,8173 }, { 11,8173 }, { 12,8173 }, { 13,8173 }, { 14,8173 },++ { 15,8173 }, { 16,8173 }, { 17,8173 }, { 18,8173 }, { 19,8173 },+ { 20,8173 }, { 21,8173 }, { 22,8173 }, { 23,8173 }, { 24,8173 },+ { 25,8173 }, { 26,8173 }, { 27,8173 }, { 28,8173 }, { 29,8173 },+ { 30,8173 }, { 31,8173 }, { 32,8173 }, { 33,8431 }, { 34,8173 },+ { 35,8431 }, { 36,8173 }, { 37,8431 }, { 38,8431 }, { 39,8173 },+ { 40,8173 }, { 41,8173 }, { 42,5708 }, { 43,8431 }, { 44,8173 },+ { 45,8431 }, { 46,8173 }, { 47,5712 }, { 48,8173 }, { 49,8173 },+ { 50,8173 }, { 51,8173 }, { 52,8173 }, { 53,8173 }, { 54,8173 },+ { 55,8173 }, { 56,8173 }, { 57,8173 }, { 58,8173 }, { 59,8173 },+ { 60,8431 }, { 61,8431 }, { 62,8431 }, { 63,8431 }, { 64,8431 },++ { 65,8173 }, { 66,8173 }, { 67,8173 }, { 68,8173 }, { 69,8173 },+ { 70,8173 }, { 71,8173 }, { 72,8173 }, { 73,8173 }, { 74,8173 },+ { 75,8173 }, { 76,8173 }, { 77,8173 }, { 78,8173 }, { 79,8173 },+ { 80,8173 }, { 81,8173 }, { 82,8173 }, { 83,8173 }, { 84,8173 },+ { 85,8173 }, { 86,8173 }, { 87,8173 }, { 88,8173 }, { 89,8173 },+ { 90,8173 }, { 91,8173 }, { 92,8173 }, { 93,8173 }, { 94,8431 },+ { 95,8173 }, { 96,8431 }, { 97,8173 }, { 98,8173 }, { 99,8173 },+ { 100,8173 }, { 101,8173 }, { 102,8173 }, { 103,8173 }, { 104,8173 },+ { 105,8173 }, { 106,8173 }, { 107,8173 }, { 108,8173 }, { 109,8173 },+ { 110,8173 }, { 111,8173 }, { 112,8173 }, { 113,8173 }, { 114,8173 },++ { 115,8173 }, { 116,8173 }, { 117,8173 }, { 118,8173 }, { 119,8173 },+ { 120,8173 }, { 121,8173 }, { 122,8173 }, { 123,8173 }, { 124,8431 },+ { 125,8173 }, { 126,8431 }, { 127,8173 }, { 128,8173 }, { 129,8173 },+ { 130,8173 }, { 131,8173 }, { 132,8173 }, { 133,8173 }, { 134,8173 },+ { 135,8173 }, { 136,8173 }, { 137,8173 }, { 138,8173 }, { 139,8173 },+ { 140,8173 }, { 141,8173 }, { 142,8173 }, { 143,8173 }, { 144,8173 },+ { 145,8173 }, { 146,8173 }, { 147,8173 }, { 148,8173 }, { 149,8173 },+ { 150,8173 }, { 151,8173 }, { 152,8173 }, { 153,8173 }, { 154,8173 },+ { 155,8173 }, { 156,8173 }, { 157,8173 }, { 158,8173 }, { 159,8173 },+ { 160,8173 }, { 161,8173 }, { 162,8173 }, { 163,8173 }, { 164,8173 },++ { 165,8173 }, { 166,8173 }, { 167,8173 }, { 168,8173 }, { 169,8173 },+ { 170,8173 }, { 171,8173 }, { 172,8173 }, { 173,8173 }, { 174,8173 },+ { 175,8173 }, { 176,8173 }, { 177,8173 }, { 178,8173 }, { 179,8173 },+ { 180,8173 }, { 181,8173 }, { 182,8173 }, { 183,8173 }, { 184,8173 },+ { 185,8173 }, { 186,8173 }, { 187,8173 }, { 188,8173 }, { 189,8173 },+ { 190,8173 }, { 191,8173 }, { 192,8173 }, { 193,8173 }, { 194,8173 },+ { 195,8173 }, { 196,8173 }, { 197,8173 }, { 198,8173 }, { 199,8173 },+ { 200,8173 }, { 201,8173 }, { 202,8173 }, { 203,8173 }, { 204,8173 },+ { 205,8173 }, { 206,8173 }, { 207,8173 }, { 208,8173 }, { 209,8173 },+ { 210,8173 }, { 211,8173 }, { 212,8173 }, { 213,8173 }, { 214,8173 },++ { 215,8173 }, { 216,8173 }, { 217,8173 }, { 218,8173 }, { 219,8173 },+ { 220,8173 }, { 221,8173 }, { 222,8173 }, { 223,8173 }, { 224,8173 },+ { 225,8173 }, { 226,8173 }, { 227,8173 }, { 228,8173 }, { 229,8173 },+ { 230,8173 }, { 231,8173 }, { 232,8173 }, { 233,8173 }, { 234,8173 },+ { 235,8173 }, { 236,8173 }, { 237,8173 }, { 238,8173 }, { 239,8173 },+ { 240,8173 }, { 241,8173 }, { 242,8173 }, { 243,8173 }, { 244,8173 },+ { 245,8173 }, { 246,8173 }, { 247,8173 }, { 248,8173 }, { 249,8173 },+ { 250,8173 }, { 251,8173 }, { 252,8173 }, { 253,8173 }, { 254,8173 },+ { 255,8173 }, { 256,8173 }, { 0, 0 }, { 0,35457 }, { 1,7915 },+ { 2,7915 }, { 3,7915 }, { 4,7915 }, { 5,7915 }, { 6,7915 },++ { 7,7915 }, { 8,7915 }, { 9,7915 }, { 10,7915 }, { 11,7915 },+ { 12,7915 }, { 13,7915 }, { 14,7915 }, { 15,7915 }, { 16,7915 },+ { 17,7915 }, { 18,7915 }, { 19,7915 }, { 20,7915 }, { 21,7915 },+ { 22,7915 }, { 23,7915 }, { 24,7915 }, { 25,7915 }, { 26,7915 },+ { 27,7915 }, { 28,7915 }, { 29,7915 }, { 30,7915 }, { 31,7915 },+ { 32,7915 }, { 33,8173 }, { 34,7915 }, { 35,8173 }, { 36,7915 },+ { 37,8173 }, { 38,8173 }, { 39,7915 }, { 40,7915 }, { 41,7915 },+ { 42,5450 }, { 43,8173 }, { 44,7915 }, { 45,8173 }, { 46,7915 },+ { 47,5454 }, { 48,7915 }, { 49,7915 }, { 50,7915 }, { 51,7915 },+ { 52,7915 }, { 53,7915 }, { 54,7915 }, { 55,7915 }, { 56,7915 },++ { 57,7915 }, { 58,7915 }, { 59,7915 }, { 60,8173 }, { 61,8173 },+ { 62,8173 }, { 63,8173 }, { 64,8173 }, { 65,7915 }, { 66,7915 },+ { 67,7915 }, { 68,7915 }, { 69,7915 }, { 70,7915 }, { 71,7915 },+ { 72,7915 }, { 73,7915 }, { 74,7915 }, { 75,7915 }, { 76,7915 },+ { 77,7915 }, { 78,7915 }, { 79,7915 }, { 80,7915 }, { 81,7915 },+ { 82,7915 }, { 83,7915 }, { 84,7915 }, { 85,7915 }, { 86,7915 },+ { 87,7915 }, { 88,7915 }, { 89,7915 }, { 90,7915 }, { 91,7915 },+ { 92,7915 }, { 93,7915 }, { 94,8173 }, { 95,7915 }, { 96,8173 },+ { 97,7915 }, { 98,7915 }, { 99,7915 }, { 100,7915 }, { 101,7915 },+ { 102,7915 }, { 103,7915 }, { 104,7915 }, { 105,7915 }, { 106,7915 },++ { 107,7915 }, { 108,7915 }, { 109,7915 }, { 110,7915 }, { 111,7915 },+ { 112,7915 }, { 113,7915 }, { 114,7915 }, { 115,7915 }, { 116,7915 },+ { 117,7915 }, { 118,7915 }, { 119,7915 }, { 120,7915 }, { 121,7915 },+ { 122,7915 }, { 123,7915 }, { 124,8173 }, { 125,7915 }, { 126,8173 },+ { 127,7915 }, { 128,7915 }, { 129,7915 }, { 130,7915 }, { 131,7915 },+ { 132,7915 }, { 133,7915 }, { 134,7915 }, { 135,7915 }, { 136,7915 },+ { 137,7915 }, { 138,7915 }, { 139,7915 }, { 140,7915 }, { 141,7915 },+ { 142,7915 }, { 143,7915 }, { 144,7915 }, { 145,7915 }, { 146,7915 },+ { 147,7915 }, { 148,7915 }, { 149,7915 }, { 150,7915 }, { 151,7915 },+ { 152,7915 }, { 153,7915 }, { 154,7915 }, { 155,7915 }, { 156,7915 },++ { 157,7915 }, { 158,7915 }, { 159,7915 }, { 160,7915 }, { 161,7915 },+ { 162,7915 }, { 163,7915 }, { 164,7915 }, { 165,7915 }, { 166,7915 },+ { 167,7915 }, { 168,7915 }, { 169,7915 }, { 170,7915 }, { 171,7915 },+ { 172,7915 }, { 173,7915 }, { 174,7915 }, { 175,7915 }, { 176,7915 },+ { 177,7915 }, { 178,7915 }, { 179,7915 }, { 180,7915 }, { 181,7915 },+ { 182,7915 }, { 183,7915 }, { 184,7915 }, { 185,7915 }, { 186,7915 },+ { 187,7915 }, { 188,7915 }, { 189,7915 }, { 190,7915 }, { 191,7915 },+ { 192,7915 }, { 193,7915 }, { 194,7915 }, { 195,7915 }, { 196,7915 },+ { 197,7915 }, { 198,7915 }, { 199,7915 }, { 200,7915 }, { 201,7915 },+ { 202,7915 }, { 203,7915 }, { 204,7915 }, { 205,7915 }, { 206,7915 },++ { 207,7915 }, { 208,7915 }, { 209,7915 }, { 210,7915 }, { 211,7915 },+ { 212,7915 }, { 213,7915 }, { 214,7915 }, { 215,7915 }, { 216,7915 },+ { 217,7915 }, { 218,7915 }, { 219,7915 }, { 220,7915 }, { 221,7915 },+ { 222,7915 }, { 223,7915 }, { 224,7915 }, { 225,7915 }, { 226,7915 },+ { 227,7915 }, { 228,7915 }, { 229,7915 }, { 230,7915 }, { 231,7915 },+ { 232,7915 }, { 233,7915 }, { 234,7915 }, { 235,7915 }, { 236,7915 },+ { 237,7915 }, { 238,7915 }, { 239,7915 }, { 240,7915 }, { 241,7915 },+ { 242,7915 }, { 243,7915 }, { 244,7915 }, { 245,7915 }, { 246,7915 },+ { 247,7915 }, { 248,7915 }, { 249,7915 }, { 250,7915 }, { 251,7915 },+ { 252,7915 }, { 253,7915 }, { 254,7915 }, { 255,7915 }, { 256,7915 },++ { 0, 0 }, { 0,35199 }, { 1,8173 }, { 2,8173 }, { 3,8173 },+ { 4,8173 }, { 5,8173 }, { 6,8173 }, { 7,8173 }, { 8,8173 },+ { 9,8173 }, { 10,8173 }, { 11,8173 }, { 12,8173 }, { 13,8173 },+ { 14,8173 }, { 15,8173 }, { 16,8173 }, { 17,8173 }, { 18,8173 },+ { 19,8173 }, { 20,8173 }, { 21,8173 }, { 22,8173 }, { 23,8173 },+ { 24,8173 }, { 25,8173 }, { 26,8173 }, { 27,8173 }, { 28,8173 },+ { 29,8173 }, { 30,8173 }, { 31,8173 }, { 32,8173 }, { 33,8173 },+ { 34,5201 }, { 35,8173 }, { 36,8173 }, { 37,8173 }, { 38,8173 },+ { 39,8173 }, { 40,8173 }, { 41,8173 }, { 42,8173 }, { 43,8173 },+ { 44,8173 }, { 45,8173 }, { 46,8173 }, { 47,8173 }, { 48,8173 },++ { 49,8173 }, { 50,8173 }, { 51,8173 }, { 52,8173 }, { 53,8173 },+ { 54,8173 }, { 55,8173 }, { 56,8173 }, { 57,8173 }, { 58,8173 },+ { 59,8173 }, { 60,8173 }, { 61,8173 }, { 62,8173 }, { 63,8173 },+ { 64,8173 }, { 65,8173 }, { 66,8173 }, { 67,8173 }, { 68,8173 },+ { 69,8173 }, { 70,8173 }, { 71,8173 }, { 72,8173 }, { 73,8173 },+ { 74,8173 }, { 75,8173 }, { 76,8173 }, { 77,8173 }, { 78,8173 },+ { 79,8173 }, { 80,8173 }, { 81,8173 }, { 82,8173 }, { 83,8173 },+ { 84,8173 }, { 85,8173 }, { 86,8173 }, { 87,8173 }, { 88,8173 },+ { 89,8173 }, { 90,8173 }, { 91,8173 }, { 92,8173 }, { 93,8173 },+ { 94,8173 }, { 95,8173 }, { 96,8173 }, { 97,8173 }, { 98,8173 },++ { 99,8173 }, { 100,8173 }, { 101,8173 }, { 102,8173 }, { 103,8173 },+ { 104,8173 }, { 105,8173 }, { 106,8173 }, { 107,8173 }, { 108,8173 },+ { 109,8173 }, { 110,8173 }, { 111,8173 }, { 112,8173 }, { 113,8173 },+ { 114,8173 }, { 115,8173 }, { 116,8173 }, { 117,8173 }, { 118,8173 },+ { 119,8173 }, { 120,8173 }, { 121,8173 }, { 122,8173 }, { 123,8173 },+ { 124,8173 }, { 125,8173 }, { 126,8173 }, { 127,8173 }, { 128,8173 },+ { 129,8173 }, { 130,8173 }, { 131,8173 }, { 132,8173 }, { 133,8173 },+ { 134,8173 }, { 135,8173 }, { 136,8173 }, { 137,8173 }, { 138,8173 },+ { 139,8173 }, { 140,8173 }, { 141,8173 }, { 142,8173 }, { 143,8173 },+ { 144,8173 }, { 145,8173 }, { 146,8173 }, { 147,8173 }, { 148,8173 },++ { 149,8173 }, { 150,8173 }, { 151,8173 }, { 152,8173 }, { 153,8173 },+ { 154,8173 }, { 155,8173 }, { 156,8173 }, { 157,8173 }, { 158,8173 },+ { 159,8173 }, { 160,8173 }, { 161,8173 }, { 162,8173 }, { 163,8173 },+ { 164,8173 }, { 165,8173 }, { 166,8173 }, { 167,8173 }, { 168,8173 },+ { 169,8173 }, { 170,8173 }, { 171,8173 }, { 172,8173 }, { 173,8173 },+ { 174,8173 }, { 175,8173 }, { 176,8173 }, { 177,8173 }, { 178,8173 },+ { 179,8173 }, { 180,8173 }, { 181,8173 }, { 182,8173 }, { 183,8173 },+ { 184,8173 }, { 185,8173 }, { 186,8173 }, { 187,8173 }, { 188,8173 },+ { 189,8173 }, { 190,8173 }, { 191,8173 }, { 192,8173 }, { 193,8173 },+ { 194,8173 }, { 195,8173 }, { 196,8173 }, { 197,8173 }, { 198,8173 },++ { 199,8173 }, { 200,8173 }, { 201,8173 }, { 202,8173 }, { 203,8173 },+ { 204,8173 }, { 205,8173 }, { 206,8173 }, { 207,8173 }, { 208,8173 },+ { 209,8173 }, { 210,8173 }, { 211,8173 }, { 212,8173 }, { 213,8173 },+ { 214,8173 }, { 215,8173 }, { 216,8173 }, { 217,8173 }, { 218,8173 },+ { 219,8173 }, { 220,8173 }, { 221,8173 }, { 222,8173 }, { 223,8173 },+ { 224,8173 }, { 225,8173 }, { 226,8173 }, { 227,8173 }, { 228,8173 },+ { 229,8173 }, { 230,8173 }, { 231,8173 }, { 232,8173 }, { 233,8173 },+ { 234,8173 }, { 235,8173 }, { 236,8173 }, { 237,8173 }, { 238,8173 },+ { 239,8173 }, { 240,8173 }, { 241,8173 }, { 242,8173 }, { 243,8173 },+ { 244,8173 }, { 245,8173 }, { 246,8173 }, { 247,8173 }, { 248,8173 },++ { 249,8173 }, { 250,8173 }, { 251,8173 }, { 252,8173 }, { 253,8173 },+ { 254,8173 }, { 255,8173 }, { 256,8173 }, { 0, 0 }, { 0,34941 },+ { 1,7915 }, { 2,7915 }, { 3,7915 }, { 4,7915 }, { 5,7915 },+ { 6,7915 }, { 7,7915 }, { 8,7915 }, { 9,7915 }, { 10,7915 },+ { 11,7915 }, { 12,7915 }, { 13,7915 }, { 14,7915 }, { 15,7915 },+ { 16,7915 }, { 17,7915 }, { 18,7915 }, { 19,7915 }, { 20,7915 },+ { 21,7915 }, { 22,7915 }, { 23,7915 }, { 24,7915 }, { 25,7915 },+ { 26,7915 }, { 27,7915 }, { 28,7915 }, { 29,7915 }, { 30,7915 },+ { 31,7915 }, { 32,7915 }, { 33,7915 }, { 34,4943 }, { 35,7915 },+ { 36,7915 }, { 37,7915 }, { 38,7915 }, { 39,7915 }, { 40,7915 },++ { 41,7915 }, { 42,7915 }, { 43,7915 }, { 44,7915 }, { 45,7915 },+ { 46,7915 }, { 47,7915 }, { 48,7915 }, { 49,7915 }, { 50,7915 },+ { 51,7915 }, { 52,7915 }, { 53,7915 }, { 54,7915 }, { 55,7915 },+ { 56,7915 }, { 57,7915 }, { 58,7915 }, { 59,7915 }, { 60,7915 },+ { 61,7915 }, { 62,7915 }, { 63,7915 }, { 64,7915 }, { 65,7915 },+ { 66,7915 }, { 67,7915 }, { 68,7915 }, { 69,7915 }, { 70,7915 },+ { 71,7915 }, { 72,7915 }, { 73,7915 }, { 74,7915 }, { 75,7915 },+ { 76,7915 }, { 77,7915 }, { 78,7915 }, { 79,7915 }, { 80,7915 },+ { 81,7915 }, { 82,7915 }, { 83,7915 }, { 84,7915 }, { 85,7915 },+ { 86,7915 }, { 87,7915 }, { 88,7915 }, { 89,7915 }, { 90,7915 },++ { 91,7915 }, { 92,7915 }, { 93,7915 }, { 94,7915 }, { 95,7915 },+ { 96,7915 }, { 97,7915 }, { 98,7915 }, { 99,7915 }, { 100,7915 },+ { 101,7915 }, { 102,7915 }, { 103,7915 }, { 104,7915 }, { 105,7915 },+ { 106,7915 }, { 107,7915 }, { 108,7915 }, { 109,7915 }, { 110,7915 },+ { 111,7915 }, { 112,7915 }, { 113,7915 }, { 114,7915 }, { 115,7915 },+ { 116,7915 }, { 117,7915 }, { 118,7915 }, { 119,7915 }, { 120,7915 },+ { 121,7915 }, { 122,7915 }, { 123,7915 }, { 124,7915 }, { 125,7915 },+ { 126,7915 }, { 127,7915 }, { 128,7915 }, { 129,7915 }, { 130,7915 },+ { 131,7915 }, { 132,7915 }, { 133,7915 }, { 134,7915 }, { 135,7915 },+ { 136,7915 }, { 137,7915 }, { 138,7915 }, { 139,7915 }, { 140,7915 },++ { 141,7915 }, { 142,7915 }, { 143,7915 }, { 144,7915 }, { 145,7915 },+ { 146,7915 }, { 147,7915 }, { 148,7915 }, { 149,7915 }, { 150,7915 },+ { 151,7915 }, { 152,7915 }, { 153,7915 }, { 154,7915 }, { 155,7915 },+ { 156,7915 }, { 157,7915 }, { 158,7915 }, { 159,7915 }, { 160,7915 },+ { 161,7915 }, { 162,7915 }, { 163,7915 }, { 164,7915 }, { 165,7915 },+ { 166,7915 }, { 167,7915 }, { 168,7915 }, { 169,7915 }, { 170,7915 },+ { 171,7915 }, { 172,7915 }, { 173,7915 }, { 174,7915 }, { 175,7915 },+ { 176,7915 }, { 177,7915 }, { 178,7915 }, { 179,7915 }, { 180,7915 },+ { 181,7915 }, { 182,7915 }, { 183,7915 }, { 184,7915 }, { 185,7915 },+ { 186,7915 }, { 187,7915 }, { 188,7915 }, { 189,7915 }, { 190,7915 },++ { 191,7915 }, { 192,7915 }, { 193,7915 }, { 194,7915 }, { 195,7915 },+ { 196,7915 }, { 197,7915 }, { 198,7915 }, { 199,7915 }, { 200,7915 },+ { 201,7915 }, { 202,7915 }, { 203,7915 }, { 204,7915 }, { 205,7915 },+ { 206,7915 }, { 207,7915 }, { 208,7915 }, { 209,7915 }, { 210,7915 },+ { 211,7915 }, { 212,7915 }, { 213,7915 }, { 214,7915 }, { 215,7915 },+ { 216,7915 }, { 217,7915 }, { 218,7915 }, { 219,7915 }, { 220,7915 },+ { 221,7915 }, { 222,7915 }, { 223,7915 }, { 224,7915 }, { 225,7915 },+ { 226,7915 }, { 227,7915 }, { 228,7915 }, { 229,7915 }, { 230,7915 },+ { 231,7915 }, { 232,7915 }, { 233,7915 }, { 234,7915 }, { 235,7915 },+ { 236,7915 }, { 237,7915 }, { 238,7915 }, { 239,7915 }, { 240,7915 },++ { 241,7915 }, { 242,7915 }, { 243,7915 }, { 244,7915 }, { 245,7915 },+ { 246,7915 }, { 247,7915 }, { 248,7915 }, { 249,7915 }, { 250,7915 },+ { 251,7915 }, { 252,7915 }, { 253,7915 }, { 254,7915 }, { 255,7915 },+ { 256,7915 }, { 0, 11 }, { 0,34683 }, { 1,7915 }, { 2,7915 },+ { 3,7915 }, { 4,7915 }, { 5,7915 }, { 6,7915 }, { 7,7915 },+ { 8,7915 }, { 9,7915 }, { 10,7915 }, { 11,7915 }, { 12,7915 },+ { 13,7915 }, { 14,7915 }, { 15,7915 }, { 16,7915 }, { 17,7915 },+ { 18,7915 }, { 19,7915 }, { 20,7915 }, { 21,7915 }, { 22,7915 },+ { 23,7915 }, { 24,7915 }, { 25,7915 }, { 26,7915 }, { 27,7915 },+ { 28,7915 }, { 29,7915 }, { 30,7915 }, { 31,7915 }, { 32,7915 },++ { 33,7915 }, { 34,7915 }, { 35,7915 }, { 36,7915 }, { 37,7915 },+ { 38,7915 }, { 39,8173 }, { 40,7915 }, { 41,7915 }, { 42,7915 },+ { 43,7915 }, { 44,7915 }, { 45,7915 }, { 46,7915 }, { 47,7915 },+ { 48,7915 }, { 49,7915 }, { 50,7915 }, { 51,7915 }, { 52,7915 },+ { 53,7915 }, { 54,7915 }, { 55,7915 }, { 56,7915 }, { 57,7915 },+ { 58,7915 }, { 59,7915 }, { 60,7915 }, { 61,7915 }, { 62,7915 },+ { 63,7915 }, { 64,7915 }, { 65,7915 }, { 66,7915 }, { 67,7915 },+ { 68,7915 }, { 69,7915 }, { 70,7915 }, { 71,7915 }, { 72,7915 },+ { 73,7915 }, { 74,7915 }, { 75,7915 }, { 76,7915 }, { 77,7915 },+ { 78,7915 }, { 79,7915 }, { 80,7915 }, { 81,7915 }, { 82,7915 },++ { 83,7915 }, { 84,7915 }, { 85,7915 }, { 86,7915 }, { 87,7915 },+ { 88,7915 }, { 89,7915 }, { 90,7915 }, { 91,7915 }, { 92,7915 },+ { 93,7915 }, { 94,7915 }, { 95,7915 }, { 96,7915 }, { 97,7915 },+ { 98,7915 }, { 99,7915 }, { 100,7915 }, { 101,7915 }, { 102,7915 },+ { 103,7915 }, { 104,7915 }, { 105,7915 }, { 106,7915 }, { 107,7915 },+ { 108,7915 }, { 109,7915 }, { 110,7915 }, { 111,7915 }, { 112,7915 },+ { 113,7915 }, { 114,7915 }, { 115,7915 }, { 116,7915 }, { 117,7915 },+ { 118,7915 }, { 119,7915 }, { 120,7915 }, { 121,7915 }, { 122,7915 },+ { 123,7915 }, { 124,7915 }, { 125,7915 }, { 126,7915 }, { 127,7915 },+ { 128,7915 }, { 129,7915 }, { 130,7915 }, { 131,7915 }, { 132,7915 },++ { 133,7915 }, { 134,7915 }, { 135,7915 }, { 136,7915 }, { 137,7915 },+ { 138,7915 }, { 139,7915 }, { 140,7915 }, { 141,7915 }, { 142,7915 },+ { 143,7915 }, { 144,7915 }, { 145,7915 }, { 146,7915 }, { 147,7915 },+ { 148,7915 }, { 149,7915 }, { 150,7915 }, { 151,7915 }, { 152,7915 },+ { 153,7915 }, { 154,7915 }, { 155,7915 }, { 156,7915 }, { 157,7915 },+ { 158,7915 }, { 159,7915 }, { 160,7915 }, { 161,7915 }, { 162,7915 },+ { 163,7915 }, { 164,7915 }, { 165,7915 }, { 166,7915 }, { 167,7915 },+ { 168,7915 }, { 169,7915 }, { 170,7915 }, { 171,7915 }, { 172,7915 },+ { 173,7915 }, { 174,7915 }, { 175,7915 }, { 176,7915 }, { 177,7915 },+ { 178,7915 }, { 179,7915 }, { 180,7915 }, { 181,7915 }, { 182,7915 },++ { 183,7915 }, { 184,7915 }, { 185,7915 }, { 186,7915 }, { 187,7915 },+ { 188,7915 }, { 189,7915 }, { 190,7915 }, { 191,7915 }, { 192,7915 },+ { 193,7915 }, { 194,7915 }, { 195,7915 }, { 196,7915 }, { 197,7915 },+ { 198,7915 }, { 199,7915 }, { 200,7915 }, { 201,7915 }, { 202,7915 },+ { 203,7915 }, { 204,7915 }, { 205,7915 }, { 206,7915 }, { 207,7915 },+ { 208,7915 }, { 209,7915 }, { 210,7915 }, { 211,7915 }, { 212,7915 },+ { 213,7915 }, { 214,7915 }, { 215,7915 }, { 216,7915 }, { 217,7915 },+ { 218,7915 }, { 219,7915 }, { 220,7915 }, { 221,7915 }, { 222,7915 },+ { 223,7915 }, { 224,7915 }, { 225,7915 }, { 226,7915 }, { 227,7915 },+ { 228,7915 }, { 229,7915 }, { 230,7915 }, { 231,7915 }, { 232,7915 },++ { 233,7915 }, { 234,7915 }, { 235,7915 }, { 236,7915 }, { 237,7915 },+ { 238,7915 }, { 239,7915 }, { 240,7915 }, { 241,7915 }, { 242,7915 },+ { 243,7915 }, { 244,7915 }, { 245,7915 }, { 246,7915 }, { 247,7915 },+ { 248,7915 }, { 249,7915 }, { 250,7915 }, { 251,7915 }, { 252,7915 },+ { 253,7915 }, { 254,7915 }, { 255,7915 }, { 256,7915 }, { 0, 11 },+ { 0,34425 }, { 1,7657 }, { 2,7657 }, { 3,7657 }, { 4,7657 },+ { 5,7657 }, { 6,7657 }, { 7,7657 }, { 8,7657 }, { 9,7657 },+ { 10,7657 }, { 11,7657 }, { 12,7657 }, { 13,7657 }, { 14,7657 },+ { 15,7657 }, { 16,7657 }, { 17,7657 }, { 18,7657 }, { 19,7657 },+ { 20,7657 }, { 21,7657 }, { 22,7657 }, { 23,7657 }, { 24,7657 },++ { 25,7657 }, { 26,7657 }, { 27,7657 }, { 28,7657 }, { 29,7657 },+ { 30,7657 }, { 31,7657 }, { 32,7657 }, { 33,7657 }, { 34,7657 },+ { 35,7657 }, { 36,7657 }, { 37,7657 }, { 38,7657 }, { 39,7915 },+ { 40,7657 }, { 41,7657 }, { 42,7657 }, { 43,7657 }, { 44,7657 },+ { 45,7657 }, { 46,7657 }, { 47,7657 }, { 48,7657 }, { 49,7657 },+ { 50,7657 }, { 51,7657 }, { 52,7657 }, { 53,7657 }, { 54,7657 },+ { 55,7657 }, { 56,7657 }, { 57,7657 }, { 58,7657 }, { 59,7657 },+ { 60,7657 }, { 61,7657 }, { 62,7657 }, { 63,7657 }, { 64,7657 },+ { 65,7657 }, { 66,7657 }, { 67,7657 }, { 68,7657 }, { 69,7657 },+ { 70,7657 }, { 71,7657 }, { 72,7657 }, { 73,7657 }, { 74,7657 },++ { 75,7657 }, { 76,7657 }, { 77,7657 }, { 78,7657 }, { 79,7657 },+ { 80,7657 }, { 81,7657 }, { 82,7657 }, { 83,7657 }, { 84,7657 },+ { 85,7657 }, { 86,7657 }, { 87,7657 }, { 88,7657 }, { 89,7657 },+ { 90,7657 }, { 91,7657 }, { 92,7657 }, { 93,7657 }, { 94,7657 },+ { 95,7657 }, { 96,7657 }, { 97,7657 }, { 98,7657 }, { 99,7657 },+ { 100,7657 }, { 101,7657 }, { 102,7657 }, { 103,7657 }, { 104,7657 },+ { 105,7657 }, { 106,7657 }, { 107,7657 }, { 108,7657 }, { 109,7657 },+ { 110,7657 }, { 111,7657 }, { 112,7657 }, { 113,7657 }, { 114,7657 },+ { 115,7657 }, { 116,7657 }, { 117,7657 }, { 118,7657 }, { 119,7657 },+ { 120,7657 }, { 121,7657 }, { 122,7657 }, { 123,7657 }, { 124,7657 },++ { 125,7657 }, { 126,7657 }, { 127,7657 }, { 128,7657 }, { 129,7657 },+ { 130,7657 }, { 131,7657 }, { 132,7657 }, { 133,7657 }, { 134,7657 },+ { 135,7657 }, { 136,7657 }, { 137,7657 }, { 138,7657 }, { 139,7657 },+ { 140,7657 }, { 141,7657 }, { 142,7657 }, { 143,7657 }, { 144,7657 },+ { 145,7657 }, { 146,7657 }, { 147,7657 }, { 148,7657 }, { 149,7657 },+ { 150,7657 }, { 151,7657 }, { 152,7657 }, { 153,7657 }, { 154,7657 },+ { 155,7657 }, { 156,7657 }, { 157,7657 }, { 158,7657 }, { 159,7657 },+ { 160,7657 }, { 161,7657 }, { 162,7657 }, { 163,7657 }, { 164,7657 },+ { 165,7657 }, { 166,7657 }, { 167,7657 }, { 168,7657 }, { 169,7657 },+ { 170,7657 }, { 171,7657 }, { 172,7657 }, { 173,7657 }, { 174,7657 },++ { 175,7657 }, { 176,7657 }, { 177,7657 }, { 178,7657 }, { 179,7657 },+ { 180,7657 }, { 181,7657 }, { 182,7657 }, { 183,7657 }, { 184,7657 },+ { 185,7657 }, { 186,7657 }, { 187,7657 }, { 188,7657 }, { 189,7657 },+ { 190,7657 }, { 191,7657 }, { 192,7657 }, { 193,7657 }, { 194,7657 },+ { 195,7657 }, { 196,7657 }, { 197,7657 }, { 198,7657 }, { 199,7657 },+ { 200,7657 }, { 201,7657 }, { 202,7657 }, { 203,7657 }, { 204,7657 },+ { 205,7657 }, { 206,7657 }, { 207,7657 }, { 208,7657 }, { 209,7657 },+ { 210,7657 }, { 211,7657 }, { 212,7657 }, { 213,7657 }, { 214,7657 },+ { 215,7657 }, { 216,7657 }, { 217,7657 }, { 218,7657 }, { 219,7657 },+ { 220,7657 }, { 221,7657 }, { 222,7657 }, { 223,7657 }, { 224,7657 },++ { 225,7657 }, { 226,7657 }, { 227,7657 }, { 228,7657 }, { 229,7657 },+ { 230,7657 }, { 231,7657 }, { 232,7657 }, { 233,7657 }, { 234,7657 },+ { 235,7657 }, { 236,7657 }, { 237,7657 }, { 238,7657 }, { 239,7657 },+ { 240,7657 }, { 241,7657 }, { 242,7657 }, { 243,7657 }, { 244,7657 },+ { 245,7657 }, { 246,7657 }, { 247,7657 }, { 248,7657 }, { 249,7657 },+ { 250,7657 }, { 251,7657 }, { 252,7657 }, { 253,7657 }, { 254,7657 },+ { 255,7657 }, { 256,7657 }, { 0, 0 }, { 0,34167 }, { 1,7704 },+ { 2,7704 }, { 3,7704 }, { 4,7704 }, { 5,7704 }, { 6,7704 },+ { 7,7704 }, { 8,7704 }, { 9,7704 }, { 10,7962 }, { 11,7704 },+ { 12,7704 }, { 13,7704 }, { 14,7704 }, { 15,7704 }, { 16,7704 },++ { 17,7704 }, { 18,7704 }, { 19,7704 }, { 20,7704 }, { 21,7704 },+ { 22,7704 }, { 23,7704 }, { 24,7704 }, { 25,7704 }, { 26,7704 },+ { 27,7704 }, { 28,7704 }, { 29,7704 }, { 30,7704 }, { 31,7704 },+ { 32,7704 }, { 33,7704 }, { 34,7704 }, { 35,7704 }, { 36,7704 },+ { 37,7704 }, { 38,7704 }, { 39,8220 }, { 40,7704 }, { 41,7704 },+ { 42,7704 }, { 43,7704 }, { 44,7704 }, { 45,7704 }, { 46,7704 },+ { 47,7704 }, { 48,7704 }, { 49,7704 }, { 50,7704 }, { 51,7704 },+ { 52,7704 }, { 53,7704 }, { 54,7704 }, { 55,7704 }, { 56,7704 },+ { 57,7704 }, { 58,7704 }, { 59,7704 }, { 60,7704 }, { 61,7704 },+ { 62,7704 }, { 63,7704 }, { 64,7704 }, { 65,7704 }, { 66,7704 },++ { 67,7704 }, { 68,7704 }, { 69,7704 }, { 70,7704 }, { 71,7704 },+ { 72,7704 }, { 73,7704 }, { 74,7704 }, { 75,7704 }, { 76,7704 },+ { 77,7704 }, { 78,7704 }, { 79,7704 }, { 80,7704 }, { 81,7704 },+ { 82,7704 }, { 83,7704 }, { 84,7704 }, { 85,7704 }, { 86,7704 },+ { 87,7704 }, { 88,7704 }, { 89,7704 }, { 90,7704 }, { 91,7704 },+ { 92,8267 }, { 93,7704 }, { 94,7704 }, { 95,7704 }, { 96,7704 },+ { 97,7704 }, { 98,7704 }, { 99,7704 }, { 100,7704 }, { 101,7704 },+ { 102,7704 }, { 103,7704 }, { 104,7704 }, { 105,7704 }, { 106,7704 },+ { 107,7704 }, { 108,7704 }, { 109,7704 }, { 110,7704 }, { 111,7704 },+ { 112,7704 }, { 113,7704 }, { 114,7704 }, { 115,7704 }, { 116,7704 },++ { 117,7704 }, { 118,7704 }, { 119,7704 }, { 120,7704 }, { 121,7704 },+ { 122,7704 }, { 123,7704 }, { 124,7704 }, { 125,7704 }, { 126,7704 },+ { 127,7704 }, { 128,7704 }, { 129,7704 }, { 130,7704 }, { 131,7704 },+ { 132,7704 }, { 133,7704 }, { 134,7704 }, { 135,7704 }, { 136,7704 },+ { 137,7704 }, { 138,7704 }, { 139,7704 }, { 140,7704 }, { 141,7704 },+ { 142,7704 }, { 143,7704 }, { 144,7704 }, { 145,7704 }, { 146,7704 },+ { 147,7704 }, { 148,7704 }, { 149,7704 }, { 150,7704 }, { 151,7704 },+ { 152,7704 }, { 153,7704 }, { 154,7704 }, { 155,7704 }, { 156,7704 },+ { 157,7704 }, { 158,7704 }, { 159,7704 }, { 160,7704 }, { 161,7704 },+ { 162,7704 }, { 163,7704 }, { 164,7704 }, { 165,7704 }, { 166,7704 },++ { 167,7704 }, { 168,7704 }, { 169,7704 }, { 170,7704 }, { 171,7704 },+ { 172,7704 }, { 173,7704 }, { 174,7704 }, { 175,7704 }, { 176,7704 },+ { 177,7704 }, { 178,7704 }, { 179,7704 }, { 180,7704 }, { 181,7704 },+ { 182,7704 }, { 183,7704 }, { 184,7704 }, { 185,7704 }, { 186,7704 },+ { 187,7704 }, { 188,7704 }, { 189,7704 }, { 190,7704 }, { 191,7704 },+ { 192,7704 }, { 193,7704 }, { 194,7704 }, { 195,7704 }, { 196,7704 },+ { 197,7704 }, { 198,7704 }, { 199,7704 }, { 200,7704 }, { 201,7704 },+ { 202,7704 }, { 203,7704 }, { 204,7704 }, { 205,7704 }, { 206,7704 },+ { 207,7704 }, { 208,7704 }, { 209,7704 }, { 210,7704 }, { 211,7704 },+ { 212,7704 }, { 213,7704 }, { 214,7704 }, { 215,7704 }, { 216,7704 },++ { 217,7704 }, { 218,7704 }, { 219,7704 }, { 220,7704 }, { 221,7704 },+ { 222,7704 }, { 223,7704 }, { 224,7704 }, { 225,7704 }, { 226,7704 },+ { 227,7704 }, { 228,7704 }, { 229,7704 }, { 230,7704 }, { 231,7704 },+ { 232,7704 }, { 233,7704 }, { 234,7704 }, { 235,7704 }, { 236,7704 },+ { 237,7704 }, { 238,7704 }, { 239,7704 }, { 240,7704 }, { 241,7704 },+ { 242,7704 }, { 243,7704 }, { 244,7704 }, { 245,7704 }, { 246,7704 },+ { 247,7704 }, { 248,7704 }, { 249,7704 }, { 250,7704 }, { 251,7704 },+ { 252,7704 }, { 253,7704 }, { 254,7704 }, { 255,7704 }, { 256,7704 },+ { 0, 0 }, { 0,33909 }, { 1,7446 }, { 2,7446 }, { 3,7446 },+ { 4,7446 }, { 5,7446 }, { 6,7446 }, { 7,7446 }, { 8,7446 },++ { 9,7446 }, { 10,7704 }, { 11,7446 }, { 12,7446 }, { 13,7446 },+ { 14,7446 }, { 15,7446 }, { 16,7446 }, { 17,7446 }, { 18,7446 },+ { 19,7446 }, { 20,7446 }, { 21,7446 }, { 22,7446 }, { 23,7446 },+ { 24,7446 }, { 25,7446 }, { 26,7446 }, { 27,7446 }, { 28,7446 },+ { 29,7446 }, { 30,7446 }, { 31,7446 }, { 32,7446 }, { 33,7446 },+ { 34,7446 }, { 35,7446 }, { 36,7446 }, { 37,7446 }, { 38,7446 },+ { 39,7962 }, { 40,7446 }, { 41,7446 }, { 42,7446 }, { 43,7446 },+ { 44,7446 }, { 45,7446 }, { 46,7446 }, { 47,7446 }, { 48,7446 },+ { 49,7446 }, { 50,7446 }, { 51,7446 }, { 52,7446 }, { 53,7446 },+ { 54,7446 }, { 55,7446 }, { 56,7446 }, { 57,7446 }, { 58,7446 },++ { 59,7446 }, { 60,7446 }, { 61,7446 }, { 62,7446 }, { 63,7446 },+ { 64,7446 }, { 65,7446 }, { 66,7446 }, { 67,7446 }, { 68,7446 },+ { 69,7446 }, { 70,7446 }, { 71,7446 }, { 72,7446 }, { 73,7446 },+ { 74,7446 }, { 75,7446 }, { 76,7446 }, { 77,7446 }, { 78,7446 },+ { 79,7446 }, { 80,7446 }, { 81,7446 }, { 82,7446 }, { 83,7446 },+ { 84,7446 }, { 85,7446 }, { 86,7446 }, { 87,7446 }, { 88,7446 },+ { 89,7446 }, { 90,7446 }, { 91,7446 }, { 92,8009 }, { 93,7446 },+ { 94,7446 }, { 95,7446 }, { 96,7446 }, { 97,7446 }, { 98,7446 },+ { 99,7446 }, { 100,7446 }, { 101,7446 }, { 102,7446 }, { 103,7446 },+ { 104,7446 }, { 105,7446 }, { 106,7446 }, { 107,7446 }, { 108,7446 },++ { 109,7446 }, { 110,7446 }, { 111,7446 }, { 112,7446 }, { 113,7446 },+ { 114,7446 }, { 115,7446 }, { 116,7446 }, { 117,7446 }, { 118,7446 },+ { 119,7446 }, { 120,7446 }, { 121,7446 }, { 122,7446 }, { 123,7446 },+ { 124,7446 }, { 125,7446 }, { 126,7446 }, { 127,7446 }, { 128,7446 },+ { 129,7446 }, { 130,7446 }, { 131,7446 }, { 132,7446 }, { 133,7446 },+ { 134,7446 }, { 135,7446 }, { 136,7446 }, { 137,7446 }, { 138,7446 },+ { 139,7446 }, { 140,7446 }, { 141,7446 }, { 142,7446 }, { 143,7446 },+ { 144,7446 }, { 145,7446 }, { 146,7446 }, { 147,7446 }, { 148,7446 },+ { 149,7446 }, { 150,7446 }, { 151,7446 }, { 152,7446 }, { 153,7446 },+ { 154,7446 }, { 155,7446 }, { 156,7446 }, { 157,7446 }, { 158,7446 },++ { 159,7446 }, { 160,7446 }, { 161,7446 }, { 162,7446 }, { 163,7446 },+ { 164,7446 }, { 165,7446 }, { 166,7446 }, { 167,7446 }, { 168,7446 },+ { 169,7446 }, { 170,7446 }, { 171,7446 }, { 172,7446 }, { 173,7446 },+ { 174,7446 }, { 175,7446 }, { 176,7446 }, { 177,7446 }, { 178,7446 },+ { 179,7446 }, { 180,7446 }, { 181,7446 }, { 182,7446 }, { 183,7446 },+ { 184,7446 }, { 185,7446 }, { 186,7446 }, { 187,7446 }, { 188,7446 },+ { 189,7446 }, { 190,7446 }, { 191,7446 }, { 192,7446 }, { 193,7446 },+ { 194,7446 }, { 195,7446 }, { 196,7446 }, { 197,7446 }, { 198,7446 },+ { 199,7446 }, { 200,7446 }, { 201,7446 }, { 202,7446 }, { 203,7446 },+ { 204,7446 }, { 205,7446 }, { 206,7446 }, { 207,7446 }, { 208,7446 },++ { 209,7446 }, { 210,7446 }, { 211,7446 }, { 212,7446 }, { 213,7446 },+ { 214,7446 }, { 215,7446 }, { 216,7446 }, { 217,7446 }, { 218,7446 },+ { 219,7446 }, { 220,7446 }, { 221,7446 }, { 222,7446 }, { 223,7446 },+ { 224,7446 }, { 225,7446 }, { 226,7446 }, { 227,7446 }, { 228,7446 },+ { 229,7446 }, { 230,7446 }, { 231,7446 }, { 232,7446 }, { 233,7446 },+ { 234,7446 }, { 235,7446 }, { 236,7446 }, { 237,7446 }, { 238,7446 },+ { 239,7446 }, { 240,7446 }, { 241,7446 }, { 242,7446 }, { 243,7446 },+ { 244,7446 }, { 245,7446 }, { 246,7446 }, { 247,7446 }, { 248,7446 },+ { 249,7446 }, { 250,7446 }, { 251,7446 }, { 252,7446 }, { 253,7446 },+ { 254,7446 }, { 255,7446 }, { 256,7446 }, { 0, 0 }, { 0,33651 },++ { 1,8009 }, { 2,8009 }, { 3,8009 }, { 4,8009 }, { 5,8009 },+ { 6,8009 }, { 7,8009 }, { 8,8009 }, { 9,8009 }, { 10,8009 },+ { 11,8009 }, { 12,8009 }, { 13,8009 }, { 14,8009 }, { 15,8009 },+ { 16,8009 }, { 17,8009 }, { 18,8009 }, { 19,8009 }, { 20,8009 },+ { 21,8009 }, { 22,8009 }, { 23,8009 }, { 24,8009 }, { 25,8009 },+ { 26,8009 }, { 27,8009 }, { 28,8009 }, { 29,8009 }, { 30,8009 },+ { 31,8009 }, { 32,8009 }, { 33,8009 }, { 34,8009 }, { 35,8009 },+ { 36,8009 }, { 37,8009 }, { 38,8009 }, { 39,8267 }, { 40,8009 },+ { 41,8009 }, { 42,8009 }, { 43,8009 }, { 44,8009 }, { 45,8009 },+ { 46,8009 }, { 47,8009 }, { 48,8009 }, { 49,8009 }, { 50,8009 },++ { 51,8009 }, { 52,8009 }, { 53,8009 }, { 54,8009 }, { 55,8009 },+ { 56,8009 }, { 57,8009 }, { 58,8009 }, { 59,8009 }, { 60,8009 },+ { 61,8009 }, { 62,8009 }, { 63,8009 }, { 64,8009 }, { 65,8009 },+ { 66,8009 }, { 67,8009 }, { 68,8009 }, { 69,8009 }, { 70,8009 },+ { 71,8009 }, { 72,8009 }, { 73,8009 }, { 74,8009 }, { 75,8009 },+ { 76,8009 }, { 77,8009 }, { 78,8009 }, { 79,8009 }, { 80,8009 },+ { 81,8009 }, { 82,8009 }, { 83,8009 }, { 84,8009 }, { 85,8009 },+ { 86,8009 }, { 87,8009 }, { 88,8009 }, { 89,8009 }, { 90,8009 },+ { 91,8009 }, { 92,8009 }, { 93,8009 }, { 94,8009 }, { 95,8009 },+ { 96,8009 }, { 97,8009 }, { 98,8009 }, { 99,8009 }, { 100,8009 },++ { 101,8009 }, { 102,8009 }, { 103,8009 }, { 104,8009 }, { 105,8009 },+ { 106,8009 }, { 107,8009 }, { 108,8009 }, { 109,8009 }, { 110,8009 },+ { 111,8009 }, { 112,8009 }, { 113,8009 }, { 114,8009 }, { 115,8009 },+ { 116,8009 }, { 117,8009 }, { 118,8009 }, { 119,8009 }, { 120,8009 },+ { 121,8009 }, { 122,8009 }, { 123,8009 }, { 124,8009 }, { 125,8009 },+ { 126,8009 }, { 127,8009 }, { 128,8009 }, { 129,8009 }, { 130,8009 },+ { 131,8009 }, { 132,8009 }, { 133,8009 }, { 134,8009 }, { 135,8009 },+ { 136,8009 }, { 137,8009 }, { 138,8009 }, { 139,8009 }, { 140,8009 },+ { 141,8009 }, { 142,8009 }, { 143,8009 }, { 144,8009 }, { 145,8009 },+ { 146,8009 }, { 147,8009 }, { 148,8009 }, { 149,8009 }, { 150,8009 },++ { 151,8009 }, { 152,8009 }, { 153,8009 }, { 154,8009 }, { 155,8009 },+ { 156,8009 }, { 157,8009 }, { 158,8009 }, { 159,8009 }, { 160,8009 },+ { 161,8009 }, { 162,8009 }, { 163,8009 }, { 164,8009 }, { 165,8009 },+ { 166,8009 }, { 167,8009 }, { 168,8009 }, { 169,8009 }, { 170,8009 },+ { 171,8009 }, { 172,8009 }, { 173,8009 }, { 174,8009 }, { 175,8009 },+ { 176,8009 }, { 177,8009 }, { 178,8009 }, { 179,8009 }, { 180,8009 },+ { 181,8009 }, { 182,8009 }, { 183,8009 }, { 184,8009 }, { 185,8009 },+ { 186,8009 }, { 187,8009 }, { 188,8009 }, { 189,8009 }, { 190,8009 },+ { 191,8009 }, { 192,8009 }, { 193,8009 }, { 194,8009 }, { 195,8009 },+ { 196,8009 }, { 197,8009 }, { 198,8009 }, { 199,8009 }, { 200,8009 },++ { 201,8009 }, { 202,8009 }, { 203,8009 }, { 204,8009 }, { 205,8009 },+ { 206,8009 }, { 207,8009 }, { 208,8009 }, { 209,8009 }, { 210,8009 },+ { 211,8009 }, { 212,8009 }, { 213,8009 }, { 214,8009 }, { 215,8009 },+ { 216,8009 }, { 217,8009 }, { 218,8009 }, { 219,8009 }, { 220,8009 },+ { 221,8009 }, { 222,8009 }, { 223,8009 }, { 224,8009 }, { 225,8009 },+ { 226,8009 }, { 227,8009 }, { 228,8009 }, { 229,8009 }, { 230,8009 },+ { 231,8009 }, { 232,8009 }, { 233,8009 }, { 234,8009 }, { 235,8009 },+ { 236,8009 }, { 237,8009 }, { 238,8009 }, { 239,8009 }, { 240,8009 },+ { 241,8009 }, { 242,8009 }, { 243,8009 }, { 244,8009 }, { 245,8009 },+ { 246,8009 }, { 247,8009 }, { 248,8009 }, { 249,8009 }, { 250,8009 },++ { 251,8009 }, { 252,8009 }, { 253,8009 }, { 254,8009 }, { 255,8009 },+ { 256,8009 }, { 0, 0 }, { 0,33393 }, { 1,7751 }, { 2,7751 },+ { 3,7751 }, { 4,7751 }, { 5,7751 }, { 6,7751 }, { 7,7751 },+ { 8,7751 }, { 9,7751 }, { 10,7751 }, { 11,7751 }, { 12,7751 },+ { 13,7751 }, { 14,7751 }, { 15,7751 }, { 16,7751 }, { 17,7751 },+ { 18,7751 }, { 19,7751 }, { 20,7751 }, { 21,7751 }, { 22,7751 },+ { 23,7751 }, { 24,7751 }, { 25,7751 }, { 26,7751 }, { 27,7751 },+ { 28,7751 }, { 29,7751 }, { 30,7751 }, { 31,7751 }, { 32,7751 },+ { 33,7751 }, { 34,7751 }, { 35,7751 }, { 36,7751 }, { 37,7751 },+ { 38,7751 }, { 39,8009 }, { 40,7751 }, { 41,7751 }, { 42,7751 },++ { 43,7751 }, { 44,7751 }, { 45,7751 }, { 46,7751 }, { 47,7751 },+ { 48,7751 }, { 49,7751 }, { 50,7751 }, { 51,7751 }, { 52,7751 },+ { 53,7751 }, { 54,7751 }, { 55,7751 }, { 56,7751 }, { 57,7751 },+ { 58,7751 }, { 59,7751 }, { 60,7751 }, { 61,7751 }, { 62,7751 },+ { 63,7751 }, { 64,7751 }, { 65,7751 }, { 66,7751 }, { 67,7751 },+ { 68,7751 }, { 69,7751 }, { 70,7751 }, { 71,7751 }, { 72,7751 },+ { 73,7751 }, { 74,7751 }, { 75,7751 }, { 76,7751 }, { 77,7751 },+ { 78,7751 }, { 79,7751 }, { 80,7751 }, { 81,7751 }, { 82,7751 },+ { 83,7751 }, { 84,7751 }, { 85,7751 }, { 86,7751 }, { 87,7751 },+ { 88,7751 }, { 89,7751 }, { 90,7751 }, { 91,7751 }, { 92,7751 },++ { 93,7751 }, { 94,7751 }, { 95,7751 }, { 96,7751 }, { 97,7751 },+ { 98,7751 }, { 99,7751 }, { 100,7751 }, { 101,7751 }, { 102,7751 },+ { 103,7751 }, { 104,7751 }, { 105,7751 }, { 106,7751 }, { 107,7751 },+ { 108,7751 }, { 109,7751 }, { 110,7751 }, { 111,7751 }, { 112,7751 },+ { 113,7751 }, { 114,7751 }, { 115,7751 }, { 116,7751 }, { 117,7751 },+ { 118,7751 }, { 119,7751 }, { 120,7751 }, { 121,7751 }, { 122,7751 },+ { 123,7751 }, { 124,7751 }, { 125,7751 }, { 126,7751 }, { 127,7751 },+ { 128,7751 }, { 129,7751 }, { 130,7751 }, { 131,7751 }, { 132,7751 },+ { 133,7751 }, { 134,7751 }, { 135,7751 }, { 136,7751 }, { 137,7751 },+ { 138,7751 }, { 139,7751 }, { 140,7751 }, { 141,7751 }, { 142,7751 },++ { 143,7751 }, { 144,7751 }, { 145,7751 }, { 146,7751 }, { 147,7751 },+ { 148,7751 }, { 149,7751 }, { 150,7751 }, { 151,7751 }, { 152,7751 },+ { 153,7751 }, { 154,7751 }, { 155,7751 }, { 156,7751 }, { 157,7751 },+ { 158,7751 }, { 159,7751 }, { 160,7751 }, { 161,7751 }, { 162,7751 },+ { 163,7751 }, { 164,7751 }, { 165,7751 }, { 166,7751 }, { 167,7751 },+ { 168,7751 }, { 169,7751 }, { 170,7751 }, { 171,7751 }, { 172,7751 },+ { 173,7751 }, { 174,7751 }, { 175,7751 }, { 176,7751 }, { 177,7751 },+ { 178,7751 }, { 179,7751 }, { 180,7751 }, { 181,7751 }, { 182,7751 },+ { 183,7751 }, { 184,7751 }, { 185,7751 }, { 186,7751 }, { 187,7751 },+ { 188,7751 }, { 189,7751 }, { 190,7751 }, { 191,7751 }, { 192,7751 },++ { 193,7751 }, { 194,7751 }, { 195,7751 }, { 196,7751 }, { 197,7751 },+ { 198,7751 }, { 199,7751 }, { 200,7751 }, { 201,7751 }, { 202,7751 },+ { 203,7751 }, { 204,7751 }, { 205,7751 }, { 206,7751 }, { 207,7751 },+ { 208,7751 }, { 209,7751 }, { 210,7751 }, { 211,7751 }, { 212,7751 },+ { 213,7751 }, { 214,7751 }, { 215,7751 }, { 216,7751 }, { 217,7751 },+ { 218,7751 }, { 219,7751 }, { 220,7751 }, { 221,7751 }, { 222,7751 },+ { 223,7751 }, { 224,7751 }, { 225,7751 }, { 226,7751 }, { 227,7751 },+ { 228,7751 }, { 229,7751 }, { 230,7751 }, { 231,7751 }, { 232,7751 },+ { 233,7751 }, { 234,7751 }, { 235,7751 }, { 236,7751 }, { 237,7751 },+ { 238,7751 }, { 239,7751 }, { 240,7751 }, { 241,7751 }, { 242,7751 },++ { 243,7751 }, { 244,7751 }, { 245,7751 }, { 246,7751 }, { 247,7751 },+ { 248,7751 }, { 249,7751 }, { 250,7751 }, { 251,7751 }, { 252,7751 },+ { 253,7751 }, { 254,7751 }, { 255,7751 }, { 256,7751 }, { 0, 0 },+ { 0,33135 }, { 1,7798 }, { 2,7798 }, { 3,7798 }, { 4,7798 },+ { 5,7798 }, { 6,7798 }, { 7,7798 }, { 8,7798 }, { 9,7798 },+ { 10,8056 }, { 11,7798 }, { 12,7798 }, { 13,7798 }, { 14,7798 },+ { 15,7798 }, { 16,7798 }, { 17,7798 }, { 18,7798 }, { 19,7798 },+ { 20,7798 }, { 21,7798 }, { 22,7798 }, { 23,7798 }, { 24,7798 },+ { 25,7798 }, { 26,7798 }, { 27,7798 }, { 28,7798 }, { 29,7798 },+ { 30,7798 }, { 31,7798 }, { 32,7798 }, { 33,7798 }, { 34,7798 },++ { 35,7798 }, { 36,8314 }, { 37,7798 }, { 38,7798 }, { 39,7798 },+ { 40,7798 }, { 41,7798 }, { 42,7798 }, { 43,7798 }, { 44,7798 },+ { 45,7798 }, { 46,7798 }, { 47,7798 }, { 48,7798 }, { 49,7798 },+ { 50,7798 }, { 51,7798 }, { 52,7798 }, { 53,7798 }, { 54,7798 },+ { 55,7798 }, { 56,7798 }, { 57,7798 }, { 58,7798 }, { 59,7798 },+ { 60,7798 }, { 61,7798 }, { 62,7798 }, { 63,7798 }, { 64,7798 },+ { 65,7798 }, { 66,7798 }, { 67,7798 }, { 68,7798 }, { 69,7798 },+ { 70,7798 }, { 71,7798 }, { 72,7798 }, { 73,7798 }, { 74,7798 },+ { 75,7798 }, { 76,7798 }, { 77,7798 }, { 78,7798 }, { 79,7798 },+ { 80,7798 }, { 81,7798 }, { 82,7798 }, { 83,7798 }, { 84,7798 },++ { 85,7798 }, { 86,7798 }, { 87,7798 }, { 88,7798 }, { 89,7798 },+ { 90,7798 }, { 91,7798 }, { 92,7798 }, { 93,7798 }, { 94,7798 },+ { 95,7798 }, { 96,7798 }, { 97,7798 }, { 98,7798 }, { 99,7798 },+ { 100,7798 }, { 101,7798 }, { 102,7798 }, { 103,7798 }, { 104,7798 },+ { 105,7798 }, { 106,7798 }, { 107,7798 }, { 108,7798 }, { 109,7798 },+ { 110,7798 }, { 111,7798 }, { 112,7798 }, { 113,7798 }, { 114,7798 },+ { 115,7798 }, { 116,7798 }, { 117,7798 }, { 118,7798 }, { 119,7798 },+ { 120,7798 }, { 121,7798 }, { 122,7798 }, { 123,7798 }, { 124,7798 },+ { 125,7798 }, { 126,7798 }, { 127,7798 }, { 128,7798 }, { 129,7798 },+ { 130,7798 }, { 131,7798 }, { 132,7798 }, { 133,7798 }, { 134,7798 },++ { 135,7798 }, { 136,7798 }, { 137,7798 }, { 138,7798 }, { 139,7798 },+ { 140,7798 }, { 141,7798 }, { 142,7798 }, { 143,7798 }, { 144,7798 },+ { 145,7798 }, { 146,7798 }, { 147,7798 }, { 148,7798 }, { 149,7798 },+ { 150,7798 }, { 151,7798 }, { 152,7798 }, { 153,7798 }, { 154,7798 },+ { 155,7798 }, { 156,7798 }, { 157,7798 }, { 158,7798 }, { 159,7798 },+ { 160,7798 }, { 161,7798 }, { 162,7798 }, { 163,7798 }, { 164,7798 },+ { 165,7798 }, { 166,7798 }, { 167,7798 }, { 168,7798 }, { 169,7798 },+ { 170,7798 }, { 171,7798 }, { 172,7798 }, { 173,7798 }, { 174,7798 },+ { 175,7798 }, { 176,7798 }, { 177,7798 }, { 178,7798 }, { 179,7798 },+ { 180,7798 }, { 181,7798 }, { 182,7798 }, { 183,7798 }, { 184,7798 },++ { 185,7798 }, { 186,7798 }, { 187,7798 }, { 188,7798 }, { 189,7798 },+ { 190,7798 }, { 191,7798 }, { 192,7798 }, { 193,7798 }, { 194,7798 },+ { 195,7798 }, { 196,7798 }, { 197,7798 }, { 198,7798 }, { 199,7798 },+ { 200,7798 }, { 201,7798 }, { 202,7798 }, { 203,7798 }, { 204,7798 },+ { 205,7798 }, { 206,7798 }, { 207,7798 }, { 208,7798 }, { 209,7798 },+ { 210,7798 }, { 211,7798 }, { 212,7798 }, { 213,7798 }, { 214,7798 },+ { 215,7798 }, { 216,7798 }, { 217,7798 }, { 218,7798 }, { 219,7798 },+ { 220,7798 }, { 221,7798 }, { 222,7798 }, { 223,7798 }, { 224,7798 },+ { 225,7798 }, { 226,7798 }, { 227,7798 }, { 228,7798 }, { 229,7798 },+ { 230,7798 }, { 231,7798 }, { 232,7798 }, { 233,7798 }, { 234,7798 },++ { 235,7798 }, { 236,7798 }, { 237,7798 }, { 238,7798 }, { 239,7798 },+ { 240,7798 }, { 241,7798 }, { 242,7798 }, { 243,7798 }, { 244,7798 },+ { 245,7798 }, { 246,7798 }, { 247,7798 }, { 248,7798 }, { 249,7798 },+ { 250,7798 }, { 251,7798 }, { 252,7798 }, { 253,7798 }, { 254,7798 },+ { 255,7798 }, { 256,7798 }, { 0, 0 }, { 0,32877 }, { 1,7540 },+ { 2,7540 }, { 3,7540 }, { 4,7540 }, { 5,7540 }, { 6,7540 },+ { 7,7540 }, { 8,7540 }, { 9,7540 }, { 10,7798 }, { 11,7540 },+ { 12,7540 }, { 13,7540 }, { 14,7540 }, { 15,7540 }, { 16,7540 },+ { 17,7540 }, { 18,7540 }, { 19,7540 }, { 20,7540 }, { 21,7540 },+ { 22,7540 }, { 23,7540 }, { 24,7540 }, { 25,7540 }, { 26,7540 },++ { 27,7540 }, { 28,7540 }, { 29,7540 }, { 30,7540 }, { 31,7540 },+ { 32,7540 }, { 33,7540 }, { 34,7540 }, { 35,7540 }, { 36,8056 },+ { 37,7540 }, { 38,7540 }, { 39,7540 }, { 40,7540 }, { 41,7540 },+ { 42,7540 }, { 43,7540 }, { 44,7540 }, { 45,7540 }, { 46,7540 },+ { 47,7540 }, { 48,7540 }, { 49,7540 }, { 50,7540 }, { 51,7540 },+ { 52,7540 }, { 53,7540 }, { 54,7540 }, { 55,7540 }, { 56,7540 },+ { 57,7540 }, { 58,7540 }, { 59,7540 }, { 60,7540 }, { 61,7540 },+ { 62,7540 }, { 63,7540 }, { 64,7540 }, { 65,7540 }, { 66,7540 },+ { 67,7540 }, { 68,7540 }, { 69,7540 }, { 70,7540 }, { 71,7540 },+ { 72,7540 }, { 73,7540 }, { 74,7540 }, { 75,7540 }, { 76,7540 },++ { 77,7540 }, { 78,7540 }, { 79,7540 }, { 80,7540 }, { 81,7540 },+ { 82,7540 }, { 83,7540 }, { 84,7540 }, { 85,7540 }, { 86,7540 },+ { 87,7540 }, { 88,7540 }, { 89,7540 }, { 90,7540 }, { 91,7540 },+ { 92,7540 }, { 93,7540 }, { 94,7540 }, { 95,7540 }, { 96,7540 },+ { 97,7540 }, { 98,7540 }, { 99,7540 }, { 100,7540 }, { 101,7540 },+ { 102,7540 }, { 103,7540 }, { 104,7540 }, { 105,7540 }, { 106,7540 },+ { 107,7540 }, { 108,7540 }, { 109,7540 }, { 110,7540 }, { 111,7540 },+ { 112,7540 }, { 113,7540 }, { 114,7540 }, { 115,7540 }, { 116,7540 },+ { 117,7540 }, { 118,7540 }, { 119,7540 }, { 120,7540 }, { 121,7540 },+ { 122,7540 }, { 123,7540 }, { 124,7540 }, { 125,7540 }, { 126,7540 },++ { 127,7540 }, { 128,7540 }, { 129,7540 }, { 130,7540 }, { 131,7540 },+ { 132,7540 }, { 133,7540 }, { 134,7540 }, { 135,7540 }, { 136,7540 },+ { 137,7540 }, { 138,7540 }, { 139,7540 }, { 140,7540 }, { 141,7540 },+ { 142,7540 }, { 143,7540 }, { 144,7540 }, { 145,7540 }, { 146,7540 },+ { 147,7540 }, { 148,7540 }, { 149,7540 }, { 150,7540 }, { 151,7540 },+ { 152,7540 }, { 153,7540 }, { 154,7540 }, { 155,7540 }, { 156,7540 },+ { 157,7540 }, { 158,7540 }, { 159,7540 }, { 160,7540 }, { 161,7540 },+ { 162,7540 }, { 163,7540 }, { 164,7540 }, { 165,7540 }, { 166,7540 },+ { 167,7540 }, { 168,7540 }, { 169,7540 }, { 170,7540 }, { 171,7540 },+ { 172,7540 }, { 173,7540 }, { 174,7540 }, { 175,7540 }, { 176,7540 },++ { 177,7540 }, { 178,7540 }, { 179,7540 }, { 180,7540 }, { 181,7540 },+ { 182,7540 }, { 183,7540 }, { 184,7540 }, { 185,7540 }, { 186,7540 },+ { 187,7540 }, { 188,7540 }, { 189,7540 }, { 190,7540 }, { 191,7540 },+ { 192,7540 }, { 193,7540 }, { 194,7540 }, { 195,7540 }, { 196,7540 },+ { 197,7540 }, { 198,7540 }, { 199,7540 }, { 200,7540 }, { 201,7540 },+ { 202,7540 }, { 203,7540 }, { 204,7540 }, { 205,7540 }, { 206,7540 },+ { 207,7540 }, { 208,7540 }, { 209,7540 }, { 210,7540 }, { 211,7540 },+ { 212,7540 }, { 213,7540 }, { 214,7540 }, { 215,7540 }, { 216,7540 },+ { 217,7540 }, { 218,7540 }, { 219,7540 }, { 220,7540 }, { 221,7540 },+ { 222,7540 }, { 223,7540 }, { 224,7540 }, { 225,7540 }, { 226,7540 },++ { 227,7540 }, { 228,7540 }, { 229,7540 }, { 230,7540 }, { 231,7540 },+ { 232,7540 }, { 233,7540 }, { 234,7540 }, { 235,7540 }, { 236,7540 },+ { 237,7540 }, { 238,7540 }, { 239,7540 }, { 240,7540 }, { 241,7540 },+ { 242,7540 }, { 243,7540 }, { 244,7540 }, { 245,7540 }, { 246,7540 },+ { 247,7540 }, { 248,7540 }, { 249,7540 }, { 250,7540 }, { 251,7540 },+ { 252,7540 }, { 253,7540 }, { 254,7540 }, { 255,7540 }, { 256,7540 },+ { 0, 0 }, { 0,32619 }, { 1,5593 }, { 2,5593 }, { 3,5593 },+ { 4,5593 }, { 5,5593 }, { 6,5593 }, { 7,5593 }, { 8,5593 },+ { 9,5593 }, { 10,5593 }, { 11,5593 }, { 12,5593 }, { 13,5593 },+ { 14,5593 }, { 15,5593 }, { 16,5593 }, { 17,5593 }, { 18,5593 },++ { 19,5593 }, { 20,5593 }, { 21,5593 }, { 22,5593 }, { 23,5593 },+ { 24,5593 }, { 25,5593 }, { 26,5593 }, { 27,5593 }, { 28,5593 },+ { 29,5593 }, { 30,5593 }, { 31,5593 }, { 32,5593 }, { 33,5593 },+ { 34,2639 }, { 35,5593 }, { 36,5593 }, { 37,5593 }, { 38,5593 },+ { 39,5593 }, { 40,5593 }, { 41,5593 }, { 42,5593 }, { 43,5593 },+ { 44,5593 }, { 45,5593 }, { 46,5593 }, { 47,5593 }, { 48,5593 },+ { 49,5593 }, { 50,5593 }, { 51,5593 }, { 52,5593 }, { 53,5593 },+ { 54,5593 }, { 55,5593 }, { 56,5593 }, { 57,5593 }, { 58,5593 },+ { 59,5593 }, { 60,5593 }, { 61,5593 }, { 62,5593 }, { 63,5593 },+ { 64,5593 }, { 65,5593 }, { 66,5593 }, { 67,5593 }, { 68,5593 },++ { 69,5593 }, { 70,5593 }, { 71,5593 }, { 72,5593 }, { 73,5593 },+ { 74,5593 }, { 75,5593 }, { 76,5593 }, { 77,5593 }, { 78,5593 },+ { 79,5593 }, { 80,5593 }, { 81,5593 }, { 82,5593 }, { 83,5593 },+ { 84,5593 }, { 85,5593 }, { 86,5593 }, { 87,5593 }, { 88,5593 },+ { 89,5593 }, { 90,5593 }, { 91,5593 }, { 92,5593 }, { 93,5593 },+ { 94,5593 }, { 95,5593 }, { 96,5593 }, { 97,5593 }, { 98,5593 },+ { 99,5593 }, { 100,5593 }, { 101,5593 }, { 102,5593 }, { 103,5593 },+ { 104,5593 }, { 105,5593 }, { 106,5593 }, { 107,5593 }, { 108,5593 },+ { 109,5593 }, { 110,5593 }, { 111,5593 }, { 112,5593 }, { 113,5593 },+ { 114,5593 }, { 115,5593 }, { 116,5593 }, { 117,5593 }, { 118,5593 },++ { 119,5593 }, { 120,5593 }, { 121,5593 }, { 122,5593 }, { 123,5593 },+ { 124,5593 }, { 125,5593 }, { 126,5593 }, { 127,5593 }, { 128,5593 },+ { 129,5593 }, { 130,5593 }, { 131,5593 }, { 132,5593 }, { 133,5593 },+ { 134,5593 }, { 135,5593 }, { 136,5593 }, { 137,5593 }, { 138,5593 },+ { 139,5593 }, { 140,5593 }, { 141,5593 }, { 142,5593 }, { 143,5593 },+ { 144,5593 }, { 145,5593 }, { 146,5593 }, { 147,5593 }, { 148,5593 },+ { 149,5593 }, { 150,5593 }, { 151,5593 }, { 152,5593 }, { 153,5593 },+ { 154,5593 }, { 155,5593 }, { 156,5593 }, { 157,5593 }, { 158,5593 },+ { 159,5593 }, { 160,5593 }, { 161,5593 }, { 162,5593 }, { 163,5593 },+ { 164,5593 }, { 165,5593 }, { 166,5593 }, { 167,5593 }, { 168,5593 },++ { 169,5593 }, { 170,5593 }, { 171,5593 }, { 172,5593 }, { 173,5593 },+ { 174,5593 }, { 175,5593 }, { 176,5593 }, { 177,5593 }, { 178,5593 },+ { 179,5593 }, { 180,5593 }, { 181,5593 }, { 182,5593 }, { 183,5593 },+ { 184,5593 }, { 185,5593 }, { 186,5593 }, { 187,5593 }, { 188,5593 },+ { 189,5593 }, { 190,5593 }, { 191,5593 }, { 192,5593 }, { 193,5593 },+ { 194,5593 }, { 195,5593 }, { 196,5593 }, { 197,5593 }, { 198,5593 },+ { 199,5593 }, { 200,5593 }, { 201,5593 }, { 202,5593 }, { 203,5593 },+ { 204,5593 }, { 205,5593 }, { 206,5593 }, { 207,5593 }, { 208,5593 },+ { 209,5593 }, { 210,5593 }, { 211,5593 }, { 212,5593 }, { 213,5593 },+ { 214,5593 }, { 215,5593 }, { 216,5593 }, { 217,5593 }, { 218,5593 },++ { 219,5593 }, { 220,5593 }, { 221,5593 }, { 222,5593 }, { 223,5593 },+ { 224,5593 }, { 225,5593 }, { 226,5593 }, { 227,5593 }, { 228,5593 },+ { 229,5593 }, { 230,5593 }, { 231,5593 }, { 232,5593 }, { 233,5593 },+ { 234,5593 }, { 235,5593 }, { 236,5593 }, { 237,5593 }, { 238,5593 },+ { 239,5593 }, { 240,5593 }, { 241,5593 }, { 242,5593 }, { 243,5593 },+ { 244,5593 }, { 245,5593 }, { 246,5593 }, { 247,5593 }, { 248,5593 },+ { 249,5593 }, { 250,5593 }, { 251,5593 }, { 252,5593 }, { 253,5593 },+ { 254,5593 }, { 255,5593 }, { 256,5593 }, { 0, 0 }, { 0,32361 },+ { 1,5335 }, { 2,5335 }, { 3,5335 }, { 4,5335 }, { 5,5335 },+ { 6,5335 }, { 7,5335 }, { 8,5335 }, { 9,5335 }, { 10,5335 },++ { 11,5335 }, { 12,5335 }, { 13,5335 }, { 14,5335 }, { 15,5335 },+ { 16,5335 }, { 17,5335 }, { 18,5335 }, { 19,5335 }, { 20,5335 },+ { 21,5335 }, { 22,5335 }, { 23,5335 }, { 24,5335 }, { 25,5335 },+ { 26,5335 }, { 27,5335 }, { 28,5335 }, { 29,5335 }, { 30,5335 },+ { 31,5335 }, { 32,5335 }, { 33,5335 }, { 34,2381 }, { 35,5335 },+ { 36,5335 }, { 37,5335 }, { 38,5335 }, { 39,5335 }, { 40,5335 },+ { 41,5335 }, { 42,5335 }, { 43,5335 }, { 44,5335 }, { 45,5335 },+ { 46,5335 }, { 47,5335 }, { 48,5335 }, { 49,5335 }, { 50,5335 },+ { 51,5335 }, { 52,5335 }, { 53,5335 }, { 54,5335 }, { 55,5335 },+ { 56,5335 }, { 57,5335 }, { 58,5335 }, { 59,5335 }, { 60,5335 },++ { 61,5335 }, { 62,5335 }, { 63,5335 }, { 64,5335 }, { 65,5335 },+ { 66,5335 }, { 67,5335 }, { 68,5335 }, { 69,5335 }, { 70,5335 },+ { 71,5335 }, { 72,5335 }, { 73,5335 }, { 74,5335 }, { 75,5335 },+ { 76,5335 }, { 77,5335 }, { 78,5335 }, { 79,5335 }, { 80,5335 },+ { 81,5335 }, { 82,5335 }, { 83,5335 }, { 84,5335 }, { 85,5335 },+ { 86,5335 }, { 87,5335 }, { 88,5335 }, { 89,5335 }, { 90,5335 },+ { 91,5335 }, { 92,5335 }, { 93,5335 }, { 94,5335 }, { 95,5335 },+ { 96,5335 }, { 97,5335 }, { 98,5335 }, { 99,5335 }, { 100,5335 },+ { 101,5335 }, { 102,5335 }, { 103,5335 }, { 104,5335 }, { 105,5335 },+ { 106,5335 }, { 107,5335 }, { 108,5335 }, { 109,5335 }, { 110,5335 },++ { 111,5335 }, { 112,5335 }, { 113,5335 }, { 114,5335 }, { 115,5335 },+ { 116,5335 }, { 117,5335 }, { 118,5335 }, { 119,5335 }, { 120,5335 },+ { 121,5335 }, { 122,5335 }, { 123,5335 }, { 124,5335 }, { 125,5335 },+ { 126,5335 }, { 127,5335 }, { 128,5335 }, { 129,5335 }, { 130,5335 },+ { 131,5335 }, { 132,5335 }, { 133,5335 }, { 134,5335 }, { 135,5335 },+ { 136,5335 }, { 137,5335 }, { 138,5335 }, { 139,5335 }, { 140,5335 },+ { 141,5335 }, { 142,5335 }, { 143,5335 }, { 144,5335 }, { 145,5335 },+ { 146,5335 }, { 147,5335 }, { 148,5335 }, { 149,5335 }, { 150,5335 },+ { 151,5335 }, { 152,5335 }, { 153,5335 }, { 154,5335 }, { 155,5335 },+ { 156,5335 }, { 157,5335 }, { 158,5335 }, { 159,5335 }, { 160,5335 },++ { 161,5335 }, { 162,5335 }, { 163,5335 }, { 164,5335 }, { 165,5335 },+ { 166,5335 }, { 167,5335 }, { 168,5335 }, { 169,5335 }, { 170,5335 },+ { 171,5335 }, { 172,5335 }, { 173,5335 }, { 174,5335 }, { 175,5335 },+ { 176,5335 }, { 177,5335 }, { 178,5335 }, { 179,5335 }, { 180,5335 },+ { 181,5335 }, { 182,5335 }, { 183,5335 }, { 184,5335 }, { 185,5335 },+ { 186,5335 }, { 187,5335 }, { 188,5335 }, { 189,5335 }, { 190,5335 },+ { 191,5335 }, { 192,5335 }, { 193,5335 }, { 194,5335 }, { 195,5335 },+ { 196,5335 }, { 197,5335 }, { 198,5335 }, { 199,5335 }, { 200,5335 },+ { 201,5335 }, { 202,5335 }, { 203,5335 }, { 204,5335 }, { 205,5335 },+ { 206,5335 }, { 207,5335 }, { 208,5335 }, { 209,5335 }, { 210,5335 },++ { 211,5335 }, { 212,5335 }, { 213,5335 }, { 214,5335 }, { 215,5335 },+ { 216,5335 }, { 217,5335 }, { 218,5335 }, { 219,5335 }, { 220,5335 },+ { 221,5335 }, { 222,5335 }, { 223,5335 }, { 224,5335 }, { 225,5335 },+ { 226,5335 }, { 227,5335 }, { 228,5335 }, { 229,5335 }, { 230,5335 },+ { 231,5335 }, { 232,5335 }, { 233,5335 }, { 234,5335 }, { 235,5335 },+ { 236,5335 }, { 237,5335 }, { 238,5335 }, { 239,5335 }, { 240,5335 },+ { 241,5335 }, { 242,5335 }, { 243,5335 }, { 244,5335 }, { 245,5335 },+ { 246,5335 }, { 247,5335 }, { 248,5335 }, { 249,5335 }, { 250,5335 },+ { 251,5335 }, { 252,5335 }, { 253,5335 }, { 254,5335 }, { 255,5335 },+ { 256,5335 }, { 0, 55 }, { 0,32103 }, { 1,2125 }, { 2,2125 },++ { 3,2125 }, { 4,2125 }, { 5,2125 }, { 6,2125 }, { 7,2125 },+ { 8,2125 }, { 9,7284 }, { 10,7289 }, { 11,2125 }, { 12,7284 },+ { 13,7284 }, { 14,2125 }, { 15,2125 }, { 16,2125 }, { 17,2125 },+ { 18,2125 }, { 19,2125 }, { 20,2125 }, { 21,2125 }, { 22,2125 },+ { 23,2125 }, { 24,2125 }, { 25,2125 }, { 26,2125 }, { 27,2125 },+ { 28,2125 }, { 29,2125 }, { 30,2125 }, { 31,2125 }, { 32,7284 },+ { 33,2125 }, { 34,2125 }, { 35,2125 }, { 36,2125 }, { 37,2125 },+ { 38,2125 }, { 39,2125 }, { 40,2125 }, { 41,2125 }, { 42,2125 },+ { 43,2125 }, { 44,2125 }, { 45,2127 }, { 46,2125 }, { 47,2125 },+ { 48,2125 }, { 49,2125 }, { 50,2125 }, { 51,2125 }, { 52,2125 },++ { 53,2125 }, { 54,2125 }, { 55,2125 }, { 56,2125 }, { 57,2125 },+ { 58,2125 }, { 59,2125 }, { 60,2125 }, { 61,2125 }, { 62,2125 },+ { 63,2125 }, { 64,2125 }, { 65,2125 }, { 66,2125 }, { 67,2125 },+ { 68,2125 }, { 69,2125 }, { 70,2125 }, { 71,2125 }, { 72,2125 },+ { 73,2125 }, { 74,2125 }, { 75,2125 }, { 76,2125 }, { 77,2125 },+ { 78,2125 }, { 79,2125 }, { 80,2125 }, { 81,2125 }, { 82,2125 },+ { 83,2125 }, { 84,2125 }, { 85,2141 }, { 86,2125 }, { 87,2125 },+ { 88,2125 }, { 89,2125 }, { 90,2125 }, { 91,2125 }, { 92,2125 },+ { 93,2125 }, { 94,2125 }, { 95,2125 }, { 96,2125 }, { 97,2125 },+ { 98,2125 }, { 99,2125 }, { 100,2125 }, { 101,2125 }, { 102,2125 },++ { 103,2125 }, { 104,2125 }, { 105,2125 }, { 106,2125 }, { 107,2125 },+ { 108,2125 }, { 109,2125 }, { 110,2125 }, { 111,2125 }, { 112,2125 },+ { 113,2125 }, { 114,2125 }, { 115,2125 }, { 116,2125 }, { 117,2141 },+ { 118,2125 }, { 119,2125 }, { 120,2125 }, { 121,2125 }, { 122,2125 },+ { 123,2125 }, { 124,2125 }, { 125,2125 }, { 126,2125 }, { 127,2125 },+ { 128,2125 }, { 129,2125 }, { 130,2125 }, { 131,2125 }, { 132,2125 },+ { 133,2125 }, { 134,2125 }, { 135,2125 }, { 136,2125 }, { 137,2125 },+ { 138,2125 }, { 139,2125 }, { 140,2125 }, { 141,2125 }, { 142,2125 },+ { 143,2125 }, { 144,2125 }, { 145,2125 }, { 146,2125 }, { 147,2125 },+ { 148,2125 }, { 149,2125 }, { 150,2125 }, { 151,2125 }, { 152,2125 },++ { 153,2125 }, { 154,2125 }, { 155,2125 }, { 156,2125 }, { 157,2125 },+ { 158,2125 }, { 159,2125 }, { 160,2125 }, { 161,2125 }, { 162,2125 },+ { 163,2125 }, { 164,2125 }, { 165,2125 }, { 166,2125 }, { 167,2125 },+ { 168,2125 }, { 169,2125 }, { 170,2125 }, { 171,2125 }, { 172,2125 },+ { 173,2125 }, { 174,2125 }, { 175,2125 }, { 176,2125 }, { 177,2125 },+ { 178,2125 }, { 179,2125 }, { 180,2125 }, { 181,2125 }, { 182,2125 },+ { 183,2125 }, { 184,2125 }, { 185,2125 }, { 186,2125 }, { 187,2125 },+ { 188,2125 }, { 189,2125 }, { 190,2125 }, { 191,2125 }, { 192,2125 },+ { 193,2125 }, { 194,2125 }, { 195,2125 }, { 196,2125 }, { 197,2125 },+ { 198,2125 }, { 199,2125 }, { 200,2125 }, { 201,2125 }, { 202,2125 },++ { 203,2125 }, { 204,2125 }, { 205,2125 }, { 206,2125 }, { 207,2125 },+ { 208,2125 }, { 209,2125 }, { 210,2125 }, { 211,2125 }, { 212,2125 },+ { 213,2125 }, { 214,2125 }, { 215,2125 }, { 216,2125 }, { 217,2125 },+ { 218,2125 }, { 219,2125 }, { 220,2125 }, { 221,2125 }, { 222,2125 },+ { 223,2125 }, { 224,2125 }, { 225,2125 }, { 226,2125 }, { 227,2125 },+ { 228,2125 }, { 229,2125 }, { 230,2125 }, { 231,2125 }, { 232,2125 },+ { 233,2125 }, { 234,2125 }, { 235,2125 }, { 236,2125 }, { 237,2125 },+ { 238,2125 }, { 239,2125 }, { 240,2125 }, { 241,2125 }, { 242,2125 },+ { 243,2125 }, { 244,2125 }, { 245,2125 }, { 246,2125 }, { 247,2125 },+ { 248,2125 }, { 249,2125 }, { 250,2125 }, { 251,2125 }, { 252,2125 },++ { 253,2125 }, { 254,2125 }, { 255,2125 }, { 256,2125 }, { 0, 55 },+ { 0,31845 }, { 1,1867 }, { 2,1867 }, { 3,1867 }, { 4,1867 },+ { 5,1867 }, { 6,1867 }, { 7,1867 }, { 8,1867 }, { 9,7026 },+ { 10,7031 }, { 11,1867 }, { 12,7026 }, { 13,7026 }, { 14,1867 },+ { 15,1867 }, { 16,1867 }, { 17,1867 }, { 18,1867 }, { 19,1867 },+ { 20,1867 }, { 21,1867 }, { 22,1867 }, { 23,1867 }, { 24,1867 },+ { 25,1867 }, { 26,1867 }, { 27,1867 }, { 28,1867 }, { 29,1867 },+ { 30,1867 }, { 31,1867 }, { 32,7026 }, { 33,1867 }, { 34,1867 },+ { 35,1867 }, { 36,1867 }, { 37,1867 }, { 38,1867 }, { 39,1867 },+ { 40,1867 }, { 41,1867 }, { 42,1867 }, { 43,1867 }, { 44,1867 },++ { 45,1869 }, { 46,1867 }, { 47,1867 }, { 48,1867 }, { 49,1867 },+ { 50,1867 }, { 51,1867 }, { 52,1867 }, { 53,1867 }, { 54,1867 },+ { 55,1867 }, { 56,1867 }, { 57,1867 }, { 58,1867 }, { 59,1867 },+ { 60,1867 }, { 61,1867 }, { 62,1867 }, { 63,1867 }, { 64,1867 },+ { 65,1867 }, { 66,1867 }, { 67,1867 }, { 68,1867 }, { 69,1867 },+ { 70,1867 }, { 71,1867 }, { 72,1867 }, { 73,1867 }, { 74,1867 },+ { 75,1867 }, { 76,1867 }, { 77,1867 }, { 78,1867 }, { 79,1867 },+ { 80,1867 }, { 81,1867 }, { 82,1867 }, { 83,1867 }, { 84,1867 },+ { 85,1883 }, { 86,1867 }, { 87,1867 }, { 88,1867 }, { 89,1867 },+ { 90,1867 }, { 91,1867 }, { 92,1867 }, { 93,1867 }, { 94,1867 },++ { 95,1867 }, { 96,1867 }, { 97,1867 }, { 98,1867 }, { 99,1867 },+ { 100,1867 }, { 101,1867 }, { 102,1867 }, { 103,1867 }, { 104,1867 },+ { 105,1867 }, { 106,1867 }, { 107,1867 }, { 108,1867 }, { 109,1867 },+ { 110,1867 }, { 111,1867 }, { 112,1867 }, { 113,1867 }, { 114,1867 },+ { 115,1867 }, { 116,1867 }, { 117,1883 }, { 118,1867 }, { 119,1867 },+ { 120,1867 }, { 121,1867 }, { 122,1867 }, { 123,1867 }, { 124,1867 },+ { 125,1867 }, { 126,1867 }, { 127,1867 }, { 128,1867 }, { 129,1867 },+ { 130,1867 }, { 131,1867 }, { 132,1867 }, { 133,1867 }, { 134,1867 },+ { 135,1867 }, { 136,1867 }, { 137,1867 }, { 138,1867 }, { 139,1867 },+ { 140,1867 }, { 141,1867 }, { 142,1867 }, { 143,1867 }, { 144,1867 },++ { 145,1867 }, { 146,1867 }, { 147,1867 }, { 148,1867 }, { 149,1867 },+ { 150,1867 }, { 151,1867 }, { 152,1867 }, { 153,1867 }, { 154,1867 },+ { 155,1867 }, { 156,1867 }, { 157,1867 }, { 158,1867 }, { 159,1867 },+ { 160,1867 }, { 161,1867 }, { 162,1867 }, { 163,1867 }, { 164,1867 },+ { 165,1867 }, { 166,1867 }, { 167,1867 }, { 168,1867 }, { 169,1867 },+ { 170,1867 }, { 171,1867 }, { 172,1867 }, { 173,1867 }, { 174,1867 },+ { 175,1867 }, { 176,1867 }, { 177,1867 }, { 178,1867 }, { 179,1867 },+ { 180,1867 }, { 181,1867 }, { 182,1867 }, { 183,1867 }, { 184,1867 },+ { 185,1867 }, { 186,1867 }, { 187,1867 }, { 188,1867 }, { 189,1867 },+ { 190,1867 }, { 191,1867 }, { 192,1867 }, { 193,1867 }, { 194,1867 },++ { 195,1867 }, { 196,1867 }, { 197,1867 }, { 198,1867 }, { 199,1867 },+ { 200,1867 }, { 201,1867 }, { 202,1867 }, { 203,1867 }, { 204,1867 },+ { 205,1867 }, { 206,1867 }, { 207,1867 }, { 208,1867 }, { 209,1867 },+ { 210,1867 }, { 211,1867 }, { 212,1867 }, { 213,1867 }, { 214,1867 },+ { 215,1867 }, { 216,1867 }, { 217,1867 }, { 218,1867 }, { 219,1867 },+ { 220,1867 }, { 221,1867 }, { 222,1867 }, { 223,1867 }, { 224,1867 },+ { 225,1867 }, { 226,1867 }, { 227,1867 }, { 228,1867 }, { 229,1867 },+ { 230,1867 }, { 231,1867 }, { 232,1867 }, { 233,1867 }, { 234,1867 },+ { 235,1867 }, { 236,1867 }, { 237,1867 }, { 238,1867 }, { 239,1867 },+ { 240,1867 }, { 241,1867 }, { 242,1867 }, { 243,1867 }, { 244,1867 },++ { 245,1867 }, { 246,1867 }, { 247,1867 }, { 248,1867 }, { 249,1867 },+ { 250,1867 }, { 251,1867 }, { 252,1867 }, { 253,1867 }, { 254,1867 },+ { 255,1867 }, { 256,1867 }, { 0, 0 }, { 0,31587 }, { 1,5945 },+ { 2,5945 }, { 3,5945 }, { 4,5945 }, { 5,5945 }, { 6,5945 },+ { 7,5945 }, { 8,5945 }, { 9,5945 }, { 10,5945 }, { 11,5945 },+ { 12,5945 }, { 13,5945 }, { 14,5945 }, { 15,5945 }, { 16,5945 },+ { 17,5945 }, { 18,5945 }, { 19,5945 }, { 20,5945 }, { 21,5945 },+ { 22,5945 }, { 23,5945 }, { 24,5945 }, { 25,5945 }, { 26,5945 },+ { 27,5945 }, { 28,5945 }, { 29,5945 }, { 30,5945 }, { 31,5945 },+ { 32,5945 }, { 33,5945 }, { 34,5945 }, { 35,5945 }, { 36,5945 },++ { 37,5945 }, { 38,5945 }, { 39,7023 }, { 40,5945 }, { 41,5945 },+ { 42,5945 }, { 43,5945 }, { 44,5945 }, { 45,5945 }, { 46,5945 },+ { 47,5945 }, { 48,5945 }, { 49,5945 }, { 50,5945 }, { 51,5945 },+ { 52,5945 }, { 53,5945 }, { 54,5945 }, { 55,5945 }, { 56,5945 },+ { 57,5945 }, { 58,5945 }, { 59,5945 }, { 60,5945 }, { 61,5945 },+ { 62,5945 }, { 63,5945 }, { 64,5945 }, { 65,5945 }, { 66,5945 },+ { 67,5945 }, { 68,5945 }, { 69,5945 }, { 70,5945 }, { 71,5945 },+ { 72,5945 }, { 73,5945 }, { 74,5945 }, { 75,5945 }, { 76,5945 },+ { 77,5945 }, { 78,5945 }, { 79,5945 }, { 80,5945 }, { 81,5945 },+ { 82,5945 }, { 83,5945 }, { 84,5945 }, { 85,5945 }, { 86,5945 },++ { 87,5945 }, { 88,5945 }, { 89,5945 }, { 90,5945 }, { 91,5945 },+ { 92,5945 }, { 93,5945 }, { 94,5945 }, { 95,5945 }, { 96,5945 },+ { 97,5945 }, { 98,5945 }, { 99,5945 }, { 100,5945 }, { 101,5945 },+ { 102,5945 }, { 103,5945 }, { 104,5945 }, { 105,5945 }, { 106,5945 },+ { 107,5945 }, { 108,5945 }, { 109,5945 }, { 110,5945 }, { 111,5945 },+ { 112,5945 }, { 113,5945 }, { 114,5945 }, { 115,5945 }, { 116,5945 },+ { 117,5945 }, { 118,5945 }, { 119,5945 }, { 120,5945 }, { 121,5945 },+ { 122,5945 }, { 123,5945 }, { 124,5945 }, { 125,5945 }, { 126,5945 },+ { 127,5945 }, { 128,5945 }, { 129,5945 }, { 130,5945 }, { 131,5945 },+ { 132,5945 }, { 133,5945 }, { 134,5945 }, { 135,5945 }, { 136,5945 },++ { 137,5945 }, { 138,5945 }, { 139,5945 }, { 140,5945 }, { 141,5945 },+ { 142,5945 }, { 143,5945 }, { 144,5945 }, { 145,5945 }, { 146,5945 },+ { 147,5945 }, { 148,5945 }, { 149,5945 }, { 150,5945 }, { 151,5945 },+ { 152,5945 }, { 153,5945 }, { 154,5945 }, { 155,5945 }, { 156,5945 },+ { 157,5945 }, { 158,5945 }, { 159,5945 }, { 160,5945 }, { 161,5945 },+ { 162,5945 }, { 163,5945 }, { 164,5945 }, { 165,5945 }, { 166,5945 },+ { 167,5945 }, { 168,5945 }, { 169,5945 }, { 170,5945 }, { 171,5945 },+ { 172,5945 }, { 173,5945 }, { 174,5945 }, { 175,5945 }, { 176,5945 },+ { 177,5945 }, { 178,5945 }, { 179,5945 }, { 180,5945 }, { 181,5945 },+ { 182,5945 }, { 183,5945 }, { 184,5945 }, { 185,5945 }, { 186,5945 },++ { 187,5945 }, { 188,5945 }, { 189,5945 }, { 190,5945 }, { 191,5945 },+ { 192,5945 }, { 193,5945 }, { 194,5945 }, { 195,5945 }, { 196,5945 },+ { 197,5945 }, { 198,5945 }, { 199,5945 }, { 200,5945 }, { 201,5945 },+ { 202,5945 }, { 203,5945 }, { 204,5945 }, { 205,5945 }, { 206,5945 },+ { 207,5945 }, { 208,5945 }, { 209,5945 }, { 210,5945 }, { 211,5945 },+ { 212,5945 }, { 213,5945 }, { 214,5945 }, { 215,5945 }, { 216,5945 },+ { 217,5945 }, { 218,5945 }, { 219,5945 }, { 220,5945 }, { 221,5945 },+ { 222,5945 }, { 223,5945 }, { 224,5945 }, { 225,5945 }, { 226,5945 },+ { 227,5945 }, { 228,5945 }, { 229,5945 }, { 230,5945 }, { 231,5945 },+ { 232,5945 }, { 233,5945 }, { 234,5945 }, { 235,5945 }, { 236,5945 },++ { 237,5945 }, { 238,5945 }, { 239,5945 }, { 240,5945 }, { 241,5945 },+ { 242,5945 }, { 243,5945 }, { 244,5945 }, { 245,5945 }, { 246,5945 },+ { 247,5945 }, { 248,5945 }, { 249,5945 }, { 250,5945 }, { 251,5945 },+ { 252,5945 }, { 253,5945 }, { 254,5945 }, { 255,5945 }, { 256,5945 },+ { 0, 0 }, { 0,31329 }, { 1,5687 }, { 2,5687 }, { 3,5687 },+ { 4,5687 }, { 5,5687 }, { 6,5687 }, { 7,5687 }, { 8,5687 },+ { 9,5687 }, { 10,5687 }, { 11,5687 }, { 12,5687 }, { 13,5687 },+ { 14,5687 }, { 15,5687 }, { 16,5687 }, { 17,5687 }, { 18,5687 },+ { 19,5687 }, { 20,5687 }, { 21,5687 }, { 22,5687 }, { 23,5687 },+ { 24,5687 }, { 25,5687 }, { 26,5687 }, { 27,5687 }, { 28,5687 },++ { 29,5687 }, { 30,5687 }, { 31,5687 }, { 32,5687 }, { 33,5687 },+ { 34,5687 }, { 35,5687 }, { 36,5687 }, { 37,5687 }, { 38,5687 },+ { 39,6765 }, { 40,5687 }, { 41,5687 }, { 42,5687 }, { 43,5687 },+ { 44,5687 }, { 45,5687 }, { 46,5687 }, { 47,5687 }, { 48,5687 },+ { 49,5687 }, { 50,5687 }, { 51,5687 }, { 52,5687 }, { 53,5687 },+ { 54,5687 }, { 55,5687 }, { 56,5687 }, { 57,5687 }, { 58,5687 },+ { 59,5687 }, { 60,5687 }, { 61,5687 }, { 62,5687 }, { 63,5687 },+ { 64,5687 }, { 65,5687 }, { 66,5687 }, { 67,5687 }, { 68,5687 },+ { 69,5687 }, { 70,5687 }, { 71,5687 }, { 72,5687 }, { 73,5687 },+ { 74,5687 }, { 75,5687 }, { 76,5687 }, { 77,5687 }, { 78,5687 },++ { 79,5687 }, { 80,5687 }, { 81,5687 }, { 82,5687 }, { 83,5687 },+ { 84,5687 }, { 85,5687 }, { 86,5687 }, { 87,5687 }, { 88,5687 },+ { 89,5687 }, { 90,5687 }, { 91,5687 }, { 92,5687 }, { 93,5687 },+ { 94,5687 }, { 95,5687 }, { 96,5687 }, { 97,5687 }, { 98,5687 },+ { 99,5687 }, { 100,5687 }, { 101,5687 }, { 102,5687 }, { 103,5687 },+ { 104,5687 }, { 105,5687 }, { 106,5687 }, { 107,5687 }, { 108,5687 },+ { 109,5687 }, { 110,5687 }, { 111,5687 }, { 112,5687 }, { 113,5687 },+ { 114,5687 }, { 115,5687 }, { 116,5687 }, { 117,5687 }, { 118,5687 },+ { 119,5687 }, { 120,5687 }, { 121,5687 }, { 122,5687 }, { 123,5687 },+ { 124,5687 }, { 125,5687 }, { 126,5687 }, { 127,5687 }, { 128,5687 },++ { 129,5687 }, { 130,5687 }, { 131,5687 }, { 132,5687 }, { 133,5687 },+ { 134,5687 }, { 135,5687 }, { 136,5687 }, { 137,5687 }, { 138,5687 },+ { 139,5687 }, { 140,5687 }, { 141,5687 }, { 142,5687 }, { 143,5687 },+ { 144,5687 }, { 145,5687 }, { 146,5687 }, { 147,5687 }, { 148,5687 },+ { 149,5687 }, { 150,5687 }, { 151,5687 }, { 152,5687 }, { 153,5687 },+ { 154,5687 }, { 155,5687 }, { 156,5687 }, { 157,5687 }, { 158,5687 },+ { 159,5687 }, { 160,5687 }, { 161,5687 }, { 162,5687 }, { 163,5687 },+ { 164,5687 }, { 165,5687 }, { 166,5687 }, { 167,5687 }, { 168,5687 },+ { 169,5687 }, { 170,5687 }, { 171,5687 }, { 172,5687 }, { 173,5687 },+ { 174,5687 }, { 175,5687 }, { 176,5687 }, { 177,5687 }, { 178,5687 },++ { 179,5687 }, { 180,5687 }, { 181,5687 }, { 182,5687 }, { 183,5687 },+ { 184,5687 }, { 185,5687 }, { 186,5687 }, { 187,5687 }, { 188,5687 },+ { 189,5687 }, { 190,5687 }, { 191,5687 }, { 192,5687 }, { 193,5687 },+ { 194,5687 }, { 195,5687 }, { 196,5687 }, { 197,5687 }, { 198,5687 },+ { 199,5687 }, { 200,5687 }, { 201,5687 }, { 202,5687 }, { 203,5687 },+ { 204,5687 }, { 205,5687 }, { 206,5687 }, { 207,5687 }, { 208,5687 },+ { 209,5687 }, { 210,5687 }, { 211,5687 }, { 212,5687 }, { 213,5687 },+ { 214,5687 }, { 215,5687 }, { 216,5687 }, { 217,5687 }, { 218,5687 },+ { 219,5687 }, { 220,5687 }, { 221,5687 }, { 222,5687 }, { 223,5687 },+ { 224,5687 }, { 225,5687 }, { 226,5687 }, { 227,5687 }, { 228,5687 },++ { 229,5687 }, { 230,5687 }, { 231,5687 }, { 232,5687 }, { 233,5687 },+ { 234,5687 }, { 235,5687 }, { 236,5687 }, { 237,5687 }, { 238,5687 },+ { 239,5687 }, { 240,5687 }, { 241,5687 }, { 242,5687 }, { 243,5687 },+ { 244,5687 }, { 245,5687 }, { 246,5687 }, { 247,5687 }, { 248,5687 },+ { 249,5687 }, { 250,5687 }, { 251,5687 }, { 252,5687 }, { 253,5687 },+ { 254,5687 }, { 255,5687 }, { 256,5687 }, { 0, 28 }, { 0,31071 },+ { 1,1113 }, { 2,1113 }, { 3,1113 }, { 4,1113 }, { 5,1113 },+ { 6,1113 }, { 7,1113 }, { 8,1113 }, { 9,6512 }, { 10,6528 },+ { 11,1113 }, { 12,6512 }, { 13,6512 }, { 14,1113 }, { 15,1113 },+ { 16,1113 }, { 17,1113 }, { 18,1113 }, { 19,1113 }, { 20,1113 },++ { 21,1113 }, { 22,1113 }, { 23,1113 }, { 24,1113 }, { 25,1113 },+ { 26,1113 }, { 27,1113 }, { 28,1113 }, { 29,1113 }, { 30,1113 },+ { 31,1113 }, { 32,6512 }, { 33,1113 }, { 34,1113 }, { 35,1113 },+ { 36,1113 }, { 37,1113 }, { 38,1113 }, { 39,1113 }, { 40,1113 },+ { 41,1113 }, { 42,1113 }, { 43,1113 }, { 44,1113 }, { 45,1131 },+ { 46,1113 }, { 47,1113 }, { 48,1113 }, { 49,1113 }, { 50,1113 },+ { 51,1113 }, { 52,1113 }, { 53,1113 }, { 54,1113 }, { 55,1113 },+ { 56,1113 }, { 57,1113 }, { 58,1113 }, { 59,1113 }, { 60,1113 },+ { 61,1113 }, { 62,1113 }, { 63,1113 }, { 64,1113 }, { 65,1113 },+ { 66,1113 }, { 67,1113 }, { 68,1113 }, { 69,1113 }, { 70,1113 },++ { 71,1113 }, { 72,1113 }, { 73,1113 }, { 74,1113 }, { 75,1113 },+ { 76,1113 }, { 77,1113 }, { 78,1113 }, { 79,1113 }, { 80,1113 },+ { 81,1113 }, { 82,1113 }, { 83,1113 }, { 84,1113 }, { 85,1139 },+ { 86,1113 }, { 87,1113 }, { 88,1113 }, { 89,1113 }, { 90,1113 },+ { 91,1113 }, { 92,1113 }, { 93,1113 }, { 94,1113 }, { 95,1113 },+ { 96,1113 }, { 97,1113 }, { 98,1113 }, { 99,1113 }, { 100,1113 },+ { 101,1113 }, { 102,1113 }, { 103,1113 }, { 104,1113 }, { 105,1113 },+ { 106,1113 }, { 107,1113 }, { 108,1113 }, { 109,1113 }, { 110,1113 },+ { 111,1113 }, { 112,1113 }, { 113,1113 }, { 114,1113 }, { 115,1113 },+ { 116,1113 }, { 117,1139 }, { 118,1113 }, { 119,1113 }, { 120,1113 },++ { 121,1113 }, { 122,1113 }, { 123,1113 }, { 124,1113 }, { 125,1113 },+ { 126,1113 }, { 127,1113 }, { 128,1113 }, { 129,1113 }, { 130,1113 },+ { 131,1113 }, { 132,1113 }, { 133,1113 }, { 134,1113 }, { 135,1113 },+ { 136,1113 }, { 137,1113 }, { 138,1113 }, { 139,1113 }, { 140,1113 },+ { 141,1113 }, { 142,1113 }, { 143,1113 }, { 144,1113 }, { 145,1113 },+ { 146,1113 }, { 147,1113 }, { 148,1113 }, { 149,1113 }, { 150,1113 },+ { 151,1113 }, { 152,1113 }, { 153,1113 }, { 154,1113 }, { 155,1113 },+ { 156,1113 }, { 157,1113 }, { 158,1113 }, { 159,1113 }, { 160,1113 },+ { 161,1113 }, { 162,1113 }, { 163,1113 }, { 164,1113 }, { 165,1113 },+ { 166,1113 }, { 167,1113 }, { 168,1113 }, { 169,1113 }, { 170,1113 },++ { 171,1113 }, { 172,1113 }, { 173,1113 }, { 174,1113 }, { 175,1113 },+ { 176,1113 }, { 177,1113 }, { 178,1113 }, { 179,1113 }, { 180,1113 },+ { 181,1113 }, { 182,1113 }, { 183,1113 }, { 184,1113 }, { 185,1113 },+ { 186,1113 }, { 187,1113 }, { 188,1113 }, { 189,1113 }, { 190,1113 },+ { 191,1113 }, { 192,1113 }, { 193,1113 }, { 194,1113 }, { 195,1113 },+ { 196,1113 }, { 197,1113 }, { 198,1113 }, { 199,1113 }, { 200,1113 },+ { 201,1113 }, { 202,1113 }, { 203,1113 }, { 204,1113 }, { 205,1113 },+ { 206,1113 }, { 207,1113 }, { 208,1113 }, { 209,1113 }, { 210,1113 },+ { 211,1113 }, { 212,1113 }, { 213,1113 }, { 214,1113 }, { 215,1113 },+ { 216,1113 }, { 217,1113 }, { 218,1113 }, { 219,1113 }, { 220,1113 },++ { 221,1113 }, { 222,1113 }, { 223,1113 }, { 224,1113 }, { 225,1113 },+ { 226,1113 }, { 227,1113 }, { 228,1113 }, { 229,1113 }, { 230,1113 },+ { 231,1113 }, { 232,1113 }, { 233,1113 }, { 234,1113 }, { 235,1113 },+ { 236,1113 }, { 237,1113 }, { 238,1113 }, { 239,1113 }, { 240,1113 },+ { 241,1113 }, { 242,1113 }, { 243,1113 }, { 244,1113 }, { 245,1113 },+ { 246,1113 }, { 247,1113 }, { 248,1113 }, { 249,1113 }, { 250,1113 },+ { 251,1113 }, { 252,1113 }, { 253,1113 }, { 254,1113 }, { 255,1113 },+ { 256,1113 }, { 0, 28 }, { 0,30813 }, { 1, 855 }, { 2, 855 },+ { 3, 855 }, { 4, 855 }, { 5, 855 }, { 6, 855 }, { 7, 855 },+ { 8, 855 }, { 9,6254 }, { 10,6270 }, { 11, 855 }, { 12,6254 },++ { 13,6254 }, { 14, 855 }, { 15, 855 }, { 16, 855 }, { 17, 855 },+ { 18, 855 }, { 19, 855 }, { 20, 855 }, { 21, 855 }, { 22, 855 },+ { 23, 855 }, { 24, 855 }, { 25, 855 }, { 26, 855 }, { 27, 855 },+ { 28, 855 }, { 29, 855 }, { 30, 855 }, { 31, 855 }, { 32,6254 },+ { 33, 855 }, { 34, 855 }, { 35, 855 }, { 36, 855 }, { 37, 855 },+ { 38, 855 }, { 39, 855 }, { 40, 855 }, { 41, 855 }, { 42, 855 },+ { 43, 855 }, { 44, 855 }, { 45, 873 }, { 46, 855 }, { 47, 855 },+ { 48, 855 }, { 49, 855 }, { 50, 855 }, { 51, 855 }, { 52, 855 },+ { 53, 855 }, { 54, 855 }, { 55, 855 }, { 56, 855 }, { 57, 855 },+ { 58, 855 }, { 59, 855 }, { 60, 855 }, { 61, 855 }, { 62, 855 },++ { 63, 855 }, { 64, 855 }, { 65, 855 }, { 66, 855 }, { 67, 855 },+ { 68, 855 }, { 69, 855 }, { 70, 855 }, { 71, 855 }, { 72, 855 },+ { 73, 855 }, { 74, 855 }, { 75, 855 }, { 76, 855 }, { 77, 855 },+ { 78, 855 }, { 79, 855 }, { 80, 855 }, { 81, 855 }, { 82, 855 },+ { 83, 855 }, { 84, 855 }, { 85, 881 }, { 86, 855 }, { 87, 855 },+ { 88, 855 }, { 89, 855 }, { 90, 855 }, { 91, 855 }, { 92, 855 },+ { 93, 855 }, { 94, 855 }, { 95, 855 }, { 96, 855 }, { 97, 855 },+ { 98, 855 }, { 99, 855 }, { 100, 855 }, { 101, 855 }, { 102, 855 },+ { 103, 855 }, { 104, 855 }, { 105, 855 }, { 106, 855 }, { 107, 855 },+ { 108, 855 }, { 109, 855 }, { 110, 855 }, { 111, 855 }, { 112, 855 },++ { 113, 855 }, { 114, 855 }, { 115, 855 }, { 116, 855 }, { 117, 881 },+ { 118, 855 }, { 119, 855 }, { 120, 855 }, { 121, 855 }, { 122, 855 },+ { 123, 855 }, { 124, 855 }, { 125, 855 }, { 126, 855 }, { 127, 855 },+ { 128, 855 }, { 129, 855 }, { 130, 855 }, { 131, 855 }, { 132, 855 },+ { 133, 855 }, { 134, 855 }, { 135, 855 }, { 136, 855 }, { 137, 855 },+ { 138, 855 }, { 139, 855 }, { 140, 855 }, { 141, 855 }, { 142, 855 },+ { 143, 855 }, { 144, 855 }, { 145, 855 }, { 146, 855 }, { 147, 855 },+ { 148, 855 }, { 149, 855 }, { 150, 855 }, { 151, 855 }, { 152, 855 },+ { 153, 855 }, { 154, 855 }, { 155, 855 }, { 156, 855 }, { 157, 855 },+ { 158, 855 }, { 159, 855 }, { 160, 855 }, { 161, 855 }, { 162, 855 },++ { 163, 855 }, { 164, 855 }, { 165, 855 }, { 166, 855 }, { 167, 855 },+ { 168, 855 }, { 169, 855 }, { 170, 855 }, { 171, 855 }, { 172, 855 },+ { 173, 855 }, { 174, 855 }, { 175, 855 }, { 176, 855 }, { 177, 855 },+ { 178, 855 }, { 179, 855 }, { 180, 855 }, { 181, 855 }, { 182, 855 },+ { 183, 855 }, { 184, 855 }, { 185, 855 }, { 186, 855 }, { 187, 855 },+ { 188, 855 }, { 189, 855 }, { 190, 855 }, { 191, 855 }, { 192, 855 },+ { 193, 855 }, { 194, 855 }, { 195, 855 }, { 196, 855 }, { 197, 855 },+ { 198, 855 }, { 199, 855 }, { 200, 855 }, { 201, 855 }, { 202, 855 },+ { 203, 855 }, { 204, 855 }, { 205, 855 }, { 206, 855 }, { 207, 855 },+ { 208, 855 }, { 209, 855 }, { 210, 855 }, { 211, 855 }, { 212, 855 },++ { 213, 855 }, { 214, 855 }, { 215, 855 }, { 216, 855 }, { 217, 855 },+ { 218, 855 }, { 219, 855 }, { 220, 855 }, { 221, 855 }, { 222, 855 },+ { 223, 855 }, { 224, 855 }, { 225, 855 }, { 226, 855 }, { 227, 855 },+ { 228, 855 }, { 229, 855 }, { 230, 855 }, { 231, 855 }, { 232, 855 },+ { 233, 855 }, { 234, 855 }, { 235, 855 }, { 236, 855 }, { 237, 855 },+ { 238, 855 }, { 239, 855 }, { 240, 855 }, { 241, 855 }, { 242, 855 },+ { 243, 855 }, { 244, 855 }, { 245, 855 }, { 246, 855 }, { 247, 855 },+ { 248, 855 }, { 249, 855 }, { 250, 855 }, { 251, 855 }, { 252, 855 },+ { 253, 855 }, { 254, 855 }, { 255, 855 }, { 256, 855 }, { 0, 0 },+ { 0,30555 }, { 1, 633 }, { 2, 633 }, { 3, 633 }, { 4, 633 },++ { 5, 633 }, { 6, 633 }, { 7, 633 }, { 8, 633 }, { 9, 633 },+ { 10, 635 }, { 11, 633 }, { 12, 633 }, { 13, 633 }, { 14, 633 },+ { 15, 633 }, { 16, 633 }, { 17, 633 }, { 18, 633 }, { 19, 633 },+ { 20, 633 }, { 21, 633 }, { 22, 633 }, { 23, 633 }, { 24, 633 },+ { 25, 633 }, { 26, 633 }, { 27, 633 }, { 28, 633 }, { 29, 633 },+ { 30, 633 }, { 31, 633 }, { 32, 633 }, { 33, 633 }, { 34, 633 },+ { 35, 633 }, { 36, 633 }, { 37, 633 }, { 38, 633 }, { 39, 633 },+ { 40, 633 }, { 41, 633 }, { 42, 633 }, { 43, 633 }, { 44, 633 },+ { 45, 633 }, { 46, 633 }, { 47, 633 }, { 48, 633 }, { 49, 633 },+ { 50, 633 }, { 51, 633 }, { 52, 633 }, { 53, 633 }, { 54, 633 },++ { 55, 633 }, { 56, 633 }, { 57, 633 }, { 58, 633 }, { 59, 633 },+ { 60, 633 }, { 61, 633 }, { 62, 633 }, { 63, 633 }, { 64, 633 },+ { 65, 633 }, { 66, 633 }, { 67, 633 }, { 68, 633 }, { 69, 633 },+ { 70, 633 }, { 71, 633 }, { 72, 633 }, { 73, 633 }, { 74, 633 },+ { 75, 633 }, { 76, 633 }, { 77, 633 }, { 78, 633 }, { 79, 633 },+ { 80, 633 }, { 81, 633 }, { 82, 633 }, { 83, 633 }, { 84, 633 },+ { 85, 633 }, { 86, 633 }, { 87, 633 }, { 88, 633 }, { 89, 633 },+ { 90, 633 }, { 91, 633 }, { 92, 637 }, { 93, 633 }, { 94, 633 },+ { 95, 633 }, { 96, 633 }, { 97, 633 }, { 98, 633 }, { 99, 633 },+ { 100, 633 }, { 101, 633 }, { 102, 633 }, { 103, 633 }, { 104, 633 },++ { 105, 633 }, { 106, 633 }, { 107, 633 }, { 108, 633 }, { 109, 633 },+ { 110, 633 }, { 111, 633 }, { 112, 633 }, { 113, 633 }, { 114, 633 },+ { 115, 633 }, { 116, 633 }, { 117, 633 }, { 118, 633 }, { 119, 633 },+ { 120, 633 }, { 121, 633 }, { 122, 633 }, { 123, 633 }, { 124, 633 },+ { 125, 633 }, { 126, 633 }, { 127, 633 }, { 128, 633 }, { 129, 633 },+ { 130, 633 }, { 131, 633 }, { 132, 633 }, { 133, 633 }, { 134, 633 },+ { 135, 633 }, { 136, 633 }, { 137, 633 }, { 138, 633 }, { 139, 633 },+ { 140, 633 }, { 141, 633 }, { 142, 633 }, { 143, 633 }, { 144, 633 },+ { 145, 633 }, { 146, 633 }, { 147, 633 }, { 148, 633 }, { 149, 633 },+ { 150, 633 }, { 151, 633 }, { 152, 633 }, { 153, 633 }, { 154, 633 },++ { 155, 633 }, { 156, 633 }, { 157, 633 }, { 158, 633 }, { 159, 633 },+ { 160, 633 }, { 161, 633 }, { 162, 633 }, { 163, 633 }, { 164, 633 },+ { 165, 633 }, { 166, 633 }, { 167, 633 }, { 168, 633 }, { 169, 633 },+ { 170, 633 }, { 171, 633 }, { 172, 633 }, { 173, 633 }, { 174, 633 },+ { 175, 633 }, { 176, 633 }, { 177, 633 }, { 178, 633 }, { 179, 633 },+ { 180, 633 }, { 181, 633 }, { 182, 633 }, { 183, 633 }, { 184, 633 },+ { 185, 633 }, { 186, 633 }, { 187, 633 }, { 188, 633 }, { 189, 633 },+ { 190, 633 }, { 191, 633 }, { 192, 633 }, { 193, 633 }, { 194, 633 },+ { 195, 633 }, { 196, 633 }, { 197, 633 }, { 198, 633 }, { 199, 633 },+ { 200, 633 }, { 201, 633 }, { 202, 633 }, { 203, 633 }, { 204, 633 },++ { 205, 633 }, { 206, 633 }, { 207, 633 }, { 208, 633 }, { 209, 633 },+ { 210, 633 }, { 211, 633 }, { 212, 633 }, { 213, 633 }, { 214, 633 },+ { 215, 633 }, { 216, 633 }, { 217, 633 }, { 218, 633 }, { 219, 633 },+ { 220, 633 }, { 221, 633 }, { 222, 633 }, { 223, 633 }, { 224, 633 },+ { 225, 633 }, { 226, 633 }, { 227, 633 }, { 228, 633 }, { 229, 633 },+ { 230, 633 }, { 231, 633 }, { 232, 633 }, { 233, 633 }, { 234, 633 },+ { 235, 633 }, { 236, 633 }, { 237, 633 }, { 238, 633 }, { 239, 633 },+ { 240, 633 }, { 241, 633 }, { 242, 633 }, { 243, 633 }, { 244, 633 },+ { 245, 633 }, { 246, 633 }, { 247, 633 }, { 248, 633 }, { 249, 633 },+ { 250, 633 }, { 251, 633 }, { 252, 633 }, { 253, 633 }, { 254, 633 },++ { 255, 633 }, { 256, 633 }, { 0, 0 }, { 0,30297 }, { 1, 375 },+ { 2, 375 }, { 3, 375 }, { 4, 375 }, { 5, 375 }, { 6, 375 },+ { 7, 375 }, { 8, 375 }, { 9, 375 }, { 10, 377 }, { 11, 375 },+ { 12, 375 }, { 13, 375 }, { 14, 375 }, { 15, 375 }, { 16, 375 },+ { 17, 375 }, { 18, 375 }, { 19, 375 }, { 20, 375 }, { 21, 375 },+ { 22, 375 }, { 23, 375 }, { 24, 375 }, { 25, 375 }, { 26, 375 },+ { 27, 375 }, { 28, 375 }, { 29, 375 }, { 30, 375 }, { 31, 375 },+ { 32, 375 }, { 33, 375 }, { 34, 375 }, { 35, 375 }, { 36, 375 },+ { 37, 375 }, { 38, 375 }, { 39, 375 }, { 40, 375 }, { 41, 375 },+ { 42, 375 }, { 43, 375 }, { 44, 375 }, { 45, 375 }, { 46, 375 },++ { 47, 375 }, { 48, 375 }, { 49, 375 }, { 50, 375 }, { 51, 375 },+ { 52, 375 }, { 53, 375 }, { 54, 375 }, { 55, 375 }, { 56, 375 },+ { 57, 375 }, { 58, 375 }, { 59, 375 }, { 60, 375 }, { 61, 375 },+ { 62, 375 }, { 63, 375 }, { 64, 375 }, { 65, 375 }, { 66, 375 },+ { 67, 375 }, { 68, 375 }, { 69, 375 }, { 70, 375 }, { 71, 375 },+ { 72, 375 }, { 73, 375 }, { 74, 375 }, { 75, 375 }, { 76, 375 },+ { 77, 375 }, { 78, 375 }, { 79, 375 }, { 80, 375 }, { 81, 375 },+ { 82, 375 }, { 83, 375 }, { 84, 375 }, { 85, 375 }, { 86, 375 },+ { 87, 375 }, { 88, 375 }, { 89, 375 }, { 90, 375 }, { 91, 375 },+ { 92, 379 }, { 93, 375 }, { 94, 375 }, { 95, 375 }, { 96, 375 },++ { 97, 375 }, { 98, 375 }, { 99, 375 }, { 100, 375 }, { 101, 375 },+ { 102, 375 }, { 103, 375 }, { 104, 375 }, { 105, 375 }, { 106, 375 },+ { 107, 375 }, { 108, 375 }, { 109, 375 }, { 110, 375 }, { 111, 375 },+ { 112, 375 }, { 113, 375 }, { 114, 375 }, { 115, 375 }, { 116, 375 },+ { 117, 375 }, { 118, 375 }, { 119, 375 }, { 120, 375 }, { 121, 375 },+ { 122, 375 }, { 123, 375 }, { 124, 375 }, { 125, 375 }, { 126, 375 },+ { 127, 375 }, { 128, 375 }, { 129, 375 }, { 130, 375 }, { 131, 375 },+ { 132, 375 }, { 133, 375 }, { 134, 375 }, { 135, 375 }, { 136, 375 },+ { 137, 375 }, { 138, 375 }, { 139, 375 }, { 140, 375 }, { 141, 375 },+ { 142, 375 }, { 143, 375 }, { 144, 375 }, { 145, 375 }, { 146, 375 },++ { 147, 375 }, { 148, 375 }, { 149, 375 }, { 150, 375 }, { 151, 375 },+ { 152, 375 }, { 153, 375 }, { 154, 375 }, { 155, 375 }, { 156, 375 },+ { 157, 375 }, { 158, 375 }, { 159, 375 }, { 160, 375 }, { 161, 375 },+ { 162, 375 }, { 163, 375 }, { 164, 375 }, { 165, 375 }, { 166, 375 },+ { 167, 375 }, { 168, 375 }, { 169, 375 }, { 170, 375 }, { 171, 375 },+ { 172, 375 }, { 173, 375 }, { 174, 375 }, { 175, 375 }, { 176, 375 },+ { 177, 375 }, { 178, 375 }, { 179, 375 }, { 180, 375 }, { 181, 375 },+ { 182, 375 }, { 183, 375 }, { 184, 375 }, { 185, 375 }, { 186, 375 },+ { 187, 375 }, { 188, 375 }, { 189, 375 }, { 190, 375 }, { 191, 375 },+ { 192, 375 }, { 193, 375 }, { 194, 375 }, { 195, 375 }, { 196, 375 },++ { 197, 375 }, { 198, 375 }, { 199, 375 }, { 200, 375 }, { 201, 375 },+ { 202, 375 }, { 203, 375 }, { 204, 375 }, { 205, 375 }, { 206, 375 },+ { 207, 375 }, { 208, 375 }, { 209, 375 }, { 210, 375 }, { 211, 375 },+ { 212, 375 }, { 213, 375 }, { 214, 375 }, { 215, 375 }, { 216, 375 },+ { 217, 375 }, { 218, 375 }, { 219, 375 }, { 220, 375 }, { 221, 375 },+ { 222, 375 }, { 223, 375 }, { 224, 375 }, { 225, 375 }, { 226, 375 },+ { 227, 375 }, { 228, 375 }, { 229, 375 }, { 230, 375 }, { 231, 375 },+ { 232, 375 }, { 233, 375 }, { 234, 375 }, { 235, 375 }, { 236, 375 },+ { 237, 375 }, { 238, 375 }, { 239, 375 }, { 240, 375 }, { 241, 375 },+ { 242, 375 }, { 243, 375 }, { 244, 375 }, { 245, 375 }, { 246, 375 },++ { 247, 375 }, { 248, 375 }, { 249, 375 }, { 250, 375 }, { 251, 375 },+ { 252, 375 }, { 253, 375 }, { 254, 375 }, { 255, 375 }, { 256, 375 },+ { 0, 79 }, { 0,30039 }, { 0, 1 }, { 0,30037 }, { 0, 49 },+ { 0,30035 }, { 0, 0 }, { 0, 1 }, { 0,30032 }, { 0, 70 },+ { 0,30030 }, { 0, 0 }, { 9,5515 }, { 10,5515 }, { 0, 0 },+ { 12,5515 }, { 13,5515 }, { 9,5510 }, { 10,5510 }, { 0, 0 },+ { 12,5510 }, { 13,5510 }, { 0, 19 }, { 0,30017 }, { 0, 69 },+ { 0,30015 }, { 0, 0 }, { 0, 69 }, { 0,30012 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 6 }, { 0,30007 }, { 0, 0 },+ { 32,5515 }, { 0, 6 }, { 0,30003 }, { 0, 0 }, { 0, 0 },++ { 32,5510 }, { 0, 51 }, { 0,29998 }, { 33,5510 }, { 0, 0 },+ { 35,5510 }, { 0, 0 }, { 37,5510 }, { 38,5510 }, { 0, 70 },+ { 0,29990 }, { 0, 0 }, { 42,5510 }, { 43,5510 }, { 0, 0 },+ { 45,5510 }, { 0, 0 }, { 47,5510 }, { 0, 0 }, { 0, 52 },+ { 0,29980 }, { 0, 54 }, { 0,29978 }, { 0, 54 }, { 0,29976 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 60,5510 }, { 61,5550 }, { 62,5510 }, { 63,5510 }, { 64,5510 },+ { 42, 408 }, { 34, 420 }, { 0, 54 }, { 0,29962 }, { 42,7294 },+ { 47, 410 }, { 0, 27 }, { 0,29958 }, { 33,5470 }, { 0, 0 },+ { 35,5470 }, { 58, 100 }, { 37,5470 }, { 38,5470 }, { 61, 102 },++ { 0, 0 }, { 0, 0 }, { 42,5470 }, { 43,5470 }, { 34, 402 },+ { 45,5470 }, { 0, 0 }, { 47,5470 }, { 0, 0 }, { 0, 27 },+ { 0,29940 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 94,5510 },+ { 0, 0 }, { 96,5510 }, { 0, 27 }, { 0,29932 }, { 45,9179 },+ { 60,5470 }, { 61,5470 }, { 62,5470 }, { 63,5470 }, { 64,5470 },+ { 0, 79 }, { 0,29924 }, { 0, 35 }, { 0,29922 }, { 0, 36 },+ { 0,29920 }, { 0, 35 }, { 0,29918 }, { 0, 43 }, { 0,29916 },+ { 0, 62 }, { 0,29914 }, { 0, 61 }, { 0,29912 }, { 0, 63 },+ { 0,29910 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 124,5510 },+ { 0, 0 }, { 126,5510 }, { 0, 0 }, { 0, 0 }, { 0, 0 },++ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 94,5470 },+ { 45,9456 }, { 96,5470 }, { 69, 465 }, { 0, 78 }, { 0,29891 },+ { 0, 8 }, { 0,29889 }, { 36, 8 }, { 0, 20 }, { 0,29886 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,5461 },+ { 49,5461 }, { 50,5461 }, { 51,5461 }, { 52,5461 }, { 53,5461 },+ { 54,5461 }, { 55,5461 }, { 56,5461 }, { 57,5461 }, { 124,5470 },+ { 0, 0 }, { 126,5470 }, { 69, 447 }, { 0, 0 }, { 101, 465 },+ { 0, 0 }, { 65,5523 }, { 66,5523 }, { 67,5523 }, { 68,5523 },+ { 69,5523 }, { 70,5523 }, { 71,5523 }, { 72,5523 }, { 73,5523 },++ { 74,5523 }, { 75,5523 }, { 76,5523 }, { 77,5523 }, { 78,5523 },+ { 79,5523 }, { 80,5523 }, { 81,5523 }, { 82,5523 }, { 83,5523 },+ { 84,5523 }, { 85,5523 }, { 86,5523 }, { 87,5523 }, { 88,5523 },+ { 89,5523 }, { 90,5523 }, { 85,9692 }, { 0, 0 }, { 101, 447 },+ { 0, 0 }, { 95,5523 }, { 63, 0 }, { 97,5523 }, { 98,5523 },+ { 99,5523 }, { 100,5523 }, { 101,5523 }, { 102,5523 }, { 103,5523 },+ { 104,5523 }, { 105,5523 }, { 106,5523 }, { 107,5523 }, { 108,5523 },+ { 109,5523 }, { 110,5523 }, { 111,5523 }, { 112,5523 }, { 113,5523 },+ { 114,5523 }, { 115,5523 }, { 116,5523 }, { 117,5523 }, { 118,5523 },+ { 119,5523 }, { 120,5523 }, { 121,5523 }, { 122,5523 }, { 117,9715 },++ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 128,5523 },+ { 129,5523 }, { 130,5523 }, { 131,5523 }, { 132,5523 }, { 133,5523 },+ { 134,5523 }, { 135,5523 }, { 136,5523 }, { 137,5523 }, { 138,5523 },+ { 139,5523 }, { 140,5523 }, { 141,5523 }, { 142,5523 }, { 143,5523 },+ { 144,5523 }, { 145,5523 }, { 146,5523 }, { 147,5523 }, { 148,5523 },+ { 149,5523 }, { 150,5523 }, { 151,5523 }, { 152,5523 }, { 153,5523 },+ { 154,5523 }, { 155,5523 }, { 156,5523 }, { 157,5523 }, { 158,5523 },+ { 159,5523 }, { 160,5523 }, { 161,5523 }, { 162,5523 }, { 163,5523 },+ { 164,5523 }, { 165,5523 }, { 166,5523 }, { 167,5523 }, { 168,5523 },+ { 169,5523 }, { 170,5523 }, { 171,5523 }, { 172,5523 }, { 173,5523 },++ { 174,5523 }, { 175,5523 }, { 176,5523 }, { 177,5523 }, { 178,5523 },+ { 179,5523 }, { 180,5523 }, { 181,5523 }, { 182,5523 }, { 183,5523 },+ { 184,5523 }, { 185,5523 }, { 186,5523 }, { 187,5523 }, { 188,5523 },+ { 189,5523 }, { 190,5523 }, { 191,5523 }, { 192,5523 }, { 193,5523 },+ { 194,5523 }, { 195,5523 }, { 196,5523 }, { 197,5523 }, { 198,5523 },+ { 199,5523 }, { 200,5523 }, { 201,5523 }, { 202,5523 }, { 203,5523 },+ { 204,5523 }, { 205,5523 }, { 206,5523 }, { 207,5523 }, { 208,5523 },+ { 209,5523 }, { 210,5523 }, { 211,5523 }, { 212,5523 }, { 213,5523 },+ { 214,5523 }, { 215,5523 }, { 216,5523 }, { 217,5523 }, { 218,5523 },+ { 219,5523 }, { 220,5523 }, { 221,5523 }, { 222,5523 }, { 223,5523 },++ { 224,5523 }, { 225,5523 }, { 226,5523 }, { 227,5523 }, { 228,5523 },+ { 229,5523 }, { 230,5523 }, { 231,5523 }, { 232,5523 }, { 233,5523 },+ { 234,5523 }, { 235,5523 }, { 236,5523 }, { 237,5523 }, { 238,5523 },+ { 239,5523 }, { 240,5523 }, { 241,5523 }, { 242,5523 }, { 243,5523 },+ { 244,5523 }, { 245,5523 }, { 246,5523 }, { 247,5523 }, { 248,5523 },+ { 249,5523 }, { 250,5523 }, { 251,5523 }, { 252,5523 }, { 253,5523 },+ { 254,5523 }, { 255,5523 }, { 0, 69 }, { 0,29667 }, { 0, 60 },+ { 0,29665 }, { 0, 18 }, { 0,29663 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 69 }, { 0,29656 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 59 }, { 0,29651 },++ { 0, 15 }, { 0,29649 }, { 0, 0 }, { 0, 10 }, { 0,29646 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 69 }, { 0,29637 }, { 0, 0 },+ { 0, 0 }, { 33,5147 }, { 0, 0 }, { 35,5147 }, { 0, 0 },+ { 37,5147 }, { 38,5147 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 42,5147 }, { 43,5147 }, { 33,5136 }, { 45,5147 }, { 35,5136 },+ { 47,5147 }, { 37,5136 }, { 38,5136 }, { 34, 170 }, { 0, 0 },+ { 0, 0 }, { 42,5136 }, { 43,5136 }, { 39, 172 }, { 45,5512 },+ { 0, 0 }, { 47,5136 }, { 0, 0 }, { 60,5147 }, { 61,5147 },+ { 62,5147 }, { 63,5147 }, { 64,5147 }, { 63,-226 }, { 45,10420 },++ { 0, 7 }, { 0,29599 }, { 0, 4 }, { 0,29597 }, { 60,5136 },+ { 61,5136 }, { 62,5136 }, { 63,5136 }, { 64,5136 }, { 46,-277 },+ { 0, 0 }, { 48,5751 }, { 49,5751 }, { 50,5751 }, { 51,5751 },+ { 52,5751 }, { 53,5751 }, { 54,5751 }, { 55,5751 }, { 56,5751 },+ { 57,5751 }, { 0, 57 }, { 0,29578 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 94,5147 }, { 0, 0 }, { 96,5147 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 69 }, { 0,29566 },+ { 0, 72 }, { 0,29564 }, { 0, 0 }, { 94,5136 }, { 0, 0 },+ { 96,5136 }, { 0, 0 }, { 0, 0 }, { 42, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 47, 2 }, { 0, 0 },++ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 17 }, { 0,29546 },+ { 0, 30 }, { 0,29544 }, { 124,5147 }, { 0, 0 }, { 126,5147 },+ { 0, 23 }, { 0,29539 }, { 0, 38 }, { 0,29537 }, { 0, 45 },+ { 0,29535 }, { 0, 0 }, { 33,5046 }, { 124,5136 }, { 35,5046 },+ { 126,5136 }, { 37,5046 }, { 38,5046 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 42,5705 }, { 43,5046 }, { 0, 0 }, { 45,5046 },+ { 0, 0 }, { 47,5046 }, { 46,5705 }, { 0, 0 }, { 48,5769 },+ { 49,5769 }, { 50,5769 }, { 51,5769 }, { 52,5769 }, { 53,5769 },+ { 54,5769 }, { 55,5769 }, { 56,5769 }, { 57,5769 }, { 60,5046 },+ { 61,5046 }, { 62,5046 }, { 63,5046 }, { 64,5046 }, { 45,10706 },++ { 0, 69 }, { 0,29499 }, { 0, 55 }, { 0,29497 }, { 0, 0 },+ { 69,5791 }, { 45,11004 }, { 0, 25 }, { 0,29492 }, { 0, 0 },+ { 0, 0 }, { 0, 69 }, { 0,29488 }, { 0, 0 }, { 0, 28 },+ { 0,29485 }, { 0, 74 }, { 0,29483 }, { 0, 50 }, { 0,29481 },+ { 0, 21 }, { 0,29479 }, { 0, 14 }, { 0,29477 }, { 0, 10 },+ { 0,29475 }, { 0, 13 }, { 0,29473 }, { 94,5046 }, { 0, 0 },+ { 96,5046 }, { 0, 17 }, { 0,29468 }, { 0, 0 }, { 33,4979 },+ { 0, 0 }, { 35,4979 }, { 101,5791 }, { 37,4979 }, { 38,4979 },+ { 0, 41 }, { 0,29459 }, { 0, 0 }, { 42,4979 }, { 43,4979 },+ { 33,4968 }, { 45,4979 }, { 35,4968 }, { 47,4979 }, { 37,4968 },++ { 38,4968 }, { 0, 0 }, { 0, 0 }, { 45,11918 }, { 42,4968 },+ { 43,4968 }, { 0, 0 }, { 45,4968 }, { 124,5046 }, { 47,4968 },+ { 126,5046 }, { 60,4979 }, { 61,5766 }, { 62,5807 }, { 63,4979 },+ { 64,4979 }, { 0, 0 }, { 0, 23 }, { 0,29432 }, { 0, 0 },+ { 45,12544 }, { 0, 0 }, { 60,4968 }, { 61,4968 }, { 62,5863 },+ { 63,4968 }, { 64,4968 }, { 45,13569 }, { 0, 69 }, { 0,29421 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 83, 100 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 94,4979 }, { 0, 0 }, { 96,4979 }, { 83, 377 }, { 0, 0 },++ { 0, 0 }, { 0, 0 }, { 0, 55 }, { 0,29397 }, { 0, 25 },+ { 0,29395 }, { 94,4968 }, { 0, 0 }, { 96,4968 }, { 0, 0 },+ { 0, 78 }, { 0,29389 }, { 33,4901 }, { 45,14565 }, { 35,4901 },+ { 0, 0 }, { 37,4901 }, { 38,4901 }, { 115, 100 }, { 0, 0 },+ { 0, 0 }, { 42,4901 }, { 43,4901 }, { 0, 0 }, { 45,4901 },+ { 124,4979 }, { 47,4901 }, { 126,4979 }, { 0, 0 }, { 0, 0 },+ { 115, 377 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 124,4968 }, { 0, 0 }, { 126,4968 }, { 60,4901 },+ { 61,5807 }, { 62,4901 }, { 63,4901 }, { 64,4901 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 36,5855 }, { 0, 0 }, { 0, 0 },++ { 45,15687 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,5855 },+ { 49,5855 }, { 50,5855 }, { 51,5855 }, { 52,5855 }, { 53,5855 },+ { 54,5855 }, { 55,5855 }, { 56,5855 }, { 57,5855 }, { 0, 0 },+ { 67, 548 }, { 0, 0 }, { 0, 0 }, { 94,4901 }, { 63,-502 },+ { 96,4901 }, { 65,5855 }, { 66,5855 }, { 67,5855 }, { 68,5855 },+ { 69,5855 }, { 70,5855 }, { 71,5855 }, { 72,5855 }, { 73,5855 },+ { 74,5855 }, { 75,5855 }, { 76,5855 }, { 77,5855 }, { 78,5855 },+ { 79,5855 }, { 80,5855 }, { 81,5855 }, { 82,5855 }, { 83,5855 },+ { 84,5855 }, { 85,5855 }, { 86,5855 }, { 87,5855 }, { 88,5855 },++ { 89,5855 }, { 90,5855 }, { 99, 548 }, { 124,4901 }, { 0, 0 },+ { 126,4901 }, { 95,5855 }, { 0, 0 }, { 97,5855 }, { 98,5855 },+ { 99,5855 }, { 100,5855 }, { 101,5855 }, { 102,5855 }, { 103,5855 },+ { 104,5855 }, { 105,5855 }, { 106,5855 }, { 107,5855 }, { 108,5855 },+ { 109,5855 }, { 110,5855 }, { 111,5855 }, { 112,5855 }, { 113,5855 },+ { 114,5855 }, { 115,5855 }, { 116,5855 }, { 117,5855 }, { 118,5855 },+ { 119,5855 }, { 120,5855 }, { 121,5855 }, { 122,5855 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 128,5855 },+ { 129,5855 }, { 130,5855 }, { 131,5855 }, { 132,5855 }, { 133,5855 },+ { 134,5855 }, { 135,5855 }, { 136,5855 }, { 137,5855 }, { 138,5855 },++ { 139,5855 }, { 140,5855 }, { 141,5855 }, { 142,5855 }, { 143,5855 },+ { 144,5855 }, { 145,5855 }, { 146,5855 }, { 147,5855 }, { 148,5855 },+ { 149,5855 }, { 150,5855 }, { 151,5855 }, { 152,5855 }, { 153,5855 },+ { 154,5855 }, { 155,5855 }, { 156,5855 }, { 157,5855 }, { 158,5855 },+ { 159,5855 }, { 160,5855 }, { 161,5855 }, { 162,5855 }, { 163,5855 },+ { 164,5855 }, { 165,5855 }, { 166,5855 }, { 167,5855 }, { 168,5855 },+ { 169,5855 }, { 170,5855 }, { 171,5855 }, { 172,5855 }, { 173,5855 },+ { 174,5855 }, { 175,5855 }, { 176,5855 }, { 177,5855 }, { 178,5855 },+ { 179,5855 }, { 180,5855 }, { 181,5855 }, { 182,5855 }, { 183,5855 },+ { 184,5855 }, { 185,5855 }, { 186,5855 }, { 187,5855 }, { 188,5855 },++ { 189,5855 }, { 190,5855 }, { 191,5855 }, { 192,5855 }, { 193,5855 },+ { 194,5855 }, { 195,5855 }, { 196,5855 }, { 197,5855 }, { 198,5855 },+ { 199,5855 }, { 200,5855 }, { 201,5855 }, { 202,5855 }, { 203,5855 },+ { 204,5855 }, { 205,5855 }, { 206,5855 }, { 207,5855 }, { 208,5855 },+ { 209,5855 }, { 210,5855 }, { 211,5855 }, { 212,5855 }, { 213,5855 },+ { 214,5855 }, { 215,5855 }, { 216,5855 }, { 217,5855 }, { 218,5855 },+ { 219,5855 }, { 220,5855 }, { 221,5855 }, { 222,5855 }, { 223,5855 },+ { 224,5855 }, { 225,5855 }, { 226,5855 }, { 227,5855 }, { 228,5855 },+ { 229,5855 }, { 230,5855 }, { 231,5855 }, { 232,5855 }, { 233,5855 },+ { 234,5855 }, { 235,5855 }, { 236,5855 }, { 237,5855 }, { 238,5855 },++ { 239,5855 }, { 240,5855 }, { 241,5855 }, { 242,5855 }, { 243,5855 },+ { 244,5855 }, { 245,5855 }, { 246,5855 }, { 247,5855 }, { 248,5855 },+ { 249,5855 }, { 250,5855 }, { 251,5855 }, { 252,5855 }, { 253,5855 },+ { 254,5855 }, { 255,5855 }, { 0, 78 }, { 0,29132 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 28 }, { 0,29108 }, { 0, 39 }, { 0,29106 },+ { 0, 40 }, { 0,29104 }, { 0, 0 }, { 0, 0 }, { 0, 0 },++ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 36,5598 },+ { 0, 0 }, { 0, 0 }, { 39,-757 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 48,5598 }, { 49,5598 }, { 50,5598 }, { 51,5598 },+ { 52,5598 }, { 53,5598 }, { 54,5598 }, { 55,5598 }, { 56,5598 },+ { 57,5598 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 63,-759 }, { 0, 0 }, { 65,5598 }, { 66,5598 },+ { 67,5598 }, { 68,5598 }, { 69,5598 }, { 70,5598 }, { 71,5598 },+ { 72,5598 }, { 73,5598 }, { 74,5598 }, { 75,5598 }, { 76,5598 },+ { 77,5598 }, { 78,5598 }, { 79,5598 }, { 80,5598 }, { 81,5598 },++ { 82,5598 }, { 83,5598 }, { 84,5598 }, { 85,5598 }, { 86,5598 },+ { 87,5598 }, { 88,5598 }, { 89,5598 }, { 90,5598 }, { 67, 261 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,5598 }, { 0, 0 },+ { 97,5598 }, { 98,5598 }, { 99,5598 }, { 100,5598 }, { 101,5598 },+ { 102,5598 }, { 103,5598 }, { 104,5598 }, { 105,5598 }, { 106,5598 },+ { 107,5598 }, { 108,5598 }, { 109,5598 }, { 110,5598 }, { 111,5598 },+ { 112,5598 }, { 113,5598 }, { 114,5598 }, { 115,5598 }, { 116,5598 },+ { 117,5598 }, { 118,5598 }, { 119,5598 }, { 120,5598 }, { 121,5598 },+ { 122,5598 }, { 99, 261 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 128,5598 }, { 129,5598 }, { 130,5598 }, { 131,5598 },++ { 132,5598 }, { 133,5598 }, { 134,5598 }, { 135,5598 }, { 136,5598 },+ { 137,5598 }, { 138,5598 }, { 139,5598 }, { 140,5598 }, { 141,5598 },+ { 142,5598 }, { 143,5598 }, { 144,5598 }, { 145,5598 }, { 146,5598 },+ { 147,5598 }, { 148,5598 }, { 149,5598 }, { 150,5598 }, { 151,5598 },+ { 152,5598 }, { 153,5598 }, { 154,5598 }, { 155,5598 }, { 156,5598 },+ { 157,5598 }, { 158,5598 }, { 159,5598 }, { 160,5598 }, { 161,5598 },+ { 162,5598 }, { 163,5598 }, { 164,5598 }, { 165,5598 }, { 166,5598 },+ { 167,5598 }, { 168,5598 }, { 169,5598 }, { 170,5598 }, { 171,5598 },+ { 172,5598 }, { 173,5598 }, { 174,5598 }, { 175,5598 }, { 176,5598 },+ { 177,5598 }, { 178,5598 }, { 179,5598 }, { 180,5598 }, { 181,5598 },++ { 182,5598 }, { 183,5598 }, { 184,5598 }, { 185,5598 }, { 186,5598 },+ { 187,5598 }, { 188,5598 }, { 189,5598 }, { 190,5598 }, { 191,5598 },+ { 192,5598 }, { 193,5598 }, { 194,5598 }, { 195,5598 }, { 196,5598 },+ { 197,5598 }, { 198,5598 }, { 199,5598 }, { 200,5598 }, { 201,5598 },+ { 202,5598 }, { 203,5598 }, { 204,5598 }, { 205,5598 }, { 206,5598 },+ { 207,5598 }, { 208,5598 }, { 209,5598 }, { 210,5598 }, { 211,5598 },+ { 212,5598 }, { 213,5598 }, { 214,5598 }, { 215,5598 }, { 216,5598 },+ { 217,5598 }, { 218,5598 }, { 219,5598 }, { 220,5598 }, { 221,5598 },+ { 222,5598 }, { 223,5598 }, { 224,5598 }, { 225,5598 }, { 226,5598 },+ { 227,5598 }, { 228,5598 }, { 229,5598 }, { 230,5598 }, { 231,5598 },++ { 232,5598 }, { 233,5598 }, { 234,5598 }, { 235,5598 }, { 236,5598 },+ { 237,5598 }, { 238,5598 }, { 239,5598 }, { 240,5598 }, { 241,5598 },+ { 242,5598 }, { 243,5598 }, { 244,5598 }, { 245,5598 }, { 246,5598 },+ { 247,5598 }, { 248,5598 }, { 249,5598 }, { 250,5598 }, { 251,5598 },+ { 252,5598 }, { 253,5598 }, { 254,5598 }, { 255,5598 }, { 0, 78 },+ { 0,28875 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },++ { 0, 55 }, { 0,28849 }, { 0, 28 }, { 0,28847 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 36,5341 }, { 0, 0 }, { 0, 0 }, { 39,-1011 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,5341 }, { 49,5341 },+ { 50,5341 }, { 51,5341 }, { 52,5341 }, { 53,5341 }, { 54,5341 },+ { 55,5341 }, { 56,5341 }, { 57,5341 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 63,-790 }, { 0, 0 },+ { 65,5341 }, { 66,5341 }, { 67,5341 }, { 68,5341 }, { 69,5341 },+ { 70,5341 }, { 71,5341 }, { 72,5341 }, { 73,5341 }, { 74,5341 },++ { 75,5341 }, { 76,5341 }, { 77,5341 }, { 78,5341 }, { 79,5341 },+ { 80,5341 }, { 81,5341 }, { 82,5341 }, { 83,5341 }, { 84,5341 },+ { 85,5341 }, { 86,5341 }, { 87,5341 }, { 88,5341 }, { 89,5341 },+ { 90,5341 }, { 65, 242 }, { 0, 0 }, { 65, 242 }, { 0, 0 },+ { 95,5341 }, { 0, 0 }, { 97,5341 }, { 98,5341 }, { 99,5341 },+ { 100,5341 }, { 101,5341 }, { 102,5341 }, { 103,5341 }, { 104,5341 },+ { 105,5341 }, { 106,5341 }, { 107,5341 }, { 108,5341 }, { 109,5341 },+ { 110,5341 }, { 111,5341 }, { 112,5341 }, { 113,5341 }, { 114,5341 },+ { 115,5341 }, { 116,5341 }, { 117,5341 }, { 118,5341 }, { 119,5341 },+ { 120,5341 }, { 121,5341 }, { 122,5341 }, { 97, 242 }, { 0, 0 },++ { 97, 242 }, { 0, 0 }, { 0, 0 }, { 128,5341 }, { 129,5341 },+ { 130,5341 }, { 131,5341 }, { 132,5341 }, { 133,5341 }, { 134,5341 },+ { 135,5341 }, { 136,5341 }, { 137,5341 }, { 138,5341 }, { 139,5341 },+ { 140,5341 }, { 141,5341 }, { 142,5341 }, { 143,5341 }, { 144,5341 },+ { 145,5341 }, { 146,5341 }, { 147,5341 }, { 148,5341 }, { 149,5341 },+ { 150,5341 }, { 151,5341 }, { 152,5341 }, { 153,5341 }, { 154,5341 },+ { 155,5341 }, { 156,5341 }, { 157,5341 }, { 158,5341 }, { 159,5341 },+ { 160,5341 }, { 161,5341 }, { 162,5341 }, { 163,5341 }, { 164,5341 },+ { 165,5341 }, { 166,5341 }, { 167,5341 }, { 168,5341 }, { 169,5341 },+ { 170,5341 }, { 171,5341 }, { 172,5341 }, { 173,5341 }, { 174,5341 },++ { 175,5341 }, { 176,5341 }, { 177,5341 }, { 178,5341 }, { 179,5341 },+ { 180,5341 }, { 181,5341 }, { 182,5341 }, { 183,5341 }, { 184,5341 },+ { 185,5341 }, { 186,5341 }, { 187,5341 }, { 188,5341 }, { 189,5341 },+ { 190,5341 }, { 191,5341 }, { 192,5341 }, { 193,5341 }, { 194,5341 },+ { 195,5341 }, { 196,5341 }, { 197,5341 }, { 198,5341 }, { 199,5341 },+ { 200,5341 }, { 201,5341 }, { 202,5341 }, { 203,5341 }, { 204,5341 },+ { 205,5341 }, { 206,5341 }, { 207,5341 }, { 208,5341 }, { 209,5341 },+ { 210,5341 }, { 211,5341 }, { 212,5341 }, { 213,5341 }, { 214,5341 },+ { 215,5341 }, { 216,5341 }, { 217,5341 }, { 218,5341 }, { 219,5341 },+ { 220,5341 }, { 221,5341 }, { 222,5341 }, { 223,5341 }, { 224,5341 },++ { 225,5341 }, { 226,5341 }, { 227,5341 }, { 228,5341 }, { 229,5341 },+ { 230,5341 }, { 231,5341 }, { 232,5341 }, { 233,5341 }, { 234,5341 },+ { 235,5341 }, { 236,5341 }, { 237,5341 }, { 238,5341 }, { 239,5341 },+ { 240,5341 }, { 241,5341 }, { 242,5341 }, { 243,5341 }, { 244,5341 },+ { 245,5341 }, { 246,5341 }, { 247,5341 }, { 248,5341 }, { 249,5341 },+ { 250,5341 }, { 251,5341 }, { 252,5341 }, { 253,5341 }, { 254,5341 },+ { 255,5341 }, { 0, 78 }, { 0,28618 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 55 }, { 0,28607 }, { 0, 28 },+ { 0,28605 }, { 0, 33 }, { 0,28603 }, { 0, 0 }, { 0, 0 },++ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 55 },+ { 0,28595 }, { 0, 28 }, { 0,28593 }, { 0, 34 }, { 0,28591 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 36,5084 }, { 0, 0 },+ { 0, 0 }, { 39,-1045 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 48,5084 }, { 49,5084 }, { 50,5084 }, { 51,5084 }, { 52,5084 },+ { 53,5084 }, { 54,5084 }, { 55,5084 }, { 56,5084 }, { 57,5084 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 63,-1273 }, { 0, 0 }, { 65,5084 }, { 66,5084 }, { 67,5084 },++ { 68,5084 }, { 69,5084 }, { 70,5084 }, { 71,5084 }, { 72,5084 },+ { 73,5084 }, { 74,5084 }, { 75,5084 }, { 76,5084 }, { 77,5084 },+ { 78,5084 }, { 79,5084 }, { 80,5084 }, { 81,5084 }, { 82,5084 },+ { 83,5084 }, { 84,5084 }, { 85,5084 }, { 86,5084 }, { 87,5084 },+ { 88,5084 }, { 89,5084 }, { 90,5084 }, { 80, 12 }, { 69,21847 },+ { 80, 12 }, { 69,21869 }, { 95,5084 }, { 0, 0 }, { 97,5084 },+ { 98,5084 }, { 99,5084 }, { 100,5084 }, { 101,5084 }, { 102,5084 },+ { 103,5084 }, { 104,5084 }, { 105,5084 }, { 106,5084 }, { 107,5084 },+ { 108,5084 }, { 109,5084 }, { 110,5084 }, { 111,5084 }, { 112,5084 },+ { 113,5084 }, { 114,5084 }, { 115,5084 }, { 116,5084 }, { 117,5084 },++ { 118,5084 }, { 119,5084 }, { 120,5084 }, { 121,5084 }, { 122,5084 },+ { 112, 12 }, { 101,21847 }, { 112, 12 }, { 101,21869 }, { 0, 0 },+ { 128,5084 }, { 129,5084 }, { 130,5084 }, { 131,5084 }, { 132,5084 },+ { 133,5084 }, { 134,5084 }, { 135,5084 }, { 136,5084 }, { 137,5084 },+ { 138,5084 }, { 139,5084 }, { 140,5084 }, { 141,5084 }, { 142,5084 },+ { 143,5084 }, { 144,5084 }, { 145,5084 }, { 146,5084 }, { 147,5084 },+ { 148,5084 }, { 149,5084 }, { 150,5084 }, { 151,5084 }, { 152,5084 },+ { 153,5084 }, { 154,5084 }, { 155,5084 }, { 156,5084 }, { 157,5084 },+ { 158,5084 }, { 159,5084 }, { 160,5084 }, { 161,5084 }, { 162,5084 },+ { 163,5084 }, { 164,5084 }, { 165,5084 }, { 166,5084 }, { 167,5084 },++ { 168,5084 }, { 169,5084 }, { 170,5084 }, { 171,5084 }, { 172,5084 },+ { 173,5084 }, { 174,5084 }, { 175,5084 }, { 176,5084 }, { 177,5084 },+ { 178,5084 }, { 179,5084 }, { 180,5084 }, { 181,5084 }, { 182,5084 },+ { 183,5084 }, { 184,5084 }, { 185,5084 }, { 186,5084 }, { 187,5084 },+ { 188,5084 }, { 189,5084 }, { 190,5084 }, { 191,5084 }, { 192,5084 },+ { 193,5084 }, { 194,5084 }, { 195,5084 }, { 196,5084 }, { 197,5084 },+ { 198,5084 }, { 199,5084 }, { 200,5084 }, { 201,5084 }, { 202,5084 },+ { 203,5084 }, { 204,5084 }, { 205,5084 }, { 206,5084 }, { 207,5084 },+ { 208,5084 }, { 209,5084 }, { 210,5084 }, { 211,5084 }, { 212,5084 },+ { 213,5084 }, { 214,5084 }, { 215,5084 }, { 216,5084 }, { 217,5084 },++ { 218,5084 }, { 219,5084 }, { 220,5084 }, { 221,5084 }, { 222,5084 },+ { 223,5084 }, { 224,5084 }, { 225,5084 }, { 226,5084 }, { 227,5084 },+ { 228,5084 }, { 229,5084 }, { 230,5084 }, { 231,5084 }, { 232,5084 },+ { 233,5084 }, { 234,5084 }, { 235,5084 }, { 236,5084 }, { 237,5084 },+ { 238,5084 }, { 239,5084 }, { 240,5084 }, { 241,5084 }, { 242,5084 },+ { 243,5084 }, { 244,5084 }, { 245,5084 }, { 246,5084 }, { 247,5084 },+ { 248,5084 }, { 249,5084 }, { 250,5084 }, { 251,5084 }, { 252,5084 },+ { 253,5084 }, { 254,5084 }, { 255,5084 }, { 0, 78 }, { 0,28361 },+ { 0, 55 }, { 0,28359 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },++ { 0, 0 }, { 0, 28 }, { 0,28348 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 55 }, { 0,28341 },+ { 0, 28 }, { 0,28339 }, { 0, 56 }, { 0,28337 }, { 0, 29 },+ { 0,28335 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 36,4827 }, { 0, 0 }, { 38,-1290 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 45,22485 }, { 48,4827 }, { 49,4827 }, { 50,4827 },+ { 51,4827 }, { 52,4827 }, { 53,4827 }, { 54,4827 }, { 55,4827 },+ { 56,4827 }, { 57,4827 }, { 45,22732 }, { 39, 4 }, { 0, 0 },++ { 39, 4 }, { 0, 0 }, { 63,-1530 }, { 0, 0 }, { 65,4827 },+ { 66,4827 }, { 67,4827 }, { 68,4827 }, { 69,4827 }, { 70,4827 },+ { 71,4827 }, { 72,4827 }, { 73,4827 }, { 74,4827 }, { 75,4827 },+ { 76,4827 }, { 77,4827 }, { 78,4827 }, { 79,4827 }, { 80,4827 },+ { 81,4827 }, { 82,4827 }, { 83,4827 }, { 84,4827 }, { 85,4827 },+ { 86,4827 }, { 87,4827 }, { 88,4827 }, { 89,4827 }, { 90,4827 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,4827 },+ { 0, 0 }, { 97,4827 }, { 98,4827 }, { 99,4827 }, { 100,4827 },+ { 101,4827 }, { 102,4827 }, { 103,4827 }, { 104,4827 }, { 105,4827 },+ { 106,4827 }, { 107,4827 }, { 108,4827 }, { 109,4827 }, { 110,4827 },++ { 111,4827 }, { 112,4827 }, { 113,4827 }, { 114,4827 }, { 115,4827 },+ { 116,4827 }, { 117,4827 }, { 118,4827 }, { 119,4827 }, { 120,4827 },+ { 121,4827 }, { 122,4827 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 128,4827 }, { 129,4827 }, { 130,4827 },+ { 131,4827 }, { 132,4827 }, { 133,4827 }, { 134,4827 }, { 135,4827 },+ { 136,4827 }, { 137,4827 }, { 138,4827 }, { 139,4827 }, { 140,4827 },+ { 141,4827 }, { 142,4827 }, { 143,4827 }, { 144,4827 }, { 145,4827 },+ { 146,4827 }, { 147,4827 }, { 148,4827 }, { 149,4827 }, { 150,4827 },+ { 151,4827 }, { 152,4827 }, { 153,4827 }, { 154,4827 }, { 155,4827 },+ { 156,4827 }, { 157,4827 }, { 158,4827 }, { 159,4827 }, { 160,4827 },++ { 161,4827 }, { 162,4827 }, { 163,4827 }, { 164,4827 }, { 165,4827 },+ { 166,4827 }, { 167,4827 }, { 168,4827 }, { 169,4827 }, { 170,4827 },+ { 171,4827 }, { 172,4827 }, { 173,4827 }, { 174,4827 }, { 175,4827 },+ { 176,4827 }, { 177,4827 }, { 178,4827 }, { 179,4827 }, { 180,4827 },+ { 181,4827 }, { 182,4827 }, { 183,4827 }, { 184,4827 }, { 185,4827 },+ { 186,4827 }, { 187,4827 }, { 188,4827 }, { 189,4827 }, { 190,4827 },+ { 191,4827 }, { 192,4827 }, { 193,4827 }, { 194,4827 }, { 195,4827 },+ { 196,4827 }, { 197,4827 }, { 198,4827 }, { 199,4827 }, { 200,4827 },+ { 201,4827 }, { 202,4827 }, { 203,4827 }, { 204,4827 }, { 205,4827 },+ { 206,4827 }, { 207,4827 }, { 208,4827 }, { 209,4827 }, { 210,4827 },++ { 211,4827 }, { 212,4827 }, { 213,4827 }, { 214,4827 }, { 215,4827 },+ { 216,4827 }, { 217,4827 }, { 218,4827 }, { 219,4827 }, { 220,4827 },+ { 221,4827 }, { 222,4827 }, { 223,4827 }, { 224,4827 }, { 225,4827 },+ { 226,4827 }, { 227,4827 }, { 228,4827 }, { 229,4827 }, { 230,4827 },+ { 231,4827 }, { 232,4827 }, { 233,4827 }, { 234,4827 }, { 235,4827 },+ { 236,4827 }, { 237,4827 }, { 238,4827 }, { 239,4827 }, { 240,4827 },+ { 241,4827 }, { 242,4827 }, { 243,4827 }, { 244,4827 }, { 245,4827 },+ { 246,4827 }, { 247,4827 }, { 248,4827 }, { 249,4827 }, { 250,4827 },+ { 251,4827 }, { 252,4827 }, { 253,4827 }, { 254,4827 }, { 255,4827 },+ { 0, 78 }, { 0,28104 }, { 0, 0 }, { 0, 0 }, { 0, 0 },++ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 36,4570 }, { 0, 0 }, { 0, 0 },+ { 39,-1545 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,4570 },+ { 49,4570 }, { 50,4570 }, { 51,4570 }, { 52,4570 }, { 53,4570 },++ { 54,4570 }, { 55,4570 }, { 56,4570 }, { 57,4570 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 63,-1787 },+ { 0, 0 }, { 65,4570 }, { 66,4570 }, { 67,4570 }, { 68,4570 },+ { 69,4570 }, { 70,4570 }, { 71,4570 }, { 72,4570 }, { 73,4570 },+ { 74,4570 }, { 75,4570 }, { 76,4570 }, { 77,4570 }, { 78,4570 },+ { 79,4570 }, { 80,4570 }, { 81,4570 }, { 82,4570 }, { 83,4570 },+ { 84,4570 }, { 85,4570 }, { 86,4570 }, { 87,4570 }, { 88,4570 },+ { 89,4570 }, { 90,4570 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 95,4570 }, { 0, 0 }, { 97,4570 }, { 98,4570 },+ { 99,4570 }, { 100,4570 }, { 101,4570 }, { 102,4570 }, { 103,4570 },++ { 104,4570 }, { 105,4570 }, { 106,4570 }, { 107,4570 }, { 108,4570 },+ { 109,4570 }, { 110,4570 }, { 111,4570 }, { 112,4570 }, { 113,4570 },+ { 114,4570 }, { 115,4570 }, { 116,4570 }, { 117,4570 }, { 118,4570 },+ { 119,4570 }, { 120,4570 }, { 121,4570 }, { 122,4570 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 128,4570 },+ { 129,4570 }, { 130,4570 }, { 131,4570 }, { 132,4570 }, { 133,4570 },+ { 134,4570 }, { 135,4570 }, { 136,4570 }, { 137,4570 }, { 138,4570 },+ { 139,4570 }, { 140,4570 }, { 141,4570 }, { 142,4570 }, { 143,4570 },+ { 144,4570 }, { 145,4570 }, { 146,4570 }, { 147,4570 }, { 148,4570 },+ { 149,4570 }, { 150,4570 }, { 151,4570 }, { 152,4570 }, { 153,4570 },++ { 154,4570 }, { 155,4570 }, { 156,4570 }, { 157,4570 }, { 158,4570 },+ { 159,4570 }, { 160,4570 }, { 161,4570 }, { 162,4570 }, { 163,4570 },+ { 164,4570 }, { 165,4570 }, { 166,4570 }, { 167,4570 }, { 168,4570 },+ { 169,4570 }, { 170,4570 }, { 171,4570 }, { 172,4570 }, { 173,4570 },+ { 174,4570 }, { 175,4570 }, { 176,4570 }, { 177,4570 }, { 178,4570 },+ { 179,4570 }, { 180,4570 }, { 181,4570 }, { 182,4570 }, { 183,4570 },+ { 184,4570 }, { 185,4570 }, { 186,4570 }, { 187,4570 }, { 188,4570 },+ { 189,4570 }, { 190,4570 }, { 191,4570 }, { 192,4570 }, { 193,4570 },+ { 194,4570 }, { 195,4570 }, { 196,4570 }, { 197,4570 }, { 198,4570 },+ { 199,4570 }, { 200,4570 }, { 201,4570 }, { 202,4570 }, { 203,4570 },++ { 204,4570 }, { 205,4570 }, { 206,4570 }, { 207,4570 }, { 208,4570 },+ { 209,4570 }, { 210,4570 }, { 211,4570 }, { 212,4570 }, { 213,4570 },+ { 214,4570 }, { 215,4570 }, { 216,4570 }, { 217,4570 }, { 218,4570 },+ { 219,4570 }, { 220,4570 }, { 221,4570 }, { 222,4570 }, { 223,4570 },+ { 224,4570 }, { 225,4570 }, { 226,4570 }, { 227,4570 }, { 228,4570 },+ { 229,4570 }, { 230,4570 }, { 231,4570 }, { 232,4570 }, { 233,4570 },+ { 234,4570 }, { 235,4570 }, { 236,4570 }, { 237,4570 }, { 238,4570 },+ { 239,4570 }, { 240,4570 }, { 241,4570 }, { 242,4570 }, { 243,4570 },+ { 244,4570 }, { 245,4570 }, { 246,4570 }, { 247,4570 }, { 248,4570 },+ { 249,4570 }, { 250,4570 }, { 251,4570 }, { 252,4570 }, { 253,4570 },++ { 254,4570 }, { 255,4570 }, { 0, 12 }, { 0,27847 }, { 1,4570 },+ { 2,4570 }, { 3,4570 }, { 4,4570 }, { 5,4570 }, { 6,4570 },+ { 7,4570 }, { 8,4570 }, { 9,4570 }, { 10,4570 }, { 11,4570 },+ { 12,4570 }, { 13,4570 }, { 14,4570 }, { 15,4570 }, { 16,4570 },+ { 17,4570 }, { 18,4570 }, { 19,4570 }, { 20,4570 }, { 21,4570 },+ { 22,4570 }, { 23,4570 }, { 24,4570 }, { 25,4570 }, { 26,4570 },+ { 27,4570 }, { 28,4570 }, { 29,4570 }, { 30,4570 }, { 31,4570 },+ { 32,4570 }, { 33,4570 }, { 34,4570 }, { 35,4570 }, { 36,4570 },+ { 37,4570 }, { 38,4570 }, { 0, 0 }, { 40,4570 }, { 41,4570 },+ { 42,4570 }, { 43,4570 }, { 44,4570 }, { 45,4570 }, { 46,4570 },++ { 47,4570 }, { 48,4570 }, { 49,4570 }, { 50,4570 }, { 51,4570 },+ { 52,4570 }, { 53,4570 }, { 54,4570 }, { 55,4570 }, { 56,4570 },+ { 57,4570 }, { 58,4570 }, { 59,4570 }, { 60,4570 }, { 61,4570 },+ { 62,4570 }, { 63,4570 }, { 64,4570 }, { 65,4570 }, { 66,4570 },+ { 67,4570 }, { 68,4570 }, { 69,4570 }, { 70,4570 }, { 71,4570 },+ { 72,4570 }, { 73,4570 }, { 74,4570 }, { 75,4570 }, { 76,4570 },+ { 77,4570 }, { 78,4570 }, { 79,4570 }, { 80,4570 }, { 81,4570 },+ { 82,4570 }, { 83,4570 }, { 84,4570 }, { 85,4570 }, { 86,4570 },+ { 87,4570 }, { 88,4570 }, { 89,4570 }, { 90,4570 }, { 91,4570 },+ { 92,4570 }, { 93,4570 }, { 94,4570 }, { 95,4570 }, { 96,4570 },++ { 97,4570 }, { 98,4570 }, { 99,4570 }, { 100,4570 }, { 101,4570 },+ { 102,4570 }, { 103,4570 }, { 104,4570 }, { 105,4570 }, { 106,4570 },+ { 107,4570 }, { 108,4570 }, { 109,4570 }, { 110,4570 }, { 111,4570 },+ { 112,4570 }, { 113,4570 }, { 114,4570 }, { 115,4570 }, { 116,4570 },+ { 117,4570 }, { 118,4570 }, { 119,4570 }, { 120,4570 }, { 121,4570 },+ { 122,4570 }, { 123,4570 }, { 124,4570 }, { 125,4570 }, { 126,4570 },+ { 127,4570 }, { 128,4570 }, { 129,4570 }, { 130,4570 }, { 131,4570 },+ { 132,4570 }, { 133,4570 }, { 134,4570 }, { 135,4570 }, { 136,4570 },+ { 137,4570 }, { 138,4570 }, { 139,4570 }, { 140,4570 }, { 141,4570 },+ { 142,4570 }, { 143,4570 }, { 144,4570 }, { 145,4570 }, { 146,4570 },++ { 147,4570 }, { 148,4570 }, { 149,4570 }, { 150,4570 }, { 151,4570 },+ { 152,4570 }, { 153,4570 }, { 154,4570 }, { 155,4570 }, { 156,4570 },+ { 157,4570 }, { 158,4570 }, { 159,4570 }, { 160,4570 }, { 161,4570 },+ { 162,4570 }, { 163,4570 }, { 164,4570 }, { 165,4570 }, { 166,4570 },+ { 167,4570 }, { 168,4570 }, { 169,4570 }, { 170,4570 }, { 171,4570 },+ { 172,4570 }, { 173,4570 }, { 174,4570 }, { 175,4570 }, { 176,4570 },+ { 177,4570 }, { 178,4570 }, { 179,4570 }, { 180,4570 }, { 181,4570 },+ { 182,4570 }, { 183,4570 }, { 184,4570 }, { 185,4570 }, { 186,4570 },+ { 187,4570 }, { 188,4570 }, { 189,4570 }, { 190,4570 }, { 191,4570 },+ { 192,4570 }, { 193,4570 }, { 194,4570 }, { 195,4570 }, { 196,4570 },++ { 197,4570 }, { 198,4570 }, { 199,4570 }, { 200,4570 }, { 201,4570 },+ { 202,4570 }, { 203,4570 }, { 204,4570 }, { 205,4570 }, { 206,4570 },+ { 207,4570 }, { 208,4570 }, { 209,4570 }, { 210,4570 }, { 211,4570 },+ { 212,4570 }, { 213,4570 }, { 214,4570 }, { 215,4570 }, { 216,4570 },+ { 217,4570 }, { 218,4570 }, { 219,4570 }, { 220,4570 }, { 221,4570 },+ { 222,4570 }, { 223,4570 }, { 224,4570 }, { 225,4570 }, { 226,4570 },+ { 227,4570 }, { 228,4570 }, { 229,4570 }, { 230,4570 }, { 231,4570 },+ { 232,4570 }, { 233,4570 }, { 234,4570 }, { 235,4570 }, { 236,4570 },+ { 237,4570 }, { 238,4570 }, { 239,4570 }, { 240,4570 }, { 241,4570 },+ { 242,4570 }, { 243,4570 }, { 244,4570 }, { 245,4570 }, { 246,4570 },++ { 247,4570 }, { 248,4570 }, { 249,4570 }, { 250,4570 }, { 251,4570 },+ { 252,4570 }, { 253,4570 }, { 254,4570 }, { 255,4570 }, { 256,4570 },+ { 0, 9 }, { 0,27589 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 9,4570 }, { 10,4575 }, { 0, 0 }, { 12,4570 }, { 13,4575 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 32,4570 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },++ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 45,-2057 }, { 0, 5 }, { 0,27542 }, { 1,4575 },+ { 2,4575 }, { 3,4575 }, { 4,4575 }, { 5,4575 }, { 6,4575 },+ { 7,4575 }, { 8,4575 }, { 9,4575 }, { 10,4575 }, { 11,4575 },+ { 12,4575 }, { 13,4575 }, { 14,4575 }, { 15,4575 }, { 16,4575 },+ { 17,4575 }, { 18,4575 }, { 19,4575 }, { 20,4575 }, { 21,4575 },+ { 22,4575 }, { 23,4575 }, { 24,4575 }, { 25,4575 }, { 26,4575 },+ { 27,4575 }, { 28,4575 }, { 29,4575 }, { 30,4575 }, { 31,4575 },+ { 32,4575 }, { 33,4575 }, { 34,4575 }, { 35,4575 }, { 36,4575 },+ { 37,4575 }, { 38,4575 }, { 39,4575 }, { 40,4575 }, { 41,4575 },++ { 0, 0 }, { 43,4575 }, { 44,4575 }, { 45,4575 }, { 46,4575 },+ { 0, 0 }, { 48,4575 }, { 49,4575 }, { 50,4575 }, { 51,4575 },+ { 52,4575 }, { 53,4575 }, { 54,4575 }, { 55,4575 }, { 56,4575 },+ { 57,4575 }, { 58,4575 }, { 59,4575 }, { 60,4575 }, { 61,4575 },+ { 62,4575 }, { 63,4575 }, { 64,4575 }, { 65,4575 }, { 66,4575 },+ { 67,4575 }, { 68,4575 }, { 69,4575 }, { 70,4575 }, { 71,4575 },+ { 72,4575 }, { 73,4575 }, { 74,4575 }, { 75,4575 }, { 76,4575 },+ { 77,4575 }, { 78,4575 }, { 79,4575 }, { 80,4575 }, { 81,4575 },+ { 82,4575 }, { 83,4575 }, { 84,4575 }, { 85,4575 }, { 86,4575 },+ { 87,4575 }, { 88,4575 }, { 89,4575 }, { 90,4575 }, { 91,4575 },++ { 92,4575 }, { 93,4575 }, { 94,4575 }, { 95,4575 }, { 96,4575 },+ { 97,4575 }, { 98,4575 }, { 99,4575 }, { 100,4575 }, { 101,4575 },+ { 102,4575 }, { 103,4575 }, { 104,4575 }, { 105,4575 }, { 106,4575 },+ { 107,4575 }, { 108,4575 }, { 109,4575 }, { 110,4575 }, { 111,4575 },+ { 112,4575 }, { 113,4575 }, { 114,4575 }, { 115,4575 }, { 116,4575 },+ { 117,4575 }, { 118,4575 }, { 119,4575 }, { 120,4575 }, { 121,4575 },+ { 122,4575 }, { 123,4575 }, { 124,4575 }, { 125,4575 }, { 126,4575 },+ { 127,4575 }, { 128,4575 }, { 129,4575 }, { 130,4575 }, { 131,4575 },+ { 132,4575 }, { 133,4575 }, { 134,4575 }, { 135,4575 }, { 136,4575 },+ { 137,4575 }, { 138,4575 }, { 139,4575 }, { 140,4575 }, { 141,4575 },++ { 142,4575 }, { 143,4575 }, { 144,4575 }, { 145,4575 }, { 146,4575 },+ { 147,4575 }, { 148,4575 }, { 149,4575 }, { 150,4575 }, { 151,4575 },+ { 152,4575 }, { 153,4575 }, { 154,4575 }, { 155,4575 }, { 156,4575 },+ { 157,4575 }, { 158,4575 }, { 159,4575 }, { 160,4575 }, { 161,4575 },+ { 162,4575 }, { 163,4575 }, { 164,4575 }, { 165,4575 }, { 166,4575 },+ { 167,4575 }, { 168,4575 }, { 169,4575 }, { 170,4575 }, { 171,4575 },+ { 172,4575 }, { 173,4575 }, { 174,4575 }, { 175,4575 }, { 176,4575 },+ { 177,4575 }, { 178,4575 }, { 179,4575 }, { 180,4575 }, { 181,4575 },+ { 182,4575 }, { 183,4575 }, { 184,4575 }, { 185,4575 }, { 186,4575 },+ { 187,4575 }, { 188,4575 }, { 189,4575 }, { 190,4575 }, { 191,4575 },++ { 192,4575 }, { 193,4575 }, { 194,4575 }, { 195,4575 }, { 196,4575 },+ { 197,4575 }, { 198,4575 }, { 199,4575 }, { 200,4575 }, { 201,4575 },+ { 202,4575 }, { 203,4575 }, { 204,4575 }, { 205,4575 }, { 206,4575 },+ { 207,4575 }, { 208,4575 }, { 209,4575 }, { 210,4575 }, { 211,4575 },+ { 212,4575 }, { 213,4575 }, { 214,4575 }, { 215,4575 }, { 216,4575 },+ { 217,4575 }, { 218,4575 }, { 219,4575 }, { 220,4575 }, { 221,4575 },+ { 222,4575 }, { 223,4575 }, { 224,4575 }, { 225,4575 }, { 226,4575 },+ { 227,4575 }, { 228,4575 }, { 229,4575 }, { 230,4575 }, { 231,4575 },+ { 232,4575 }, { 233,4575 }, { 234,4575 }, { 235,4575 }, { 236,4575 },+ { 237,4575 }, { 238,4575 }, { 239,4575 }, { 240,4575 }, { 241,4575 },++ { 242,4575 }, { 243,4575 }, { 244,4575 }, { 245,4575 }, { 246,4575 },+ { 247,4575 }, { 248,4575 }, { 249,4575 }, { 250,4575 }, { 251,4575 },+ { 252,4575 }, { 253,4575 }, { 254,4575 }, { 255,4575 }, { 256,4575 },+ { 0, 5 }, { 0,27284 }, { 1,4317 }, { 2,4317 }, { 3,4317 },+ { 4,4317 }, { 5,4317 }, { 6,4317 }, { 7,4317 }, { 8,4317 },+ { 9,4317 }, { 10,4317 }, { 11,4317 }, { 12,4317 }, { 13,4317 },+ { 14,4317 }, { 15,4317 }, { 16,4317 }, { 17,4317 }, { 18,4317 },+ { 19,4317 }, { 20,4317 }, { 21,4317 }, { 22,4317 }, { 23,4317 },+ { 24,4317 }, { 25,4317 }, { 26,4317 }, { 27,4317 }, { 28,4317 },+ { 29,4317 }, { 30,4317 }, { 31,4317 }, { 32,4317 }, { 33,4317 },++ { 34,4317 }, { 35,4317 }, { 36,4317 }, { 37,4317 }, { 38,4317 },+ { 39,4317 }, { 40,4317 }, { 41,4317 }, { 0, 0 }, { 43,4317 },+ { 44,4317 }, { 45,4317 }, { 46,4317 }, { 0, 0 }, { 48,4317 },+ { 49,4317 }, { 50,4317 }, { 51,4317 }, { 52,4317 }, { 53,4317 },+ { 54,4317 }, { 55,4317 }, { 56,4317 }, { 57,4317 }, { 58,4317 },+ { 59,4317 }, { 60,4317 }, { 61,4317 }, { 62,4317 }, { 63,4317 },+ { 64,4317 }, { 65,4317 }, { 66,4317 }, { 67,4317 }, { 68,4317 },+ { 69,4317 }, { 70,4317 }, { 71,4317 }, { 72,4317 }, { 73,4317 },+ { 74,4317 }, { 75,4317 }, { 76,4317 }, { 77,4317 }, { 78,4317 },+ { 79,4317 }, { 80,4317 }, { 81,4317 }, { 82,4317 }, { 83,4317 },++ { 84,4317 }, { 85,4317 }, { 86,4317 }, { 87,4317 }, { 88,4317 },+ { 89,4317 }, { 90,4317 }, { 91,4317 }, { 92,4317 }, { 93,4317 },+ { 94,4317 }, { 95,4317 }, { 96,4317 }, { 97,4317 }, { 98,4317 },+ { 99,4317 }, { 100,4317 }, { 101,4317 }, { 102,4317 }, { 103,4317 },+ { 104,4317 }, { 105,4317 }, { 106,4317 }, { 107,4317 }, { 108,4317 },+ { 109,4317 }, { 110,4317 }, { 111,4317 }, { 112,4317 }, { 113,4317 },+ { 114,4317 }, { 115,4317 }, { 116,4317 }, { 117,4317 }, { 118,4317 },+ { 119,4317 }, { 120,4317 }, { 121,4317 }, { 122,4317 }, { 123,4317 },+ { 124,4317 }, { 125,4317 }, { 126,4317 }, { 127,4317 }, { 128,4317 },+ { 129,4317 }, { 130,4317 }, { 131,4317 }, { 132,4317 }, { 133,4317 },++ { 134,4317 }, { 135,4317 }, { 136,4317 }, { 137,4317 }, { 138,4317 },+ { 139,4317 }, { 140,4317 }, { 141,4317 }, { 142,4317 }, { 143,4317 },+ { 144,4317 }, { 145,4317 }, { 146,4317 }, { 147,4317 }, { 148,4317 },+ { 149,4317 }, { 150,4317 }, { 151,4317 }, { 152,4317 }, { 153,4317 },+ { 154,4317 }, { 155,4317 }, { 156,4317 }, { 157,4317 }, { 158,4317 },+ { 159,4317 }, { 160,4317 }, { 161,4317 }, { 162,4317 }, { 163,4317 },+ { 164,4317 }, { 165,4317 }, { 166,4317 }, { 167,4317 }, { 168,4317 },+ { 169,4317 }, { 170,4317 }, { 171,4317 }, { 172,4317 }, { 173,4317 },+ { 174,4317 }, { 175,4317 }, { 176,4317 }, { 177,4317 }, { 178,4317 },+ { 179,4317 }, { 180,4317 }, { 181,4317 }, { 182,4317 }, { 183,4317 },++ { 184,4317 }, { 185,4317 }, { 186,4317 }, { 187,4317 }, { 188,4317 },+ { 189,4317 }, { 190,4317 }, { 191,4317 }, { 192,4317 }, { 193,4317 },+ { 194,4317 }, { 195,4317 }, { 196,4317 }, { 197,4317 }, { 198,4317 },+ { 199,4317 }, { 200,4317 }, { 201,4317 }, { 202,4317 }, { 203,4317 },+ { 204,4317 }, { 205,4317 }, { 206,4317 }, { 207,4317 }, { 208,4317 },+ { 209,4317 }, { 210,4317 }, { 211,4317 }, { 212,4317 }, { 213,4317 },+ { 214,4317 }, { 215,4317 }, { 216,4317 }, { 217,4317 }, { 218,4317 },+ { 219,4317 }, { 220,4317 }, { 221,4317 }, { 222,4317 }, { 223,4317 },+ { 224,4317 }, { 225,4317 }, { 226,4317 }, { 227,4317 }, { 228,4317 },+ { 229,4317 }, { 230,4317 }, { 231,4317 }, { 232,4317 }, { 233,4317 },++ { 234,4317 }, { 235,4317 }, { 236,4317 }, { 237,4317 }, { 238,4317 },+ { 239,4317 }, { 240,4317 }, { 241,4317 }, { 242,4317 }, { 243,4317 },+ { 244,4317 }, { 245,4317 }, { 246,4317 }, { 247,4317 }, { 248,4317 },+ { 249,4317 }, { 250,4317 }, { 251,4317 }, { 252,4317 }, { 253,4317 },+ { 254,4317 }, { 255,4317 }, { 256,4317 }, { 0, 58 }, { 0,27026 },+ { 1,4445 }, { 2,4445 }, { 3,4445 }, { 4,4445 }, { 5,4445 },+ { 6,4445 }, { 7,4445 }, { 8,4445 }, { 9,4445 }, { 10,4445 },+ { 11,4445 }, { 12,4445 }, { 13,4445 }, { 14,4445 }, { 15,4445 },+ { 16,4445 }, { 17,4445 }, { 18,4445 }, { 19,4445 }, { 20,4445 },+ { 21,4445 }, { 22,4445 }, { 23,4445 }, { 24,4445 }, { 25,4445 },++ { 26,4445 }, { 27,4445 }, { 28,4445 }, { 29,4445 }, { 30,4445 },+ { 31,4445 }, { 32,4445 }, { 33,4445 }, { 0, 0 }, { 35,4445 },+ { 36,4445 }, { 37,4445 }, { 38,4445 }, { 39,4445 }, { 40,4445 },+ { 41,4445 }, { 42,4445 }, { 43,4445 }, { 44,4445 }, { 45,4445 },+ { 46,4445 }, { 47,4445 }, { 48,4445 }, { 49,4445 }, { 50,4445 },+ { 51,4445 }, { 52,4445 }, { 53,4445 }, { 54,4445 }, { 55,4445 },+ { 56,4445 }, { 57,4445 }, { 58,4445 }, { 59,4445 }, { 60,4445 },+ { 61,4445 }, { 62,4445 }, { 63,4445 }, { 64,4445 }, { 65,4445 },+ { 66,4445 }, { 67,4445 }, { 68,4445 }, { 69,4445 }, { 70,4445 },+ { 71,4445 }, { 72,4445 }, { 73,4445 }, { 74,4445 }, { 75,4445 },++ { 76,4445 }, { 77,4445 }, { 78,4445 }, { 79,4445 }, { 80,4445 },+ { 81,4445 }, { 82,4445 }, { 83,4445 }, { 84,4445 }, { 85,4445 },+ { 86,4445 }, { 87,4445 }, { 88,4445 }, { 89,4445 }, { 90,4445 },+ { 91,4445 }, { 92,4445 }, { 93,4445 }, { 94,4445 }, { 95,4445 },+ { 96,4445 }, { 97,4445 }, { 98,4445 }, { 99,4445 }, { 100,4445 },+ { 101,4445 }, { 102,4445 }, { 103,4445 }, { 104,4445 }, { 105,4445 },+ { 106,4445 }, { 107,4445 }, { 108,4445 }, { 109,4445 }, { 110,4445 },+ { 111,4445 }, { 112,4445 }, { 113,4445 }, { 114,4445 }, { 115,4445 },+ { 116,4445 }, { 117,4445 }, { 118,4445 }, { 119,4445 }, { 120,4445 },+ { 121,4445 }, { 122,4445 }, { 123,4445 }, { 124,4445 }, { 125,4445 },++ { 126,4445 }, { 127,4445 }, { 128,4445 }, { 129,4445 }, { 130,4445 },+ { 131,4445 }, { 132,4445 }, { 133,4445 }, { 134,4445 }, { 135,4445 },+ { 136,4445 }, { 137,4445 }, { 138,4445 }, { 139,4445 }, { 140,4445 },+ { 141,4445 }, { 142,4445 }, { 143,4445 }, { 144,4445 }, { 145,4445 },+ { 146,4445 }, { 147,4445 }, { 148,4445 }, { 149,4445 }, { 150,4445 },+ { 151,4445 }, { 152,4445 }, { 153,4445 }, { 154,4445 }, { 155,4445 },+ { 156,4445 }, { 157,4445 }, { 158,4445 }, { 159,4445 }, { 160,4445 },+ { 161,4445 }, { 162,4445 }, { 163,4445 }, { 164,4445 }, { 165,4445 },+ { 166,4445 }, { 167,4445 }, { 168,4445 }, { 169,4445 }, { 170,4445 },+ { 171,4445 }, { 172,4445 }, { 173,4445 }, { 174,4445 }, { 175,4445 },++ { 176,4445 }, { 177,4445 }, { 178,4445 }, { 179,4445 }, { 180,4445 },+ { 181,4445 }, { 182,4445 }, { 183,4445 }, { 184,4445 }, { 185,4445 },+ { 186,4445 }, { 187,4445 }, { 188,4445 }, { 189,4445 }, { 190,4445 },+ { 191,4445 }, { 192,4445 }, { 193,4445 }, { 194,4445 }, { 195,4445 },+ { 196,4445 }, { 197,4445 }, { 198,4445 }, { 199,4445 }, { 200,4445 },+ { 201,4445 }, { 202,4445 }, { 203,4445 }, { 204,4445 }, { 205,4445 },+ { 206,4445 }, { 207,4445 }, { 208,4445 }, { 209,4445 }, { 210,4445 },+ { 211,4445 }, { 212,4445 }, { 213,4445 }, { 214,4445 }, { 215,4445 },+ { 216,4445 }, { 217,4445 }, { 218,4445 }, { 219,4445 }, { 220,4445 },+ { 221,4445 }, { 222,4445 }, { 223,4445 }, { 224,4445 }, { 225,4445 },++ { 226,4445 }, { 227,4445 }, { 228,4445 }, { 229,4445 }, { 230,4445 },+ { 231,4445 }, { 232,4445 }, { 233,4445 }, { 234,4445 }, { 235,4445 },+ { 236,4445 }, { 237,4445 }, { 238,4445 }, { 239,4445 }, { 240,4445 },+ { 241,4445 }, { 242,4445 }, { 243,4445 }, { 244,4445 }, { 245,4445 },+ { 246,4445 }, { 247,4445 }, { 248,4445 }, { 249,4445 }, { 250,4445 },+ { 251,4445 }, { 252,4445 }, { 253,4445 }, { 254,4445 }, { 255,4445 },+ { 256,4445 }, { 0, 11 }, { 0,26768 }, { 1,4445 }, { 2,4445 },+ { 3,4445 }, { 4,4445 }, { 5,4445 }, { 6,4445 }, { 7,4445 },+ { 8,4445 }, { 9,4445 }, { 10,4445 }, { 11,4445 }, { 12,4445 },+ { 13,4445 }, { 14,4445 }, { 15,4445 }, { 16,4445 }, { 17,4445 },++ { 18,4445 }, { 19,4445 }, { 20,4445 }, { 21,4445 }, { 22,4445 },+ { 23,4445 }, { 24,4445 }, { 25,4445 }, { 26,4445 }, { 27,4445 },+ { 28,4445 }, { 29,4445 }, { 30,4445 }, { 31,4445 }, { 32,4445 },+ { 33,4445 }, { 34,4445 }, { 35,4445 }, { 36,4445 }, { 37,4445 },+ { 38,4445 }, { 0, 0 }, { 40,4445 }, { 41,4445 }, { 42,4445 },+ { 43,4445 }, { 44,4445 }, { 45,4445 }, { 46,4445 }, { 47,4445 },+ { 48,4445 }, { 49,4445 }, { 50,4445 }, { 51,4445 }, { 52,4445 },+ { 53,4445 }, { 54,4445 }, { 55,4445 }, { 56,4445 }, { 57,4445 },+ { 58,4445 }, { 59,4445 }, { 60,4445 }, { 61,4445 }, { 62,4445 },+ { 63,4445 }, { 64,4445 }, { 65,4445 }, { 66,4445 }, { 67,4445 },++ { 68,4445 }, { 69,4445 }, { 70,4445 }, { 71,4445 }, { 72,4445 },+ { 73,4445 }, { 74,4445 }, { 75,4445 }, { 76,4445 }, { 77,4445 },+ { 78,4445 }, { 79,4445 }, { 80,4445 }, { 81,4445 }, { 82,4445 },+ { 83,4445 }, { 84,4445 }, { 85,4445 }, { 86,4445 }, { 87,4445 },+ { 88,4445 }, { 89,4445 }, { 90,4445 }, { 91,4445 }, { 92,4445 },+ { 93,4445 }, { 94,4445 }, { 95,4445 }, { 96,4445 }, { 97,4445 },+ { 98,4445 }, { 99,4445 }, { 100,4445 }, { 101,4445 }, { 102,4445 },+ { 103,4445 }, { 104,4445 }, { 105,4445 }, { 106,4445 }, { 107,4445 },+ { 108,4445 }, { 109,4445 }, { 110,4445 }, { 111,4445 }, { 112,4445 },+ { 113,4445 }, { 114,4445 }, { 115,4445 }, { 116,4445 }, { 117,4445 },++ { 118,4445 }, { 119,4445 }, { 120,4445 }, { 121,4445 }, { 122,4445 },+ { 123,4445 }, { 124,4445 }, { 125,4445 }, { 126,4445 }, { 127,4445 },+ { 128,4445 }, { 129,4445 }, { 130,4445 }, { 131,4445 }, { 132,4445 },+ { 133,4445 }, { 134,4445 }, { 135,4445 }, { 136,4445 }, { 137,4445 },+ { 138,4445 }, { 139,4445 }, { 140,4445 }, { 141,4445 }, { 142,4445 },+ { 143,4445 }, { 144,4445 }, { 145,4445 }, { 146,4445 }, { 147,4445 },+ { 148,4445 }, { 149,4445 }, { 150,4445 }, { 151,4445 }, { 152,4445 },+ { 153,4445 }, { 154,4445 }, { 155,4445 }, { 156,4445 }, { 157,4445 },+ { 158,4445 }, { 159,4445 }, { 160,4445 }, { 161,4445 }, { 162,4445 },+ { 163,4445 }, { 164,4445 }, { 165,4445 }, { 166,4445 }, { 167,4445 },++ { 168,4445 }, { 169,4445 }, { 170,4445 }, { 171,4445 }, { 172,4445 },+ { 173,4445 }, { 174,4445 }, { 175,4445 }, { 176,4445 }, { 177,4445 },+ { 178,4445 }, { 179,4445 }, { 180,4445 }, { 181,4445 }, { 182,4445 },+ { 183,4445 }, { 184,4445 }, { 185,4445 }, { 186,4445 }, { 187,4445 },+ { 188,4445 }, { 189,4445 }, { 190,4445 }, { 191,4445 }, { 192,4445 },+ { 193,4445 }, { 194,4445 }, { 195,4445 }, { 196,4445 }, { 197,4445 },+ { 198,4445 }, { 199,4445 }, { 200,4445 }, { 201,4445 }, { 202,4445 },+ { 203,4445 }, { 204,4445 }, { 205,4445 }, { 206,4445 }, { 207,4445 },+ { 208,4445 }, { 209,4445 }, { 210,4445 }, { 211,4445 }, { 212,4445 },+ { 213,4445 }, { 214,4445 }, { 215,4445 }, { 216,4445 }, { 217,4445 },++ { 218,4445 }, { 219,4445 }, { 220,4445 }, { 221,4445 }, { 222,4445 },+ { 223,4445 }, { 224,4445 }, { 225,4445 }, { 226,4445 }, { 227,4445 },+ { 228,4445 }, { 229,4445 }, { 230,4445 }, { 231,4445 }, { 232,4445 },+ { 233,4445 }, { 234,4445 }, { 235,4445 }, { 236,4445 }, { 237,4445 },+ { 238,4445 }, { 239,4445 }, { 240,4445 }, { 241,4445 }, { 242,4445 },+ { 243,4445 }, { 244,4445 }, { 245,4445 }, { 246,4445 }, { 247,4445 },+ { 248,4445 }, { 249,4445 }, { 250,4445 }, { 251,4445 }, { 252,4445 },+ { 253,4445 }, { 254,4445 }, { 255,4445 }, { 256,4445 }, { 0, 16 },+ { 0,26510 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 9,4445 },++ { 10,4450 }, { 0, 0 }, { 12,4445 }, { 13,4450 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 32,4445 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 45,-3036 }, { 0, 32 }, { 0,26463 }, { 1,4450 }, { 2,4450 },+ { 3,4450 }, { 4,4450 }, { 5,4450 }, { 6,4450 }, { 7,4450 },+ { 8,4450 }, { 9,4450 }, { 10,4450 }, { 11,4450 }, { 12,4450 },++ { 13,4450 }, { 14,4450 }, { 15,4450 }, { 16,4450 }, { 17,4450 },+ { 18,4450 }, { 19,4450 }, { 20,4450 }, { 21,4450 }, { 22,4450 },+ { 23,4450 }, { 24,4450 }, { 25,4450 }, { 26,4450 }, { 27,4450 },+ { 28,4450 }, { 29,4450 }, { 30,4450 }, { 31,4450 }, { 32,4450 },+ { 33,4450 }, { 34,4450 }, { 35,4450 }, { 36,4450 }, { 37,4450 },+ { 38,4450 }, { 0, 0 }, { 40,4450 }, { 41,4450 }, { 42,4450 },+ { 43,4450 }, { 44,4450 }, { 45,4450 }, { 46,4450 }, { 47,4450 },+ { 48,4450 }, { 49,4450 }, { 50,4450 }, { 51,4450 }, { 52,4450 },+ { 53,4450 }, { 54,4450 }, { 55,4450 }, { 56,4450 }, { 57,4450 },+ { 58,4450 }, { 59,4450 }, { 60,4450 }, { 61,4450 }, { 62,4450 },++ { 63,4450 }, { 64,4450 }, { 65,4450 }, { 66,4450 }, { 67,4450 },+ { 68,4450 }, { 69,4450 }, { 70,4450 }, { 71,4450 }, { 72,4450 },+ { 73,4450 }, { 74,4450 }, { 75,4450 }, { 76,4450 }, { 77,4450 },+ { 78,4450 }, { 79,4450 }, { 80,4450 }, { 81,4450 }, { 82,4450 },+ { 83,4450 }, { 84,4450 }, { 85,4450 }, { 86,4450 }, { 87,4450 },+ { 88,4450 }, { 89,4450 }, { 90,4450 }, { 91,4450 }, { 0, 0 },+ { 93,4450 }, { 94,4450 }, { 95,4450 }, { 96,4450 }, { 97,4450 },+ { 98,4450 }, { 99,4450 }, { 100,4450 }, { 101,4450 }, { 102,4450 },+ { 103,4450 }, { 104,4450 }, { 105,4450 }, { 106,4450 }, { 107,4450 },+ { 108,4450 }, { 109,4450 }, { 110,4450 }, { 111,4450 }, { 112,4450 },++ { 113,4450 }, { 114,4450 }, { 115,4450 }, { 116,4450 }, { 117,4450 },+ { 118,4450 }, { 119,4450 }, { 120,4450 }, { 121,4450 }, { 122,4450 },+ { 123,4450 }, { 124,4450 }, { 125,4450 }, { 126,4450 }, { 127,4450 },+ { 128,4450 }, { 129,4450 }, { 130,4450 }, { 131,4450 }, { 132,4450 },+ { 133,4450 }, { 134,4450 }, { 135,4450 }, { 136,4450 }, { 137,4450 },+ { 138,4450 }, { 139,4450 }, { 140,4450 }, { 141,4450 }, { 142,4450 },+ { 143,4450 }, { 144,4450 }, { 145,4450 }, { 146,4450 }, { 147,4450 },+ { 148,4450 }, { 149,4450 }, { 150,4450 }, { 151,4450 }, { 152,4450 },+ { 153,4450 }, { 154,4450 }, { 155,4450 }, { 156,4450 }, { 157,4450 },+ { 158,4450 }, { 159,4450 }, { 160,4450 }, { 161,4450 }, { 162,4450 },++ { 163,4450 }, { 164,4450 }, { 165,4450 }, { 166,4450 }, { 167,4450 },+ { 168,4450 }, { 169,4450 }, { 170,4450 }, { 171,4450 }, { 172,4450 },+ { 173,4450 }, { 174,4450 }, { 175,4450 }, { 176,4450 }, { 177,4450 },+ { 178,4450 }, { 179,4450 }, { 180,4450 }, { 181,4450 }, { 182,4450 },+ { 183,4450 }, { 184,4450 }, { 185,4450 }, { 186,4450 }, { 187,4450 },+ { 188,4450 }, { 189,4450 }, { 190,4450 }, { 191,4450 }, { 192,4450 },+ { 193,4450 }, { 194,4450 }, { 195,4450 }, { 196,4450 }, { 197,4450 },+ { 198,4450 }, { 199,4450 }, { 200,4450 }, { 201,4450 }, { 202,4450 },+ { 203,4450 }, { 204,4450 }, { 205,4450 }, { 206,4450 }, { 207,4450 },+ { 208,4450 }, { 209,4450 }, { 210,4450 }, { 211,4450 }, { 212,4450 },++ { 213,4450 }, { 214,4450 }, { 215,4450 }, { 216,4450 }, { 217,4450 },+ { 218,4450 }, { 219,4450 }, { 220,4450 }, { 221,4450 }, { 222,4450 },+ { 223,4450 }, { 224,4450 }, { 225,4450 }, { 226,4450 }, { 227,4450 },+ { 228,4450 }, { 229,4450 }, { 230,4450 }, { 231,4450 }, { 232,4450 },+ { 233,4450 }, { 234,4450 }, { 235,4450 }, { 236,4450 }, { 237,4450 },+ { 238,4450 }, { 239,4450 }, { 240,4450 }, { 241,4450 }, { 242,4450 },+ { 243,4450 }, { 244,4450 }, { 245,4450 }, { 246,4450 }, { 247,4450 },+ { 248,4450 }, { 249,4450 }, { 250,4450 }, { 251,4450 }, { 252,4450 },+ { 253,4450 }, { 254,4450 }, { 255,4450 }, { 256,4450 }, { 0, 32 },+ { 0,26205 }, { 1,4192 }, { 2,4192 }, { 3,4192 }, { 4,4192 },++ { 5,4192 }, { 6,4192 }, { 7,4192 }, { 8,4192 }, { 9,4192 },+ { 10,4192 }, { 11,4192 }, { 12,4192 }, { 13,4192 }, { 14,4192 },+ { 15,4192 }, { 16,4192 }, { 17,4192 }, { 18,4192 }, { 19,4192 },+ { 20,4192 }, { 21,4192 }, { 22,4192 }, { 23,4192 }, { 24,4192 },+ { 25,4192 }, { 26,4192 }, { 27,4192 }, { 28,4192 }, { 29,4192 },+ { 30,4192 }, { 31,4192 }, { 32,4192 }, { 33,4192 }, { 34,4192 },+ { 35,4192 }, { 36,4192 }, { 37,4192 }, { 38,4192 }, { 0, 0 },+ { 40,4192 }, { 41,4192 }, { 42,4192 }, { 43,4192 }, { 44,4192 },+ { 45,4192 }, { 46,4192 }, { 47,4192 }, { 48,4192 }, { 49,4192 },+ { 50,4192 }, { 51,4192 }, { 52,4192 }, { 53,4192 }, { 54,4192 },++ { 55,4192 }, { 56,4192 }, { 57,4192 }, { 58,4192 }, { 59,4192 },+ { 60,4192 }, { 61,4192 }, { 62,4192 }, { 63,4192 }, { 64,4192 },+ { 65,4192 }, { 66,4192 }, { 67,4192 }, { 68,4192 }, { 69,4192 },+ { 70,4192 }, { 71,4192 }, { 72,4192 }, { 73,4192 }, { 74,4192 },+ { 75,4192 }, { 76,4192 }, { 77,4192 }, { 78,4192 }, { 79,4192 },+ { 80,4192 }, { 81,4192 }, { 82,4192 }, { 83,4192 }, { 84,4192 },+ { 85,4192 }, { 86,4192 }, { 87,4192 }, { 88,4192 }, { 89,4192 },+ { 90,4192 }, { 91,4192 }, { 0, 0 }, { 93,4192 }, { 94,4192 },+ { 95,4192 }, { 96,4192 }, { 97,4192 }, { 98,4192 }, { 99,4192 },+ { 100,4192 }, { 101,4192 }, { 102,4192 }, { 103,4192 }, { 104,4192 },++ { 105,4192 }, { 106,4192 }, { 107,4192 }, { 108,4192 }, { 109,4192 },+ { 110,4192 }, { 111,4192 }, { 112,4192 }, { 113,4192 }, { 114,4192 },+ { 115,4192 }, { 116,4192 }, { 117,4192 }, { 118,4192 }, { 119,4192 },+ { 120,4192 }, { 121,4192 }, { 122,4192 }, { 123,4192 }, { 124,4192 },+ { 125,4192 }, { 126,4192 }, { 127,4192 }, { 128,4192 }, { 129,4192 },+ { 130,4192 }, { 131,4192 }, { 132,4192 }, { 133,4192 }, { 134,4192 },+ { 135,4192 }, { 136,4192 }, { 137,4192 }, { 138,4192 }, { 139,4192 },+ { 140,4192 }, { 141,4192 }, { 142,4192 }, { 143,4192 }, { 144,4192 },+ { 145,4192 }, { 146,4192 }, { 147,4192 }, { 148,4192 }, { 149,4192 },+ { 150,4192 }, { 151,4192 }, { 152,4192 }, { 153,4192 }, { 154,4192 },++ { 155,4192 }, { 156,4192 }, { 157,4192 }, { 158,4192 }, { 159,4192 },+ { 160,4192 }, { 161,4192 }, { 162,4192 }, { 163,4192 }, { 164,4192 },+ { 165,4192 }, { 166,4192 }, { 167,4192 }, { 168,4192 }, { 169,4192 },+ { 170,4192 }, { 171,4192 }, { 172,4192 }, { 173,4192 }, { 174,4192 },+ { 175,4192 }, { 176,4192 }, { 177,4192 }, { 178,4192 }, { 179,4192 },+ { 180,4192 }, { 181,4192 }, { 182,4192 }, { 183,4192 }, { 184,4192 },+ { 185,4192 }, { 186,4192 }, { 187,4192 }, { 188,4192 }, { 189,4192 },+ { 190,4192 }, { 191,4192 }, { 192,4192 }, { 193,4192 }, { 194,4192 },+ { 195,4192 }, { 196,4192 }, { 197,4192 }, { 198,4192 }, { 199,4192 },+ { 200,4192 }, { 201,4192 }, { 202,4192 }, { 203,4192 }, { 204,4192 },++ { 205,4192 }, { 206,4192 }, { 207,4192 }, { 208,4192 }, { 209,4192 },+ { 210,4192 }, { 211,4192 }, { 212,4192 }, { 213,4192 }, { 214,4192 },+ { 215,4192 }, { 216,4192 }, { 217,4192 }, { 218,4192 }, { 219,4192 },+ { 220,4192 }, { 221,4192 }, { 222,4192 }, { 223,4192 }, { 224,4192 },+ { 225,4192 }, { 226,4192 }, { 227,4192 }, { 228,4192 }, { 229,4192 },+ { 230,4192 }, { 231,4192 }, { 232,4192 }, { 233,4192 }, { 234,4192 },+ { 235,4192 }, { 236,4192 }, { 237,4192 }, { 238,4192 }, { 239,4192 },+ { 240,4192 }, { 241,4192 }, { 242,4192 }, { 243,4192 }, { 244,4192 },+ { 245,4192 }, { 246,4192 }, { 247,4192 }, { 248,4192 }, { 249,4192 },+ { 250,4192 }, { 251,4192 }, { 252,4192 }, { 253,4192 }, { 254,4192 },++ { 255,4192 }, { 256,4192 }, { 0, 22 }, { 0,25947 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 9,4192 }, { 10,4197 }, { 0, 0 },+ { 12,4192 }, { 13,4197 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 32,4192 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 39,-3597 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 45,-3592 }, { 0, 42 },++ { 0,25900 }, { 1,-3637 }, { 2,-3637 }, { 3,-3637 }, { 4,-3637 },+ { 5,-3637 }, { 6,-3637 }, { 7,-3637 }, { 8,-3637 }, { 9,-3637 },+ { 10,-3637 }, { 11,-3637 }, { 12,-3637 }, { 13,-3637 }, { 14,-3637 },+ { 15,-3637 }, { 16,-3637 }, { 17,-3637 }, { 18,-3637 }, { 19,-3637 },+ { 20,-3637 }, { 21,-3637 }, { 22,-3637 }, { 23,-3637 }, { 24,-3637 },+ { 25,-3637 }, { 26,-3637 }, { 27,-3637 }, { 28,-3637 }, { 29,-3637 },+ { 30,-3637 }, { 31,-3637 }, { 32,-3637 }, { 33,-3637 }, { 34,-3637 },+ { 35,-3637 }, { 36,-3637 }, { 37,-3637 }, { 38,-3637 }, { 39,-3637 },+ { 40,-3637 }, { 41,-3637 }, { 42,-3637 }, { 43,-3637 }, { 44,-3637 },+ { 45,-3637 }, { 46,-3637 }, { 47,-3637 }, { 48,4152 }, { 49,4152 },++ { 50,4152 }, { 51,4152 }, { 52,4152 }, { 53,4152 }, { 54,4152 },+ { 55,4152 }, { 56,-3637 }, { 57,-3637 }, { 58,-3637 }, { 59,-3637 },+ { 60,-3637 }, { 61,-3637 }, { 62,-3637 }, { 63,-3637 }, { 64,-3637 },+ { 65,-3637 }, { 66,-3637 }, { 67,-3637 }, { 68,-3637 }, { 69,-3637 },+ { 70,-3637 }, { 71,-3637 }, { 72,-3637 }, { 73,-3637 }, { 74,-3637 },+ { 75,-3637 }, { 76,-3637 }, { 77,-3637 }, { 78,-3637 }, { 79,-3637 },+ { 80,-3637 }, { 81,-3637 }, { 82,-3637 }, { 83,-3637 }, { 84,-3637 },+ { 85,4165 }, { 86,-3637 }, { 87,-3637 }, { 88,-3637 }, { 89,-3637 },+ { 90,-3637 }, { 91,-3637 }, { 92,-3637 }, { 93,-3637 }, { 94,-3637 },+ { 95,-3637 }, { 96,-3637 }, { 97,-3637 }, { 98,-3637 }, { 99,-3637 },++ { 100,-3637 }, { 101,-3637 }, { 102,-3637 }, { 103,-3637 }, { 104,-3637 },+ { 105,-3637 }, { 106,-3637 }, { 107,-3637 }, { 108,-3637 }, { 109,-3637 },+ { 110,-3637 }, { 111,-3637 }, { 112,-3637 }, { 113,-3637 }, { 114,-3637 },+ { 115,-3637 }, { 116,-3637 }, { 117,4188 }, { 118,-3637 }, { 119,-3637 },+ { 120,4226 }, { 121,-3637 }, { 122,-3637 }, { 123,-3637 }, { 124,-3637 },+ { 125,-3637 }, { 126,-3637 }, { 127,-3637 }, { 128,-3637 }, { 129,-3637 },+ { 130,-3637 }, { 131,-3637 }, { 132,-3637 }, { 133,-3637 }, { 134,-3637 },+ { 135,-3637 }, { 136,-3637 }, { 137,-3637 }, { 138,-3637 }, { 139,-3637 },+ { 140,-3637 }, { 141,-3637 }, { 142,-3637 }, { 143,-3637 }, { 144,-3637 },+ { 145,-3637 }, { 146,-3637 }, { 147,-3637 }, { 148,-3637 }, { 149,-3637 },++ { 150,-3637 }, { 151,-3637 }, { 152,-3637 }, { 153,-3637 }, { 154,-3637 },+ { 155,-3637 }, { 156,-3637 }, { 157,-3637 }, { 158,-3637 }, { 159,-3637 },+ { 160,-3637 }, { 161,-3637 }, { 162,-3637 }, { 163,-3637 }, { 164,-3637 },+ { 165,-3637 }, { 166,-3637 }, { 167,-3637 }, { 168,-3637 }, { 169,-3637 },+ { 170,-3637 }, { 171,-3637 }, { 172,-3637 }, { 173,-3637 }, { 174,-3637 },+ { 175,-3637 }, { 176,-3637 }, { 177,-3637 }, { 178,-3637 }, { 179,-3637 },+ { 180,-3637 }, { 181,-3637 }, { 182,-3637 }, { 183,-3637 }, { 184,-3637 },+ { 185,-3637 }, { 186,-3637 }, { 187,-3637 }, { 188,-3637 }, { 189,-3637 },+ { 190,-3637 }, { 191,-3637 }, { 192,-3637 }, { 193,-3637 }, { 194,-3637 },+ { 195,-3637 }, { 196,-3637 }, { 197,-3637 }, { 198,-3637 }, { 199,-3637 },++ { 200,-3637 }, { 201,-3637 }, { 202,-3637 }, { 203,-3637 }, { 204,-3637 },+ { 205,-3637 }, { 206,-3637 }, { 207,-3637 }, { 208,-3637 }, { 209,-3637 },+ { 210,-3637 }, { 211,-3637 }, { 212,-3637 }, { 213,-3637 }, { 214,-3637 },+ { 215,-3637 }, { 216,-3637 }, { 217,-3637 }, { 218,-3637 }, { 219,-3637 },+ { 220,-3637 }, { 221,-3637 }, { 222,-3637 }, { 223,-3637 }, { 224,-3637 },+ { 225,-3637 }, { 226,-3637 }, { 227,-3637 }, { 228,-3637 }, { 229,-3637 },+ { 230,-3637 }, { 231,-3637 }, { 232,-3637 }, { 233,-3637 }, { 234,-3637 },+ { 235,-3637 }, { 236,-3637 }, { 237,-3637 }, { 238,-3637 }, { 239,-3637 },+ { 240,-3637 }, { 241,-3637 }, { 242,-3637 }, { 243,-3637 }, { 244,-3637 },+ { 245,-3637 }, { 246,-3637 }, { 247,-3637 }, { 248,-3637 }, { 249,-3637 },++ { 250,-3637 }, { 251,-3637 }, { 252,-3637 }, { 253,-3637 }, { 254,-3637 },+ { 255,-3637 }, { 256,-3637 }, { 0, 31 }, { 0,25642 }, { 1,4072 },+ { 2,4072 }, { 3,4072 }, { 4,4072 }, { 5,4072 }, { 6,4072 },+ { 7,4072 }, { 8,4072 }, { 9,4072 }, { 10,4072 }, { 11,4072 },+ { 12,4072 }, { 13,4072 }, { 14,4072 }, { 15,4072 }, { 16,4072 },+ { 17,4072 }, { 18,4072 }, { 19,4072 }, { 20,4072 }, { 21,4072 },+ { 22,4072 }, { 23,4072 }, { 24,4072 }, { 25,4072 }, { 26,4072 },+ { 27,4072 }, { 28,4072 }, { 29,4072 }, { 30,4072 }, { 31,4072 },+ { 32,4072 }, { 33,4072 }, { 34,4072 }, { 35,4072 }, { 36,4072 },+ { 37,4072 }, { 38,4072 }, { 0, 0 }, { 40,4072 }, { 41,4072 },++ { 42,4072 }, { 43,4072 }, { 44,4072 }, { 45,4072 }, { 46,4072 },+ { 47,4072 }, { 48,4072 }, { 49,4072 }, { 50,4072 }, { 51,4072 },+ { 52,4072 }, { 53,4072 }, { 54,4072 }, { 55,4072 }, { 56,4072 },+ { 57,4072 }, { 58,4072 }, { 59,4072 }, { 60,4072 }, { 61,4072 },+ { 62,4072 }, { 63,4072 }, { 64,4072 }, { 65,4072 }, { 66,4072 },+ { 67,4072 }, { 68,4072 }, { 69,4072 }, { 70,4072 }, { 71,4072 },+ { 72,4072 }, { 73,4072 }, { 74,4072 }, { 75,4072 }, { 76,4072 },+ { 77,4072 }, { 78,4072 }, { 79,4072 }, { 80,4072 }, { 81,4072 },+ { 82,4072 }, { 83,4072 }, { 84,4072 }, { 85,4072 }, { 86,4072 },+ { 87,4072 }, { 88,4072 }, { 89,4072 }, { 90,4072 }, { 91,4072 },++ { 92,4072 }, { 93,4072 }, { 94,4072 }, { 95,4072 }, { 96,4072 },+ { 97,4072 }, { 98,4072 }, { 99,4072 }, { 100,4072 }, { 101,4072 },+ { 102,4072 }, { 103,4072 }, { 104,4072 }, { 105,4072 }, { 106,4072 },+ { 107,4072 }, { 108,4072 }, { 109,4072 }, { 110,4072 }, { 111,4072 },+ { 112,4072 }, { 113,4072 }, { 114,4072 }, { 115,4072 }, { 116,4072 },+ { 117,4072 }, { 118,4072 }, { 119,4072 }, { 120,4072 }, { 121,4072 },+ { 122,4072 }, { 123,4072 }, { 124,4072 }, { 125,4072 }, { 126,4072 },+ { 127,4072 }, { 128,4072 }, { 129,4072 }, { 130,4072 }, { 131,4072 },+ { 132,4072 }, { 133,4072 }, { 134,4072 }, { 135,4072 }, { 136,4072 },+ { 137,4072 }, { 138,4072 }, { 139,4072 }, { 140,4072 }, { 141,4072 },++ { 142,4072 }, { 143,4072 }, { 144,4072 }, { 145,4072 }, { 146,4072 },+ { 147,4072 }, { 148,4072 }, { 149,4072 }, { 150,4072 }, { 151,4072 },+ { 152,4072 }, { 153,4072 }, { 154,4072 }, { 155,4072 }, { 156,4072 },+ { 157,4072 }, { 158,4072 }, { 159,4072 }, { 160,4072 }, { 161,4072 },+ { 162,4072 }, { 163,4072 }, { 164,4072 }, { 165,4072 }, { 166,4072 },+ { 167,4072 }, { 168,4072 }, { 169,4072 }, { 170,4072 }, { 171,4072 },+ { 172,4072 }, { 173,4072 }, { 174,4072 }, { 175,4072 }, { 176,4072 },+ { 177,4072 }, { 178,4072 }, { 179,4072 }, { 180,4072 }, { 181,4072 },+ { 182,4072 }, { 183,4072 }, { 184,4072 }, { 185,4072 }, { 186,4072 },+ { 187,4072 }, { 188,4072 }, { 189,4072 }, { 190,4072 }, { 191,4072 },++ { 192,4072 }, { 193,4072 }, { 194,4072 }, { 195,4072 }, { 196,4072 },+ { 197,4072 }, { 198,4072 }, { 199,4072 }, { 200,4072 }, { 201,4072 },+ { 202,4072 }, { 203,4072 }, { 204,4072 }, { 205,4072 }, { 206,4072 },+ { 207,4072 }, { 208,4072 }, { 209,4072 }, { 210,4072 }, { 211,4072 },+ { 212,4072 }, { 213,4072 }, { 214,4072 }, { 215,4072 }, { 216,4072 },+ { 217,4072 }, { 218,4072 }, { 219,4072 }, { 220,4072 }, { 221,4072 },+ { 222,4072 }, { 223,4072 }, { 224,4072 }, { 225,4072 }, { 226,4072 },+ { 227,4072 }, { 228,4072 }, { 229,4072 }, { 230,4072 }, { 231,4072 },+ { 232,4072 }, { 233,4072 }, { 234,4072 }, { 235,4072 }, { 236,4072 },+ { 237,4072 }, { 238,4072 }, { 239,4072 }, { 240,4072 }, { 241,4072 },++ { 242,4072 }, { 243,4072 }, { 244,4072 }, { 245,4072 }, { 246,4072 },+ { 247,4072 }, { 248,4072 }, { 249,4072 }, { 250,4072 }, { 251,4072 },+ { 252,4072 }, { 253,4072 }, { 254,4072 }, { 255,4072 }, { 256,4072 },+ { 0, 22 }, { 0,25384 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 9,3629 }, { 10,3634 }, { 0, 0 }, { 12,3629 }, { 13,3634 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 32,3629 }, { 0, 0 },++ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 39,-4160 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 45,-4155 }, { 0, 46 }, { 0,25337 }, { 1,4025 },+ { 2,4025 }, { 3,4025 }, { 4,4025 }, { 5,4025 }, { 6,4025 },+ { 7,4025 }, { 8,4025 }, { 9,4025 }, { 10,4025 }, { 11,4025 },+ { 12,4025 }, { 13,4025 }, { 14,4025 }, { 15,4025 }, { 16,4025 },+ { 17,4025 }, { 18,4025 }, { 19,4025 }, { 20,4025 }, { 21,4025 },+ { 22,4025 }, { 23,4025 }, { 24,4025 }, { 25,4025 }, { 26,4025 },+ { 27,4025 }, { 28,4025 }, { 29,4025 }, { 30,4025 }, { 31,4025 },+ { 32,4025 }, { 33,4025 }, { 34,4025 }, { 35,4025 }, { 0, 0 },++ { 37,4025 }, { 38,4025 }, { 39,4025 }, { 40,4025 }, { 41,4025 },+ { 42,4025 }, { 43,4025 }, { 44,4025 }, { 45,4025 }, { 46,4025 },+ { 47,4025 }, { 48,4025 }, { 49,4025 }, { 50,4025 }, { 51,4025 },+ { 52,4025 }, { 53,4025 }, { 54,4025 }, { 55,4025 }, { 56,4025 },+ { 57,4025 }, { 58,4025 }, { 59,4025 }, { 60,4025 }, { 61,4025 },+ { 62,4025 }, { 63,4025 }, { 64,4025 }, { 65,4025 }, { 66,4025 },+ { 67,4025 }, { 68,4025 }, { 69,4025 }, { 70,4025 }, { 71,4025 },+ { 72,4025 }, { 73,4025 }, { 74,4025 }, { 75,4025 }, { 76,4025 },+ { 77,4025 }, { 78,4025 }, { 79,4025 }, { 80,4025 }, { 81,4025 },+ { 82,4025 }, { 83,4025 }, { 84,4025 }, { 85,4025 }, { 86,4025 },++ { 87,4025 }, { 88,4025 }, { 89,4025 }, { 90,4025 }, { 91,4025 },+ { 92,4025 }, { 93,4025 }, { 94,4025 }, { 95,4025 }, { 96,4025 },+ { 97,4025 }, { 98,4025 }, { 99,4025 }, { 100,4025 }, { 101,4025 },+ { 102,4025 }, { 103,4025 }, { 104,4025 }, { 105,4025 }, { 106,4025 },+ { 107,4025 }, { 108,4025 }, { 109,4025 }, { 110,4025 }, { 111,4025 },+ { 112,4025 }, { 113,4025 }, { 114,4025 }, { 115,4025 }, { 116,4025 },+ { 117,4025 }, { 118,4025 }, { 119,4025 }, { 120,4025 }, { 121,4025 },+ { 122,4025 }, { 123,4025 }, { 124,4025 }, { 125,4025 }, { 126,4025 },+ { 127,4025 }, { 128,4025 }, { 129,4025 }, { 130,4025 }, { 131,4025 },+ { 132,4025 }, { 133,4025 }, { 134,4025 }, { 135,4025 }, { 136,4025 },++ { 137,4025 }, { 138,4025 }, { 139,4025 }, { 140,4025 }, { 141,4025 },+ { 142,4025 }, { 143,4025 }, { 144,4025 }, { 145,4025 }, { 146,4025 },+ { 147,4025 }, { 148,4025 }, { 149,4025 }, { 150,4025 }, { 151,4025 },+ { 152,4025 }, { 153,4025 }, { 154,4025 }, { 155,4025 }, { 156,4025 },+ { 157,4025 }, { 158,4025 }, { 159,4025 }, { 160,4025 }, { 161,4025 },+ { 162,4025 }, { 163,4025 }, { 164,4025 }, { 165,4025 }, { 166,4025 },+ { 167,4025 }, { 168,4025 }, { 169,4025 }, { 170,4025 }, { 171,4025 },+ { 172,4025 }, { 173,4025 }, { 174,4025 }, { 175,4025 }, { 176,4025 },+ { 177,4025 }, { 178,4025 }, { 179,4025 }, { 180,4025 }, { 181,4025 },+ { 182,4025 }, { 183,4025 }, { 184,4025 }, { 185,4025 }, { 186,4025 },++ { 187,4025 }, { 188,4025 }, { 189,4025 }, { 190,4025 }, { 191,4025 },+ { 192,4025 }, { 193,4025 }, { 194,4025 }, { 195,4025 }, { 196,4025 },+ { 197,4025 }, { 198,4025 }, { 199,4025 }, { 200,4025 }, { 201,4025 },+ { 202,4025 }, { 203,4025 }, { 204,4025 }, { 205,4025 }, { 206,4025 },+ { 207,4025 }, { 208,4025 }, { 209,4025 }, { 210,4025 }, { 211,4025 },+ { 212,4025 }, { 213,4025 }, { 214,4025 }, { 215,4025 }, { 216,4025 },+ { 217,4025 }, { 218,4025 }, { 219,4025 }, { 220,4025 }, { 221,4025 },+ { 222,4025 }, { 223,4025 }, { 224,4025 }, { 225,4025 }, { 226,4025 },+ { 227,4025 }, { 228,4025 }, { 229,4025 }, { 230,4025 }, { 231,4025 },+ { 232,4025 }, { 233,4025 }, { 234,4025 }, { 235,4025 }, { 236,4025 },++ { 237,4025 }, { 238,4025 }, { 239,4025 }, { 240,4025 }, { 241,4025 },+ { 242,4025 }, { 243,4025 }, { 244,4025 }, { 245,4025 }, { 246,4025 },+ { 247,4025 }, { 248,4025 }, { 249,4025 }, { 250,4025 }, { 251,4025 },+ { 252,4025 }, { 253,4025 }, { 254,4025 }, { 255,4025 }, { 256,4025 },+ { 0, 46 }, { 0,25079 }, { 1,3767 }, { 2,3767 }, { 3,3767 },+ { 4,3767 }, { 5,3767 }, { 6,3767 }, { 7,3767 }, { 8,3767 },+ { 9,3767 }, { 10,3767 }, { 11,3767 }, { 12,3767 }, { 13,3767 },+ { 14,3767 }, { 15,3767 }, { 16,3767 }, { 17,3767 }, { 18,3767 },+ { 19,3767 }, { 20,3767 }, { 21,3767 }, { 22,3767 }, { 23,3767 },+ { 24,3767 }, { 25,3767 }, { 26,3767 }, { 27,3767 }, { 28,3767 },++ { 29,3767 }, { 30,3767 }, { 31,3767 }, { 32,3767 }, { 33,3767 },+ { 34,3767 }, { 35,3767 }, { 0, 0 }, { 37,3767 }, { 38,3767 },+ { 39,3767 }, { 40,3767 }, { 41,3767 }, { 42,3767 }, { 43,3767 },+ { 44,3767 }, { 45,3767 }, { 46,3767 }, { 47,3767 }, { 48,3767 },+ { 49,3767 }, { 50,3767 }, { 51,3767 }, { 52,3767 }, { 53,3767 },+ { 54,3767 }, { 55,3767 }, { 56,3767 }, { 57,3767 }, { 58,3767 },+ { 59,3767 }, { 60,3767 }, { 61,3767 }, { 62,3767 }, { 63,3767 },+ { 64,3767 }, { 65,3767 }, { 66,3767 }, { 67,3767 }, { 68,3767 },+ { 69,3767 }, { 70,3767 }, { 71,3767 }, { 72,3767 }, { 73,3767 },+ { 74,3767 }, { 75,3767 }, { 76,3767 }, { 77,3767 }, { 78,3767 },++ { 79,3767 }, { 80,3767 }, { 81,3767 }, { 82,3767 }, { 83,3767 },+ { 84,3767 }, { 85,3767 }, { 86,3767 }, { 87,3767 }, { 88,3767 },+ { 89,3767 }, { 90,3767 }, { 91,3767 }, { 92,3767 }, { 93,3767 },+ { 94,3767 }, { 95,3767 }, { 96,3767 }, { 97,3767 }, { 98,3767 },+ { 99,3767 }, { 100,3767 }, { 101,3767 }, { 102,3767 }, { 103,3767 },+ { 104,3767 }, { 105,3767 }, { 106,3767 }, { 107,3767 }, { 108,3767 },+ { 109,3767 }, { 110,3767 }, { 111,3767 }, { 112,3767 }, { 113,3767 },+ { 114,3767 }, { 115,3767 }, { 116,3767 }, { 117,3767 }, { 118,3767 },+ { 119,3767 }, { 120,3767 }, { 121,3767 }, { 122,3767 }, { 123,3767 },+ { 124,3767 }, { 125,3767 }, { 126,3767 }, { 127,3767 }, { 128,3767 },++ { 129,3767 }, { 130,3767 }, { 131,3767 }, { 132,3767 }, { 133,3767 },+ { 134,3767 }, { 135,3767 }, { 136,3767 }, { 137,3767 }, { 138,3767 },+ { 139,3767 }, { 140,3767 }, { 141,3767 }, { 142,3767 }, { 143,3767 },+ { 144,3767 }, { 145,3767 }, { 146,3767 }, { 147,3767 }, { 148,3767 },+ { 149,3767 }, { 150,3767 }, { 151,3767 }, { 152,3767 }, { 153,3767 },+ { 154,3767 }, { 155,3767 }, { 156,3767 }, { 157,3767 }, { 158,3767 },+ { 159,3767 }, { 160,3767 }, { 161,3767 }, { 162,3767 }, { 163,3767 },+ { 164,3767 }, { 165,3767 }, { 166,3767 }, { 167,3767 }, { 168,3767 },+ { 169,3767 }, { 170,3767 }, { 171,3767 }, { 172,3767 }, { 173,3767 },+ { 174,3767 }, { 175,3767 }, { 176,3767 }, { 177,3767 }, { 178,3767 },++ { 179,3767 }, { 180,3767 }, { 181,3767 }, { 182,3767 }, { 183,3767 },+ { 184,3767 }, { 185,3767 }, { 186,3767 }, { 187,3767 }, { 188,3767 },+ { 189,3767 }, { 190,3767 }, { 191,3767 }, { 192,3767 }, { 193,3767 },+ { 194,3767 }, { 195,3767 }, { 196,3767 }, { 197,3767 }, { 198,3767 },+ { 199,3767 }, { 200,3767 }, { 201,3767 }, { 202,3767 }, { 203,3767 },+ { 204,3767 }, { 205,3767 }, { 206,3767 }, { 207,3767 }, { 208,3767 },+ { 209,3767 }, { 210,3767 }, { 211,3767 }, { 212,3767 }, { 213,3767 },+ { 214,3767 }, { 215,3767 }, { 216,3767 }, { 217,3767 }, { 218,3767 },+ { 219,3767 }, { 220,3767 }, { 221,3767 }, { 222,3767 }, { 223,3767 },+ { 224,3767 }, { 225,3767 }, { 226,3767 }, { 227,3767 }, { 228,3767 },++ { 229,3767 }, { 230,3767 }, { 231,3767 }, { 232,3767 }, { 233,3767 },+ { 234,3767 }, { 235,3767 }, { 236,3767 }, { 237,3767 }, { 238,3767 },+ { 239,3767 }, { 240,3767 }, { 241,3767 }, { 242,3767 }, { 243,3767 },+ { 244,3767 }, { 245,3767 }, { 246,3767 }, { 247,3767 }, { 248,3767 },+ { 249,3767 }, { 250,3767 }, { 251,3767 }, { 252,3767 }, { 253,3767 },+ { 254,3767 }, { 255,3767 }, { 256,3767 }, { 0, 48 }, { 0,24821 },+ { 0, 53 }, { 0,24819 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 53 }, { 0,24814 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 9,3767 }, { 10,3767 }, { 0, 0 }, { 12,3767 }, { 13,3767 },+ { 9,3762 }, { 10,3762 }, { 0, 0 }, { 12,3762 }, { 13,3762 },++ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 32,3767 }, { 0, 0 },+ { 36,-4714 }, { 0, 0 }, { 0, 0 }, { 32,3762 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,3767 },+ { 66,3767 }, { 67,3767 }, { 68,3767 }, { 69,3767 }, { 70,3767 },++ { 71,3767 }, { 72,3767 }, { 73,3767 }, { 74,3767 }, { 75,3767 },+ { 76,3767 }, { 77,3767 }, { 78,3767 }, { 79,3767 }, { 80,3767 },+ { 81,3767 }, { 82,3767 }, { 83,3767 }, { 84,3767 }, { 85,3767 },+ { 86,3767 }, { 87,3767 }, { 88,3767 }, { 89,3767 }, { 90,3767 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,3767 },+ { 0, 0 }, { 97,3767 }, { 98,3767 }, { 99,3767 }, { 100,3767 },+ { 101,3767 }, { 102,3767 }, { 103,3767 }, { 104,3767 }, { 105,3767 },+ { 106,3767 }, { 107,3767 }, { 108,3767 }, { 109,3767 }, { 110,3767 },+ { 111,3767 }, { 112,3767 }, { 113,3767 }, { 114,3767 }, { 115,3767 },+ { 116,3767 }, { 117,3767 }, { 118,3767 }, { 119,3767 }, { 120,3767 },++ { 121,3767 }, { 122,3767 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 128,3767 }, { 129,3767 }, { 130,3767 },+ { 131,3767 }, { 132,3767 }, { 133,3767 }, { 134,3767 }, { 135,3767 },+ { 136,3767 }, { 137,3767 }, { 138,3767 }, { 139,3767 }, { 140,3767 },+ { 141,3767 }, { 142,3767 }, { 143,3767 }, { 144,3767 }, { 145,3767 },+ { 146,3767 }, { 147,3767 }, { 148,3767 }, { 149,3767 }, { 150,3767 },+ { 151,3767 }, { 152,3767 }, { 153,3767 }, { 154,3767 }, { 155,3767 },+ { 156,3767 }, { 157,3767 }, { 158,3767 }, { 159,3767 }, { 160,3767 },+ { 161,3767 }, { 162,3767 }, { 163,3767 }, { 164,3767 }, { 165,3767 },+ { 166,3767 }, { 167,3767 }, { 168,3767 }, { 169,3767 }, { 170,3767 },++ { 171,3767 }, { 172,3767 }, { 173,3767 }, { 174,3767 }, { 175,3767 },+ { 176,3767 }, { 177,3767 }, { 178,3767 }, { 179,3767 }, { 180,3767 },+ { 181,3767 }, { 182,3767 }, { 183,3767 }, { 184,3767 }, { 185,3767 },+ { 186,3767 }, { 187,3767 }, { 188,3767 }, { 189,3767 }, { 190,3767 },+ { 191,3767 }, { 192,3767 }, { 193,3767 }, { 194,3767 }, { 195,3767 },+ { 196,3767 }, { 197,3767 }, { 198,3767 }, { 199,3767 }, { 200,3767 },+ { 201,3767 }, { 202,3767 }, { 203,3767 }, { 204,3767 }, { 205,3767 },+ { 206,3767 }, { 207,3767 }, { 208,3767 }, { 209,3767 }, { 210,3767 },+ { 211,3767 }, { 212,3767 }, { 213,3767 }, { 214,3767 }, { 215,3767 },+ { 216,3767 }, { 217,3767 }, { 218,3767 }, { 219,3767 }, { 220,3767 },++ { 221,3767 }, { 222,3767 }, { 223,3767 }, { 224,3767 }, { 225,3767 },+ { 226,3767 }, { 227,3767 }, { 228,3767 }, { 229,3767 }, { 230,3767 },+ { 231,3767 }, { 232,3767 }, { 233,3767 }, { 234,3767 }, { 235,3767 },+ { 236,3767 }, { 237,3767 }, { 238,3767 }, { 239,3767 }, { 240,3767 },+ { 241,3767 }, { 242,3767 }, { 243,3767 }, { 244,3767 }, { 245,3767 },+ { 246,3767 }, { 247,3767 }, { 248,3767 }, { 249,3767 }, { 250,3767 },+ { 251,3767 }, { 252,3767 }, { 253,3767 }, { 254,3767 }, { 255,3767 },+ { 0, 24 }, { 0,24564 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 26 }, { 0,24559 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 9,4025 }, { 10,4030 }, { 0, 0 }, { 12,4025 }, { 13,4030 },++ { 9,4041 }, { 10,4041 }, { 0, 0 }, { 12,4041 }, { 13,4041 },+ { 0, 0 }, { 0, 26 }, { 0,24543 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 9,4025 }, { 10,4025 }, { 32,4025 }, { 12,4025 },+ { 13,4025 }, { 0, 0 }, { 0, 0 }, { 32,4041 }, { 0, 0 },+ { 39,-4980 }, { 0, 0 }, { 0, 1 }, { 0,24522 }, { 0, 70 },+ { 0,24520 }, { 45,-4928 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 9, 0 }, { 10, 0 }, { 32,4025 },+ { 12, 0 }, { 13, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },++ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 32, 0 }, { 0, 0 }, { 0, 0 }, { 33, 0 }, { 0, 0 },+ { 35, 0 }, { 0, 0 }, { 37, 0 }, { 38, 0 }, { 0, 68 },+ { 0,24480 }, { 0, 0 }, { 42, 0 }, { 43, 0 }, { 0, 0 },+ { 45, 0 }, { 0, 0 }, { 47, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 71 }, { 0,24463 }, { 0, 0 }, { 0, 0 },+ { 60, 0 }, { 61, 0 }, { 62, 0 }, { 63, 0 }, { 64, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },++ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 33, -40 }, { 0, 0 },+ { 35, -40 }, { 0, 0 }, { 37, -40 }, { 38, -40 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 42, -40 }, { 43, -40 }, { 0, 0 },+ { 45, -40 }, { 0, 0 }, { 47, -40 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 94, 0 },+ { 0, 0 }, { 96, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 60, -40 }, { 61, -40 }, { 62, -40 }, { 63, -40 }, { 64, -40 },+ { 48, 0 }, { 49, 0 }, { 50, 0 }, { 51, 0 }, { 52, 0 },+ { 53, 0 }, { 54, 0 }, { 55, 0 }, { 56, 0 }, { 57, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 44 }, { 0,24401 },++ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 124, 0 },+ { 0, 0 }, { 126, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 94, -40 },+ { 0, 0 }, { 96, -40 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 36,-5515 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 124, -40 },+ { 0, 0 }, { 126, -40 }, { 48,4257 }, { 49,4257 }, { 50,4257 },++ { 51,4257 }, { 52,4257 }, { 53,4257 }, { 54,4257 }, { 55,4257 },+ { 56,4257 }, { 57,4257 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,4257 },+ { 66,4257 }, { 67,4257 }, { 68,4257 }, { 69,4257 }, { 70,4257 },+ { 71,4257 }, { 72,4257 }, { 73,4257 }, { 74,4257 }, { 75,4257 },+ { 76,4257 }, { 77,4257 }, { 78,4257 }, { 79,4257 }, { 80,4257 },+ { 81,4257 }, { 82,4257 }, { 83,4257 }, { 84,4257 }, { 85,4257 },+ { 86,4257 }, { 87,4257 }, { 88,4257 }, { 89,4257 }, { 90,4257 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95,4257 },+ { 0, 0 }, { 97,4257 }, { 98,4257 }, { 99,4257 }, { 100,4257 },++ { 101,4257 }, { 102,4257 }, { 103,4257 }, { 104,4257 }, { 105,4257 },+ { 106,4257 }, { 107,4257 }, { 108,4257 }, { 109,4257 }, { 110,4257 },+ { 111,4257 }, { 112,4257 }, { 113,4257 }, { 114,4257 }, { 115,4257 },+ { 116,4257 }, { 117,4257 }, { 118,4257 }, { 119,4257 }, { 120,4257 },+ { 121,4257 }, { 122,4257 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 128,4257 }, { 129,4257 }, { 130,4257 },+ { 131,4257 }, { 132,4257 }, { 133,4257 }, { 134,4257 }, { 135,4257 },+ { 136,4257 }, { 137,4257 }, { 138,4257 }, { 139,4257 }, { 140,4257 },+ { 141,4257 }, { 142,4257 }, { 143,4257 }, { 144,4257 }, { 145,4257 },+ { 146,4257 }, { 147,4257 }, { 148,4257 }, { 149,4257 }, { 150,4257 },++ { 151,4257 }, { 152,4257 }, { 153,4257 }, { 154,4257 }, { 155,4257 },+ { 156,4257 }, { 157,4257 }, { 158,4257 }, { 159,4257 }, { 160,4257 },+ { 161,4257 }, { 162,4257 }, { 163,4257 }, { 164,4257 }, { 165,4257 },+ { 166,4257 }, { 167,4257 }, { 168,4257 }, { 169,4257 }, { 170,4257 },+ { 171,4257 }, { 172,4257 }, { 173,4257 }, { 174,4257 }, { 175,4257 },+ { 176,4257 }, { 177,4257 }, { 178,4257 }, { 179,4257 }, { 180,4257 },+ { 181,4257 }, { 182,4257 }, { 183,4257 }, { 184,4257 }, { 185,4257 },+ { 186,4257 }, { 187,4257 }, { 188,4257 }, { 189,4257 }, { 190,4257 },+ { 191,4257 }, { 192,4257 }, { 193,4257 }, { 194,4257 }, { 195,4257 },+ { 196,4257 }, { 197,4257 }, { 198,4257 }, { 199,4257 }, { 200,4257 },++ { 201,4257 }, { 202,4257 }, { 203,4257 }, { 204,4257 }, { 205,4257 },+ { 206,4257 }, { 207,4257 }, { 208,4257 }, { 209,4257 }, { 210,4257 },+ { 211,4257 }, { 212,4257 }, { 213,4257 }, { 214,4257 }, { 215,4257 },+ { 216,4257 }, { 217,4257 }, { 218,4257 }, { 219,4257 }, { 220,4257 },+ { 221,4257 }, { 222,4257 }, { 223,4257 }, { 224,4257 }, { 225,4257 },+ { 226,4257 }, { 227,4257 }, { 228,4257 }, { 229,4257 }, { 230,4257 },+ { 231,4257 }, { 232,4257 }, { 233,4257 }, { 234,4257 }, { 235,4257 },+ { 236,4257 }, { 237,4257 }, { 238,4257 }, { 239,4257 }, { 240,4257 },+ { 241,4257 }, { 242,4257 }, { 243,4257 }, { 244,4257 }, { 245,4257 },+ { 246,4257 }, { 247,4257 }, { 248,4257 }, { 249,4257 }, { 250,4257 },++ { 251,4257 }, { 252,4257 }, { 253,4257 }, { 254,4257 }, { 255,4257 },+ { 0, 1 }, { 0,24144 }, { 1,4257 }, { 2,4257 }, { 3,4257 },+ { 4,4257 }, { 5,4257 }, { 6,4257 }, { 7,4257 }, { 8,4257 },+ { 9,4257 }, { 0, 0 }, { 11,4257 }, { 12,4257 }, { 0, 0 },+ { 14,4257 }, { 15,4257 }, { 16,4257 }, { 17,4257 }, { 18,4257 },+ { 19,4257 }, { 20,4257 }, { 21,4257 }, { 22,4257 }, { 23,4257 },+ { 24,4257 }, { 25,4257 }, { 26,4257 }, { 27,4257 }, { 28,4257 },+ { 29,4257 }, { 30,4257 }, { 31,4257 }, { 32,4257 }, { 33,4515 },+ { 34,4257 }, { 35,4515 }, { 36,4257 }, { 37,4515 }, { 38,4515 },+ { 39,4257 }, { 40,4257 }, { 41,4257 }, { 42,4515 }, { 43,4515 },++ { 44,4257 }, { 45,4515 }, { 46,4257 }, { 47,4515 }, { 48,4257 },+ { 49,4257 }, { 50,4257 }, { 51,4257 }, { 52,4257 }, { 53,4257 },+ { 54,4257 }, { 55,4257 }, { 56,4257 }, { 57,4257 }, { 58,4257 },+ { 59,4257 }, { 60,4515 }, { 61,4515 }, { 62,4515 }, { 63,4515 },+ { 64,4515 }, { 65,4257 }, { 66,4257 }, { 67,4257 }, { 68,4257 },+ { 69,4257 }, { 70,4257 }, { 71,4257 }, { 72,4257 }, { 73,4257 },+ { 74,4257 }, { 75,4257 }, { 76,4257 }, { 77,4257 }, { 78,4257 },+ { 79,4257 }, { 80,4257 }, { 81,4257 }, { 82,4257 }, { 83,4257 },+ { 84,4257 }, { 85,4257 }, { 86,4257 }, { 87,4257 }, { 88,4257 },+ { 89,4257 }, { 90,4257 }, { 91,4257 }, { 92,4257 }, { 93,4257 },++ { 94,4515 }, { 95,4257 }, { 96,4515 }, { 97,4257 }, { 98,4257 },+ { 99,4257 }, { 100,4257 }, { 101,4257 }, { 102,4257 }, { 103,4257 },+ { 104,4257 }, { 105,4257 }, { 106,4257 }, { 107,4257 }, { 108,4257 },+ { 109,4257 }, { 110,4257 }, { 111,4257 }, { 112,4257 }, { 113,4257 },+ { 114,4257 }, { 115,4257 }, { 116,4257 }, { 117,4257 }, { 118,4257 },+ { 119,4257 }, { 120,4257 }, { 121,4257 }, { 122,4257 }, { 123,4257 },+ { 124,4515 }, { 125,4257 }, { 126,4515 }, { 127,4257 }, { 128,4257 },+ { 129,4257 }, { 130,4257 }, { 131,4257 }, { 132,4257 }, { 133,4257 },+ { 134,4257 }, { 135,4257 }, { 136,4257 }, { 137,4257 }, { 138,4257 },+ { 139,4257 }, { 140,4257 }, { 141,4257 }, { 142,4257 }, { 143,4257 },++ { 144,4257 }, { 145,4257 }, { 146,4257 }, { 147,4257 }, { 148,4257 },+ { 149,4257 }, { 150,4257 }, { 151,4257 }, { 152,4257 }, { 153,4257 },+ { 154,4257 }, { 155,4257 }, { 156,4257 }, { 157,4257 }, { 158,4257 },+ { 159,4257 }, { 160,4257 }, { 161,4257 }, { 162,4257 }, { 163,4257 },+ { 164,4257 }, { 165,4257 }, { 166,4257 }, { 167,4257 }, { 168,4257 },+ { 169,4257 }, { 170,4257 }, { 171,4257 }, { 172,4257 }, { 173,4257 },+ { 174,4257 }, { 175,4257 }, { 176,4257 }, { 177,4257 }, { 178,4257 },+ { 179,4257 }, { 180,4257 }, { 181,4257 }, { 182,4257 }, { 183,4257 },+ { 184,4257 }, { 185,4257 }, { 186,4257 }, { 187,4257 }, { 188,4257 },+ { 189,4257 }, { 190,4257 }, { 191,4257 }, { 192,4257 }, { 193,4257 },++ { 194,4257 }, { 195,4257 }, { 196,4257 }, { 197,4257 }, { 198,4257 },+ { 199,4257 }, { 200,4257 }, { 201,4257 }, { 202,4257 }, { 203,4257 },+ { 204,4257 }, { 205,4257 }, { 206,4257 }, { 207,4257 }, { 208,4257 },+ { 209,4257 }, { 210,4257 }, { 211,4257 }, { 212,4257 }, { 213,4257 },+ { 214,4257 }, { 215,4257 }, { 216,4257 }, { 217,4257 }, { 218,4257 },+ { 219,4257 }, { 220,4257 }, { 221,4257 }, { 222,4257 }, { 223,4257 },+ { 224,4257 }, { 225,4257 }, { 226,4257 }, { 227,4257 }, { 228,4257 },+ { 229,4257 }, { 230,4257 }, { 231,4257 }, { 232,4257 }, { 233,4257 },+ { 234,4257 }, { 235,4257 }, { 236,4257 }, { 237,4257 }, { 238,4257 },+ { 239,4257 }, { 240,4257 }, { 241,4257 }, { 242,4257 }, { 243,4257 },++ { 244,4257 }, { 245,4257 }, { 246,4257 }, { 247,4257 }, { 248,4257 },+ { 249,4257 }, { 250,4257 }, { 251,4257 }, { 252,4257 }, { 253,4257 },+ { 254,4257 }, { 255,4257 }, { 256,4257 }, { 0, 73 }, { 0,23886 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 2 }, { 0,23861 },+ { 0, 73 }, { 0,23859 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },++ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 48, 0 }, { 49, 0 }, { 50, 0 },+ { 51, 0 }, { 52, 0 }, { 53, 0 }, { 54, 0 }, { 55, 0 },+ { 56, 0 }, { 57, 0 }, { 33,4490 }, { 0, 0 }, { 35,4490 },+ { 0, 0 }, { 37,4490 }, { 38,4490 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 42,4490 }, { 43,4490 }, { 69, 113 }, { 45,4490 },+ { 0, 0 }, { 47,4490 }, { 46,-5624 }, { 0, 0 }, { 48,4490 },+ { 49,4490 }, { 50,4490 }, { 51,4490 }, { 52,4490 }, { 53,4490 },+ { 54,4490 }, { 55,4490 }, { 56,4490 }, { 57,4490 }, { 60,4490 },++ { 61,4490 }, { 62,4490 }, { 63,4490 }, { 64,4490 }, { 0, 72 },+ { 0,23795 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 69, 86 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 101, 113 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 76 }, { 0,23773 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 94,4490 }, { 0, 0 },+ { 96,4490 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 101, 86 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },++ { 0, 0 }, { 46, -64 }, { 0, 0 }, { 48, 0 }, { 49, 0 },+ { 50, 0 }, { 51, 0 }, { 52, 0 }, { 53, 0 }, { 54, 0 },+ { 55, 0 }, { 56, 0 }, { 57, 0 }, { 124,4490 }, { 0, 0 },+ { 126,4490 }, { 0, 65 }, { 0,23733 }, { 0, 0 }, { 0, 0 },+ { 43,4426 }, { 0, 0 }, { 45,4426 }, { 0, 0 }, { 69, 22 },+ { 48,4468 }, { 49,4468 }, { 50,4468 }, { 51,4468 }, { 52,4468 },+ { 53,4468 }, { 54,4468 }, { 55,4468 }, { 56,4468 }, { 57,4468 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },++ { 33,-787 }, { 0, 0 }, { 35,-787 }, { 0, 0 }, { 37,-787 },+ { 38,-787 }, { 101, 22 }, { 0, 67 }, { 0,23692 }, { 42,-787 },+ { 43,-787 }, { 0, 0 }, { 45,-787 }, { 0, 0 }, { 47,-787 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 60,-787 }, { 61,-787 }, { 62,-787 },+ { 63,-787 }, { 64,-787 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 33,-828 }, { 0, 0 }, { 35,-828 }, { 0, 0 },+ { 37,-828 }, { 38,-828 }, { 0, 0 }, { 0, 0 }, { 0, 0 },++ { 42,-828 }, { 43,-828 }, { 0, 0 }, { 45,-828 }, { 0, 0 },+ { 47,-828 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 94,-787 }, { 0, 0 }, { 96,-787 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 60,-828 }, { 61,-828 },+ { 62,-828 }, { 63,-828 }, { 64,-828 }, { 0, 0 }, { 0, 64 },+ { 0,23625 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 66 }, { 0,23614 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 124,-787 }, { 0, 0 }, { 126,-787 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },++ { 0, 0 }, { 0, 0 }, { 94,-828 }, { 0, 0 }, { 96,-828 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 33,-895 }, { 0, 0 },+ { 35,-895 }, { 0, 0 }, { 37,-895 }, { 38,-895 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 42,-895 }, { 43,-895 }, { 33,-906 },+ { 45,-895 }, { 35,-906 }, { 47,-895 }, { 37,-906 }, { 38,-906 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 42,-906 }, { 43,-906 },+ { 0, 0 }, { 45,-906 }, { 124,-828 }, { 47,-906 }, { 126,-828 },+ { 60,-895 }, { 61,-895 }, { 62,-895 }, { 63,-895 }, { 64,-895 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 60,-906 }, { 61,-906 }, { 62,-906 }, { 63,-906 },++ { 64,-906 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 78 }, { 0,23534 }, { 0, 0 }, { 0, 0 }, { 94,-895 },+ { 0, 0 }, { 96,-895 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 94,-906 }, { 0, 0 }, { 96,-906 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 124,-895 },++ { 0, 0 }, { 126,-895 }, { 36, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 124,-906 }, { 0, 0 }, { 126,-906 }, { 0, 0 }, { 48, 0 },+ { 49, 0 }, { 50, 0 }, { 51, 0 }, { 52, 0 }, { 53, 0 },+ { 54, 0 }, { 55, 0 }, { 56, 0 }, { 57, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 63,-6357 },+ { 0, 0 }, { 65, 0 }, { 66, 0 }, { 67, 0 }, { 68, 0 },+ { 69, 0 }, { 70, 0 }, { 71, 0 }, { 72, 0 }, { 73, 0 },+ { 74, 0 }, { 75, 0 }, { 76, 0 }, { 77, 0 }, { 78, 0 },+ { 79, 0 }, { 80, 0 }, { 81, 0 }, { 82, 0 }, { 83, 0 },++ { 84, 0 }, { 85, 0 }, { 86, 0 }, { 87, 0 }, { 88, 0 },+ { 89, 0 }, { 90, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 95, 0 }, { 0, 0 }, { 97, 0 }, { 98, 0 },+ { 99, 0 }, { 100, 0 }, { 101, 0 }, { 102, 0 }, { 103, 0 },+ { 104, 0 }, { 105, 0 }, { 106, 0 }, { 107, 0 }, { 108, 0 },+ { 109, 0 }, { 110, 0 }, { 111, 0 }, { 112, 0 }, { 113, 0 },+ { 114, 0 }, { 115, 0 }, { 116, 0 }, { 117, 0 }, { 118, 0 },+ { 119, 0 }, { 120, 0 }, { 121, 0 }, { 122, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 128, 0 },+ { 129, 0 }, { 130, 0 }, { 131, 0 }, { 132, 0 }, { 133, 0 },++ { 134, 0 }, { 135, 0 }, { 136, 0 }, { 137, 0 }, { 138, 0 },+ { 139, 0 }, { 140, 0 }, { 141, 0 }, { 142, 0 }, { 143, 0 },+ { 144, 0 }, { 145, 0 }, { 146, 0 }, { 147, 0 }, { 148, 0 },+ { 149, 0 }, { 150, 0 }, { 151, 0 }, { 152, 0 }, { 153, 0 },+ { 154, 0 }, { 155, 0 }, { 156, 0 }, { 157, 0 }, { 158, 0 },+ { 159, 0 }, { 160, 0 }, { 161, 0 }, { 162, 0 }, { 163, 0 },+ { 164, 0 }, { 165, 0 }, { 166, 0 }, { 167, 0 }, { 168, 0 },+ { 169, 0 }, { 170, 0 }, { 171, 0 }, { 172, 0 }, { 173, 0 },+ { 174, 0 }, { 175, 0 }, { 176, 0 }, { 177, 0 }, { 178, 0 },+ { 179, 0 }, { 180, 0 }, { 181, 0 }, { 182, 0 }, { 183, 0 },++ { 184, 0 }, { 185, 0 }, { 186, 0 }, { 187, 0 }, { 188, 0 },+ { 189, 0 }, { 190, 0 }, { 191, 0 }, { 192, 0 }, { 193, 0 },+ { 194, 0 }, { 195, 0 }, { 196, 0 }, { 197, 0 }, { 198, 0 },+ { 199, 0 }, { 200, 0 }, { 201, 0 }, { 202, 0 }, { 203, 0 },+ { 204, 0 }, { 205, 0 }, { 206, 0 }, { 207, 0 }, { 208, 0 },+ { 209, 0 }, { 210, 0 }, { 211, 0 }, { 212, 0 }, { 213, 0 },+ { 214, 0 }, { 215, 0 }, { 216, 0 }, { 217, 0 }, { 218, 0 },+ { 219, 0 }, { 220, 0 }, { 221, 0 }, { 222, 0 }, { 223, 0 },+ { 224, 0 }, { 225, 0 }, { 226, 0 }, { 227, 0 }, { 228, 0 },+ { 229, 0 }, { 230, 0 }, { 231, 0 }, { 232, 0 }, { 233, 0 },++ { 234, 0 }, { 235, 0 }, { 236, 0 }, { 237, 0 }, { 238, 0 },+ { 239, 0 }, { 240, 0 }, { 241, 0 }, { 242, 0 }, { 243, 0 },+ { 244, 0 }, { 245, 0 }, { 246, 0 }, { 247, 0 }, { 248, 0 },+ { 249, 0 }, { 250, 0 }, { 251, 0 }, { 252, 0 }, { 253, 0 },+ { 254, 0 }, { 255, 0 }, { 0, 12 }, { 0,23277 }, { 1, 0 },+ { 2, 0 }, { 3, 0 }, { 4, 0 }, { 5, 0 }, { 6, 0 },+ { 7, 0 }, { 8, 0 }, { 9, 0 }, { 10, 0 }, { 11, 0 },+ { 12, 0 }, { 13, 0 }, { 14, 0 }, { 15, 0 }, { 16, 0 },+ { 17, 0 }, { 18, 0 }, { 19, 0 }, { 20, 0 }, { 21, 0 },+ { 22, 0 }, { 23, 0 }, { 24, 0 }, { 25, 0 }, { 26, 0 },++ { 27, 0 }, { 28, 0 }, { 29, 0 }, { 30, 0 }, { 31, 0 },+ { 32, 0 }, { 33, 0 }, { 34, 0 }, { 35, 0 }, { 36, 0 },+ { 37, 0 }, { 38, 0 }, { 0, 0 }, { 40, 0 }, { 41, 0 },+ { 42, 0 }, { 43, 0 }, { 44, 0 }, { 45, 0 }, { 46, 0 },+ { 47, 0 }, { 48, 0 }, { 49, 0 }, { 50, 0 }, { 51, 0 },+ { 52, 0 }, { 53, 0 }, { 54, 0 }, { 55, 0 }, { 56, 0 },+ { 57, 0 }, { 58, 0 }, { 59, 0 }, { 60, 0 }, { 61, 0 },+ { 62, 0 }, { 63, 0 }, { 64, 0 }, { 65, 0 }, { 66, 0 },+ { 67, 0 }, { 68, 0 }, { 69, 0 }, { 70, 0 }, { 71, 0 },+ { 72, 0 }, { 73, 0 }, { 74, 0 }, { 75, 0 }, { 76, 0 },++ { 77, 0 }, { 78, 0 }, { 79, 0 }, { 80, 0 }, { 81, 0 },+ { 82, 0 }, { 83, 0 }, { 84, 0 }, { 85, 0 }, { 86, 0 },+ { 87, 0 }, { 88, 0 }, { 89, 0 }, { 90, 0 }, { 91, 0 },+ { 92, 0 }, { 93, 0 }, { 94, 0 }, { 95, 0 }, { 96, 0 },+ { 97, 0 }, { 98, 0 }, { 99, 0 }, { 100, 0 }, { 101, 0 },+ { 102, 0 }, { 103, 0 }, { 104, 0 }, { 105, 0 }, { 106, 0 },+ { 107, 0 }, { 108, 0 }, { 109, 0 }, { 110, 0 }, { 111, 0 },+ { 112, 0 }, { 113, 0 }, { 114, 0 }, { 115, 0 }, { 116, 0 },+ { 117, 0 }, { 118, 0 }, { 119, 0 }, { 120, 0 }, { 121, 0 },+ { 122, 0 }, { 123, 0 }, { 124, 0 }, { 125, 0 }, { 126, 0 },++ { 127, 0 }, { 128, 0 }, { 129, 0 }, { 130, 0 }, { 131, 0 },+ { 132, 0 }, { 133, 0 }, { 134, 0 }, { 135, 0 }, { 136, 0 },+ { 137, 0 }, { 138, 0 }, { 139, 0 }, { 140, 0 }, { 141, 0 },+ { 142, 0 }, { 143, 0 }, { 144, 0 }, { 145, 0 }, { 146, 0 },+ { 147, 0 }, { 148, 0 }, { 149, 0 }, { 150, 0 }, { 151, 0 },+ { 152, 0 }, { 153, 0 }, { 154, 0 }, { 155, 0 }, { 156, 0 },+ { 157, 0 }, { 158, 0 }, { 159, 0 }, { 160, 0 }, { 161, 0 },+ { 162, 0 }, { 163, 0 }, { 164, 0 }, { 165, 0 }, { 166, 0 },+ { 167, 0 }, { 168, 0 }, { 169, 0 }, { 170, 0 }, { 171, 0 },+ { 172, 0 }, { 173, 0 }, { 174, 0 }, { 175, 0 }, { 176, 0 },++ { 177, 0 }, { 178, 0 }, { 179, 0 }, { 180, 0 }, { 181, 0 },+ { 182, 0 }, { 183, 0 }, { 184, 0 }, { 185, 0 }, { 186, 0 },+ { 187, 0 }, { 188, 0 }, { 189, 0 }, { 190, 0 }, { 191, 0 },+ { 192, 0 }, { 193, 0 }, { 194, 0 }, { 195, 0 }, { 196, 0 },+ { 197, 0 }, { 198, 0 }, { 199, 0 }, { 200, 0 }, { 201, 0 },+ { 202, 0 }, { 203, 0 }, { 204, 0 }, { 205, 0 }, { 206, 0 },+ { 207, 0 }, { 208, 0 }, { 209, 0 }, { 210, 0 }, { 211, 0 },+ { 212, 0 }, { 213, 0 }, { 214, 0 }, { 215, 0 }, { 216, 0 },+ { 217, 0 }, { 218, 0 }, { 219, 0 }, { 220, 0 }, { 221, 0 },+ { 222, 0 }, { 223, 0 }, { 224, 0 }, { 225, 0 }, { 226, 0 },++ { 227, 0 }, { 228, 0 }, { 229, 0 }, { 230, 0 }, { 231, 0 },+ { 232, 0 }, { 233, 0 }, { 234, 0 }, { 235, 0 }, { 236, 0 },+ { 237, 0 }, { 238, 0 }, { 239, 0 }, { 240, 0 }, { 241, 0 },+ { 242, 0 }, { 243, 0 }, { 244, 0 }, { 245, 0 }, { 246, 0 },+ { 247, 0 }, { 248, 0 }, { 249, 0 }, { 250, 0 }, { 251, 0 },+ { 252, 0 }, { 253, 0 }, { 254, 0 }, { 255, 0 }, { 256, 0 },+ { 0, 9 }, { 0,23019 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 9 }, { 0,23014 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 9, 0 }, { 10, 5 }, { 0, 0 }, { 12, 0 }, { 13, 5 },+ { 9,3741 }, { 10,3741 }, { 0, 0 }, { 12,3741 }, { 13,3741 },++ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 32, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 32,3741 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 39,-6463 }, { 45,-6627 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 45,-6461 }, { 0, 5 }, { 0,22967 }, { 1, 0 },+ { 2, 0 }, { 3, 0 }, { 4, 0 }, { 5, 0 }, { 6, 0 },+ { 7, 0 }, { 8, 0 }, { 9, 0 }, { 10, 0 }, { 11, 0 },+ { 12, 0 }, { 13, 0 }, { 14, 0 }, { 15, 0 }, { 16, 0 },++ { 17, 0 }, { 18, 0 }, { 19, 0 }, { 20, 0 }, { 21, 0 },+ { 22, 0 }, { 23, 0 }, { 24, 0 }, { 25, 0 }, { 26, 0 },+ { 27, 0 }, { 28, 0 }, { 29, 0 }, { 30, 0 }, { 31, 0 },+ { 32, 0 }, { 33, 0 }, { 34, 0 }, { 35, 0 }, { 36, 0 },+ { 37, 0 }, { 38, 0 }, { 39, 0 }, { 40, 0 }, { 41, 0 },+ { 0, 0 }, { 43, 0 }, { 44, 0 }, { 45, 0 }, { 46, 0 },+ { 0, 0 }, { 48, 0 }, { 49, 0 }, { 50, 0 }, { 51, 0 },+ { 52, 0 }, { 53, 0 }, { 54, 0 }, { 55, 0 }, { 56, 0 },+ { 57, 0 }, { 58, 0 }, { 59, 0 }, { 60, 0 }, { 61, 0 },+ { 62, 0 }, { 63, 0 }, { 64, 0 }, { 65, 0 }, { 66, 0 },++ { 67, 0 }, { 68, 0 }, { 69, 0 }, { 70, 0 }, { 71, 0 },+ { 72, 0 }, { 73, 0 }, { 74, 0 }, { 75, 0 }, { 76, 0 },+ { 77, 0 }, { 78, 0 }, { 79, 0 }, { 80, 0 }, { 81, 0 },+ { 82, 0 }, { 83, 0 }, { 84, 0 }, { 85, 0 }, { 86, 0 },+ { 87, 0 }, { 88, 0 }, { 89, 0 }, { 90, 0 }, { 91, 0 },+ { 92, 0 }, { 93, 0 }, { 94, 0 }, { 95, 0 }, { 96, 0 },+ { 97, 0 }, { 98, 0 }, { 99, 0 }, { 100, 0 }, { 101, 0 },+ { 102, 0 }, { 103, 0 }, { 104, 0 }, { 105, 0 }, { 106, 0 },+ { 107, 0 }, { 108, 0 }, { 109, 0 }, { 110, 0 }, { 111, 0 },+ { 112, 0 }, { 113, 0 }, { 114, 0 }, { 115, 0 }, { 116, 0 },++ { 117, 0 }, { 118, 0 }, { 119, 0 }, { 120, 0 }, { 121, 0 },+ { 122, 0 }, { 123, 0 }, { 124, 0 }, { 125, 0 }, { 126, 0 },+ { 127, 0 }, { 128, 0 }, { 129, 0 }, { 130, 0 }, { 131, 0 },+ { 132, 0 }, { 133, 0 }, { 134, 0 }, { 135, 0 }, { 136, 0 },+ { 137, 0 }, { 138, 0 }, { 139, 0 }, { 140, 0 }, { 141, 0 },+ { 142, 0 }, { 143, 0 }, { 144, 0 }, { 145, 0 }, { 146, 0 },+ { 147, 0 }, { 148, 0 }, { 149, 0 }, { 150, 0 }, { 151, 0 },+ { 152, 0 }, { 153, 0 }, { 154, 0 }, { 155, 0 }, { 156, 0 },+ { 157, 0 }, { 158, 0 }, { 159, 0 }, { 160, 0 }, { 161, 0 },+ { 162, 0 }, { 163, 0 }, { 164, 0 }, { 165, 0 }, { 166, 0 },++ { 167, 0 }, { 168, 0 }, { 169, 0 }, { 170, 0 }, { 171, 0 },+ { 172, 0 }, { 173, 0 }, { 174, 0 }, { 175, 0 }, { 176, 0 },+ { 177, 0 }, { 178, 0 }, { 179, 0 }, { 180, 0 }, { 181, 0 },+ { 182, 0 }, { 183, 0 }, { 184, 0 }, { 185, 0 }, { 186, 0 },+ { 187, 0 }, { 188, 0 }, { 189, 0 }, { 190, 0 }, { 191, 0 },+ { 192, 0 }, { 193, 0 }, { 194, 0 }, { 195, 0 }, { 196, 0 },+ { 197, 0 }, { 198, 0 }, { 199, 0 }, { 200, 0 }, { 201, 0 },+ { 202, 0 }, { 203, 0 }, { 204, 0 }, { 205, 0 }, { 206, 0 },+ { 207, 0 }, { 208, 0 }, { 209, 0 }, { 210, 0 }, { 211, 0 },+ { 212, 0 }, { 213, 0 }, { 214, 0 }, { 215, 0 }, { 216, 0 },++ { 217, 0 }, { 218, 0 }, { 219, 0 }, { 220, 0 }, { 221, 0 },+ { 222, 0 }, { 223, 0 }, { 224, 0 }, { 225, 0 }, { 226, 0 },+ { 227, 0 }, { 228, 0 }, { 229, 0 }, { 230, 0 }, { 231, 0 },+ { 232, 0 }, { 233, 0 }, { 234, 0 }, { 235, 0 }, { 236, 0 },+ { 237, 0 }, { 238, 0 }, { 239, 0 }, { 240, 0 }, { 241, 0 },+ { 242, 0 }, { 243, 0 }, { 244, 0 }, { 245, 0 }, { 246, 0 },+ { 247, 0 }, { 248, 0 }, { 249, 0 }, { 250, 0 }, { 251, 0 },+ { 252, 0 }, { 253, 0 }, { 254, 0 }, { 255, 0 }, { 256, 0 },+ { 0, 3 }, { 0,22709 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },++ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 33,3741 },+ { 0, 0 }, { 35,3741 }, { 0, 0 }, { 37,3741 }, { 38,3741 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 42,3741 }, { 43,3741 },+ { 0, 0 }, { 45,3741 }, { 0, 0 }, { 47,3741 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },++ { 0, 0 }, { 60,3741 }, { 61,3741 }, { 62,3741 }, { 63,3741 },+ { 64,3741 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 94,3741 }, { 0, 0 }, { 96,3741 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },++ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 124,3741 }, { 0, 0 }, { 126,3741 }, { 0, 58 }, { 0,22581 },+ { 1, 0 }, { 2, 0 }, { 3, 0 }, { 4, 0 }, { 5, 0 },+ { 6, 0 }, { 7, 0 }, { 8, 0 }, { 9, 0 }, { 10, 0 },+ { 11, 0 }, { 12, 0 }, { 13, 0 }, { 14, 0 }, { 15, 0 },+ { 16, 0 }, { 17, 0 }, { 18, 0 }, { 19, 0 }, { 20, 0 },+ { 21, 0 }, { 22, 0 }, { 23, 0 }, { 24, 0 }, { 25, 0 },+ { 26, 0 }, { 27, 0 }, { 28, 0 }, { 29, 0 }, { 30, 0 },++ { 31, 0 }, { 32, 0 }, { 33, 0 }, { 0, 0 }, { 35, 0 },+ { 36, 0 }, { 37, 0 }, { 38, 0 }, { 39, 0 }, { 40, 0 },+ { 41, 0 }, { 42, 0 }, { 43, 0 }, { 44, 0 }, { 45, 0 },+ { 46, 0 }, { 47, 0 }, { 48, 0 }, { 49, 0 }, { 50, 0 },+ { 51, 0 }, { 52, 0 }, { 53, 0 }, { 54, 0 }, { 55, 0 },+ { 56, 0 }, { 57, 0 }, { 58, 0 }, { 59, 0 }, { 60, 0 },+ { 61, 0 }, { 62, 0 }, { 63, 0 }, { 64, 0 }, { 65, 0 },+ { 66, 0 }, { 67, 0 }, { 68, 0 }, { 69, 0 }, { 70, 0 },+ { 71, 0 }, { 72, 0 }, { 73, 0 }, { 74, 0 }, { 75, 0 },+ { 76, 0 }, { 77, 0 }, { 78, 0 }, { 79, 0 }, { 80, 0 },++ { 81, 0 }, { 82, 0 }, { 83, 0 }, { 84, 0 }, { 85, 0 },+ { 86, 0 }, { 87, 0 }, { 88, 0 }, { 89, 0 }, { 90, 0 },+ { 91, 0 }, { 92, 0 }, { 93, 0 }, { 94, 0 }, { 95, 0 },+ { 96, 0 }, { 97, 0 }, { 98, 0 }, { 99, 0 }, { 100, 0 },+ { 101, 0 }, { 102, 0 }, { 103, 0 }, { 104, 0 }, { 105, 0 },+ { 106, 0 }, { 107, 0 }, { 108, 0 }, { 109, 0 }, { 110, 0 },+ { 111, 0 }, { 112, 0 }, { 113, 0 }, { 114, 0 }, { 115, 0 },+ { 116, 0 }, { 117, 0 }, { 118, 0 }, { 119, 0 }, { 120, 0 },+ { 121, 0 }, { 122, 0 }, { 123, 0 }, { 124, 0 }, { 125, 0 },+ { 126, 0 }, { 127, 0 }, { 128, 0 }, { 129, 0 }, { 130, 0 },++ { 131, 0 }, { 132, 0 }, { 133, 0 }, { 134, 0 }, { 135, 0 },+ { 136, 0 }, { 137, 0 }, { 138, 0 }, { 139, 0 }, { 140, 0 },+ { 141, 0 }, { 142, 0 }, { 143, 0 }, { 144, 0 }, { 145, 0 },+ { 146, 0 }, { 147, 0 }, { 148, 0 }, { 149, 0 }, { 150, 0 },+ { 151, 0 }, { 152, 0 }, { 153, 0 }, { 154, 0 }, { 155, 0 },+ { 156, 0 }, { 157, 0 }, { 158, 0 }, { 159, 0 }, { 160, 0 },+ { 161, 0 }, { 162, 0 }, { 163, 0 }, { 164, 0 }, { 165, 0 },+ { 166, 0 }, { 167, 0 }, { 168, 0 }, { 169, 0 }, { 170, 0 },+ { 171, 0 }, { 172, 0 }, { 173, 0 }, { 174, 0 }, { 175, 0 },+ { 176, 0 }, { 177, 0 }, { 178, 0 }, { 179, 0 }, { 180, 0 },++ { 181, 0 }, { 182, 0 }, { 183, 0 }, { 184, 0 }, { 185, 0 },+ { 186, 0 }, { 187, 0 }, { 188, 0 }, { 189, 0 }, { 190, 0 },+ { 191, 0 }, { 192, 0 }, { 193, 0 }, { 194, 0 }, { 195, 0 },+ { 196, 0 }, { 197, 0 }, { 198, 0 }, { 199, 0 }, { 200, 0 },+ { 201, 0 }, { 202, 0 }, { 203, 0 }, { 204, 0 }, { 205, 0 },+ { 206, 0 }, { 207, 0 }, { 208, 0 }, { 209, 0 }, { 210, 0 },+ { 211, 0 }, { 212, 0 }, { 213, 0 }, { 214, 0 }, { 215, 0 },+ { 216, 0 }, { 217, 0 }, { 218, 0 }, { 219, 0 }, { 220, 0 },+ { 221, 0 }, { 222, 0 }, { 223, 0 }, { 224, 0 }, { 225, 0 },+ { 226, 0 }, { 227, 0 }, { 228, 0 }, { 229, 0 }, { 230, 0 },++ { 231, 0 }, { 232, 0 }, { 233, 0 }, { 234, 0 }, { 235, 0 },+ { 236, 0 }, { 237, 0 }, { 238, 0 }, { 239, 0 }, { 240, 0 },+ { 241, 0 }, { 242, 0 }, { 243, 0 }, { 244, 0 }, { 245, 0 },+ { 246, 0 }, { 247, 0 }, { 248, 0 }, { 249, 0 }, { 250, 0 },+ { 251, 0 }, { 252, 0 }, { 253, 0 }, { 254, 0 }, { 255, 0 },+ { 256, 0 }, { 0, 11 }, { 0,22323 }, { 1, 0 }, { 2, 0 },+ { 3, 0 }, { 4, 0 }, { 5, 0 }, { 6, 0 }, { 7, 0 },+ { 8, 0 }, { 9, 0 }, { 10, 0 }, { 11, 0 }, { 12, 0 },+ { 13, 0 }, { 14, 0 }, { 15, 0 }, { 16, 0 }, { 17, 0 },+ { 18, 0 }, { 19, 0 }, { 20, 0 }, { 21, 0 }, { 22, 0 },++ { 23, 0 }, { 24, 0 }, { 25, 0 }, { 26, 0 }, { 27, 0 },+ { 28, 0 }, { 29, 0 }, { 30, 0 }, { 31, 0 }, { 32, 0 },+ { 33, 0 }, { 34, 0 }, { 35, 0 }, { 36, 0 }, { 37, 0 },+ { 38, 0 }, { 0, 0 }, { 40, 0 }, { 41, 0 }, { 42, 0 },+ { 43, 0 }, { 44, 0 }, { 45, 0 }, { 46, 0 }, { 47, 0 },+ { 48, 0 }, { 49, 0 }, { 50, 0 }, { 51, 0 }, { 52, 0 },+ { 53, 0 }, { 54, 0 }, { 55, 0 }, { 56, 0 }, { 57, 0 },+ { 58, 0 }, { 59, 0 }, { 60, 0 }, { 61, 0 }, { 62, 0 },+ { 63, 0 }, { 64, 0 }, { 65, 0 }, { 66, 0 }, { 67, 0 },+ { 68, 0 }, { 69, 0 }, { 70, 0 }, { 71, 0 }, { 72, 0 },++ { 73, 0 }, { 74, 0 }, { 75, 0 }, { 76, 0 }, { 77, 0 },+ { 78, 0 }, { 79, 0 }, { 80, 0 }, { 81, 0 }, { 82, 0 },+ { 83, 0 }, { 84, 0 }, { 85, 0 }, { 86, 0 }, { 87, 0 },+ { 88, 0 }, { 89, 0 }, { 90, 0 }, { 91, 0 }, { 92, 0 },+ { 93, 0 }, { 94, 0 }, { 95, 0 }, { 96, 0 }, { 97, 0 },+ { 98, 0 }, { 99, 0 }, { 100, 0 }, { 101, 0 }, { 102, 0 },+ { 103, 0 }, { 104, 0 }, { 105, 0 }, { 106, 0 }, { 107, 0 },+ { 108, 0 }, { 109, 0 }, { 110, 0 }, { 111, 0 }, { 112, 0 },+ { 113, 0 }, { 114, 0 }, { 115, 0 }, { 116, 0 }, { 117, 0 },+ { 118, 0 }, { 119, 0 }, { 120, 0 }, { 121, 0 }, { 122, 0 },++ { 123, 0 }, { 124, 0 }, { 125, 0 }, { 126, 0 }, { 127, 0 },+ { 128, 0 }, { 129, 0 }, { 130, 0 }, { 131, 0 }, { 132, 0 },+ { 133, 0 }, { 134, 0 }, { 135, 0 }, { 136, 0 }, { 137, 0 },+ { 138, 0 }, { 139, 0 }, { 140, 0 }, { 141, 0 }, { 142, 0 },+ { 143, 0 }, { 144, 0 }, { 145, 0 }, { 146, 0 }, { 147, 0 },+ { 148, 0 }, { 149, 0 }, { 150, 0 }, { 151, 0 }, { 152, 0 },+ { 153, 0 }, { 154, 0 }, { 155, 0 }, { 156, 0 }, { 157, 0 },+ { 158, 0 }, { 159, 0 }, { 160, 0 }, { 161, 0 }, { 162, 0 },+ { 163, 0 }, { 164, 0 }, { 165, 0 }, { 166, 0 }, { 167, 0 },+ { 168, 0 }, { 169, 0 }, { 170, 0 }, { 171, 0 }, { 172, 0 },++ { 173, 0 }, { 174, 0 }, { 175, 0 }, { 176, 0 }, { 177, 0 },+ { 178, 0 }, { 179, 0 }, { 180, 0 }, { 181, 0 }, { 182, 0 },+ { 183, 0 }, { 184, 0 }, { 185, 0 }, { 186, 0 }, { 187, 0 },+ { 188, 0 }, { 189, 0 }, { 190, 0 }, { 191, 0 }, { 192, 0 },+ { 193, 0 }, { 194, 0 }, { 195, 0 }, { 196, 0 }, { 197, 0 },+ { 198, 0 }, { 199, 0 }, { 200, 0 }, { 201, 0 }, { 202, 0 },+ { 203, 0 }, { 204, 0 }, { 205, 0 }, { 206, 0 }, { 207, 0 },+ { 208, 0 }, { 209, 0 }, { 210, 0 }, { 211, 0 }, { 212, 0 },+ { 213, 0 }, { 214, 0 }, { 215, 0 }, { 216, 0 }, { 217, 0 },+ { 218, 0 }, { 219, 0 }, { 220, 0 }, { 221, 0 }, { 222, 0 },++ { 223, 0 }, { 224, 0 }, { 225, 0 }, { 226, 0 }, { 227, 0 },+ { 228, 0 }, { 229, 0 }, { 230, 0 }, { 231, 0 }, { 232, 0 },+ { 233, 0 }, { 234, 0 }, { 235, 0 }, { 236, 0 }, { 237, 0 },+ { 238, 0 }, { 239, 0 }, { 240, 0 }, { 241, 0 }, { 242, 0 },+ { 243, 0 }, { 244, 0 }, { 245, 0 }, { 246, 0 }, { 247, 0 },+ { 248, 0 }, { 249, 0 }, { 250, 0 }, { 251, 0 }, { 252, 0 },+ { 253, 0 }, { 254, 0 }, { 255, 0 }, { 256, 0 }, { 0, 16 },+ { 0,22065 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 16 },+ { 0,22060 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 9, 0 },+ { 10, 5 }, { 0, 0 }, { 12, 0 }, { 13, 5 }, { 9,3099 },++ { 10,3099 }, { 0, 0 }, { 12,3099 }, { 13,3099 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 32, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 32,3099 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 39,-7413 },+ { 45,-7481 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 45,-7408 }, { 0, 32 }, { 0,22013 }, { 1, 0 }, { 2, 0 },+ { 3, 0 }, { 4, 0 }, { 5, 0 }, { 6, 0 }, { 7, 0 },+ { 8, 0 }, { 9, 0 }, { 10, 0 }, { 11, 0 }, { 12, 0 },++ { 13, 0 }, { 14, 0 }, { 15, 0 }, { 16, 0 }, { 17, 0 },+ { 18, 0 }, { 19, 0 }, { 20, 0 }, { 21, 0 }, { 22, 0 },+ { 23, 0 }, { 24, 0 }, { 25, 0 }, { 26, 0 }, { 27, 0 },+ { 28, 0 }, { 29, 0 }, { 30, 0 }, { 31, 0 }, { 32, 0 },+ { 33, 0 }, { 34, 0 }, { 35, 0 }, { 36, 0 }, { 37, 0 },+ { 38, 0 }, { 0, 0 }, { 40, 0 }, { 41, 0 }, { 42, 0 },+ { 43, 0 }, { 44, 0 }, { 45, 0 }, { 46, 0 }, { 47, 0 },+ { 48, 0 }, { 49, 0 }, { 50, 0 }, { 51, 0 }, { 52, 0 },+ { 53, 0 }, { 54, 0 }, { 55, 0 }, { 56, 0 }, { 57, 0 },+ { 58, 0 }, { 59, 0 }, { 60, 0 }, { 61, 0 }, { 62, 0 },++ { 63, 0 }, { 64, 0 }, { 65, 0 }, { 66, 0 }, { 67, 0 },+ { 68, 0 }, { 69, 0 }, { 70, 0 }, { 71, 0 }, { 72, 0 },+ { 73, 0 }, { 74, 0 }, { 75, 0 }, { 76, 0 }, { 77, 0 },+ { 78, 0 }, { 79, 0 }, { 80, 0 }, { 81, 0 }, { 82, 0 },+ { 83, 0 }, { 84, 0 }, { 85, 0 }, { 86, 0 }, { 87, 0 },+ { 88, 0 }, { 89, 0 }, { 90, 0 }, { 91, 0 }, { 0, 0 },+ { 93, 0 }, { 94, 0 }, { 95, 0 }, { 96, 0 }, { 97, 0 },+ { 98, 0 }, { 99, 0 }, { 100, 0 }, { 101, 0 }, { 102, 0 },+ { 103, 0 }, { 104, 0 }, { 105, 0 }, { 106, 0 }, { 107, 0 },+ { 108, 0 }, { 109, 0 }, { 110, 0 }, { 111, 0 }, { 112, 0 },++ { 113, 0 }, { 114, 0 }, { 115, 0 }, { 116, 0 }, { 117, 0 },+ { 118, 0 }, { 119, 0 }, { 120, 0 }, { 121, 0 }, { 122, 0 },+ { 123, 0 }, { 124, 0 }, { 125, 0 }, { 126, 0 }, { 127, 0 },+ { 128, 0 }, { 129, 0 }, { 130, 0 }, { 131, 0 }, { 132, 0 },+ { 133, 0 }, { 134, 0 }, { 135, 0 }, { 136, 0 }, { 137, 0 },+ { 138, 0 }, { 139, 0 }, { 140, 0 }, { 141, 0 }, { 142, 0 },+ { 143, 0 }, { 144, 0 }, { 145, 0 }, { 146, 0 }, { 147, 0 },+ { 148, 0 }, { 149, 0 }, { 150, 0 }, { 151, 0 }, { 152, 0 },+ { 153, 0 }, { 154, 0 }, { 155, 0 }, { 156, 0 }, { 157, 0 },+ { 158, 0 }, { 159, 0 }, { 160, 0 }, { 161, 0 }, { 162, 0 },++ { 163, 0 }, { 164, 0 }, { 165, 0 }, { 166, 0 }, { 167, 0 },+ { 168, 0 }, { 169, 0 }, { 170, 0 }, { 171, 0 }, { 172, 0 },+ { 173, 0 }, { 174, 0 }, { 175, 0 }, { 176, 0 }, { 177, 0 },+ { 178, 0 }, { 179, 0 }, { 180, 0 }, { 181, 0 }, { 182, 0 },+ { 183, 0 }, { 184, 0 }, { 185, 0 }, { 186, 0 }, { 187, 0 },+ { 188, 0 }, { 189, 0 }, { 190, 0 }, { 191, 0 }, { 192, 0 },+ { 193, 0 }, { 194, 0 }, { 195, 0 }, { 196, 0 }, { 197, 0 },+ { 198, 0 }, { 199, 0 }, { 200, 0 }, { 201, 0 }, { 202, 0 },+ { 203, 0 }, { 204, 0 }, { 205, 0 }, { 206, 0 }, { 207, 0 },+ { 208, 0 }, { 209, 0 }, { 210, 0 }, { 211, 0 }, { 212, 0 },++ { 213, 0 }, { 214, 0 }, { 215, 0 }, { 216, 0 }, { 217, 0 },+ { 218, 0 }, { 219, 0 }, { 220, 0 }, { 221, 0 }, { 222, 0 },+ { 223, 0 }, { 224, 0 }, { 225, 0 }, { 226, 0 }, { 227, 0 },+ { 228, 0 }, { 229, 0 }, { 230, 0 }, { 231, 0 }, { 232, 0 },+ { 233, 0 }, { 234, 0 }, { 235, 0 }, { 236, 0 }, { 237, 0 },+ { 238, 0 }, { 239, 0 }, { 240, 0 }, { 241, 0 }, { 242, 0 },+ { 243, 0 }, { 244, 0 }, { 245, 0 }, { 246, 0 }, { 247, 0 },+ { 248, 0 }, { 249, 0 }, { 250, 0 }, { 251, 0 }, { 252, 0 },+ { 253, 0 }, { 254, 0 }, { 255, 0 }, { 256, 0 }, { 0, 22 },+ { 0,21755 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 22 },++ { 0,21750 }, { 0, 39 }, { 0,21748 }, { 0, 0 }, { 9, 0 },+ { 10, 5 }, { 0, 0 }, { 12, 0 }, { 13, 5 }, { 9,3168 },+ { 10,3168 }, { 0, 0 }, { 12,3168 }, { 13,3168 }, { 0, 37 },+ { 0,21735 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 32, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 32,3168 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 37 }, { 0,21712 }, { 39,-7709 },+ { 45,-7784 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 45,-7682 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },++ { 48,3471 }, { 49,3471 }, { 50,3471 }, { 51,3471 }, { 52,3471 },+ { 53,3471 }, { 54,3471 }, { 55,3471 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,3466 }, { 49,3466 },+ { 50,3466 }, { 51,3466 }, { 52,3466 }, { 53,3466 }, { 54,3466 },+ { 55,3466 }, { 56,3466 }, { 57,3466 }, { 0, 0 }, { 0, 0 },+ { 0, 38 }, { 0,21674 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 65,3466 }, { 66,3466 }, { 67,3466 }, { 68,3466 }, { 69,3466 },+ { 70,3466 }, { 48,3466 }, { 49,3466 }, { 50,3466 }, { 51,3466 },+ { 52,3466 }, { 53,3466 }, { 54,3466 }, { 55,3466 }, { 56,3466 },+ { 57,3466 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },++ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,3466 }, { 66,3466 },+ { 67,3466 }, { 68,3466 }, { 69,3466 }, { 70,3466 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 97,3466 }, { 98,3466 }, { 99,3466 },+ { 100,3466 }, { 101,3466 }, { 102,3466 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,3466 },+ { 49,3466 }, { 50,3466 }, { 51,3466 }, { 52,3466 }, { 53,3466 },+ { 54,3466 }, { 55,3466 }, { 56,3466 }, { 57,3466 }, { 0, 0 },+ { 97,3466 }, { 98,3466 }, { 99,3466 }, { 100,3466 }, { 101,3466 },+ { 102,3466 }, { 65,3466 }, { 66,3466 }, { 67,3466 }, { 68,3466 },+ { 69,3466 }, { 70,3466 }, { 0, 0 }, { 0, 0 }, { 0, 0 },++ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 97,3466 }, { 98,3466 },+ { 99,3466 }, { 100,3466 }, { 101,3466 }, { 102,3466 }, { 0, 31 },+ { 0,21570 }, { 1, 0 }, { 2, 0 }, { 3, 0 }, { 4, 0 },+ { 5, 0 }, { 6, 0 }, { 7, 0 }, { 8, 0 }, { 9, 0 },+ { 10, 0 }, { 11, 0 }, { 12, 0 }, { 13, 0 }, { 14, 0 },+ { 15, 0 }, { 16, 0 }, { 17, 0 }, { 18, 0 }, { 19, 0 },++ { 20, 0 }, { 21, 0 }, { 22, 0 }, { 23, 0 }, { 24, 0 },+ { 25, 0 }, { 26, 0 }, { 27, 0 }, { 28, 0 }, { 29, 0 },+ { 30, 0 }, { 31, 0 }, { 32, 0 }, { 33, 0 }, { 34, 0 },+ { 35, 0 }, { 36, 0 }, { 37, 0 }, { 38, 0 }, { 0, 0 },+ { 40, 0 }, { 41, 0 }, { 42, 0 }, { 43, 0 }, { 44, 0 },+ { 45, 0 }, { 46, 0 }, { 47, 0 }, { 48, 0 }, { 49, 0 },+ { 50, 0 }, { 51, 0 }, { 52, 0 }, { 53, 0 }, { 54, 0 },+ { 55, 0 }, { 56, 0 }, { 57, 0 }, { 58, 0 }, { 59, 0 },+ { 60, 0 }, { 61, 0 }, { 62, 0 }, { 63, 0 }, { 64, 0 },+ { 65, 0 }, { 66, 0 }, { 67, 0 }, { 68, 0 }, { 69, 0 },++ { 70, 0 }, { 71, 0 }, { 72, 0 }, { 73, 0 }, { 74, 0 },+ { 75, 0 }, { 76, 0 }, { 77, 0 }, { 78, 0 }, { 79, 0 },+ { 80, 0 }, { 81, 0 }, { 82, 0 }, { 83, 0 }, { 84, 0 },+ { 85, 0 }, { 86, 0 }, { 87, 0 }, { 88, 0 }, { 89, 0 },+ { 90, 0 }, { 91, 0 }, { 92, 0 }, { 93, 0 }, { 94, 0 },+ { 95, 0 }, { 96, 0 }, { 97, 0 }, { 98, 0 }, { 99, 0 },+ { 100, 0 }, { 101, 0 }, { 102, 0 }, { 103, 0 }, { 104, 0 },+ { 105, 0 }, { 106, 0 }, { 107, 0 }, { 108, 0 }, { 109, 0 },+ { 110, 0 }, { 111, 0 }, { 112, 0 }, { 113, 0 }, { 114, 0 },+ { 115, 0 }, { 116, 0 }, { 117, 0 }, { 118, 0 }, { 119, 0 },++ { 120, 0 }, { 121, 0 }, { 122, 0 }, { 123, 0 }, { 124, 0 },+ { 125, 0 }, { 126, 0 }, { 127, 0 }, { 128, 0 }, { 129, 0 },+ { 130, 0 }, { 131, 0 }, { 132, 0 }, { 133, 0 }, { 134, 0 },+ { 135, 0 }, { 136, 0 }, { 137, 0 }, { 138, 0 }, { 139, 0 },+ { 140, 0 }, { 141, 0 }, { 142, 0 }, { 143, 0 }, { 144, 0 },+ { 145, 0 }, { 146, 0 }, { 147, 0 }, { 148, 0 }, { 149, 0 },+ { 150, 0 }, { 151, 0 }, { 152, 0 }, { 153, 0 }, { 154, 0 },+ { 155, 0 }, { 156, 0 }, { 157, 0 }, { 158, 0 }, { 159, 0 },+ { 160, 0 }, { 161, 0 }, { 162, 0 }, { 163, 0 }, { 164, 0 },+ { 165, 0 }, { 166, 0 }, { 167, 0 }, { 168, 0 }, { 169, 0 },++ { 170, 0 }, { 171, 0 }, { 172, 0 }, { 173, 0 }, { 174, 0 },+ { 175, 0 }, { 176, 0 }, { 177, 0 }, { 178, 0 }, { 179, 0 },+ { 180, 0 }, { 181, 0 }, { 182, 0 }, { 183, 0 }, { 184, 0 },+ { 185, 0 }, { 186, 0 }, { 187, 0 }, { 188, 0 }, { 189, 0 },+ { 190, 0 }, { 191, 0 }, { 192, 0 }, { 193, 0 }, { 194, 0 },+ { 195, 0 }, { 196, 0 }, { 197, 0 }, { 198, 0 }, { 199, 0 },+ { 200, 0 }, { 201, 0 }, { 202, 0 }, { 203, 0 }, { 204, 0 },+ { 205, 0 }, { 206, 0 }, { 207, 0 }, { 208, 0 }, { 209, 0 },+ { 210, 0 }, { 211, 0 }, { 212, 0 }, { 213, 0 }, { 214, 0 },+ { 215, 0 }, { 216, 0 }, { 217, 0 }, { 218, 0 }, { 219, 0 },++ { 220, 0 }, { 221, 0 }, { 222, 0 }, { 223, 0 }, { 224, 0 },+ { 225, 0 }, { 226, 0 }, { 227, 0 }, { 228, 0 }, { 229, 0 },+ { 230, 0 }, { 231, 0 }, { 232, 0 }, { 233, 0 }, { 234, 0 },+ { 235, 0 }, { 236, 0 }, { 237, 0 }, { 238, 0 }, { 239, 0 },+ { 240, 0 }, { 241, 0 }, { 242, 0 }, { 243, 0 }, { 244, 0 },+ { 245, 0 }, { 246, 0 }, { 247, 0 }, { 248, 0 }, { 249, 0 },+ { 250, 0 }, { 251, 0 }, { 252, 0 }, { 253, 0 }, { 254, 0 },+ { 255, 0 }, { 256, 0 }, { 0, 46 }, { 0,21312 }, { 1, 0 },+ { 2, 0 }, { 3, 0 }, { 4, 0 }, { 5, 0 }, { 6, 0 },+ { 7, 0 }, { 8, 0 }, { 9, 0 }, { 10, 0 }, { 11, 0 },++ { 12, 0 }, { 13, 0 }, { 14, 0 }, { 15, 0 }, { 16, 0 },+ { 17, 0 }, { 18, 0 }, { 19, 0 }, { 20, 0 }, { 21, 0 },+ { 22, 0 }, { 23, 0 }, { 24, 0 }, { 25, 0 }, { 26, 0 },+ { 27, 0 }, { 28, 0 }, { 29, 0 }, { 30, 0 }, { 31, 0 },+ { 32, 0 }, { 33, 0 }, { 34, 0 }, { 35, 0 }, { 0, 0 },+ { 37, 0 }, { 38, 0 }, { 39, 0 }, { 40, 0 }, { 41, 0 },+ { 42, 0 }, { 43, 0 }, { 44, 0 }, { 45, 0 }, { 46, 0 },+ { 47, 0 }, { 48, 0 }, { 49, 0 }, { 50, 0 }, { 51, 0 },+ { 52, 0 }, { 53, 0 }, { 54, 0 }, { 55, 0 }, { 56, 0 },+ { 57, 0 }, { 58, 0 }, { 59, 0 }, { 60, 0 }, { 61, 0 },++ { 62, 0 }, { 63, 0 }, { 64, 0 }, { 65, 0 }, { 66, 0 },+ { 67, 0 }, { 68, 0 }, { 69, 0 }, { 70, 0 }, { 71, 0 },+ { 72, 0 }, { 73, 0 }, { 74, 0 }, { 75, 0 }, { 76, 0 },+ { 77, 0 }, { 78, 0 }, { 79, 0 }, { 80, 0 }, { 81, 0 },+ { 82, 0 }, { 83, 0 }, { 84, 0 }, { 85, 0 }, { 86, 0 },+ { 87, 0 }, { 88, 0 }, { 89, 0 }, { 90, 0 }, { 91, 0 },+ { 92, 0 }, { 93, 0 }, { 94, 0 }, { 95, 0 }, { 96, 0 },+ { 97, 0 }, { 98, 0 }, { 99, 0 }, { 100, 0 }, { 101, 0 },+ { 102, 0 }, { 103, 0 }, { 104, 0 }, { 105, 0 }, { 106, 0 },+ { 107, 0 }, { 108, 0 }, { 109, 0 }, { 110, 0 }, { 111, 0 },++ { 112, 0 }, { 113, 0 }, { 114, 0 }, { 115, 0 }, { 116, 0 },+ { 117, 0 }, { 118, 0 }, { 119, 0 }, { 120, 0 }, { 121, 0 },+ { 122, 0 }, { 123, 0 }, { 124, 0 }, { 125, 0 }, { 126, 0 },+ { 127, 0 }, { 128, 0 }, { 129, 0 }, { 130, 0 }, { 131, 0 },+ { 132, 0 }, { 133, 0 }, { 134, 0 }, { 135, 0 }, { 136, 0 },+ { 137, 0 }, { 138, 0 }, { 139, 0 }, { 140, 0 }, { 141, 0 },+ { 142, 0 }, { 143, 0 }, { 144, 0 }, { 145, 0 }, { 146, 0 },+ { 147, 0 }, { 148, 0 }, { 149, 0 }, { 150, 0 }, { 151, 0 },+ { 152, 0 }, { 153, 0 }, { 154, 0 }, { 155, 0 }, { 156, 0 },+ { 157, 0 }, { 158, 0 }, { 159, 0 }, { 160, 0 }, { 161, 0 },++ { 162, 0 }, { 163, 0 }, { 164, 0 }, { 165, 0 }, { 166, 0 },+ { 167, 0 }, { 168, 0 }, { 169, 0 }, { 170, 0 }, { 171, 0 },+ { 172, 0 }, { 173, 0 }, { 174, 0 }, { 175, 0 }, { 176, 0 },+ { 177, 0 }, { 178, 0 }, { 179, 0 }, { 180, 0 }, { 181, 0 },+ { 182, 0 }, { 183, 0 }, { 184, 0 }, { 185, 0 }, { 186, 0 },+ { 187, 0 }, { 188, 0 }, { 189, 0 }, { 190, 0 }, { 191, 0 },+ { 192, 0 }, { 193, 0 }, { 194, 0 }, { 195, 0 }, { 196, 0 },+ { 197, 0 }, { 198, 0 }, { 199, 0 }, { 200, 0 }, { 201, 0 },+ { 202, 0 }, { 203, 0 }, { 204, 0 }, { 205, 0 }, { 206, 0 },+ { 207, 0 }, { 208, 0 }, { 209, 0 }, { 210, 0 }, { 211, 0 },++ { 212, 0 }, { 213, 0 }, { 214, 0 }, { 215, 0 }, { 216, 0 },+ { 217, 0 }, { 218, 0 }, { 219, 0 }, { 220, 0 }, { 221, 0 },+ { 222, 0 }, { 223, 0 }, { 224, 0 }, { 225, 0 }, { 226, 0 },+ { 227, 0 }, { 228, 0 }, { 229, 0 }, { 230, 0 }, { 231, 0 },+ { 232, 0 }, { 233, 0 }, { 234, 0 }, { 235, 0 }, { 236, 0 },+ { 237, 0 }, { 238, 0 }, { 239, 0 }, { 240, 0 }, { 241, 0 },+ { 242, 0 }, { 243, 0 }, { 244, 0 }, { 245, 0 }, { 246, 0 },+ { 247, 0 }, { 248, 0 }, { 249, 0 }, { 250, 0 }, { 251, 0 },+ { 252, 0 }, { 253, 0 }, { 254, 0 }, { 255, 0 }, { 256, 0 },+ { 0, 47 }, { 0,21054 }, { 0, 53 }, { 0,21052 }, { 0, 0 },++ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 9, 0 }, { 10, 0 }, { 0, 0 },+ { 12, 0 }, { 13, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 32, 0 }, { 0, 0 }, { 36,-8481 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,2918 },+ { 49,2918 }, { 50,2918 }, { 51,2918 }, { 52,2918 }, { 53,2918 },++ { 54,2918 }, { 55,2918 }, { 56,2918 }, { 57,2918 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 65,2918 }, { 66,2918 }, { 67,2918 }, { 68,2918 },+ { 69,2918 }, { 70,2918 }, { 71,2918 }, { 72,2918 }, { 73,2918 },+ { 74,2918 }, { 75,2918 }, { 76,2918 }, { 77,2918 }, { 78,2918 },+ { 79,2918 }, { 80,2918 }, { 81,2918 }, { 82,2918 }, { 83,2918 },+ { 84,2918 }, { 85,2918 }, { 86,2918 }, { 87,2918 }, { 88,2918 },+ { 89,2918 }, { 90,2918 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 95,2918 }, { 0, 0 }, { 97,2918 }, { 98,2918 },+ { 99,2918 }, { 100,2918 }, { 101,2918 }, { 102,2918 }, { 103,2918 },++ { 104,2918 }, { 105,2918 }, { 106,2918 }, { 107,2918 }, { 108,2918 },+ { 109,2918 }, { 110,2918 }, { 111,2918 }, { 112,2918 }, { 113,2918 },+ { 114,2918 }, { 115,2918 }, { 116,2918 }, { 117,2918 }, { 118,2918 },+ { 119,2918 }, { 120,2918 }, { 121,2918 }, { 122,2918 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 128,2918 },+ { 129,2918 }, { 130,2918 }, { 131,2918 }, { 132,2918 }, { 133,2918 },+ { 134,2918 }, { 135,2918 }, { 136,2918 }, { 137,2918 }, { 138,2918 },+ { 139,2918 }, { 140,2918 }, { 141,2918 }, { 142,2918 }, { 143,2918 },+ { 144,2918 }, { 145,2918 }, { 146,2918 }, { 147,2918 }, { 148,2918 },+ { 149,2918 }, { 150,2918 }, { 151,2918 }, { 152,2918 }, { 153,2918 },++ { 154,2918 }, { 155,2918 }, { 156,2918 }, { 157,2918 }, { 158,2918 },+ { 159,2918 }, { 160,2918 }, { 161,2918 }, { 162,2918 }, { 163,2918 },+ { 164,2918 }, { 165,2918 }, { 166,2918 }, { 167,2918 }, { 168,2918 },+ { 169,2918 }, { 170,2918 }, { 171,2918 }, { 172,2918 }, { 173,2918 },+ { 174,2918 }, { 175,2918 }, { 176,2918 }, { 177,2918 }, { 178,2918 },+ { 179,2918 }, { 180,2918 }, { 181,2918 }, { 182,2918 }, { 183,2918 },+ { 184,2918 }, { 185,2918 }, { 186,2918 }, { 187,2918 }, { 188,2918 },+ { 189,2918 }, { 190,2918 }, { 191,2918 }, { 192,2918 }, { 193,2918 },+ { 194,2918 }, { 195,2918 }, { 196,2918 }, { 197,2918 }, { 198,2918 },+ { 199,2918 }, { 200,2918 }, { 201,2918 }, { 202,2918 }, { 203,2918 },++ { 204,2918 }, { 205,2918 }, { 206,2918 }, { 207,2918 }, { 208,2918 },+ { 209,2918 }, { 210,2918 }, { 211,2918 }, { 212,2918 }, { 213,2918 },+ { 214,2918 }, { 215,2918 }, { 216,2918 }, { 217,2918 }, { 218,2918 },+ { 219,2918 }, { 220,2918 }, { 221,2918 }, { 222,2918 }, { 223,2918 },+ { 224,2918 }, { 225,2918 }, { 226,2918 }, { 227,2918 }, { 228,2918 },+ { 229,2918 }, { 230,2918 }, { 231,2918 }, { 232,2918 }, { 233,2918 },+ { 234,2918 }, { 235,2918 }, { 236,2918 }, { 237,2918 }, { 238,2918 },+ { 239,2918 }, { 240,2918 }, { 241,2918 }, { 242,2918 }, { 243,2918 },+ { 244,2918 }, { 245,2918 }, { 246,2918 }, { 247,2918 }, { 248,2918 },+ { 249,2918 }, { 250,2918 }, { 251,2918 }, { 252,2918 }, { 253,2918 },++ { 254,2918 }, { 255,2918 }, { 0, 53 }, { 0,20797 }, { 1,2918 },+ { 2,2918 }, { 3,2918 }, { 4,2918 }, { 5,2918 }, { 6,2918 },+ { 7,2918 }, { 8,2918 }, { 9,2918 }, { 0, 0 }, { 11,2918 },+ { 12,2918 }, { 0, 0 }, { 14,2918 }, { 15,2918 }, { 16,2918 },+ { 17,2918 }, { 18,2918 }, { 19,2918 }, { 20,2918 }, { 21,2918 },+ { 22,2918 }, { 23,2918 }, { 24,2918 }, { 25,2918 }, { 26,2918 },+ { 27,2918 }, { 28,2918 }, { 29,2918 }, { 30,2918 }, { 31,2918 },+ { 32,2918 }, { 33,2918 }, { 34,2918 }, { 35,2918 }, { 36,2918 },+ { 37,2918 }, { 38,2918 }, { 39,2918 }, { 40,2918 }, { 41,2918 },+ { 42,2918 }, { 43,2918 }, { 44,2918 }, { 45,2918 }, { 46,2918 },++ { 47,2918 }, { 48,2918 }, { 49,2918 }, { 50,2918 }, { 51,2918 },+ { 52,2918 }, { 53,2918 }, { 54,2918 }, { 55,2918 }, { 56,2918 },+ { 57,2918 }, { 58,2918 }, { 59,2918 }, { 60,2918 }, { 61,2918 },+ { 62,2918 }, { 63,2918 }, { 64,2918 }, { 65,2918 }, { 66,2918 },+ { 67,2918 }, { 68,2918 }, { 69,2918 }, { 70,2918 }, { 71,2918 },+ { 72,2918 }, { 73,2918 }, { 74,2918 }, { 75,2918 }, { 76,2918 },+ { 77,2918 }, { 78,2918 }, { 79,2918 }, { 80,2918 }, { 81,2918 },+ { 82,2918 }, { 83,2918 }, { 84,2918 }, { 85,2918 }, { 86,2918 },+ { 87,2918 }, { 88,2918 }, { 89,2918 }, { 90,2918 }, { 91,2918 },+ { 92,2918 }, { 93,2918 }, { 94,2918 }, { 95,2918 }, { 96,2918 },++ { 97,2918 }, { 98,2918 }, { 99,2918 }, { 100,2918 }, { 101,2918 },+ { 102,2918 }, { 103,2918 }, { 104,2918 }, { 105,2918 }, { 106,2918 },+ { 107,2918 }, { 108,2918 }, { 109,2918 }, { 110,2918 }, { 111,2918 },+ { 112,2918 }, { 113,2918 }, { 114,2918 }, { 115,2918 }, { 116,2918 },+ { 117,2918 }, { 118,2918 }, { 119,2918 }, { 120,2918 }, { 121,2918 },+ { 122,2918 }, { 123,2918 }, { 124,2918 }, { 125,2918 }, { 126,2918 },+ { 127,2918 }, { 128,2918 }, { 129,2918 }, { 130,2918 }, { 131,2918 },+ { 132,2918 }, { 133,2918 }, { 134,2918 }, { 135,2918 }, { 136,2918 },+ { 137,2918 }, { 138,2918 }, { 139,2918 }, { 140,2918 }, { 141,2918 },+ { 142,2918 }, { 143,2918 }, { 144,2918 }, { 145,2918 }, { 146,2918 },++ { 147,2918 }, { 148,2918 }, { 149,2918 }, { 150,2918 }, { 151,2918 },+ { 152,2918 }, { 153,2918 }, { 154,2918 }, { 155,2918 }, { 156,2918 },+ { 157,2918 }, { 158,2918 }, { 159,2918 }, { 160,2918 }, { 161,2918 },+ { 162,2918 }, { 163,2918 }, { 164,2918 }, { 165,2918 }, { 166,2918 },+ { 167,2918 }, { 168,2918 }, { 169,2918 }, { 170,2918 }, { 171,2918 },+ { 172,2918 }, { 173,2918 }, { 174,2918 }, { 175,2918 }, { 176,2918 },+ { 177,2918 }, { 178,2918 }, { 179,2918 }, { 180,2918 }, { 181,2918 },+ { 182,2918 }, { 183,2918 }, { 184,2918 }, { 185,2918 }, { 186,2918 },+ { 187,2918 }, { 188,2918 }, { 189,2918 }, { 190,2918 }, { 191,2918 },+ { 192,2918 }, { 193,2918 }, { 194,2918 }, { 195,2918 }, { 196,2918 },++ { 197,2918 }, { 198,2918 }, { 199,2918 }, { 200,2918 }, { 201,2918 },+ { 202,2918 }, { 203,2918 }, { 204,2918 }, { 205,2918 }, { 206,2918 },+ { 207,2918 }, { 208,2918 }, { 209,2918 }, { 210,2918 }, { 211,2918 },+ { 212,2918 }, { 213,2918 }, { 214,2918 }, { 215,2918 }, { 216,2918 },+ { 217,2918 }, { 218,2918 }, { 219,2918 }, { 220,2918 }, { 221,2918 },+ { 222,2918 }, { 223,2918 }, { 224,2918 }, { 225,2918 }, { 226,2918 },+ { 227,2918 }, { 228,2918 }, { 229,2918 }, { 230,2918 }, { 231,2918 },+ { 232,2918 }, { 233,2918 }, { 234,2918 }, { 235,2918 }, { 236,2918 },+ { 237,2918 }, { 238,2918 }, { 239,2918 }, { 240,2918 }, { 241,2918 },+ { 242,2918 }, { 243,2918 }, { 244,2918 }, { 245,2918 }, { 246,2918 },++ { 247,2918 }, { 248,2918 }, { 249,2918 }, { 250,2918 }, { 251,2918 },+ { 252,2918 }, { 253,2918 }, { 254,2918 }, { 255,2918 }, { 256,2918 },+ { 0, 24 }, { 0,20539 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 24 }, { 0,20534 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 9, 0 }, { 10, 5 }, { 0, 0 }, { 12, 0 }, { 13, 5 },+ { 9,2913 }, { 10,2913 }, { 0, 0 }, { 12,2913 }, { 13,2913 },+ { 0, 0 }, { 0, 26 }, { 0,20518 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 9, 0 }, { 10, 0 }, { 32, 0 }, { 12, 0 },+ { 13, 0 }, { 0, 0 }, { 0, 0 }, { 32,2913 }, { 0, 0 },++ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 39,-8925 }, { 45,-8953 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 45,-8861 }, { 0, 0 }, { 0, 0 }, { 32, 0 },+ { 0, 26 }, { 0,20484 }, { 1,3168 }, { 2,3168 }, { 3,3168 },+ { 4,3168 }, { 5,3168 }, { 6,3168 }, { 7,3168 }, { 8,3168 },+ { 9,3168 }, { 0, 0 }, { 11,3168 }, { 12,3168 }, { 0, 0 },+ { 14,3168 }, { 15,3168 }, { 16,3168 }, { 17,3168 }, { 18,3168 },+ { 19,3168 }, { 20,3168 }, { 21,3168 }, { 22,3168 }, { 23,3168 },+ { 24,3168 }, { 25,3168 }, { 26,3168 }, { 27,3168 }, { 28,3168 },+ { 29,3168 }, { 30,3168 }, { 31,3168 }, { 32,3168 }, { 33,3168 },++ { 34,3168 }, { 35,3168 }, { 36,3168 }, { 37,3168 }, { 38,3168 },+ { 39,3168 }, { 40,3168 }, { 41,3168 }, { 42,3168 }, { 43,3168 },+ { 44,3168 }, { 45,3168 }, { 46,3168 }, { 47,3168 }, { 48,3168 },+ { 49,3168 }, { 50,3168 }, { 51,3168 }, { 52,3168 }, { 53,3168 },+ { 54,3168 }, { 55,3168 }, { 56,3168 }, { 57,3168 }, { 58,3168 },+ { 59,3168 }, { 60,3168 }, { 61,3168 }, { 62,3168 }, { 63,3168 },+ { 64,3168 }, { 65,3168 }, { 66,3168 }, { 67,3168 }, { 68,3168 },+ { 69,3168 }, { 70,3168 }, { 71,3168 }, { 72,3168 }, { 73,3168 },+ { 74,3168 }, { 75,3168 }, { 76,3168 }, { 77,3168 }, { 78,3168 },+ { 79,3168 }, { 80,3168 }, { 81,3168 }, { 82,3168 }, { 83,3168 },++ { 84,3168 }, { 85,3168 }, { 86,3168 }, { 87,3168 }, { 88,3168 },+ { 89,3168 }, { 90,3168 }, { 91,3168 }, { 92,3168 }, { 93,3168 },+ { 94,3168 }, { 95,3168 }, { 96,3168 }, { 97,3168 }, { 98,3168 },+ { 99,3168 }, { 100,3168 }, { 101,3168 }, { 102,3168 }, { 103,3168 },+ { 104,3168 }, { 105,3168 }, { 106,3168 }, { 107,3168 }, { 108,3168 },+ { 109,3168 }, { 110,3168 }, { 111,3168 }, { 112,3168 }, { 113,3168 },+ { 114,3168 }, { 115,3168 }, { 116,3168 }, { 117,3168 }, { 118,3168 },+ { 119,3168 }, { 120,3168 }, { 121,3168 }, { 122,3168 }, { 123,3168 },+ { 124,3168 }, { 125,3168 }, { 126,3168 }, { 127,3168 }, { 128,3168 },+ { 129,3168 }, { 130,3168 }, { 131,3168 }, { 132,3168 }, { 133,3168 },++ { 134,3168 }, { 135,3168 }, { 136,3168 }, { 137,3168 }, { 138,3168 },+ { 139,3168 }, { 140,3168 }, { 141,3168 }, { 142,3168 }, { 143,3168 },+ { 144,3168 }, { 145,3168 }, { 146,3168 }, { 147,3168 }, { 148,3168 },+ { 149,3168 }, { 150,3168 }, { 151,3168 }, { 152,3168 }, { 153,3168 },+ { 154,3168 }, { 155,3168 }, { 156,3168 }, { 157,3168 }, { 158,3168 },+ { 159,3168 }, { 160,3168 }, { 161,3168 }, { 162,3168 }, { 163,3168 },+ { 164,3168 }, { 165,3168 }, { 166,3168 }, { 167,3168 }, { 168,3168 },+ { 169,3168 }, { 170,3168 }, { 171,3168 }, { 172,3168 }, { 173,3168 },+ { 174,3168 }, { 175,3168 }, { 176,3168 }, { 177,3168 }, { 178,3168 },+ { 179,3168 }, { 180,3168 }, { 181,3168 }, { 182,3168 }, { 183,3168 },++ { 184,3168 }, { 185,3168 }, { 186,3168 }, { 187,3168 }, { 188,3168 },+ { 189,3168 }, { 190,3168 }, { 191,3168 }, { 192,3168 }, { 193,3168 },+ { 194,3168 }, { 195,3168 }, { 196,3168 }, { 197,3168 }, { 198,3168 },+ { 199,3168 }, { 200,3168 }, { 201,3168 }, { 202,3168 }, { 203,3168 },+ { 204,3168 }, { 205,3168 }, { 206,3168 }, { 207,3168 }, { 208,3168 },+ { 209,3168 }, { 210,3168 }, { 211,3168 }, { 212,3168 }, { 213,3168 },+ { 214,3168 }, { 215,3168 }, { 216,3168 }, { 217,3168 }, { 218,3168 },+ { 219,3168 }, { 220,3168 }, { 221,3168 }, { 222,3168 }, { 223,3168 },+ { 224,3168 }, { 225,3168 }, { 226,3168 }, { 227,3168 }, { 228,3168 },+ { 229,3168 }, { 230,3168 }, { 231,3168 }, { 232,3168 }, { 233,3168 },++ { 234,3168 }, { 235,3168 }, { 236,3168 }, { 237,3168 }, { 238,3168 },+ { 239,3168 }, { 240,3168 }, { 241,3168 }, { 242,3168 }, { 243,3168 },+ { 244,3168 }, { 245,3168 }, { 246,3168 }, { 247,3168 }, { 248,3168 },+ { 249,3168 }, { 250,3168 }, { 251,3168 }, { 252,3168 }, { 253,3168 },+ { 254,3168 }, { 255,3168 }, { 256,3168 }, { 0, 37 }, { 0,20226 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 37 }, { 0,20203 }, { 0, 0 }, { 0, 0 },++ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 48,3168 }, { 49,3168 }, { 50,3168 },+ { 51,3168 }, { 52,3168 }, { 53,3168 }, { 54,3168 }, { 55,3168 },+ { 56,3168 }, { 57,3168 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,3168 },+ { 66,3168 }, { 67,3168 }, { 68,3168 }, { 69,3168 }, { 70,3168 },+ { 48,3168 }, { 49,3168 }, { 50,3168 }, { 51,3168 }, { 52,3168 },++ { 53,3168 }, { 54,3168 }, { 55,3168 }, { 56,3168 }, { 57,3168 },+ { 0, 44 }, { 0,20144 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 65,3168 }, { 66,3168 }, { 67,3168 },+ { 68,3168 }, { 69,3168 }, { 70,3168 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 97,3168 }, { 98,3168 }, { 99,3168 }, { 100,3168 },+ { 101,3168 }, { 102,3168 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 36,-9772 }, { 0, 0 }, { 97,3168 },+ { 98,3168 }, { 99,3168 }, { 100,3168 }, { 101,3168 }, { 102,3168 },++ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48, 0 },+ { 49, 0 }, { 50, 0 }, { 51, 0 }, { 52, 0 }, { 53, 0 },+ { 54, 0 }, { 55, 0 }, { 56, 0 }, { 57, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 65, 0 }, { 66, 0 }, { 67, 0 }, { 68, 0 },+ { 69, 0 }, { 70, 0 }, { 71, 0 }, { 72, 0 }, { 73, 0 },+ { 74, 0 }, { 75, 0 }, { 76, 0 }, { 77, 0 }, { 78, 0 },+ { 79, 0 }, { 80, 0 }, { 81, 0 }, { 82, 0 }, { 83, 0 },+ { 84, 0 }, { 85, 0 }, { 86, 0 }, { 87, 0 }, { 88, 0 },+ { 89, 0 }, { 90, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },++ { 0, 0 }, { 95, 0 }, { 0, 0 }, { 97, 0 }, { 98, 0 },+ { 99, 0 }, { 100, 0 }, { 101, 0 }, { 102, 0 }, { 103, 0 },+ { 104, 0 }, { 105, 0 }, { 106, 0 }, { 107, 0 }, { 108, 0 },+ { 109, 0 }, { 110, 0 }, { 111, 0 }, { 112, 0 }, { 113, 0 },+ { 114, 0 }, { 115, 0 }, { 116, 0 }, { 117, 0 }, { 118, 0 },+ { 119, 0 }, { 120, 0 }, { 121, 0 }, { 122, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 128, 0 },+ { 129, 0 }, { 130, 0 }, { 131, 0 }, { 132, 0 }, { 133, 0 },+ { 134, 0 }, { 135, 0 }, { 136, 0 }, { 137, 0 }, { 138, 0 },+ { 139, 0 }, { 140, 0 }, { 141, 0 }, { 142, 0 }, { 143, 0 },++ { 144, 0 }, { 145, 0 }, { 146, 0 }, { 147, 0 }, { 148, 0 },+ { 149, 0 }, { 150, 0 }, { 151, 0 }, { 152, 0 }, { 153, 0 },+ { 154, 0 }, { 155, 0 }, { 156, 0 }, { 157, 0 }, { 158, 0 },+ { 159, 0 }, { 160, 0 }, { 161, 0 }, { 162, 0 }, { 163, 0 },+ { 164, 0 }, { 165, 0 }, { 166, 0 }, { 167, 0 }, { 168, 0 },+ { 169, 0 }, { 170, 0 }, { 171, 0 }, { 172, 0 }, { 173, 0 },+ { 174, 0 }, { 175, 0 }, { 176, 0 }, { 177, 0 }, { 178, 0 },+ { 179, 0 }, { 180, 0 }, { 181, 0 }, { 182, 0 }, { 183, 0 },+ { 184, 0 }, { 185, 0 }, { 186, 0 }, { 187, 0 }, { 188, 0 },+ { 189, 0 }, { 190, 0 }, { 191, 0 }, { 192, 0 }, { 193, 0 },++ { 194, 0 }, { 195, 0 }, { 196, 0 }, { 197, 0 }, { 198, 0 },+ { 199, 0 }, { 200, 0 }, { 201, 0 }, { 202, 0 }, { 203, 0 },+ { 204, 0 }, { 205, 0 }, { 206, 0 }, { 207, 0 }, { 208, 0 },+ { 209, 0 }, { 210, 0 }, { 211, 0 }, { 212, 0 }, { 213, 0 },+ { 214, 0 }, { 215, 0 }, { 216, 0 }, { 217, 0 }, { 218, 0 },+ { 219, 0 }, { 220, 0 }, { 221, 0 }, { 222, 0 }, { 223, 0 },+ { 224, 0 }, { 225, 0 }, { 226, 0 }, { 227, 0 }, { 228, 0 },+ { 229, 0 }, { 230, 0 }, { 231, 0 }, { 232, 0 }, { 233, 0 },+ { 234, 0 }, { 235, 0 }, { 236, 0 }, { 237, 0 }, { 238, 0 },+ { 239, 0 }, { 240, 0 }, { 241, 0 }, { 242, 0 }, { 243, 0 },++ { 244, 0 }, { 245, 0 }, { 246, 0 }, { 247, 0 }, { 248, 0 },+ { 249, 0 }, { 250, 0 }, { 251, 0 }, { 252, 0 }, { 253, 0 },+ { 254, 0 }, { 255, 0 }, { 0, 1 }, { 0,19887 }, { 1, 0 },+ { 2, 0 }, { 3, 0 }, { 4, 0 }, { 5, 0 }, { 6, 0 },+ { 7, 0 }, { 8, 0 }, { 9, 0 }, { 0, 0 }, { 11, 0 },+ { 12, 0 }, { 0, 0 }, { 14, 0 }, { 15, 0 }, { 16, 0 },+ { 17, 0 }, { 18, 0 }, { 19, 0 }, { 20, 0 }, { 21, 0 },+ { 22, 0 }, { 23, 0 }, { 24, 0 }, { 25, 0 }, { 26, 0 },+ { 27, 0 }, { 28, 0 }, { 29, 0 }, { 30, 0 }, { 31, 0 },+ { 32, 0 }, { 33, 0 }, { 34, 0 }, { 35, 0 }, { 36, 0 },++ { 37, 0 }, { 38, 0 }, { 39, 0 }, { 40, 0 }, { 41, 0 },+ { 42, 0 }, { 43, 0 }, { 44, 0 }, { 45, 0 }, { 46, 0 },+ { 47, 0 }, { 48, 0 }, { 49, 0 }, { 50, 0 }, { 51, 0 },+ { 52, 0 }, { 53, 0 }, { 54, 0 }, { 55, 0 }, { 56, 0 },+ { 57, 0 }, { 58, 0 }, { 59, 0 }, { 60, 0 }, { 61, 0 },+ { 62, 0 }, { 63, 0 }, { 64, 0 }, { 65, 0 }, { 66, 0 },+ { 67, 0 }, { 68, 0 }, { 69, 0 }, { 70, 0 }, { 71, 0 },+ { 72, 0 }, { 73, 0 }, { 74, 0 }, { 75, 0 }, { 76, 0 },+ { 77, 0 }, { 78, 0 }, { 79, 0 }, { 80, 0 }, { 81, 0 },+ { 82, 0 }, { 83, 0 }, { 84, 0 }, { 85, 0 }, { 86, 0 },++ { 87, 0 }, { 88, 0 }, { 89, 0 }, { 90, 0 }, { 91, 0 },+ { 92, 0 }, { 93, 0 }, { 94, 0 }, { 95, 0 }, { 96, 0 },+ { 97, 0 }, { 98, 0 }, { 99, 0 }, { 100, 0 }, { 101, 0 },+ { 102, 0 }, { 103, 0 }, { 104, 0 }, { 105, 0 }, { 106, 0 },+ { 107, 0 }, { 108, 0 }, { 109, 0 }, { 110, 0 }, { 111, 0 },+ { 112, 0 }, { 113, 0 }, { 114, 0 }, { 115, 0 }, { 116, 0 },+ { 117, 0 }, { 118, 0 }, { 119, 0 }, { 120, 0 }, { 121, 0 },+ { 122, 0 }, { 123, 0 }, { 124, 0 }, { 125, 0 }, { 126, 0 },+ { 127, 0 }, { 128, 0 }, { 129, 0 }, { 130, 0 }, { 131, 0 },+ { 132, 0 }, { 133, 0 }, { 134, 0 }, { 135, 0 }, { 136, 0 },++ { 137, 0 }, { 138, 0 }, { 139, 0 }, { 140, 0 }, { 141, 0 },+ { 142, 0 }, { 143, 0 }, { 144, 0 }, { 145, 0 }, { 146, 0 },+ { 147, 0 }, { 148, 0 }, { 149, 0 }, { 150, 0 }, { 151, 0 },+ { 152, 0 }, { 153, 0 }, { 154, 0 }, { 155, 0 }, { 156, 0 },+ { 157, 0 }, { 158, 0 }, { 159, 0 }, { 160, 0 }, { 161, 0 },+ { 162, 0 }, { 163, 0 }, { 164, 0 }, { 165, 0 }, { 166, 0 },+ { 167, 0 }, { 168, 0 }, { 169, 0 }, { 170, 0 }, { 171, 0 },+ { 172, 0 }, { 173, 0 }, { 174, 0 }, { 175, 0 }, { 176, 0 },+ { 177, 0 }, { 178, 0 }, { 179, 0 }, { 180, 0 }, { 181, 0 },+ { 182, 0 }, { 183, 0 }, { 184, 0 }, { 185, 0 }, { 186, 0 },++ { 187, 0 }, { 188, 0 }, { 189, 0 }, { 190, 0 }, { 191, 0 },+ { 192, 0 }, { 193, 0 }, { 194, 0 }, { 195, 0 }, { 196, 0 },+ { 197, 0 }, { 198, 0 }, { 199, 0 }, { 200, 0 }, { 201, 0 },+ { 202, 0 }, { 203, 0 }, { 204, 0 }, { 205, 0 }, { 206, 0 },+ { 207, 0 }, { 208, 0 }, { 209, 0 }, { 210, 0 }, { 211, 0 },+ { 212, 0 }, { 213, 0 }, { 214, 0 }, { 215, 0 }, { 216, 0 },+ { 217, 0 }, { 218, 0 }, { 219, 0 }, { 220, 0 }, { 221, 0 },+ { 222, 0 }, { 223, 0 }, { 224, 0 }, { 225, 0 }, { 226, 0 },+ { 227, 0 }, { 228, 0 }, { 229, 0 }, { 230, 0 }, { 231, 0 },+ { 232, 0 }, { 233, 0 }, { 234, 0 }, { 235, 0 }, { 236, 0 },++ { 237, 0 }, { 238, 0 }, { 239, 0 }, { 240, 0 }, { 241, 0 },+ { 242, 0 }, { 243, 0 }, { 244, 0 }, { 245, 0 }, { 246, 0 },+ { 247, 0 }, { 248, 0 }, { 249, 0 }, { 250, 0 }, { 251, 0 },+ { 252, 0 }, { 253, 0 }, { 254, 0 }, { 255, 0 }, { 256, 0 },+ { 0, 1 }, { 0,19629 }, { 1,-258 }, { 2,-258 }, { 3,-258 },+ { 4,-258 }, { 5,-258 }, { 6,-258 }, { 7,-258 }, { 8,-258 },+ { 9,-258 }, { 0, 0 }, { 11,-258 }, { 12,-258 }, { 0, 0 },+ { 14,-258 }, { 15,-258 }, { 16,-258 }, { 17,-258 }, { 18,-258 },+ { 19,-258 }, { 20,-258 }, { 21,-258 }, { 22,-258 }, { 23,-258 },+ { 24,-258 }, { 25,-258 }, { 26,-258 }, { 27,-258 }, { 28,-258 },++ { 29,-258 }, { 30,-258 }, { 31,-258 }, { 32,-258 }, { 33, 0 },+ { 34,-258 }, { 35, 0 }, { 36,-258 }, { 37, 0 }, { 38, 0 },+ { 39,-258 }, { 40,-258 }, { 41,-258 }, { 42, 0 }, { 43, 0 },+ { 44,-258 }, { 45, 0 }, { 46,-258 }, { 47, 0 }, { 48,-258 },+ { 49,-258 }, { 50,-258 }, { 51,-258 }, { 52,-258 }, { 53,-258 },+ { 54,-258 }, { 55,-258 }, { 56,-258 }, { 57,-258 }, { 58,-258 },+ { 59,-258 }, { 60, 0 }, { 61, 0 }, { 62, 0 }, { 63, 0 },+ { 64, 0 }, { 65,-258 }, { 66,-258 }, { 67,-258 }, { 68,-258 },+ { 69,-258 }, { 70,-258 }, { 71,-258 }, { 72,-258 }, { 73,-258 },+ { 74,-258 }, { 75,-258 }, { 76,-258 }, { 77,-258 }, { 78,-258 },++ { 79,-258 }, { 80,-258 }, { 81,-258 }, { 82,-258 }, { 83,-258 },+ { 84,-258 }, { 85,-258 }, { 86,-258 }, { 87,-258 }, { 88,-258 },+ { 89,-258 }, { 90,-258 }, { 91,-258 }, { 92,-258 }, { 93,-258 },+ { 94, 0 }, { 95,-258 }, { 96, 0 }, { 97,-258 }, { 98,-258 },+ { 99,-258 }, { 100,-258 }, { 101,-258 }, { 102,-258 }, { 103,-258 },+ { 104,-258 }, { 105,-258 }, { 106,-258 }, { 107,-258 }, { 108,-258 },+ { 109,-258 }, { 110,-258 }, { 111,-258 }, { 112,-258 }, { 113,-258 },+ { 114,-258 }, { 115,-258 }, { 116,-258 }, { 117,-258 }, { 118,-258 },+ { 119,-258 }, { 120,-258 }, { 121,-258 }, { 122,-258 }, { 123,-258 },+ { 124, 0 }, { 125,-258 }, { 126, 0 }, { 127,-258 }, { 128,-258 },++ { 129,-258 }, { 130,-258 }, { 131,-258 }, { 132,-258 }, { 133,-258 },+ { 134,-258 }, { 135,-258 }, { 136,-258 }, { 137,-258 }, { 138,-258 },+ { 139,-258 }, { 140,-258 }, { 141,-258 }, { 142,-258 }, { 143,-258 },+ { 144,-258 }, { 145,-258 }, { 146,-258 }, { 147,-258 }, { 148,-258 },+ { 149,-258 }, { 150,-258 }, { 151,-258 }, { 152,-258 }, { 153,-258 },+ { 154,-258 }, { 155,-258 }, { 156,-258 }, { 157,-258 }, { 158,-258 },+ { 159,-258 }, { 160,-258 }, { 161,-258 }, { 162,-258 }, { 163,-258 },+ { 164,-258 }, { 165,-258 }, { 166,-258 }, { 167,-258 }, { 168,-258 },+ { 169,-258 }, { 170,-258 }, { 171,-258 }, { 172,-258 }, { 173,-258 },+ { 174,-258 }, { 175,-258 }, { 176,-258 }, { 177,-258 }, { 178,-258 },++ { 179,-258 }, { 180,-258 }, { 181,-258 }, { 182,-258 }, { 183,-258 },+ { 184,-258 }, { 185,-258 }, { 186,-258 }, { 187,-258 }, { 188,-258 },+ { 189,-258 }, { 190,-258 }, { 191,-258 }, { 192,-258 }, { 193,-258 },+ { 194,-258 }, { 195,-258 }, { 196,-258 }, { 197,-258 }, { 198,-258 },+ { 199,-258 }, { 200,-258 }, { 201,-258 }, { 202,-258 }, { 203,-258 },+ { 204,-258 }, { 205,-258 }, { 206,-258 }, { 207,-258 }, { 208,-258 },+ { 209,-258 }, { 210,-258 }, { 211,-258 }, { 212,-258 }, { 213,-258 },+ { 214,-258 }, { 215,-258 }, { 216,-258 }, { 217,-258 }, { 218,-258 },+ { 219,-258 }, { 220,-258 }, { 221,-258 }, { 222,-258 }, { 223,-258 },+ { 224,-258 }, { 225,-258 }, { 226,-258 }, { 227,-258 }, { 228,-258 },++ { 229,-258 }, { 230,-258 }, { 231,-258 }, { 232,-258 }, { 233,-258 },+ { 234,-258 }, { 235,-258 }, { 236,-258 }, { 237,-258 }, { 238,-258 },+ { 239,-258 }, { 240,-258 }, { 241,-258 }, { 242,-258 }, { 243,-258 },+ { 244,-258 }, { 245,-258 }, { 246,-258 }, { 247,-258 }, { 248,-258 },+ { 249,-258 }, { 250,-258 }, { 251,-258 }, { 252,-258 }, { 253,-258 },+ { 254,-258 }, { 255,-258 }, { 256,-258 }, { 0, 2 }, { 0,19371 },+ { 0, 73 }, { 0,19369 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },++ { 0, 0 }, { 0, 0 }, { 0, 77 }, { 0,19347 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 33, 0 }, { 0, 0 }, { 35, 0 },+ { 0, 0 }, { 37, 0 }, { 38, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 42, 0 }, { 43, 0 }, { 0, 0 }, { 45, 0 },+ { 0, 0 }, { 47, 0 }, { 0, 0 }, { 0, 0 }, { 48, 0 },+ { 49, 0 }, { 50, 0 }, { 51, 0 }, { 52, 0 }, { 53, 0 },+ { 54, 0 }, { 55, 0 }, { 56, 0 }, { 57, 0 }, { 60, 0 },+ { 61, 0 }, { 62, 0 }, { 63, 0 }, { 64, 0 }, { 0, 75 },+ { 0,19305 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },++ { 69,-4404 }, { 48, 42 }, { 49, 42 }, { 50, 42 }, { 51, 42 },+ { 52, 42 }, { 53, 42 }, { 54, 42 }, { 55, 42 }, { 56, 42 },+ { 57, 42 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 94, 0 }, { 0, 0 },+ { 96, 0 }, { 0, 9 }, { 0,19273 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 101,-4404 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 9, 0 }, { 10, 0 }, { 0, 0 }, { 12, 0 },+ { 13, 0 }, { 0, 0 }, { 0, 0 }, { 48, 0 }, { 49, 0 },+ { 50, 0 }, { 51, 0 }, { 52, 0 }, { 53, 0 }, { 54, 0 },++ { 55, 0 }, { 56, 0 }, { 57, 0 }, { 124, 0 }, { 0, 0 },+ { 126, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 32, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 39,-10204 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 45,-10202 }, { 0, 9 }, { 0,19226 },+ { 1,2553 }, { 2,2553 }, { 3,2553 }, { 4,2553 }, { 5,2553 },+ { 6,2553 }, { 7,2553 }, { 8,2553 }, { 9,2811 }, { 10,-3788 },+ { 11,2553 }, { 12,2811 }, { 13,-3788 }, { 14,2553 }, { 15,2553 },+ { 16,2553 }, { 17,2553 }, { 18,2553 }, { 19,2553 }, { 20,2553 },+ { 21,2553 }, { 22,2553 }, { 23,2553 }, { 24,2553 }, { 25,2553 },++ { 26,2553 }, { 27,2553 }, { 28,2553 }, { 29,2553 }, { 30,2553 },+ { 31,2553 }, { 32,2811 }, { 33,2553 }, { 34,2553 }, { 35,2553 },+ { 36,2553 }, { 37,2553 }, { 38,2553 }, { 39,2553 }, { 40,2553 },+ { 41,2553 }, { 42,2553 }, { 43,2553 }, { 44,2553 }, { 45,3069 },+ { 46,2553 }, { 47,2553 }, { 48,2553 }, { 49,2553 }, { 50,2553 },+ { 51,2553 }, { 52,2553 }, { 53,2553 }, { 54,2553 }, { 55,2553 },+ { 56,2553 }, { 57,2553 }, { 58,2553 }, { 59,2553 }, { 60,2553 },+ { 61,2553 }, { 62,2553 }, { 63,2553 }, { 64,2553 }, { 65,2553 },+ { 66,2553 }, { 67,2553 }, { 68,2553 }, { 69,2553 }, { 70,2553 },+ { 71,2553 }, { 72,2553 }, { 73,2553 }, { 74,2553 }, { 75,2553 },++ { 76,2553 }, { 77,2553 }, { 78,2553 }, { 79,2553 }, { 80,2553 },+ { 81,2553 }, { 82,2553 }, { 83,2553 }, { 84,2553 }, { 85,2553 },+ { 86,2553 }, { 87,2553 }, { 88,2553 }, { 89,2553 }, { 90,2553 },+ { 91,2553 }, { 92,2553 }, { 93,2553 }, { 94,2553 }, { 95,2553 },+ { 96,2553 }, { 97,2553 }, { 98,2553 }, { 99,2553 }, { 100,2553 },+ { 101,2553 }, { 102,2553 }, { 103,2553 }, { 104,2553 }, { 105,2553 },+ { 106,2553 }, { 107,2553 }, { 108,2553 }, { 109,2553 }, { 110,2553 },+ { 111,2553 }, { 112,2553 }, { 113,2553 }, { 114,2553 }, { 115,2553 },+ { 116,2553 }, { 117,2553 }, { 118,2553 }, { 119,2553 }, { 120,2553 },+ { 121,2553 }, { 122,2553 }, { 123,2553 }, { 124,2553 }, { 125,2553 },++ { 126,2553 }, { 127,2553 }, { 128,2553 }, { 129,2553 }, { 130,2553 },+ { 131,2553 }, { 132,2553 }, { 133,2553 }, { 134,2553 }, { 135,2553 },+ { 136,2553 }, { 137,2553 }, { 138,2553 }, { 139,2553 }, { 140,2553 },+ { 141,2553 }, { 142,2553 }, { 143,2553 }, { 144,2553 }, { 145,2553 },+ { 146,2553 }, { 147,2553 }, { 148,2553 }, { 149,2553 }, { 150,2553 },+ { 151,2553 }, { 152,2553 }, { 153,2553 }, { 154,2553 }, { 155,2553 },+ { 156,2553 }, { 157,2553 }, { 158,2553 }, { 159,2553 }, { 160,2553 },+ { 161,2553 }, { 162,2553 }, { 163,2553 }, { 164,2553 }, { 165,2553 },+ { 166,2553 }, { 167,2553 }, { 168,2553 }, { 169,2553 }, { 170,2553 },+ { 171,2553 }, { 172,2553 }, { 173,2553 }, { 174,2553 }, { 175,2553 },++ { 176,2553 }, { 177,2553 }, { 178,2553 }, { 179,2553 }, { 180,2553 },+ { 181,2553 }, { 182,2553 }, { 183,2553 }, { 184,2553 }, { 185,2553 },+ { 186,2553 }, { 187,2553 }, { 188,2553 }, { 189,2553 }, { 190,2553 },+ { 191,2553 }, { 192,2553 }, { 193,2553 }, { 194,2553 }, { 195,2553 },+ { 196,2553 }, { 197,2553 }, { 198,2553 }, { 199,2553 }, { 200,2553 },+ { 201,2553 }, { 202,2553 }, { 203,2553 }, { 204,2553 }, { 205,2553 },+ { 206,2553 }, { 207,2553 }, { 208,2553 }, { 209,2553 }, { 210,2553 },+ { 211,2553 }, { 212,2553 }, { 213,2553 }, { 214,2553 }, { 215,2553 },+ { 216,2553 }, { 217,2553 }, { 218,2553 }, { 219,2553 }, { 220,2553 },+ { 221,2553 }, { 222,2553 }, { 223,2553 }, { 224,2553 }, { 225,2553 },++ { 226,2553 }, { 227,2553 }, { 228,2553 }, { 229,2553 }, { 230,2553 },+ { 231,2553 }, { 232,2553 }, { 233,2553 }, { 234,2553 }, { 235,2553 },+ { 236,2553 }, { 237,2553 }, { 238,2553 }, { 239,2553 }, { 240,2553 },+ { 241,2553 }, { 242,2553 }, { 243,2553 }, { 244,2553 }, { 245,2553 },+ { 246,2553 }, { 247,2553 }, { 248,2553 }, { 249,2553 }, { 250,2553 },+ { 251,2553 }, { 252,2553 }, { 253,2553 }, { 254,2553 }, { 255,2553 },+ { 256,2553 }, { 0, 3 }, { 0,18968 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 16 }, { 0,18961 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 9, 0 }, { 10, 0 },++ { 0, 0 }, { 12, 0 }, { 13, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 33, 0 }, { 0, 0 }, { 35, 0 }, { 0, 0 }, { 37, 0 },+ { 38, 0 }, { 32, 0 }, { 0, 0 }, { 0, 0 }, { 42, 0 },+ { 43, 0 }, { 0, 0 }, { 45, 0 }, { 39,-10512 }, { 47, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 45,-10507 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 60, 0 }, { 61, 0 }, { 62, 0 },+ { 63, 0 }, { 64, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },++ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 94, 0 }, { 0, 0 }, { 96, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },++ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 124, 0 }, { 0, 0 }, { 126, 0 }, { 0, 16 },+ { 0,18840 }, { 1,3199 }, { 2,3199 }, { 3,3199 }, { 4,3199 },+ { 5,3199 }, { 6,3199 }, { 7,3199 }, { 8,3199 }, { 9,3457 },+ { 10,-3220 }, { 11,3199 }, { 12,3457 }, { 13,-3220 }, { 14,3199 },+ { 15,3199 }, { 16,3199 }, { 17,3199 }, { 18,3199 }, { 19,3199 },+ { 20,3199 }, { 21,3199 }, { 22,3199 }, { 23,3199 }, { 24,3199 },+ { 25,3199 }, { 26,3199 }, { 27,3199 }, { 28,3199 }, { 29,3199 },+ { 30,3199 }, { 31,3199 }, { 32,3457 }, { 33,3199 }, { 34,3199 },+ { 35,3199 }, { 36,3199 }, { 37,3199 }, { 38,3199 }, { 39,3199 },++ { 40,3199 }, { 41,3199 }, { 42,3199 }, { 43,3199 }, { 44,3199 },+ { 45,3715 }, { 46,3199 }, { 47,3199 }, { 48,3199 }, { 49,3199 },+ { 50,3199 }, { 51,3199 }, { 52,3199 }, { 53,3199 }, { 54,3199 },+ { 55,3199 }, { 56,3199 }, { 57,3199 }, { 58,3199 }, { 59,3199 },+ { 60,3199 }, { 61,3199 }, { 62,3199 }, { 63,3199 }, { 64,3199 },+ { 65,3199 }, { 66,3199 }, { 67,3199 }, { 68,3199 }, { 69,3199 },+ { 70,3199 }, { 71,3199 }, { 72,3199 }, { 73,3199 }, { 74,3199 },+ { 75,3199 }, { 76,3199 }, { 77,3199 }, { 78,3199 }, { 79,3199 },+ { 80,3199 }, { 81,3199 }, { 82,3199 }, { 83,3199 }, { 84,3199 },+ { 85,3199 }, { 86,3199 }, { 87,3199 }, { 88,3199 }, { 89,3199 },++ { 90,3199 }, { 91,3199 }, { 92,3199 }, { 93,3199 }, { 94,3199 },+ { 95,3199 }, { 96,3199 }, { 97,3199 }, { 98,3199 }, { 99,3199 },+ { 100,3199 }, { 101,3199 }, { 102,3199 }, { 103,3199 }, { 104,3199 },+ { 105,3199 }, { 106,3199 }, { 107,3199 }, { 108,3199 }, { 109,3199 },+ { 110,3199 }, { 111,3199 }, { 112,3199 }, { 113,3199 }, { 114,3199 },+ { 115,3199 }, { 116,3199 }, { 117,3199 }, { 118,3199 }, { 119,3199 },+ { 120,3199 }, { 121,3199 }, { 122,3199 }, { 123,3199 }, { 124,3199 },+ { 125,3199 }, { 126,3199 }, { 127,3199 }, { 128,3199 }, { 129,3199 },+ { 130,3199 }, { 131,3199 }, { 132,3199 }, { 133,3199 }, { 134,3199 },+ { 135,3199 }, { 136,3199 }, { 137,3199 }, { 138,3199 }, { 139,3199 },++ { 140,3199 }, { 141,3199 }, { 142,3199 }, { 143,3199 }, { 144,3199 },+ { 145,3199 }, { 146,3199 }, { 147,3199 }, { 148,3199 }, { 149,3199 },+ { 150,3199 }, { 151,3199 }, { 152,3199 }, { 153,3199 }, { 154,3199 },+ { 155,3199 }, { 156,3199 }, { 157,3199 }, { 158,3199 }, { 159,3199 },+ { 160,3199 }, { 161,3199 }, { 162,3199 }, { 163,3199 }, { 164,3199 },+ { 165,3199 }, { 166,3199 }, { 167,3199 }, { 168,3199 }, { 169,3199 },+ { 170,3199 }, { 171,3199 }, { 172,3199 }, { 173,3199 }, { 174,3199 },+ { 175,3199 }, { 176,3199 }, { 177,3199 }, { 178,3199 }, { 179,3199 },+ { 180,3199 }, { 181,3199 }, { 182,3199 }, { 183,3199 }, { 184,3199 },+ { 185,3199 }, { 186,3199 }, { 187,3199 }, { 188,3199 }, { 189,3199 },++ { 190,3199 }, { 191,3199 }, { 192,3199 }, { 193,3199 }, { 194,3199 },+ { 195,3199 }, { 196,3199 }, { 197,3199 }, { 198,3199 }, { 199,3199 },+ { 200,3199 }, { 201,3199 }, { 202,3199 }, { 203,3199 }, { 204,3199 },+ { 205,3199 }, { 206,3199 }, { 207,3199 }, { 208,3199 }, { 209,3199 },+ { 210,3199 }, { 211,3199 }, { 212,3199 }, { 213,3199 }, { 214,3199 },+ { 215,3199 }, { 216,3199 }, { 217,3199 }, { 218,3199 }, { 219,3199 },+ { 220,3199 }, { 221,3199 }, { 222,3199 }, { 223,3199 }, { 224,3199 },+ { 225,3199 }, { 226,3199 }, { 227,3199 }, { 228,3199 }, { 229,3199 },+ { 230,3199 }, { 231,3199 }, { 232,3199 }, { 233,3199 }, { 234,3199 },+ { 235,3199 }, { 236,3199 }, { 237,3199 }, { 238,3199 }, { 239,3199 },++ { 240,3199 }, { 241,3199 }, { 242,3199 }, { 243,3199 }, { 244,3199 },+ { 245,3199 }, { 246,3199 }, { 247,3199 }, { 248,3199 }, { 249,3199 },+ { 250,3199 }, { 251,3199 }, { 252,3199 }, { 253,3199 }, { 254,3199 },+ { 255,3199 }, { 256,3199 }, { 0, 22 }, { 0,18582 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 9, 0 }, { 10, 0 }, { 0, 0 },+ { 12, 0 }, { 13, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },++ { 32, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 39,-10877 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 45,-10850 }, { 0, 22 },+ { 0,18535 }, { 1,3926 }, { 2,3926 }, { 3,3926 }, { 4,3926 },+ { 5,3926 }, { 6,3926 }, { 7,3926 }, { 8,3926 }, { 9,4184 },+ { 10,-3215 }, { 11,3926 }, { 12,4184 }, { 13,-3215 }, { 14,3926 },+ { 15,3926 }, { 16,3926 }, { 17,3926 }, { 18,3926 }, { 19,3926 },+ { 20,3926 }, { 21,3926 }, { 22,3926 }, { 23,3926 }, { 24,3926 },+ { 25,3926 }, { 26,3926 }, { 27,3926 }, { 28,3926 }, { 29,3926 },+ { 30,3926 }, { 31,3926 }, { 32,4184 }, { 33,3926 }, { 34,3926 },++ { 35,3926 }, { 36,3926 }, { 37,3926 }, { 38,3926 }, { 39,3926 },+ { 40,3926 }, { 41,3926 }, { 42,3926 }, { 43,3926 }, { 44,3926 },+ { 45,4442 }, { 46,3926 }, { 47,3926 }, { 48,3926 }, { 49,3926 },+ { 50,3926 }, { 51,3926 }, { 52,3926 }, { 53,3926 }, { 54,3926 },+ { 55,3926 }, { 56,3926 }, { 57,3926 }, { 58,3926 }, { 59,3926 },+ { 60,3926 }, { 61,3926 }, { 62,3926 }, { 63,3926 }, { 64,3926 },+ { 65,3926 }, { 66,3926 }, { 67,3926 }, { 68,3926 }, { 69,3926 },+ { 70,3926 }, { 71,3926 }, { 72,3926 }, { 73,3926 }, { 74,3926 },+ { 75,3926 }, { 76,3926 }, { 77,3926 }, { 78,3926 }, { 79,3926 },+ { 80,3926 }, { 81,3926 }, { 82,3926 }, { 83,3926 }, { 84,3926 },++ { 85,3926 }, { 86,3926 }, { 87,3926 }, { 88,3926 }, { 89,3926 },+ { 90,3926 }, { 91,3926 }, { 92,3926 }, { 93,3926 }, { 94,3926 },+ { 95,3926 }, { 96,3926 }, { 97,3926 }, { 98,3926 }, { 99,3926 },+ { 100,3926 }, { 101,3926 }, { 102,3926 }, { 103,3926 }, { 104,3926 },+ { 105,3926 }, { 106,3926 }, { 107,3926 }, { 108,3926 }, { 109,3926 },+ { 110,3926 }, { 111,3926 }, { 112,3926 }, { 113,3926 }, { 114,3926 },+ { 115,3926 }, { 116,3926 }, { 117,3926 }, { 118,3926 }, { 119,3926 },+ { 120,3926 }, { 121,3926 }, { 122,3926 }, { 123,3926 }, { 124,3926 },+ { 125,3926 }, { 126,3926 }, { 127,3926 }, { 128,3926 }, { 129,3926 },+ { 130,3926 }, { 131,3926 }, { 132,3926 }, { 133,3926 }, { 134,3926 },++ { 135,3926 }, { 136,3926 }, { 137,3926 }, { 138,3926 }, { 139,3926 },+ { 140,3926 }, { 141,3926 }, { 142,3926 }, { 143,3926 }, { 144,3926 },+ { 145,3926 }, { 146,3926 }, { 147,3926 }, { 148,3926 }, { 149,3926 },+ { 150,3926 }, { 151,3926 }, { 152,3926 }, { 153,3926 }, { 154,3926 },+ { 155,3926 }, { 156,3926 }, { 157,3926 }, { 158,3926 }, { 159,3926 },+ { 160,3926 }, { 161,3926 }, { 162,3926 }, { 163,3926 }, { 164,3926 },+ { 165,3926 }, { 166,3926 }, { 167,3926 }, { 168,3926 }, { 169,3926 },+ { 170,3926 }, { 171,3926 }, { 172,3926 }, { 173,3926 }, { 174,3926 },+ { 175,3926 }, { 176,3926 }, { 177,3926 }, { 178,3926 }, { 179,3926 },+ { 180,3926 }, { 181,3926 }, { 182,3926 }, { 183,3926 }, { 184,3926 },++ { 185,3926 }, { 186,3926 }, { 187,3926 }, { 188,3926 }, { 189,3926 },+ { 190,3926 }, { 191,3926 }, { 192,3926 }, { 193,3926 }, { 194,3926 },+ { 195,3926 }, { 196,3926 }, { 197,3926 }, { 198,3926 }, { 199,3926 },+ { 200,3926 }, { 201,3926 }, { 202,3926 }, { 203,3926 }, { 204,3926 },+ { 205,3926 }, { 206,3926 }, { 207,3926 }, { 208,3926 }, { 209,3926 },+ { 210,3926 }, { 211,3926 }, { 212,3926 }, { 213,3926 }, { 214,3926 },+ { 215,3926 }, { 216,3926 }, { 217,3926 }, { 218,3926 }, { 219,3926 },+ { 220,3926 }, { 221,3926 }, { 222,3926 }, { 223,3926 }, { 224,3926 },+ { 225,3926 }, { 226,3926 }, { 227,3926 }, { 228,3926 }, { 229,3926 },+ { 230,3926 }, { 231,3926 }, { 232,3926 }, { 233,3926 }, { 234,3926 },++ { 235,3926 }, { 236,3926 }, { 237,3926 }, { 238,3926 }, { 239,3926 },+ { 240,3926 }, { 241,3926 }, { 242,3926 }, { 243,3926 }, { 244,3926 },+ { 245,3926 }, { 246,3926 }, { 247,3926 }, { 248,3926 }, { 249,3926 },+ { 250,3926 }, { 251,3926 }, { 252,3926 }, { 253,3926 }, { 254,3926 },+ { 255,3926 }, { 256,3926 }, { 0, 39 }, { 0,18277 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 37 }, { 0,18269 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },++ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 37 }, { 0,18246 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 48,-10829 }, { 49,-10829 }, { 50,-10829 }, { 51,-10829 },+ { 52,-10829 }, { 53,-10829 }, { 54,-10829 }, { 55,-10829 }, { 48,4434 },+ { 49,4434 }, { 50,4434 }, { 51,4434 }, { 52,4434 }, { 53,4434 },+ { 54,4434 }, { 55,4434 }, { 56,4434 }, { 57,4434 }, { 0, 0 },+ { 0, 0 }, { 0, 40 }, { 0,18208 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 65,4434 }, { 66,4434 }, { 67,4434 }, { 68,4434 },++ { 69,4434 }, { 70,4434 }, { 48,4434 }, { 49,4434 }, { 50,4434 },+ { 51,4434 }, { 52,4434 }, { 53,4434 }, { 54,4434 }, { 55,4434 },+ { 56,4434 }, { 57,4434 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,4434 },+ { 66,4434 }, { 67,4434 }, { 68,4434 }, { 69,4434 }, { 70,4434 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 97,4434 }, { 98,4434 },+ { 99,4434 }, { 100,4434 }, { 101,4434 }, { 102,4434 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 48,-10896 }, { 49,-10896 }, { 50,-10896 }, { 51,-10896 }, { 52,-10896 },+ { 53,-10896 }, { 54,-10896 }, { 55,-10896 }, { 56,-10896 }, { 57,-10896 },++ { 0, 0 }, { 97,4434 }, { 98,4434 }, { 99,4434 }, { 100,4434 },+ { 101,4434 }, { 102,4434 }, { 65,-10896 }, { 66,-10896 }, { 67,-10896 },+ { 68,-10896 }, { 69,-10896 }, { 70,-10896 }, { 0, 47 }, { 0,18136 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 97,-10896 },+ { 98,-10896 }, { 99,-10896 }, { 100,-10896 }, { 101,-10896 }, { 102,-10896 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },++ { 36,-11399 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 48, 0 }, { 49, 0 }, { 50, 0 },+ { 51, 0 }, { 52, 0 }, { 53, 0 }, { 54, 0 }, { 55, 0 },+ { 56, 0 }, { 57, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65, 0 },+ { 66, 0 }, { 67, 0 }, { 68, 0 }, { 69, 0 }, { 70, 0 },+ { 71, 0 }, { 72, 0 }, { 73, 0 }, { 74, 0 }, { 75, 0 },+ { 76, 0 }, { 77, 0 }, { 78, 0 }, { 79, 0 }, { 80, 0 },+ { 81, 0 }, { 82, 0 }, { 83, 0 }, { 84, 0 }, { 85, 0 },++ { 86, 0 }, { 87, 0 }, { 88, 0 }, { 89, 0 }, { 90, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 95, 0 },+ { 0, 0 }, { 97, 0 }, { 98, 0 }, { 99, 0 }, { 100, 0 },+ { 101, 0 }, { 102, 0 }, { 103, 0 }, { 104, 0 }, { 105, 0 },+ { 106, 0 }, { 107, 0 }, { 108, 0 }, { 109, 0 }, { 110, 0 },+ { 111, 0 }, { 112, 0 }, { 113, 0 }, { 114, 0 }, { 115, 0 },+ { 116, 0 }, { 117, 0 }, { 118, 0 }, { 119, 0 }, { 120, 0 },+ { 121, 0 }, { 122, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 128, 0 }, { 129, 0 }, { 130, 0 },+ { 131, 0 }, { 132, 0 }, { 133, 0 }, { 134, 0 }, { 135, 0 },++ { 136, 0 }, { 137, 0 }, { 138, 0 }, { 139, 0 }, { 140, 0 },+ { 141, 0 }, { 142, 0 }, { 143, 0 }, { 144, 0 }, { 145, 0 },+ { 146, 0 }, { 147, 0 }, { 148, 0 }, { 149, 0 }, { 150, 0 },+ { 151, 0 }, { 152, 0 }, { 153, 0 }, { 154, 0 }, { 155, 0 },+ { 156, 0 }, { 157, 0 }, { 158, 0 }, { 159, 0 }, { 160, 0 },+ { 161, 0 }, { 162, 0 }, { 163, 0 }, { 164, 0 }, { 165, 0 },+ { 166, 0 }, { 167, 0 }, { 168, 0 }, { 169, 0 }, { 170, 0 },+ { 171, 0 }, { 172, 0 }, { 173, 0 }, { 174, 0 }, { 175, 0 },+ { 176, 0 }, { 177, 0 }, { 178, 0 }, { 179, 0 }, { 180, 0 },+ { 181, 0 }, { 182, 0 }, { 183, 0 }, { 184, 0 }, { 185, 0 },++ { 186, 0 }, { 187, 0 }, { 188, 0 }, { 189, 0 }, { 190, 0 },+ { 191, 0 }, { 192, 0 }, { 193, 0 }, { 194, 0 }, { 195, 0 },+ { 196, 0 }, { 197, 0 }, { 198, 0 }, { 199, 0 }, { 200, 0 },+ { 201, 0 }, { 202, 0 }, { 203, 0 }, { 204, 0 }, { 205, 0 },+ { 206, 0 }, { 207, 0 }, { 208, 0 }, { 209, 0 }, { 210, 0 },+ { 211, 0 }, { 212, 0 }, { 213, 0 }, { 214, 0 }, { 215, 0 },+ { 216, 0 }, { 217, 0 }, { 218, 0 }, { 219, 0 }, { 220, 0 },+ { 221, 0 }, { 222, 0 }, { 223, 0 }, { 224, 0 }, { 225, 0 },+ { 226, 0 }, { 227, 0 }, { 228, 0 }, { 229, 0 }, { 230, 0 },+ { 231, 0 }, { 232, 0 }, { 233, 0 }, { 234, 0 }, { 235, 0 },++ { 236, 0 }, { 237, 0 }, { 238, 0 }, { 239, 0 }, { 240, 0 },+ { 241, 0 }, { 242, 0 }, { 243, 0 }, { 244, 0 }, { 245, 0 },+ { 246, 0 }, { 247, 0 }, { 248, 0 }, { 249, 0 }, { 250, 0 },+ { 251, 0 }, { 252, 0 }, { 253, 0 }, { 254, 0 }, { 255, 0 },+ { 0, 53 }, { 0,17879 }, { 1, 0 }, { 2, 0 }, { 3, 0 },+ { 4, 0 }, { 5, 0 }, { 6, 0 }, { 7, 0 }, { 8, 0 },+ { 9, 0 }, { 0, 0 }, { 11, 0 }, { 12, 0 }, { 0, 0 },+ { 14, 0 }, { 15, 0 }, { 16, 0 }, { 17, 0 }, { 18, 0 },+ { 19, 0 }, { 20, 0 }, { 21, 0 }, { 22, 0 }, { 23, 0 },+ { 24, 0 }, { 25, 0 }, { 26, 0 }, { 27, 0 }, { 28, 0 },++ { 29, 0 }, { 30, 0 }, { 31, 0 }, { 32, 0 }, { 33, 0 },+ { 34, 0 }, { 35, 0 }, { 36, 0 }, { 37, 0 }, { 38, 0 },+ { 39, 0 }, { 40, 0 }, { 41, 0 }, { 42, 0 }, { 43, 0 },+ { 44, 0 }, { 45, 0 }, { 46, 0 }, { 47, 0 }, { 48, 0 },+ { 49, 0 }, { 50, 0 }, { 51, 0 }, { 52, 0 }, { 53, 0 },+ { 54, 0 }, { 55, 0 }, { 56, 0 }, { 57, 0 }, { 58, 0 },+ { 59, 0 }, { 60, 0 }, { 61, 0 }, { 62, 0 }, { 63, 0 },+ { 64, 0 }, { 65, 0 }, { 66, 0 }, { 67, 0 }, { 68, 0 },+ { 69, 0 }, { 70, 0 }, { 71, 0 }, { 72, 0 }, { 73, 0 },+ { 74, 0 }, { 75, 0 }, { 76, 0 }, { 77, 0 }, { 78, 0 },++ { 79, 0 }, { 80, 0 }, { 81, 0 }, { 82, 0 }, { 83, 0 },+ { 84, 0 }, { 85, 0 }, { 86, 0 }, { 87, 0 }, { 88, 0 },+ { 89, 0 }, { 90, 0 }, { 91, 0 }, { 92, 0 }, { 93, 0 },+ { 94, 0 }, { 95, 0 }, { 96, 0 }, { 97, 0 }, { 98, 0 },+ { 99, 0 }, { 100, 0 }, { 101, 0 }, { 102, 0 }, { 103, 0 },+ { 104, 0 }, { 105, 0 }, { 106, 0 }, { 107, 0 }, { 108, 0 },+ { 109, 0 }, { 110, 0 }, { 111, 0 }, { 112, 0 }, { 113, 0 },+ { 114, 0 }, { 115, 0 }, { 116, 0 }, { 117, 0 }, { 118, 0 },+ { 119, 0 }, { 120, 0 }, { 121, 0 }, { 122, 0 }, { 123, 0 },+ { 124, 0 }, { 125, 0 }, { 126, 0 }, { 127, 0 }, { 128, 0 },++ { 129, 0 }, { 130, 0 }, { 131, 0 }, { 132, 0 }, { 133, 0 },+ { 134, 0 }, { 135, 0 }, { 136, 0 }, { 137, 0 }, { 138, 0 },+ { 139, 0 }, { 140, 0 }, { 141, 0 }, { 142, 0 }, { 143, 0 },+ { 144, 0 }, { 145, 0 }, { 146, 0 }, { 147, 0 }, { 148, 0 },+ { 149, 0 }, { 150, 0 }, { 151, 0 }, { 152, 0 }, { 153, 0 },+ { 154, 0 }, { 155, 0 }, { 156, 0 }, { 157, 0 }, { 158, 0 },+ { 159, 0 }, { 160, 0 }, { 161, 0 }, { 162, 0 }, { 163, 0 },+ { 164, 0 }, { 165, 0 }, { 166, 0 }, { 167, 0 }, { 168, 0 },+ { 169, 0 }, { 170, 0 }, { 171, 0 }, { 172, 0 }, { 173, 0 },+ { 174, 0 }, { 175, 0 }, { 176, 0 }, { 177, 0 }, { 178, 0 },++ { 179, 0 }, { 180, 0 }, { 181, 0 }, { 182, 0 }, { 183, 0 },+ { 184, 0 }, { 185, 0 }, { 186, 0 }, { 187, 0 }, { 188, 0 },+ { 189, 0 }, { 190, 0 }, { 191, 0 }, { 192, 0 }, { 193, 0 },+ { 194, 0 }, { 195, 0 }, { 196, 0 }, { 197, 0 }, { 198, 0 },+ { 199, 0 }, { 200, 0 }, { 201, 0 }, { 202, 0 }, { 203, 0 },+ { 204, 0 }, { 205, 0 }, { 206, 0 }, { 207, 0 }, { 208, 0 },+ { 209, 0 }, { 210, 0 }, { 211, 0 }, { 212, 0 }, { 213, 0 },+ { 214, 0 }, { 215, 0 }, { 216, 0 }, { 217, 0 }, { 218, 0 },+ { 219, 0 }, { 220, 0 }, { 221, 0 }, { 222, 0 }, { 223, 0 },+ { 224, 0 }, { 225, 0 }, { 226, 0 }, { 227, 0 }, { 228, 0 },++ { 229, 0 }, { 230, 0 }, { 231, 0 }, { 232, 0 }, { 233, 0 },+ { 234, 0 }, { 235, 0 }, { 236, 0 }, { 237, 0 }, { 238, 0 },+ { 239, 0 }, { 240, 0 }, { 241, 0 }, { 242, 0 }, { 243, 0 },+ { 244, 0 }, { 245, 0 }, { 246, 0 }, { 247, 0 }, { 248, 0 },+ { 249, 0 }, { 250, 0 }, { 251, 0 }, { 252, 0 }, { 253, 0 },+ { 254, 0 }, { 255, 0 }, { 256, 0 }, { 0, 24 }, { 0,17621 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 9, 0 }, { 10, 0 },+ { 0, 0 }, { 12, 0 }, { 13, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },++ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 32, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 39,-11838 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 45,-11774 },+ { 0, 24 }, { 0,17574 }, { 1,4124 }, { 2,4124 }, { 3,4124 },+ { 4,4124 }, { 5,4124 }, { 6,4124 }, { 7,4124 }, { 8,4124 },+ { 9,4382 }, { 10,-2960 }, { 11,4124 }, { 12,4382 }, { 13,-2960 },+ { 14,4124 }, { 15,4124 }, { 16,4124 }, { 17,4124 }, { 18,4124 },+ { 19,4124 }, { 20,4124 }, { 21,4124 }, { 22,4124 }, { 23,4124 },++ { 24,4124 }, { 25,4124 }, { 26,4124 }, { 27,4124 }, { 28,4124 },+ { 29,4124 }, { 30,4124 }, { 31,4124 }, { 32,4382 }, { 33,4124 },+ { 34,4124 }, { 35,4124 }, { 36,4124 }, { 37,4124 }, { 38,4124 },+ { 39,4124 }, { 40,4124 }, { 41,4124 }, { 42,4124 }, { 43,4124 },+ { 44,4124 }, { 45,4640 }, { 46,4124 }, { 47,4124 }, { 48,4124 },+ { 49,4124 }, { 50,4124 }, { 51,4124 }, { 52,4124 }, { 53,4124 },+ { 54,4124 }, { 55,4124 }, { 56,4124 }, { 57,4124 }, { 58,4124 },+ { 59,4124 }, { 60,4124 }, { 61,4124 }, { 62,4124 }, { 63,4124 },+ { 64,4124 }, { 65,4124 }, { 66,4124 }, { 67,4124 }, { 68,4124 },+ { 69,4124 }, { 70,4124 }, { 71,4124 }, { 72,4124 }, { 73,4124 },++ { 74,4124 }, { 75,4124 }, { 76,4124 }, { 77,4124 }, { 78,4124 },+ { 79,4124 }, { 80,4124 }, { 81,4124 }, { 82,4124 }, { 83,4124 },+ { 84,4124 }, { 85,4124 }, { 86,4124 }, { 87,4124 }, { 88,4124 },+ { 89,4124 }, { 90,4124 }, { 91,4124 }, { 92,4124 }, { 93,4124 },+ { 94,4124 }, { 95,4124 }, { 96,4124 }, { 97,4124 }, { 98,4124 },+ { 99,4124 }, { 100,4124 }, { 101,4124 }, { 102,4124 }, { 103,4124 },+ { 104,4124 }, { 105,4124 }, { 106,4124 }, { 107,4124 }, { 108,4124 },+ { 109,4124 }, { 110,4124 }, { 111,4124 }, { 112,4124 }, { 113,4124 },+ { 114,4124 }, { 115,4124 }, { 116,4124 }, { 117,4124 }, { 118,4124 },+ { 119,4124 }, { 120,4124 }, { 121,4124 }, { 122,4124 }, { 123,4124 },++ { 124,4124 }, { 125,4124 }, { 126,4124 }, { 127,4124 }, { 128,4124 },+ { 129,4124 }, { 130,4124 }, { 131,4124 }, { 132,4124 }, { 133,4124 },+ { 134,4124 }, { 135,4124 }, { 136,4124 }, { 137,4124 }, { 138,4124 },+ { 139,4124 }, { 140,4124 }, { 141,4124 }, { 142,4124 }, { 143,4124 },+ { 144,4124 }, { 145,4124 }, { 146,4124 }, { 147,4124 }, { 148,4124 },+ { 149,4124 }, { 150,4124 }, { 151,4124 }, { 152,4124 }, { 153,4124 },+ { 154,4124 }, { 155,4124 }, { 156,4124 }, { 157,4124 }, { 158,4124 },+ { 159,4124 }, { 160,4124 }, { 161,4124 }, { 162,4124 }, { 163,4124 },+ { 164,4124 }, { 165,4124 }, { 166,4124 }, { 167,4124 }, { 168,4124 },+ { 169,4124 }, { 170,4124 }, { 171,4124 }, { 172,4124 }, { 173,4124 },++ { 174,4124 }, { 175,4124 }, { 176,4124 }, { 177,4124 }, { 178,4124 },+ { 179,4124 }, { 180,4124 }, { 181,4124 }, { 182,4124 }, { 183,4124 },+ { 184,4124 }, { 185,4124 }, { 186,4124 }, { 187,4124 }, { 188,4124 },+ { 189,4124 }, { 190,4124 }, { 191,4124 }, { 192,4124 }, { 193,4124 },+ { 194,4124 }, { 195,4124 }, { 196,4124 }, { 197,4124 }, { 198,4124 },+ { 199,4124 }, { 200,4124 }, { 201,4124 }, { 202,4124 }, { 203,4124 },+ { 204,4124 }, { 205,4124 }, { 206,4124 }, { 207,4124 }, { 208,4124 },+ { 209,4124 }, { 210,4124 }, { 211,4124 }, { 212,4124 }, { 213,4124 },+ { 214,4124 }, { 215,4124 }, { 216,4124 }, { 217,4124 }, { 218,4124 },+ { 219,4124 }, { 220,4124 }, { 221,4124 }, { 222,4124 }, { 223,4124 },++ { 224,4124 }, { 225,4124 }, { 226,4124 }, { 227,4124 }, { 228,4124 },+ { 229,4124 }, { 230,4124 }, { 231,4124 }, { 232,4124 }, { 233,4124 },+ { 234,4124 }, { 235,4124 }, { 236,4124 }, { 237,4124 }, { 238,4124 },+ { 239,4124 }, { 240,4124 }, { 241,4124 }, { 242,4124 }, { 243,4124 },+ { 244,4124 }, { 245,4124 }, { 246,4124 }, { 247,4124 }, { 248,4124 },+ { 249,4124 }, { 250,4124 }, { 251,4124 }, { 252,4124 }, { 253,4124 },+ { 254,4124 }, { 255,4124 }, { 256,4124 }, { 0, 26 }, { 0,17316 },+ { 1, 0 }, { 2, 0 }, { 3, 0 }, { 4, 0 }, { 5, 0 },+ { 6, 0 }, { 7, 0 }, { 8, 0 }, { 9, 0 }, { 0, 0 },+ { 11, 0 }, { 12, 0 }, { 0, 0 }, { 14, 0 }, { 15, 0 },++ { 16, 0 }, { 17, 0 }, { 18, 0 }, { 19, 0 }, { 20, 0 },+ { 21, 0 }, { 22, 0 }, { 23, 0 }, { 24, 0 }, { 25, 0 },+ { 26, 0 }, { 27, 0 }, { 28, 0 }, { 29, 0 }, { 30, 0 },+ { 31, 0 }, { 32, 0 }, { 33, 0 }, { 34, 0 }, { 35, 0 },+ { 36, 0 }, { 37, 0 }, { 38, 0 }, { 39, 0 }, { 40, 0 },+ { 41, 0 }, { 42, 0 }, { 43, 0 }, { 44, 0 }, { 45, 0 },+ { 46, 0 }, { 47, 0 }, { 48, 0 }, { 49, 0 }, { 50, 0 },+ { 51, 0 }, { 52, 0 }, { 53, 0 }, { 54, 0 }, { 55, 0 },+ { 56, 0 }, { 57, 0 }, { 58, 0 }, { 59, 0 }, { 60, 0 },+ { 61, 0 }, { 62, 0 }, { 63, 0 }, { 64, 0 }, { 65, 0 },++ { 66, 0 }, { 67, 0 }, { 68, 0 }, { 69, 0 }, { 70, 0 },+ { 71, 0 }, { 72, 0 }, { 73, 0 }, { 74, 0 }, { 75, 0 },+ { 76, 0 }, { 77, 0 }, { 78, 0 }, { 79, 0 }, { 80, 0 },+ { 81, 0 }, { 82, 0 }, { 83, 0 }, { 84, 0 }, { 85, 0 },+ { 86, 0 }, { 87, 0 }, { 88, 0 }, { 89, 0 }, { 90, 0 },+ { 91, 0 }, { 92, 0 }, { 93, 0 }, { 94, 0 }, { 95, 0 },+ { 96, 0 }, { 97, 0 }, { 98, 0 }, { 99, 0 }, { 100, 0 },+ { 101, 0 }, { 102, 0 }, { 103, 0 }, { 104, 0 }, { 105, 0 },+ { 106, 0 }, { 107, 0 }, { 108, 0 }, { 109, 0 }, { 110, 0 },+ { 111, 0 }, { 112, 0 }, { 113, 0 }, { 114, 0 }, { 115, 0 },++ { 116, 0 }, { 117, 0 }, { 118, 0 }, { 119, 0 }, { 120, 0 },+ { 121, 0 }, { 122, 0 }, { 123, 0 }, { 124, 0 }, { 125, 0 },+ { 126, 0 }, { 127, 0 }, { 128, 0 }, { 129, 0 }, { 130, 0 },+ { 131, 0 }, { 132, 0 }, { 133, 0 }, { 134, 0 }, { 135, 0 },+ { 136, 0 }, { 137, 0 }, { 138, 0 }, { 139, 0 }, { 140, 0 },+ { 141, 0 }, { 142, 0 }, { 143, 0 }, { 144, 0 }, { 145, 0 },+ { 146, 0 }, { 147, 0 }, { 148, 0 }, { 149, 0 }, { 150, 0 },+ { 151, 0 }, { 152, 0 }, { 153, 0 }, { 154, 0 }, { 155, 0 },+ { 156, 0 }, { 157, 0 }, { 158, 0 }, { 159, 0 }, { 160, 0 },+ { 161, 0 }, { 162, 0 }, { 163, 0 }, { 164, 0 }, { 165, 0 },++ { 166, 0 }, { 167, 0 }, { 168, 0 }, { 169, 0 }, { 170, 0 },+ { 171, 0 }, { 172, 0 }, { 173, 0 }, { 174, 0 }, { 175, 0 },+ { 176, 0 }, { 177, 0 }, { 178, 0 }, { 179, 0 }, { 180, 0 },+ { 181, 0 }, { 182, 0 }, { 183, 0 }, { 184, 0 }, { 185, 0 },+ { 186, 0 }, { 187, 0 }, { 188, 0 }, { 189, 0 }, { 190, 0 },+ { 191, 0 }, { 192, 0 }, { 193, 0 }, { 194, 0 }, { 195, 0 },+ { 196, 0 }, { 197, 0 }, { 198, 0 }, { 199, 0 }, { 200, 0 },+ { 201, 0 }, { 202, 0 }, { 203, 0 }, { 204, 0 }, { 205, 0 },+ { 206, 0 }, { 207, 0 }, { 208, 0 }, { 209, 0 }, { 210, 0 },+ { 211, 0 }, { 212, 0 }, { 213, 0 }, { 214, 0 }, { 215, 0 },++ { 216, 0 }, { 217, 0 }, { 218, 0 }, { 219, 0 }, { 220, 0 },+ { 221, 0 }, { 222, 0 }, { 223, 0 }, { 224, 0 }, { 225, 0 },+ { 226, 0 }, { 227, 0 }, { 228, 0 }, { 229, 0 }, { 230, 0 },+ { 231, 0 }, { 232, 0 }, { 233, 0 }, { 234, 0 }, { 235, 0 },+ { 236, 0 }, { 237, 0 }, { 238, 0 }, { 239, 0 }, { 240, 0 },+ { 241, 0 }, { 242, 0 }, { 243, 0 }, { 244, 0 }, { 245, 0 },+ { 246, 0 }, { 247, 0 }, { 248, 0 }, { 249, 0 }, { 250, 0 },+ { 251, 0 }, { 252, 0 }, { 253, 0 }, { 254, 0 }, { 255, 0 },+ { 256, 0 }, { 0, 37 }, { 0,17058 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },++ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 37 },+ { 0,17035 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 48,4382 }, { 49,4382 }, { 50,4382 }, { 51,4382 }, { 52,4382 },+ { 53,4382 }, { 54,4382 }, { 55,4382 }, { 56,4382 }, { 57,4382 },++ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 65,4382 }, { 66,4382 }, { 67,4382 },+ { 68,4382 }, { 69,4382 }, { 70,4382 }, { 48,4382 }, { 49,4382 },+ { 50,4382 }, { 51,4382 }, { 52,4382 }, { 53,4382 }, { 54,4382 },+ { 55,4382 }, { 56,4382 }, { 57,4382 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 65,4382 }, { 66,4382 }, { 67,4382 }, { 68,4382 }, { 69,4382 },+ { 70,4382 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 97,4382 },+ { 98,4382 }, { 99,4382 }, { 100,4382 }, { 101,4382 }, { 102,4382 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },++ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 97,4382 }, { 98,4382 }, { 99,4382 },+ { 100,4382 }, { 101,4382 }, { 102,4382 }, { 0, 9 }, { 0,16931 },+ { 1,4382 }, { 2,4382 }, { 3,4382 }, { 4,4382 }, { 5,4382 },+ { 6,4382 }, { 7,4382 }, { 8,4382 }, { 9,4640 }, { 10,4898 },+ { 11,4382 }, { 12,4640 }, { 13,4898 }, { 14,4382 }, { 15,4382 },+ { 16,4382 }, { 17,4382 }, { 18,4382 }, { 19,4382 }, { 20,4382 },+ { 21,4382 }, { 22,4382 }, { 23,4382 }, { 24,4382 }, { 25,4382 },+ { 26,4382 }, { 27,4382 }, { 28,4382 }, { 29,4382 }, { 30,4382 },++ { 31,4382 }, { 32,4640 }, { 33,4382 }, { 34,4382 }, { 35,4382 },+ { 36,4382 }, { 37,4382 }, { 38,4382 }, { 39,4382 }, { 40,4382 },+ { 41,4382 }, { 42,4382 }, { 43,4382 }, { 44,4382 }, { 45,4945 },+ { 46,4382 }, { 47,4382 }, { 48,4382 }, { 49,4382 }, { 50,4382 },+ { 51,4382 }, { 52,4382 }, { 53,4382 }, { 54,4382 }, { 55,4382 },+ { 56,4382 }, { 57,4382 }, { 58,4382 }, { 59,4382 }, { 60,4382 },+ { 61,4382 }, { 62,4382 }, { 63,4382 }, { 64,4382 }, { 65,4382 },+ { 66,4382 }, { 67,4382 }, { 68,4382 }, { 69,4382 }, { 70,4382 },+ { 71,4382 }, { 72,4382 }, { 73,4382 }, { 74,4382 }, { 75,4382 },+ { 76,4382 }, { 77,4382 }, { 78,4382 }, { 79,4382 }, { 80,4382 },++ { 81,4382 }, { 82,4382 }, { 83,4382 }, { 84,4382 }, { 85,4382 },+ { 86,4382 }, { 87,4382 }, { 88,4382 }, { 89,4382 }, { 90,4382 },+ { 91,4382 }, { 92,4382 }, { 93,4382 }, { 94,4382 }, { 95,4382 },+ { 96,4382 }, { 97,4382 }, { 98,4382 }, { 99,4382 }, { 100,4382 },+ { 101,4382 }, { 102,4382 }, { 103,4382 }, { 104,4382 }, { 105,4382 },+ { 106,4382 }, { 107,4382 }, { 108,4382 }, { 109,4382 }, { 110,4382 },+ { 111,4382 }, { 112,4382 }, { 113,4382 }, { 114,4382 }, { 115,4382 },+ { 116,4382 }, { 117,4382 }, { 118,4382 }, { 119,4382 }, { 120,4382 },+ { 121,4382 }, { 122,4382 }, { 123,4382 }, { 124,4382 }, { 125,4382 },+ { 126,4382 }, { 127,4382 }, { 128,4382 }, { 129,4382 }, { 130,4382 },++ { 131,4382 }, { 132,4382 }, { 133,4382 }, { 134,4382 }, { 135,4382 },+ { 136,4382 }, { 137,4382 }, { 138,4382 }, { 139,4382 }, { 140,4382 },+ { 141,4382 }, { 142,4382 }, { 143,4382 }, { 144,4382 }, { 145,4382 },+ { 146,4382 }, { 147,4382 }, { 148,4382 }, { 149,4382 }, { 150,4382 },+ { 151,4382 }, { 152,4382 }, { 153,4382 }, { 154,4382 }, { 155,4382 },+ { 156,4382 }, { 157,4382 }, { 158,4382 }, { 159,4382 }, { 160,4382 },+ { 161,4382 }, { 162,4382 }, { 163,4382 }, { 164,4382 }, { 165,4382 },+ { 166,4382 }, { 167,4382 }, { 168,4382 }, { 169,4382 }, { 170,4382 },+ { 171,4382 }, { 172,4382 }, { 173,4382 }, { 174,4382 }, { 175,4382 },+ { 176,4382 }, { 177,4382 }, { 178,4382 }, { 179,4382 }, { 180,4382 },++ { 181,4382 }, { 182,4382 }, { 183,4382 }, { 184,4382 }, { 185,4382 },+ { 186,4382 }, { 187,4382 }, { 188,4382 }, { 189,4382 }, { 190,4382 },+ { 191,4382 }, { 192,4382 }, { 193,4382 }, { 194,4382 }, { 195,4382 },+ { 196,4382 }, { 197,4382 }, { 198,4382 }, { 199,4382 }, { 200,4382 },+ { 201,4382 }, { 202,4382 }, { 203,4382 }, { 204,4382 }, { 205,4382 },+ { 206,4382 }, { 207,4382 }, { 208,4382 }, { 209,4382 }, { 210,4382 },+ { 211,4382 }, { 212,4382 }, { 213,4382 }, { 214,4382 }, { 215,4382 },+ { 216,4382 }, { 217,4382 }, { 218,4382 }, { 219,4382 }, { 220,4382 },+ { 221,4382 }, { 222,4382 }, { 223,4382 }, { 224,4382 }, { 225,4382 },+ { 226,4382 }, { 227,4382 }, { 228,4382 }, { 229,4382 }, { 230,4382 },++ { 231,4382 }, { 232,4382 }, { 233,4382 }, { 234,4382 }, { 235,4382 },+ { 236,4382 }, { 237,4382 }, { 238,4382 }, { 239,4382 }, { 240,4382 },+ { 241,4382 }, { 242,4382 }, { 243,4382 }, { 244,4382 }, { 245,4382 },+ { 246,4382 }, { 247,4382 }, { 248,4382 }, { 249,4382 }, { 250,4382 },+ { 251,4382 }, { 252,4382 }, { 253,4382 }, { 254,4382 }, { 255,4382 },+ { 256,4382 }, { 0, 9 }, { 0,16673 }, { 1, 0 }, { 2, 0 },+ { 3, 0 }, { 4, 0 }, { 5, 0 }, { 6, 0 }, { 7, 0 },+ { 8, 0 }, { 9, 258 }, { 10,-6341 }, { 11, 0 }, { 12, 258 },+ { 13,-6341 }, { 14, 0 }, { 15, 0 }, { 16, 0 }, { 17, 0 },+ { 18, 0 }, { 19, 0 }, { 20, 0 }, { 21, 0 }, { 22, 0 },++ { 23, 0 }, { 24, 0 }, { 25, 0 }, { 26, 0 }, { 27, 0 },+ { 28, 0 }, { 29, 0 }, { 30, 0 }, { 31, 0 }, { 32, 258 },+ { 33, 0 }, { 34, 0 }, { 35, 0 }, { 36, 0 }, { 37, 0 },+ { 38, 0 }, { 39, 0 }, { 40, 0 }, { 41, 0 }, { 42, 0 },+ { 43, 0 }, { 44, 0 }, { 45, 516 }, { 46, 0 }, { 47, 0 },+ { 48, 0 }, { 49, 0 }, { 50, 0 }, { 51, 0 }, { 52, 0 },+ { 53, 0 }, { 54, 0 }, { 55, 0 }, { 56, 0 }, { 57, 0 },+ { 58, 0 }, { 59, 0 }, { 60, 0 }, { 61, 0 }, { 62, 0 },+ { 63, 0 }, { 64, 0 }, { 65, 0 }, { 66, 0 }, { 67, 0 },+ { 68, 0 }, { 69, 0 }, { 70, 0 }, { 71, 0 }, { 72, 0 },++ { 73, 0 }, { 74, 0 }, { 75, 0 }, { 76, 0 }, { 77, 0 },+ { 78, 0 }, { 79, 0 }, { 80, 0 }, { 81, 0 }, { 82, 0 },+ { 83, 0 }, { 84, 0 }, { 85, 0 }, { 86, 0 }, { 87, 0 },+ { 88, 0 }, { 89, 0 }, { 90, 0 }, { 91, 0 }, { 92, 0 },+ { 93, 0 }, { 94, 0 }, { 95, 0 }, { 96, 0 }, { 97, 0 },+ { 98, 0 }, { 99, 0 }, { 100, 0 }, { 101, 0 }, { 102, 0 },+ { 103, 0 }, { 104, 0 }, { 105, 0 }, { 106, 0 }, { 107, 0 },+ { 108, 0 }, { 109, 0 }, { 110, 0 }, { 111, 0 }, { 112, 0 },+ { 113, 0 }, { 114, 0 }, { 115, 0 }, { 116, 0 }, { 117, 0 },+ { 118, 0 }, { 119, 0 }, { 120, 0 }, { 121, 0 }, { 122, 0 },++ { 123, 0 }, { 124, 0 }, { 125, 0 }, { 126, 0 }, { 127, 0 },+ { 128, 0 }, { 129, 0 }, { 130, 0 }, { 131, 0 }, { 132, 0 },+ { 133, 0 }, { 134, 0 }, { 135, 0 }, { 136, 0 }, { 137, 0 },+ { 138, 0 }, { 139, 0 }, { 140, 0 }, { 141, 0 }, { 142, 0 },+ { 143, 0 }, { 144, 0 }, { 145, 0 }, { 146, 0 }, { 147, 0 },+ { 148, 0 }, { 149, 0 }, { 150, 0 }, { 151, 0 }, { 152, 0 },+ { 153, 0 }, { 154, 0 }, { 155, 0 }, { 156, 0 }, { 157, 0 },+ { 158, 0 }, { 159, 0 }, { 160, 0 }, { 161, 0 }, { 162, 0 },+ { 163, 0 }, { 164, 0 }, { 165, 0 }, { 166, 0 }, { 167, 0 },+ { 168, 0 }, { 169, 0 }, { 170, 0 }, { 171, 0 }, { 172, 0 },++ { 173, 0 }, { 174, 0 }, { 175, 0 }, { 176, 0 }, { 177, 0 },+ { 178, 0 }, { 179, 0 }, { 180, 0 }, { 181, 0 }, { 182, 0 },+ { 183, 0 }, { 184, 0 }, { 185, 0 }, { 186, 0 }, { 187, 0 },+ { 188, 0 }, { 189, 0 }, { 190, 0 }, { 191, 0 }, { 192, 0 },+ { 193, 0 }, { 194, 0 }, { 195, 0 }, { 196, 0 }, { 197, 0 },+ { 198, 0 }, { 199, 0 }, { 200, 0 }, { 201, 0 }, { 202, 0 },+ { 203, 0 }, { 204, 0 }, { 205, 0 }, { 206, 0 }, { 207, 0 },+ { 208, 0 }, { 209, 0 }, { 210, 0 }, { 211, 0 }, { 212, 0 },+ { 213, 0 }, { 214, 0 }, { 215, 0 }, { 216, 0 }, { 217, 0 },+ { 218, 0 }, { 219, 0 }, { 220, 0 }, { 221, 0 }, { 222, 0 },++ { 223, 0 }, { 224, 0 }, { 225, 0 }, { 226, 0 }, { 227, 0 },+ { 228, 0 }, { 229, 0 }, { 230, 0 }, { 231, 0 }, { 232, 0 },+ { 233, 0 }, { 234, 0 }, { 235, 0 }, { 236, 0 }, { 237, 0 },+ { 238, 0 }, { 239, 0 }, { 240, 0 }, { 241, 0 }, { 242, 0 },+ { 243, 0 }, { 244, 0 }, { 245, 0 }, { 246, 0 }, { 247, 0 },+ { 248, 0 }, { 249, 0 }, { 250, 0 }, { 251, 0 }, { 252, 0 },+ { 253, 0 }, { 254, 0 }, { 255, 0 }, { 256, 0 }, { 0, 9 },+ { 0,16415 }, { 1,-258 }, { 2,-258 }, { 3,-258 }, { 4,-258 },+ { 5,-258 }, { 6,-258 }, { 7,-258 }, { 8,-258 }, { 9, 0 },+ { 10,-6599 }, { 11,-258 }, { 12, 0 }, { 13,-6599 }, { 14,-258 },++ { 15,-258 }, { 16,-258 }, { 17,-258 }, { 18,-258 }, { 19,-258 },+ { 20,-258 }, { 21,-258 }, { 22,-258 }, { 23,-258 }, { 24,-258 },+ { 25,-258 }, { 26,-258 }, { 27,-258 }, { 28,-258 }, { 29,-258 },+ { 30,-258 }, { 31,-258 }, { 32, 0 }, { 33,-258 }, { 34,-258 },+ { 35,-258 }, { 36,-258 }, { 37,-258 }, { 38,-258 }, { 39,-258 },+ { 40,-258 }, { 41,-258 }, { 42,-258 }, { 43,-258 }, { 44,-258 },+ { 45, 258 }, { 46,-258 }, { 47,-258 }, { 48,-258 }, { 49,-258 },+ { 50,-258 }, { 51,-258 }, { 52,-258 }, { 53,-258 }, { 54,-258 },+ { 55,-258 }, { 56,-258 }, { 57,-258 }, { 58,-258 }, { 59,-258 },+ { 60,-258 }, { 61,-258 }, { 62,-258 }, { 63,-258 }, { 64,-258 },++ { 65,-258 }, { 66,-258 }, { 67,-258 }, { 68,-258 }, { 69,-258 },+ { 70,-258 }, { 71,-258 }, { 72,-258 }, { 73,-258 }, { 74,-258 },+ { 75,-258 }, { 76,-258 }, { 77,-258 }, { 78,-258 }, { 79,-258 },+ { 80,-258 }, { 81,-258 }, { 82,-258 }, { 83,-258 }, { 84,-258 },+ { 85,-258 }, { 86,-258 }, { 87,-258 }, { 88,-258 }, { 89,-258 },+ { 90,-258 }, { 91,-258 }, { 92,-258 }, { 93,-258 }, { 94,-258 },+ { 95,-258 }, { 96,-258 }, { 97,-258 }, { 98,-258 }, { 99,-258 },+ { 100,-258 }, { 101,-258 }, { 102,-258 }, { 103,-258 }, { 104,-258 },+ { 105,-258 }, { 106,-258 }, { 107,-258 }, { 108,-258 }, { 109,-258 },+ { 110,-258 }, { 111,-258 }, { 112,-258 }, { 113,-258 }, { 114,-258 },++ { 115,-258 }, { 116,-258 }, { 117,-258 }, { 118,-258 }, { 119,-258 },+ { 120,-258 }, { 121,-258 }, { 122,-258 }, { 123,-258 }, { 124,-258 },+ { 125,-258 }, { 126,-258 }, { 127,-258 }, { 128,-258 }, { 129,-258 },+ { 130,-258 }, { 131,-258 }, { 132,-258 }, { 133,-258 }, { 134,-258 },+ { 135,-258 }, { 136,-258 }, { 137,-258 }, { 138,-258 }, { 139,-258 },+ { 140,-258 }, { 141,-258 }, { 142,-258 }, { 143,-258 }, { 144,-258 },+ { 145,-258 }, { 146,-258 }, { 147,-258 }, { 148,-258 }, { 149,-258 },+ { 150,-258 }, { 151,-258 }, { 152,-258 }, { 153,-258 }, { 154,-258 },+ { 155,-258 }, { 156,-258 }, { 157,-258 }, { 158,-258 }, { 159,-258 },+ { 160,-258 }, { 161,-258 }, { 162,-258 }, { 163,-258 }, { 164,-258 },++ { 165,-258 }, { 166,-258 }, { 167,-258 }, { 168,-258 }, { 169,-258 },+ { 170,-258 }, { 171,-258 }, { 172,-258 }, { 173,-258 }, { 174,-258 },+ { 175,-258 }, { 176,-258 }, { 177,-258 }, { 178,-258 }, { 179,-258 },+ { 180,-258 }, { 181,-258 }, { 182,-258 }, { 183,-258 }, { 184,-258 },+ { 185,-258 }, { 186,-258 }, { 187,-258 }, { 188,-258 }, { 189,-258 },+ { 190,-258 }, { 191,-258 }, { 192,-258 }, { 193,-258 }, { 194,-258 },+ { 195,-258 }, { 196,-258 }, { 197,-258 }, { 198,-258 }, { 199,-258 },+ { 200,-258 }, { 201,-258 }, { 202,-258 }, { 203,-258 }, { 204,-258 },+ { 205,-258 }, { 206,-258 }, { 207,-258 }, { 208,-258 }, { 209,-258 },+ { 210,-258 }, { 211,-258 }, { 212,-258 }, { 213,-258 }, { 214,-258 },++ { 215,-258 }, { 216,-258 }, { 217,-258 }, { 218,-258 }, { 219,-258 },+ { 220,-258 }, { 221,-258 }, { 222,-258 }, { 223,-258 }, { 224,-258 },+ { 225,-258 }, { 226,-258 }, { 227,-258 }, { 228,-258 }, { 229,-258 },+ { 230,-258 }, { 231,-258 }, { 232,-258 }, { 233,-258 }, { 234,-258 },+ { 235,-258 }, { 236,-258 }, { 237,-258 }, { 238,-258 }, { 239,-258 },+ { 240,-258 }, { 241,-258 }, { 242,-258 }, { 243,-258 }, { 244,-258 },+ { 245,-258 }, { 246,-258 }, { 247,-258 }, { 248,-258 }, { 249,-258 },+ { 250,-258 }, { 251,-258 }, { 252,-258 }, { 253,-258 }, { 254,-258 },+ { 255,-258 }, { 256,-258 }, { 0, 9 }, { 0,16157 }, { 1,-516 },+ { 2,-516 }, { 3,-516 }, { 4,-516 }, { 5,-516 }, { 6,-516 },++ { 7,-516 }, { 8,-516 }, { 9,-258 }, { 10,-6857 }, { 11,-516 },+ { 12,-258 }, { 13,-6857 }, { 14,-516 }, { 15,-516 }, { 16,-516 },+ { 17,-516 }, { 18,-516 }, { 19,-516 }, { 20,-516 }, { 21,-516 },+ { 22,-516 }, { 23,-516 }, { 24,-516 }, { 25,-516 }, { 26,-516 },+ { 27,-516 }, { 28,-516 }, { 29,-516 }, { 30,-516 }, { 31,-516 },+ { 32,-258 }, { 33,-516 }, { 34,-516 }, { 35,-516 }, { 36,-516 },+ { 37,-516 }, { 38,-516 }, { 39,-516 }, { 40,-516 }, { 41,-516 },+ { 42,-516 }, { 43,-516 }, { 44,-516 }, { 45,4429 }, { 46,-516 },+ { 47,-516 }, { 48,-516 }, { 49,-516 }, { 50,-516 }, { 51,-516 },+ { 52,-516 }, { 53,-516 }, { 54,-516 }, { 55,-516 }, { 56,-516 },++ { 57,-516 }, { 58,-516 }, { 59,-516 }, { 60,-516 }, { 61,-516 },+ { 62,-516 }, { 63,-516 }, { 64,-516 }, { 65,-516 }, { 66,-516 },+ { 67,-516 }, { 68,-516 }, { 69,-516 }, { 70,-516 }, { 71,-516 },+ { 72,-516 }, { 73,-516 }, { 74,-516 }, { 75,-516 }, { 76,-516 },+ { 77,-516 }, { 78,-516 }, { 79,-516 }, { 80,-516 }, { 81,-516 },+ { 82,-516 }, { 83,-516 }, { 84,-516 }, { 85,-516 }, { 86,-516 },+ { 87,-516 }, { 88,-516 }, { 89,-516 }, { 90,-516 }, { 91,-516 },+ { 92,-516 }, { 93,-516 }, { 94,-516 }, { 95,-516 }, { 96,-516 },+ { 97,-516 }, { 98,-516 }, { 99,-516 }, { 100,-516 }, { 101,-516 },+ { 102,-516 }, { 103,-516 }, { 104,-516 }, { 105,-516 }, { 106,-516 },++ { 107,-516 }, { 108,-516 }, { 109,-516 }, { 110,-516 }, { 111,-516 },+ { 112,-516 }, { 113,-516 }, { 114,-516 }, { 115,-516 }, { 116,-516 },+ { 117,-516 }, { 118,-516 }, { 119,-516 }, { 120,-516 }, { 121,-516 },+ { 122,-516 }, { 123,-516 }, { 124,-516 }, { 125,-516 }, { 126,-516 },+ { 127,-516 }, { 128,-516 }, { 129,-516 }, { 130,-516 }, { 131,-516 },+ { 132,-516 }, { 133,-516 }, { 134,-516 }, { 135,-516 }, { 136,-516 },+ { 137,-516 }, { 138,-516 }, { 139,-516 }, { 140,-516 }, { 141,-516 },+ { 142,-516 }, { 143,-516 }, { 144,-516 }, { 145,-516 }, { 146,-516 },+ { 147,-516 }, { 148,-516 }, { 149,-516 }, { 150,-516 }, { 151,-516 },+ { 152,-516 }, { 153,-516 }, { 154,-516 }, { 155,-516 }, { 156,-516 },++ { 157,-516 }, { 158,-516 }, { 159,-516 }, { 160,-516 }, { 161,-516 },+ { 162,-516 }, { 163,-516 }, { 164,-516 }, { 165,-516 }, { 166,-516 },+ { 167,-516 }, { 168,-516 }, { 169,-516 }, { 170,-516 }, { 171,-516 },+ { 172,-516 }, { 173,-516 }, { 174,-516 }, { 175,-516 }, { 176,-516 },+ { 177,-516 }, { 178,-516 }, { 179,-516 }, { 180,-516 }, { 181,-516 },+ { 182,-516 }, { 183,-516 }, { 184,-516 }, { 185,-516 }, { 186,-516 },+ { 187,-516 }, { 188,-516 }, { 189,-516 }, { 190,-516 }, { 191,-516 },+ { 192,-516 }, { 193,-516 }, { 194,-516 }, { 195,-516 }, { 196,-516 },+ { 197,-516 }, { 198,-516 }, { 199,-516 }, { 200,-516 }, { 201,-516 },+ { 202,-516 }, { 203,-516 }, { 204,-516 }, { 205,-516 }, { 206,-516 },++ { 207,-516 }, { 208,-516 }, { 209,-516 }, { 210,-516 }, { 211,-516 },+ { 212,-516 }, { 213,-516 }, { 214,-516 }, { 215,-516 }, { 216,-516 },+ { 217,-516 }, { 218,-516 }, { 219,-516 }, { 220,-516 }, { 221,-516 },+ { 222,-516 }, { 223,-516 }, { 224,-516 }, { 225,-516 }, { 226,-516 },+ { 227,-516 }, { 228,-516 }, { 229,-516 }, { 230,-516 }, { 231,-516 },+ { 232,-516 }, { 233,-516 }, { 234,-516 }, { 235,-516 }, { 236,-516 },+ { 237,-516 }, { 238,-516 }, { 239,-516 }, { 240,-516 }, { 241,-516 },+ { 242,-516 }, { 243,-516 }, { 244,-516 }, { 245,-516 }, { 246,-516 },+ { 247,-516 }, { 248,-516 }, { 249,-516 }, { 250,-516 }, { 251,-516 },+ { 252,-516 }, { 253,-516 }, { 254,-516 }, { 255,-516 }, { 256,-516 },++ { 0, 16 }, { 0,15899 }, { 1,4429 }, { 2,4429 }, { 3,4429 },+ { 4,4429 }, { 5,4429 }, { 6,4429 }, { 7,4429 }, { 8,4429 },+ { 9,4687 }, { 10,4945 }, { 11,4429 }, { 12,4687 }, { 13,4945 },+ { 14,4429 }, { 15,4429 }, { 16,4429 }, { 17,4429 }, { 18,4429 },+ { 19,4429 }, { 20,4429 }, { 21,4429 }, { 22,4429 }, { 23,4429 },+ { 24,4429 }, { 25,4429 }, { 26,4429 }, { 27,4429 }, { 28,4429 },+ { 29,4429 }, { 30,4429 }, { 31,4429 }, { 32,4687 }, { 33,4429 },+ { 34,4429 }, { 35,4429 }, { 36,4429 }, { 37,4429 }, { 38,4429 },+ { 39,4429 }, { 40,4429 }, { 41,4429 }, { 42,4429 }, { 43,4429 },+ { 44,4429 }, { 45,4992 }, { 46,4429 }, { 47,4429 }, { 48,4429 },++ { 49,4429 }, { 50,4429 }, { 51,4429 }, { 52,4429 }, { 53,4429 },+ { 54,4429 }, { 55,4429 }, { 56,4429 }, { 57,4429 }, { 58,4429 },+ { 59,4429 }, { 60,4429 }, { 61,4429 }, { 62,4429 }, { 63,4429 },+ { 64,4429 }, { 65,4429 }, { 66,4429 }, { 67,4429 }, { 68,4429 },+ { 69,4429 }, { 70,4429 }, { 71,4429 }, { 72,4429 }, { 73,4429 },+ { 74,4429 }, { 75,4429 }, { 76,4429 }, { 77,4429 }, { 78,4429 },+ { 79,4429 }, { 80,4429 }, { 81,4429 }, { 82,4429 }, { 83,4429 },+ { 84,4429 }, { 85,4429 }, { 86,4429 }, { 87,4429 }, { 88,4429 },+ { 89,4429 }, { 90,4429 }, { 91,4429 }, { 92,4429 }, { 93,4429 },+ { 94,4429 }, { 95,4429 }, { 96,4429 }, { 97,4429 }, { 98,4429 },++ { 99,4429 }, { 100,4429 }, { 101,4429 }, { 102,4429 }, { 103,4429 },+ { 104,4429 }, { 105,4429 }, { 106,4429 }, { 107,4429 }, { 108,4429 },+ { 109,4429 }, { 110,4429 }, { 111,4429 }, { 112,4429 }, { 113,4429 },+ { 114,4429 }, { 115,4429 }, { 116,4429 }, { 117,4429 }, { 118,4429 },+ { 119,4429 }, { 120,4429 }, { 121,4429 }, { 122,4429 }, { 123,4429 },+ { 124,4429 }, { 125,4429 }, { 126,4429 }, { 127,4429 }, { 128,4429 },+ { 129,4429 }, { 130,4429 }, { 131,4429 }, { 132,4429 }, { 133,4429 },+ { 134,4429 }, { 135,4429 }, { 136,4429 }, { 137,4429 }, { 138,4429 },+ { 139,4429 }, { 140,4429 }, { 141,4429 }, { 142,4429 }, { 143,4429 },+ { 144,4429 }, { 145,4429 }, { 146,4429 }, { 147,4429 }, { 148,4429 },++ { 149,4429 }, { 150,4429 }, { 151,4429 }, { 152,4429 }, { 153,4429 },+ { 154,4429 }, { 155,4429 }, { 156,4429 }, { 157,4429 }, { 158,4429 },+ { 159,4429 }, { 160,4429 }, { 161,4429 }, { 162,4429 }, { 163,4429 },+ { 164,4429 }, { 165,4429 }, { 166,4429 }, { 167,4429 }, { 168,4429 },+ { 169,4429 }, { 170,4429 }, { 171,4429 }, { 172,4429 }, { 173,4429 },+ { 174,4429 }, { 175,4429 }, { 176,4429 }, { 177,4429 }, { 178,4429 },+ { 179,4429 }, { 180,4429 }, { 181,4429 }, { 182,4429 }, { 183,4429 },+ { 184,4429 }, { 185,4429 }, { 186,4429 }, { 187,4429 }, { 188,4429 },+ { 189,4429 }, { 190,4429 }, { 191,4429 }, { 192,4429 }, { 193,4429 },+ { 194,4429 }, { 195,4429 }, { 196,4429 }, { 197,4429 }, { 198,4429 },++ { 199,4429 }, { 200,4429 }, { 201,4429 }, { 202,4429 }, { 203,4429 },+ { 204,4429 }, { 205,4429 }, { 206,4429 }, { 207,4429 }, { 208,4429 },+ { 209,4429 }, { 210,4429 }, { 211,4429 }, { 212,4429 }, { 213,4429 },+ { 214,4429 }, { 215,4429 }, { 216,4429 }, { 217,4429 }, { 218,4429 },+ { 219,4429 }, { 220,4429 }, { 221,4429 }, { 222,4429 }, { 223,4429 },+ { 224,4429 }, { 225,4429 }, { 226,4429 }, { 227,4429 }, { 228,4429 },+ { 229,4429 }, { 230,4429 }, { 231,4429 }, { 232,4429 }, { 233,4429 },+ { 234,4429 }, { 235,4429 }, { 236,4429 }, { 237,4429 }, { 238,4429 },+ { 239,4429 }, { 240,4429 }, { 241,4429 }, { 242,4429 }, { 243,4429 },+ { 244,4429 }, { 245,4429 }, { 246,4429 }, { 247,4429 }, { 248,4429 },++ { 249,4429 }, { 250,4429 }, { 251,4429 }, { 252,4429 }, { 253,4429 },+ { 254,4429 }, { 255,4429 }, { 256,4429 }, { 0, 16 }, { 0,15641 },+ { 1, 0 }, { 2, 0 }, { 3, 0 }, { 4, 0 }, { 5, 0 },+ { 6, 0 }, { 7, 0 }, { 8, 0 }, { 9, 258 }, { 10,-6419 },+ { 11, 0 }, { 12, 258 }, { 13,-6419 }, { 14, 0 }, { 15, 0 },+ { 16, 0 }, { 17, 0 }, { 18, 0 }, { 19, 0 }, { 20, 0 },+ { 21, 0 }, { 22, 0 }, { 23, 0 }, { 24, 0 }, { 25, 0 },+ { 26, 0 }, { 27, 0 }, { 28, 0 }, { 29, 0 }, { 30, 0 },+ { 31, 0 }, { 32, 258 }, { 33, 0 }, { 34, 0 }, { 35, 0 },+ { 36, 0 }, { 37, 0 }, { 38, 0 }, { 39, 0 }, { 40, 0 },++ { 41, 0 }, { 42, 0 }, { 43, 0 }, { 44, 0 }, { 45, 516 },+ { 46, 0 }, { 47, 0 }, { 48, 0 }, { 49, 0 }, { 50, 0 },+ { 51, 0 }, { 52, 0 }, { 53, 0 }, { 54, 0 }, { 55, 0 },+ { 56, 0 }, { 57, 0 }, { 58, 0 }, { 59, 0 }, { 60, 0 },+ { 61, 0 }, { 62, 0 }, { 63, 0 }, { 64, 0 }, { 65, 0 },+ { 66, 0 }, { 67, 0 }, { 68, 0 }, { 69, 0 }, { 70, 0 },+ { 71, 0 }, { 72, 0 }, { 73, 0 }, { 74, 0 }, { 75, 0 },+ { 76, 0 }, { 77, 0 }, { 78, 0 }, { 79, 0 }, { 80, 0 },+ { 81, 0 }, { 82, 0 }, { 83, 0 }, { 84, 0 }, { 85, 0 },+ { 86, 0 }, { 87, 0 }, { 88, 0 }, { 89, 0 }, { 90, 0 },++ { 91, 0 }, { 92, 0 }, { 93, 0 }, { 94, 0 }, { 95, 0 },+ { 96, 0 }, { 97, 0 }, { 98, 0 }, { 99, 0 }, { 100, 0 },+ { 101, 0 }, { 102, 0 }, { 103, 0 }, { 104, 0 }, { 105, 0 },+ { 106, 0 }, { 107, 0 }, { 108, 0 }, { 109, 0 }, { 110, 0 },+ { 111, 0 }, { 112, 0 }, { 113, 0 }, { 114, 0 }, { 115, 0 },+ { 116, 0 }, { 117, 0 }, { 118, 0 }, { 119, 0 }, { 120, 0 },+ { 121, 0 }, { 122, 0 }, { 123, 0 }, { 124, 0 }, { 125, 0 },+ { 126, 0 }, { 127, 0 }, { 128, 0 }, { 129, 0 }, { 130, 0 },+ { 131, 0 }, { 132, 0 }, { 133, 0 }, { 134, 0 }, { 135, 0 },+ { 136, 0 }, { 137, 0 }, { 138, 0 }, { 139, 0 }, { 140, 0 },++ { 141, 0 }, { 142, 0 }, { 143, 0 }, { 144, 0 }, { 145, 0 },+ { 146, 0 }, { 147, 0 }, { 148, 0 }, { 149, 0 }, { 150, 0 },+ { 151, 0 }, { 152, 0 }, { 153, 0 }, { 154, 0 }, { 155, 0 },+ { 156, 0 }, { 157, 0 }, { 158, 0 }, { 159, 0 }, { 160, 0 },+ { 161, 0 }, { 162, 0 }, { 163, 0 }, { 164, 0 }, { 165, 0 },+ { 166, 0 }, { 167, 0 }, { 168, 0 }, { 169, 0 }, { 170, 0 },+ { 171, 0 }, { 172, 0 }, { 173, 0 }, { 174, 0 }, { 175, 0 },+ { 176, 0 }, { 177, 0 }, { 178, 0 }, { 179, 0 }, { 180, 0 },+ { 181, 0 }, { 182, 0 }, { 183, 0 }, { 184, 0 }, { 185, 0 },+ { 186, 0 }, { 187, 0 }, { 188, 0 }, { 189, 0 }, { 190, 0 },++ { 191, 0 }, { 192, 0 }, { 193, 0 }, { 194, 0 }, { 195, 0 },+ { 196, 0 }, { 197, 0 }, { 198, 0 }, { 199, 0 }, { 200, 0 },+ { 201, 0 }, { 202, 0 }, { 203, 0 }, { 204, 0 }, { 205, 0 },+ { 206, 0 }, { 207, 0 }, { 208, 0 }, { 209, 0 }, { 210, 0 },+ { 211, 0 }, { 212, 0 }, { 213, 0 }, { 214, 0 }, { 215, 0 },+ { 216, 0 }, { 217, 0 }, { 218, 0 }, { 219, 0 }, { 220, 0 },+ { 221, 0 }, { 222, 0 }, { 223, 0 }, { 224, 0 }, { 225, 0 },+ { 226, 0 }, { 227, 0 }, { 228, 0 }, { 229, 0 }, { 230, 0 },+ { 231, 0 }, { 232, 0 }, { 233, 0 }, { 234, 0 }, { 235, 0 },+ { 236, 0 }, { 237, 0 }, { 238, 0 }, { 239, 0 }, { 240, 0 },++ { 241, 0 }, { 242, 0 }, { 243, 0 }, { 244, 0 }, { 245, 0 },+ { 246, 0 }, { 247, 0 }, { 248, 0 }, { 249, 0 }, { 250, 0 },+ { 251, 0 }, { 252, 0 }, { 253, 0 }, { 254, 0 }, { 255, 0 },+ { 256, 0 }, { 0, 16 }, { 0,15383 }, { 1,-258 }, { 2,-258 },+ { 3,-258 }, { 4,-258 }, { 5,-258 }, { 6,-258 }, { 7,-258 },+ { 8,-258 }, { 9, 0 }, { 10,-6677 }, { 11,-258 }, { 12, 0 },+ { 13,-6677 }, { 14,-258 }, { 15,-258 }, { 16,-258 }, { 17,-258 },+ { 18,-258 }, { 19,-258 }, { 20,-258 }, { 21,-258 }, { 22,-258 },+ { 23,-258 }, { 24,-258 }, { 25,-258 }, { 26,-258 }, { 27,-258 },+ { 28,-258 }, { 29,-258 }, { 30,-258 }, { 31,-258 }, { 32, 0 },++ { 33,-258 }, { 34,-258 }, { 35,-258 }, { 36,-258 }, { 37,-258 },+ { 38,-258 }, { 39,-258 }, { 40,-258 }, { 41,-258 }, { 42,-258 },+ { 43,-258 }, { 44,-258 }, { 45, 258 }, { 46,-258 }, { 47,-258 },+ { 48,-258 }, { 49,-258 }, { 50,-258 }, { 51,-258 }, { 52,-258 },+ { 53,-258 }, { 54,-258 }, { 55,-258 }, { 56,-258 }, { 57,-258 },+ { 58,-258 }, { 59,-258 }, { 60,-258 }, { 61,-258 }, { 62,-258 },+ { 63,-258 }, { 64,-258 }, { 65,-258 }, { 66,-258 }, { 67,-258 },+ { 68,-258 }, { 69,-258 }, { 70,-258 }, { 71,-258 }, { 72,-258 },+ { 73,-258 }, { 74,-258 }, { 75,-258 }, { 76,-258 }, { 77,-258 },+ { 78,-258 }, { 79,-258 }, { 80,-258 }, { 81,-258 }, { 82,-258 },++ { 83,-258 }, { 84,-258 }, { 85,-258 }, { 86,-258 }, { 87,-258 },+ { 88,-258 }, { 89,-258 }, { 90,-258 }, { 91,-258 }, { 92,-258 },+ { 93,-258 }, { 94,-258 }, { 95,-258 }, { 96,-258 }, { 97,-258 },+ { 98,-258 }, { 99,-258 }, { 100,-258 }, { 101,-258 }, { 102,-258 },+ { 103,-258 }, { 104,-258 }, { 105,-258 }, { 106,-258 }, { 107,-258 },+ { 108,-258 }, { 109,-258 }, { 110,-258 }, { 111,-258 }, { 112,-258 },+ { 113,-258 }, { 114,-258 }, { 115,-258 }, { 116,-258 }, { 117,-258 },+ { 118,-258 }, { 119,-258 }, { 120,-258 }, { 121,-258 }, { 122,-258 },+ { 123,-258 }, { 124,-258 }, { 125,-258 }, { 126,-258 }, { 127,-258 },+ { 128,-258 }, { 129,-258 }, { 130,-258 }, { 131,-258 }, { 132,-258 },++ { 133,-258 }, { 134,-258 }, { 135,-258 }, { 136,-258 }, { 137,-258 },+ { 138,-258 }, { 139,-258 }, { 140,-258 }, { 141,-258 }, { 142,-258 },+ { 143,-258 }, { 144,-258 }, { 145,-258 }, { 146,-258 }, { 147,-258 },+ { 148,-258 }, { 149,-258 }, { 150,-258 }, { 151,-258 }, { 152,-258 },+ { 153,-258 }, { 154,-258 }, { 155,-258 }, { 156,-258 }, { 157,-258 },+ { 158,-258 }, { 159,-258 }, { 160,-258 }, { 161,-258 }, { 162,-258 },+ { 163,-258 }, { 164,-258 }, { 165,-258 }, { 166,-258 }, { 167,-258 },+ { 168,-258 }, { 169,-258 }, { 170,-258 }, { 171,-258 }, { 172,-258 },+ { 173,-258 }, { 174,-258 }, { 175,-258 }, { 176,-258 }, { 177,-258 },+ { 178,-258 }, { 179,-258 }, { 180,-258 }, { 181,-258 }, { 182,-258 },++ { 183,-258 }, { 184,-258 }, { 185,-258 }, { 186,-258 }, { 187,-258 },+ { 188,-258 }, { 189,-258 }, { 190,-258 }, { 191,-258 }, { 192,-258 },+ { 193,-258 }, { 194,-258 }, { 195,-258 }, { 196,-258 }, { 197,-258 },+ { 198,-258 }, { 199,-258 }, { 200,-258 }, { 201,-258 }, { 202,-258 },+ { 203,-258 }, { 204,-258 }, { 205,-258 }, { 206,-258 }, { 207,-258 },+ { 208,-258 }, { 209,-258 }, { 210,-258 }, { 211,-258 }, { 212,-258 },+ { 213,-258 }, { 214,-258 }, { 215,-258 }, { 216,-258 }, { 217,-258 },+ { 218,-258 }, { 219,-258 }, { 220,-258 }, { 221,-258 }, { 222,-258 },+ { 223,-258 }, { 224,-258 }, { 225,-258 }, { 226,-258 }, { 227,-258 },+ { 228,-258 }, { 229,-258 }, { 230,-258 }, { 231,-258 }, { 232,-258 },++ { 233,-258 }, { 234,-258 }, { 235,-258 }, { 236,-258 }, { 237,-258 },+ { 238,-258 }, { 239,-258 }, { 240,-258 }, { 241,-258 }, { 242,-258 },+ { 243,-258 }, { 244,-258 }, { 245,-258 }, { 246,-258 }, { 247,-258 },+ { 248,-258 }, { 249,-258 }, { 250,-258 }, { 251,-258 }, { 252,-258 },+ { 253,-258 }, { 254,-258 }, { 255,-258 }, { 256,-258 }, { 0, 16 },+ { 0,15125 }, { 1,-516 }, { 2,-516 }, { 3,-516 }, { 4,-516 },+ { 5,-516 }, { 6,-516 }, { 7,-516 }, { 8,-516 }, { 9,-258 },+ { 10,-6935 }, { 11,-516 }, { 12,-258 }, { 13,-6935 }, { 14,-516 },+ { 15,-516 }, { 16,-516 }, { 17,-516 }, { 18,-516 }, { 19,-516 },+ { 20,-516 }, { 21,-516 }, { 22,-516 }, { 23,-516 }, { 24,-516 },++ { 25,-516 }, { 26,-516 }, { 27,-516 }, { 28,-516 }, { 29,-516 },+ { 30,-516 }, { 31,-516 }, { 32,-258 }, { 33,-516 }, { 34,-516 },+ { 35,-516 }, { 36,-516 }, { 37,-516 }, { 38,-516 }, { 39,-516 },+ { 40,-516 }, { 41,-516 }, { 42,-516 }, { 43,-516 }, { 44,-516 },+ { 45,4476 }, { 46,-516 }, { 47,-516 }, { 48,-516 }, { 49,-516 },+ { 50,-516 }, { 51,-516 }, { 52,-516 }, { 53,-516 }, { 54,-516 },+ { 55,-516 }, { 56,-516 }, { 57,-516 }, { 58,-516 }, { 59,-516 },+ { 60,-516 }, { 61,-516 }, { 62,-516 }, { 63,-516 }, { 64,-516 },+ { 65,-516 }, { 66,-516 }, { 67,-516 }, { 68,-516 }, { 69,-516 },+ { 70,-516 }, { 71,-516 }, { 72,-516 }, { 73,-516 }, { 74,-516 },++ { 75,-516 }, { 76,-516 }, { 77,-516 }, { 78,-516 }, { 79,-516 },+ { 80,-516 }, { 81,-516 }, { 82,-516 }, { 83,-516 }, { 84,-516 },+ { 85,-516 }, { 86,-516 }, { 87,-516 }, { 88,-516 }, { 89,-516 },+ { 90,-516 }, { 91,-516 }, { 92,-516 }, { 93,-516 }, { 94,-516 },+ { 95,-516 }, { 96,-516 }, { 97,-516 }, { 98,-516 }, { 99,-516 },+ { 100,-516 }, { 101,-516 }, { 102,-516 }, { 103,-516 }, { 104,-516 },+ { 105,-516 }, { 106,-516 }, { 107,-516 }, { 108,-516 }, { 109,-516 },+ { 110,-516 }, { 111,-516 }, { 112,-516 }, { 113,-516 }, { 114,-516 },+ { 115,-516 }, { 116,-516 }, { 117,-516 }, { 118,-516 }, { 119,-516 },+ { 120,-516 }, { 121,-516 }, { 122,-516 }, { 123,-516 }, { 124,-516 },++ { 125,-516 }, { 126,-516 }, { 127,-516 }, { 128,-516 }, { 129,-516 },+ { 130,-516 }, { 131,-516 }, { 132,-516 }, { 133,-516 }, { 134,-516 },+ { 135,-516 }, { 136,-516 }, { 137,-516 }, { 138,-516 }, { 139,-516 },+ { 140,-516 }, { 141,-516 }, { 142,-516 }, { 143,-516 }, { 144,-516 },+ { 145,-516 }, { 146,-516 }, { 147,-516 }, { 148,-516 }, { 149,-516 },+ { 150,-516 }, { 151,-516 }, { 152,-516 }, { 153,-516 }, { 154,-516 },+ { 155,-516 }, { 156,-516 }, { 157,-516 }, { 158,-516 }, { 159,-516 },+ { 160,-516 }, { 161,-516 }, { 162,-516 }, { 163,-516 }, { 164,-516 },+ { 165,-516 }, { 166,-516 }, { 167,-516 }, { 168,-516 }, { 169,-516 },+ { 170,-516 }, { 171,-516 }, { 172,-516 }, { 173,-516 }, { 174,-516 },++ { 175,-516 }, { 176,-516 }, { 177,-516 }, { 178,-516 }, { 179,-516 },+ { 180,-516 }, { 181,-516 }, { 182,-516 }, { 183,-516 }, { 184,-516 },+ { 185,-516 }, { 186,-516 }, { 187,-516 }, { 188,-516 }, { 189,-516 },+ { 190,-516 }, { 191,-516 }, { 192,-516 }, { 193,-516 }, { 194,-516 },+ { 195,-516 }, { 196,-516 }, { 197,-516 }, { 198,-516 }, { 199,-516 },+ { 200,-516 }, { 201,-516 }, { 202,-516 }, { 203,-516 }, { 204,-516 },+ { 205,-516 }, { 206,-516 }, { 207,-516 }, { 208,-516 }, { 209,-516 },+ { 210,-516 }, { 211,-516 }, { 212,-516 }, { 213,-516 }, { 214,-516 },+ { 215,-516 }, { 216,-516 }, { 217,-516 }, { 218,-516 }, { 219,-516 },+ { 220,-516 }, { 221,-516 }, { 222,-516 }, { 223,-516 }, { 224,-516 },++ { 225,-516 }, { 226,-516 }, { 227,-516 }, { 228,-516 }, { 229,-516 },+ { 230,-516 }, { 231,-516 }, { 232,-516 }, { 233,-516 }, { 234,-516 },+ { 235,-516 }, { 236,-516 }, { 237,-516 }, { 238,-516 }, { 239,-516 },+ { 240,-516 }, { 241,-516 }, { 242,-516 }, { 243,-516 }, { 244,-516 },+ { 245,-516 }, { 246,-516 }, { 247,-516 }, { 248,-516 }, { 249,-516 },+ { 250,-516 }, { 251,-516 }, { 252,-516 }, { 253,-516 }, { 254,-516 },+ { 255,-516 }, { 256,-516 }, { 0, 22 }, { 0,14867 }, { 1,4476 },+ { 2,4476 }, { 3,4476 }, { 4,4476 }, { 5,4476 }, { 6,4476 },+ { 7,4476 }, { 8,4476 }, { 9,4734 }, { 10,4992 }, { 11,4476 },+ { 12,4734 }, { 13,4992 }, { 14,4476 }, { 15,4476 }, { 16,4476 },++ { 17,4476 }, { 18,4476 }, { 19,4476 }, { 20,4476 }, { 21,4476 },+ { 22,4476 }, { 23,4476 }, { 24,4476 }, { 25,4476 }, { 26,4476 },+ { 27,4476 }, { 28,4476 }, { 29,4476 }, { 30,4476 }, { 31,4476 },+ { 32,4734 }, { 33,4476 }, { 34,4476 }, { 35,4476 }, { 36,4476 },+ { 37,4476 }, { 38,4476 }, { 39,4476 }, { 40,4476 }, { 41,4476 },+ { 42,4476 }, { 43,4476 }, { 44,4476 }, { 45,5039 }, { 46,4476 },+ { 47,4476 }, { 48,4476 }, { 49,4476 }, { 50,4476 }, { 51,4476 },+ { 52,4476 }, { 53,4476 }, { 54,4476 }, { 55,4476 }, { 56,4476 },+ { 57,4476 }, { 58,4476 }, { 59,4476 }, { 60,4476 }, { 61,4476 },+ { 62,4476 }, { 63,4476 }, { 64,4476 }, { 65,4476 }, { 66,4476 },++ { 67,4476 }, { 68,4476 }, { 69,4476 }, { 70,4476 }, { 71,4476 },+ { 72,4476 }, { 73,4476 }, { 74,4476 }, { 75,4476 }, { 76,4476 },+ { 77,4476 }, { 78,4476 }, { 79,4476 }, { 80,4476 }, { 81,4476 },+ { 82,4476 }, { 83,4476 }, { 84,4476 }, { 85,4476 }, { 86,4476 },+ { 87,4476 }, { 88,4476 }, { 89,4476 }, { 90,4476 }, { 91,4476 },+ { 92,4476 }, { 93,4476 }, { 94,4476 }, { 95,4476 }, { 96,4476 },+ { 97,4476 }, { 98,4476 }, { 99,4476 }, { 100,4476 }, { 101,4476 },+ { 102,4476 }, { 103,4476 }, { 104,4476 }, { 105,4476 }, { 106,4476 },+ { 107,4476 }, { 108,4476 }, { 109,4476 }, { 110,4476 }, { 111,4476 },+ { 112,4476 }, { 113,4476 }, { 114,4476 }, { 115,4476 }, { 116,4476 },++ { 117,4476 }, { 118,4476 }, { 119,4476 }, { 120,4476 }, { 121,4476 },+ { 122,4476 }, { 123,4476 }, { 124,4476 }, { 125,4476 }, { 126,4476 },+ { 127,4476 }, { 128,4476 }, { 129,4476 }, { 130,4476 }, { 131,4476 },+ { 132,4476 }, { 133,4476 }, { 134,4476 }, { 135,4476 }, { 136,4476 },+ { 137,4476 }, { 138,4476 }, { 139,4476 }, { 140,4476 }, { 141,4476 },+ { 142,4476 }, { 143,4476 }, { 144,4476 }, { 145,4476 }, { 146,4476 },+ { 147,4476 }, { 148,4476 }, { 149,4476 }, { 150,4476 }, { 151,4476 },+ { 152,4476 }, { 153,4476 }, { 154,4476 }, { 155,4476 }, { 156,4476 },+ { 157,4476 }, { 158,4476 }, { 159,4476 }, { 160,4476 }, { 161,4476 },+ { 162,4476 }, { 163,4476 }, { 164,4476 }, { 165,4476 }, { 166,4476 },++ { 167,4476 }, { 168,4476 }, { 169,4476 }, { 170,4476 }, { 171,4476 },+ { 172,4476 }, { 173,4476 }, { 174,4476 }, { 175,4476 }, { 176,4476 },+ { 177,4476 }, { 178,4476 }, { 179,4476 }, { 180,4476 }, { 181,4476 },+ { 182,4476 }, { 183,4476 }, { 184,4476 }, { 185,4476 }, { 186,4476 },+ { 187,4476 }, { 188,4476 }, { 189,4476 }, { 190,4476 }, { 191,4476 },+ { 192,4476 }, { 193,4476 }, { 194,4476 }, { 195,4476 }, { 196,4476 },+ { 197,4476 }, { 198,4476 }, { 199,4476 }, { 200,4476 }, { 201,4476 },+ { 202,4476 }, { 203,4476 }, { 204,4476 }, { 205,4476 }, { 206,4476 },+ { 207,4476 }, { 208,4476 }, { 209,4476 }, { 210,4476 }, { 211,4476 },+ { 212,4476 }, { 213,4476 }, { 214,4476 }, { 215,4476 }, { 216,4476 },++ { 217,4476 }, { 218,4476 }, { 219,4476 }, { 220,4476 }, { 221,4476 },+ { 222,4476 }, { 223,4476 }, { 224,4476 }, { 225,4476 }, { 226,4476 },+ { 227,4476 }, { 228,4476 }, { 229,4476 }, { 230,4476 }, { 231,4476 },+ { 232,4476 }, { 233,4476 }, { 234,4476 }, { 235,4476 }, { 236,4476 },+ { 237,4476 }, { 238,4476 }, { 239,4476 }, { 240,4476 }, { 241,4476 },+ { 242,4476 }, { 243,4476 }, { 244,4476 }, { 245,4476 }, { 246,4476 },+ { 247,4476 }, { 248,4476 }, { 249,4476 }, { 250,4476 }, { 251,4476 },+ { 252,4476 }, { 253,4476 }, { 254,4476 }, { 255,4476 }, { 256,4476 },+ { 0, 22 }, { 0,14609 }, { 1, 0 }, { 2, 0 }, { 3, 0 },+ { 4, 0 }, { 5, 0 }, { 6, 0 }, { 7, 0 }, { 8, 0 },++ { 9, 258 }, { 10,-7141 }, { 11, 0 }, { 12, 258 }, { 13,-7141 },+ { 14, 0 }, { 15, 0 }, { 16, 0 }, { 17, 0 }, { 18, 0 },+ { 19, 0 }, { 20, 0 }, { 21, 0 }, { 22, 0 }, { 23, 0 },+ { 24, 0 }, { 25, 0 }, { 26, 0 }, { 27, 0 }, { 28, 0 },+ { 29, 0 }, { 30, 0 }, { 31, 0 }, { 32, 258 }, { 33, 0 },+ { 34, 0 }, { 35, 0 }, { 36, 0 }, { 37, 0 }, { 38, 0 },+ { 39, 0 }, { 40, 0 }, { 41, 0 }, { 42, 0 }, { 43, 0 },+ { 44, 0 }, { 45, 516 }, { 46, 0 }, { 47, 0 }, { 48, 0 },+ { 49, 0 }, { 50, 0 }, { 51, 0 }, { 52, 0 }, { 53, 0 },+ { 54, 0 }, { 55, 0 }, { 56, 0 }, { 57, 0 }, { 58, 0 },++ { 59, 0 }, { 60, 0 }, { 61, 0 }, { 62, 0 }, { 63, 0 },+ { 64, 0 }, { 65, 0 }, { 66, 0 }, { 67, 0 }, { 68, 0 },+ { 69, 0 }, { 70, 0 }, { 71, 0 }, { 72, 0 }, { 73, 0 },+ { 74, 0 }, { 75, 0 }, { 76, 0 }, { 77, 0 }, { 78, 0 },+ { 79, 0 }, { 80, 0 }, { 81, 0 }, { 82, 0 }, { 83, 0 },+ { 84, 0 }, { 85, 0 }, { 86, 0 }, { 87, 0 }, { 88, 0 },+ { 89, 0 }, { 90, 0 }, { 91, 0 }, { 92, 0 }, { 93, 0 },+ { 94, 0 }, { 95, 0 }, { 96, 0 }, { 97, 0 }, { 98, 0 },+ { 99, 0 }, { 100, 0 }, { 101, 0 }, { 102, 0 }, { 103, 0 },+ { 104, 0 }, { 105, 0 }, { 106, 0 }, { 107, 0 }, { 108, 0 },++ { 109, 0 }, { 110, 0 }, { 111, 0 }, { 112, 0 }, { 113, 0 },+ { 114, 0 }, { 115, 0 }, { 116, 0 }, { 117, 0 }, { 118, 0 },+ { 119, 0 }, { 120, 0 }, { 121, 0 }, { 122, 0 }, { 123, 0 },+ { 124, 0 }, { 125, 0 }, { 126, 0 }, { 127, 0 }, { 128, 0 },+ { 129, 0 }, { 130, 0 }, { 131, 0 }, { 132, 0 }, { 133, 0 },+ { 134, 0 }, { 135, 0 }, { 136, 0 }, { 137, 0 }, { 138, 0 },+ { 139, 0 }, { 140, 0 }, { 141, 0 }, { 142, 0 }, { 143, 0 },+ { 144, 0 }, { 145, 0 }, { 146, 0 }, { 147, 0 }, { 148, 0 },+ { 149, 0 }, { 150, 0 }, { 151, 0 }, { 152, 0 }, { 153, 0 },+ { 154, 0 }, { 155, 0 }, { 156, 0 }, { 157, 0 }, { 158, 0 },++ { 159, 0 }, { 160, 0 }, { 161, 0 }, { 162, 0 }, { 163, 0 },+ { 164, 0 }, { 165, 0 }, { 166, 0 }, { 167, 0 }, { 168, 0 },+ { 169, 0 }, { 170, 0 }, { 171, 0 }, { 172, 0 }, { 173, 0 },+ { 174, 0 }, { 175, 0 }, { 176, 0 }, { 177, 0 }, { 178, 0 },+ { 179, 0 }, { 180, 0 }, { 181, 0 }, { 182, 0 }, { 183, 0 },+ { 184, 0 }, { 185, 0 }, { 186, 0 }, { 187, 0 }, { 188, 0 },+ { 189, 0 }, { 190, 0 }, { 191, 0 }, { 192, 0 }, { 193, 0 },+ { 194, 0 }, { 195, 0 }, { 196, 0 }, { 197, 0 }, { 198, 0 },+ { 199, 0 }, { 200, 0 }, { 201, 0 }, { 202, 0 }, { 203, 0 },+ { 204, 0 }, { 205, 0 }, { 206, 0 }, { 207, 0 }, { 208, 0 },++ { 209, 0 }, { 210, 0 }, { 211, 0 }, { 212, 0 }, { 213, 0 },+ { 214, 0 }, { 215, 0 }, { 216, 0 }, { 217, 0 }, { 218, 0 },+ { 219, 0 }, { 220, 0 }, { 221, 0 }, { 222, 0 }, { 223, 0 },+ { 224, 0 }, { 225, 0 }, { 226, 0 }, { 227, 0 }, { 228, 0 },+ { 229, 0 }, { 230, 0 }, { 231, 0 }, { 232, 0 }, { 233, 0 },+ { 234, 0 }, { 235, 0 }, { 236, 0 }, { 237, 0 }, { 238, 0 },+ { 239, 0 }, { 240, 0 }, { 241, 0 }, { 242, 0 }, { 243, 0 },+ { 244, 0 }, { 245, 0 }, { 246, 0 }, { 247, 0 }, { 248, 0 },+ { 249, 0 }, { 250, 0 }, { 251, 0 }, { 252, 0 }, { 253, 0 },+ { 254, 0 }, { 255, 0 }, { 256, 0 }, { 0, 22 }, { 0,14351 },++ { 1,-258 }, { 2,-258 }, { 3,-258 }, { 4,-258 }, { 5,-258 },+ { 6,-258 }, { 7,-258 }, { 8,-258 }, { 9, 0 }, { 10,-7399 },+ { 11,-258 }, { 12, 0 }, { 13,-7399 }, { 14,-258 }, { 15,-258 },+ { 16,-258 }, { 17,-258 }, { 18,-258 }, { 19,-258 }, { 20,-258 },+ { 21,-258 }, { 22,-258 }, { 23,-258 }, { 24,-258 }, { 25,-258 },+ { 26,-258 }, { 27,-258 }, { 28,-258 }, { 29,-258 }, { 30,-258 },+ { 31,-258 }, { 32, 0 }, { 33,-258 }, { 34,-258 }, { 35,-258 },+ { 36,-258 }, { 37,-258 }, { 38,-258 }, { 39,-258 }, { 40,-258 },+ { 41,-258 }, { 42,-258 }, { 43,-258 }, { 44,-258 }, { 45, 258 },+ { 46,-258 }, { 47,-258 }, { 48,-258 }, { 49,-258 }, { 50,-258 },++ { 51,-258 }, { 52,-258 }, { 53,-258 }, { 54,-258 }, { 55,-258 },+ { 56,-258 }, { 57,-258 }, { 58,-258 }, { 59,-258 }, { 60,-258 },+ { 61,-258 }, { 62,-258 }, { 63,-258 }, { 64,-258 }, { 65,-258 },+ { 66,-258 }, { 67,-258 }, { 68,-258 }, { 69,-258 }, { 70,-258 },+ { 71,-258 }, { 72,-258 }, { 73,-258 }, { 74,-258 }, { 75,-258 },+ { 76,-258 }, { 77,-258 }, { 78,-258 }, { 79,-258 }, { 80,-258 },+ { 81,-258 }, { 82,-258 }, { 83,-258 }, { 84,-258 }, { 85,-258 },+ { 86,-258 }, { 87,-258 }, { 88,-258 }, { 89,-258 }, { 90,-258 },+ { 91,-258 }, { 92,-258 }, { 93,-258 }, { 94,-258 }, { 95,-258 },+ { 96,-258 }, { 97,-258 }, { 98,-258 }, { 99,-258 }, { 100,-258 },++ { 101,-258 }, { 102,-258 }, { 103,-258 }, { 104,-258 }, { 105,-258 },+ { 106,-258 }, { 107,-258 }, { 108,-258 }, { 109,-258 }, { 110,-258 },+ { 111,-258 }, { 112,-258 }, { 113,-258 }, { 114,-258 }, { 115,-258 },+ { 116,-258 }, { 117,-258 }, { 118,-258 }, { 119,-258 }, { 120,-258 },+ { 121,-258 }, { 122,-258 }, { 123,-258 }, { 124,-258 }, { 125,-258 },+ { 126,-258 }, { 127,-258 }, { 128,-258 }, { 129,-258 }, { 130,-258 },+ { 131,-258 }, { 132,-258 }, { 133,-258 }, { 134,-258 }, { 135,-258 },+ { 136,-258 }, { 137,-258 }, { 138,-258 }, { 139,-258 }, { 140,-258 },+ { 141,-258 }, { 142,-258 }, { 143,-258 }, { 144,-258 }, { 145,-258 },+ { 146,-258 }, { 147,-258 }, { 148,-258 }, { 149,-258 }, { 150,-258 },++ { 151,-258 }, { 152,-258 }, { 153,-258 }, { 154,-258 }, { 155,-258 },+ { 156,-258 }, { 157,-258 }, { 158,-258 }, { 159,-258 }, { 160,-258 },+ { 161,-258 }, { 162,-258 }, { 163,-258 }, { 164,-258 }, { 165,-258 },+ { 166,-258 }, { 167,-258 }, { 168,-258 }, { 169,-258 }, { 170,-258 },+ { 171,-258 }, { 172,-258 }, { 173,-258 }, { 174,-258 }, { 175,-258 },+ { 176,-258 }, { 177,-258 }, { 178,-258 }, { 179,-258 }, { 180,-258 },+ { 181,-258 }, { 182,-258 }, { 183,-258 }, { 184,-258 }, { 185,-258 },+ { 186,-258 }, { 187,-258 }, { 188,-258 }, { 189,-258 }, { 190,-258 },+ { 191,-258 }, { 192,-258 }, { 193,-258 }, { 194,-258 }, { 195,-258 },+ { 196,-258 }, { 197,-258 }, { 198,-258 }, { 199,-258 }, { 200,-258 },++ { 201,-258 }, { 202,-258 }, { 203,-258 }, { 204,-258 }, { 205,-258 },+ { 206,-258 }, { 207,-258 }, { 208,-258 }, { 209,-258 }, { 210,-258 },+ { 211,-258 }, { 212,-258 }, { 213,-258 }, { 214,-258 }, { 215,-258 },+ { 216,-258 }, { 217,-258 }, { 218,-258 }, { 219,-258 }, { 220,-258 },+ { 221,-258 }, { 222,-258 }, { 223,-258 }, { 224,-258 }, { 225,-258 },+ { 226,-258 }, { 227,-258 }, { 228,-258 }, { 229,-258 }, { 230,-258 },+ { 231,-258 }, { 232,-258 }, { 233,-258 }, { 234,-258 }, { 235,-258 },+ { 236,-258 }, { 237,-258 }, { 238,-258 }, { 239,-258 }, { 240,-258 },+ { 241,-258 }, { 242,-258 }, { 243,-258 }, { 244,-258 }, { 245,-258 },+ { 246,-258 }, { 247,-258 }, { 248,-258 }, { 249,-258 }, { 250,-258 },++ { 251,-258 }, { 252,-258 }, { 253,-258 }, { 254,-258 }, { 255,-258 },+ { 256,-258 }, { 0, 22 }, { 0,14093 }, { 1,-516 }, { 2,-516 },+ { 3,-516 }, { 4,-516 }, { 5,-516 }, { 6,-516 }, { 7,-516 },+ { 8,-516 }, { 9,-258 }, { 10,-7657 }, { 11,-516 }, { 12,-258 },+ { 13,-7657 }, { 14,-516 }, { 15,-516 }, { 16,-516 }, { 17,-516 },+ { 18,-516 }, { 19,-516 }, { 20,-516 }, { 21,-516 }, { 22,-516 },+ { 23,-516 }, { 24,-516 }, { 25,-516 }, { 26,-516 }, { 27,-516 },+ { 28,-516 }, { 29,-516 }, { 30,-516 }, { 31,-516 }, { 32,-258 },+ { 33,-516 }, { 34,-516 }, { 35,-516 }, { 36,-516 }, { 37,-516 },+ { 38,-516 }, { 39,-516 }, { 40,-516 }, { 41,-516 }, { 42,-516 },++ { 43,-516 }, { 44,-516 }, { 45,4523 }, { 46,-516 }, { 47,-516 },+ { 48,-516 }, { 49,-516 }, { 50,-516 }, { 51,-516 }, { 52,-516 },+ { 53,-516 }, { 54,-516 }, { 55,-516 }, { 56,-516 }, { 57,-516 },+ { 58,-516 }, { 59,-516 }, { 60,-516 }, { 61,-516 }, { 62,-516 },+ { 63,-516 }, { 64,-516 }, { 65,-516 }, { 66,-516 }, { 67,-516 },+ { 68,-516 }, { 69,-516 }, { 70,-516 }, { 71,-516 }, { 72,-516 },+ { 73,-516 }, { 74,-516 }, { 75,-516 }, { 76,-516 }, { 77,-516 },+ { 78,-516 }, { 79,-516 }, { 80,-516 }, { 81,-516 }, { 82,-516 },+ { 83,-516 }, { 84,-516 }, { 85,-516 }, { 86,-516 }, { 87,-516 },+ { 88,-516 }, { 89,-516 }, { 90,-516 }, { 91,-516 }, { 92,-516 },++ { 93,-516 }, { 94,-516 }, { 95,-516 }, { 96,-516 }, { 97,-516 },+ { 98,-516 }, { 99,-516 }, { 100,-516 }, { 101,-516 }, { 102,-516 },+ { 103,-516 }, { 104,-516 }, { 105,-516 }, { 106,-516 }, { 107,-516 },+ { 108,-516 }, { 109,-516 }, { 110,-516 }, { 111,-516 }, { 112,-516 },+ { 113,-516 }, { 114,-516 }, { 115,-516 }, { 116,-516 }, { 117,-516 },+ { 118,-516 }, { 119,-516 }, { 120,-516 }, { 121,-516 }, { 122,-516 },+ { 123,-516 }, { 124,-516 }, { 125,-516 }, { 126,-516 }, { 127,-516 },+ { 128,-516 }, { 129,-516 }, { 130,-516 }, { 131,-516 }, { 132,-516 },+ { 133,-516 }, { 134,-516 }, { 135,-516 }, { 136,-516 }, { 137,-516 },+ { 138,-516 }, { 139,-516 }, { 140,-516 }, { 141,-516 }, { 142,-516 },++ { 143,-516 }, { 144,-516 }, { 145,-516 }, { 146,-516 }, { 147,-516 },+ { 148,-516 }, { 149,-516 }, { 150,-516 }, { 151,-516 }, { 152,-516 },+ { 153,-516 }, { 154,-516 }, { 155,-516 }, { 156,-516 }, { 157,-516 },+ { 158,-516 }, { 159,-516 }, { 160,-516 }, { 161,-516 }, { 162,-516 },+ { 163,-516 }, { 164,-516 }, { 165,-516 }, { 166,-516 }, { 167,-516 },+ { 168,-516 }, { 169,-516 }, { 170,-516 }, { 171,-516 }, { 172,-516 },+ { 173,-516 }, { 174,-516 }, { 175,-516 }, { 176,-516 }, { 177,-516 },+ { 178,-516 }, { 179,-516 }, { 180,-516 }, { 181,-516 }, { 182,-516 },+ { 183,-516 }, { 184,-516 }, { 185,-516 }, { 186,-516 }, { 187,-516 },+ { 188,-516 }, { 189,-516 }, { 190,-516 }, { 191,-516 }, { 192,-516 },++ { 193,-516 }, { 194,-516 }, { 195,-516 }, { 196,-516 }, { 197,-516 },+ { 198,-516 }, { 199,-516 }, { 200,-516 }, { 201,-516 }, { 202,-516 },+ { 203,-516 }, { 204,-516 }, { 205,-516 }, { 206,-516 }, { 207,-516 },+ { 208,-516 }, { 209,-516 }, { 210,-516 }, { 211,-516 }, { 212,-516 },+ { 213,-516 }, { 214,-516 }, { 215,-516 }, { 216,-516 }, { 217,-516 },+ { 218,-516 }, { 219,-516 }, { 220,-516 }, { 221,-516 }, { 222,-516 },+ { 223,-516 }, { 224,-516 }, { 225,-516 }, { 226,-516 }, { 227,-516 },+ { 228,-516 }, { 229,-516 }, { 230,-516 }, { 231,-516 }, { 232,-516 },+ { 233,-516 }, { 234,-516 }, { 235,-516 }, { 236,-516 }, { 237,-516 },+ { 238,-516 }, { 239,-516 }, { 240,-516 }, { 241,-516 }, { 242,-516 },++ { 243,-516 }, { 244,-516 }, { 245,-516 }, { 246,-516 }, { 247,-516 },+ { 248,-516 }, { 249,-516 }, { 250,-516 }, { 251,-516 }, { 252,-516 },+ { 253,-516 }, { 254,-516 }, { 255,-516 }, { 256,-516 }, { 0, 37 },+ { 0,13835 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 37 }, { 0,13812 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },++ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48,4523 }, { 49,4523 },+ { 50,4523 }, { 51,4523 }, { 52,4523 }, { 53,4523 }, { 54,4523 },+ { 55,4523 }, { 56,4523 }, { 57,4523 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 65,4523 }, { 66,4523 }, { 67,4523 }, { 68,4523 }, { 69,4523 },+ { 70,4523 }, { 48,4523 }, { 49,4523 }, { 50,4523 }, { 51,4523 },+ { 52,4523 }, { 53,4523 }, { 54,4523 }, { 55,4523 }, { 56,4523 },+ { 57,4523 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },++ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,4523 }, { 66,4523 },+ { 67,4523 }, { 68,4523 }, { 69,4523 }, { 70,4523 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 97,4523 }, { 98,4523 }, { 99,4523 },+ { 100,4523 }, { 101,4523 }, { 102,4523 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 97,4523 }, { 98,4523 }, { 99,4523 }, { 100,4523 }, { 101,4523 },+ { 102,4523 }, { 0, 24 }, { 0,13708 }, { 1,4523 }, { 2,4523 },+ { 3,4523 }, { 4,4523 }, { 5,4523 }, { 6,4523 }, { 7,4523 },++ { 8,4523 }, { 9,4781 }, { 10,5039 }, { 11,4523 }, { 12,4781 },+ { 13,5039 }, { 14,4523 }, { 15,4523 }, { 16,4523 }, { 17,4523 },+ { 18,4523 }, { 19,4523 }, { 20,4523 }, { 21,4523 }, { 22,4523 },+ { 23,4523 }, { 24,4523 }, { 25,4523 }, { 26,4523 }, { 27,4523 },+ { 28,4523 }, { 29,4523 }, { 30,4523 }, { 31,4523 }, { 32,4781 },+ { 33,4523 }, { 34,4523 }, { 35,4523 }, { 36,4523 }, { 37,4523 },+ { 38,4523 }, { 39,4523 }, { 40,4523 }, { 41,4523 }, { 42,4523 },+ { 43,4523 }, { 44,4523 }, { 45,5086 }, { 46,4523 }, { 47,4523 },+ { 48,4523 }, { 49,4523 }, { 50,4523 }, { 51,4523 }, { 52,4523 },+ { 53,4523 }, { 54,4523 }, { 55,4523 }, { 56,4523 }, { 57,4523 },++ { 58,4523 }, { 59,4523 }, { 60,4523 }, { 61,4523 }, { 62,4523 },+ { 63,4523 }, { 64,4523 }, { 65,4523 }, { 66,4523 }, { 67,4523 },+ { 68,4523 }, { 69,4523 }, { 70,4523 }, { 71,4523 }, { 72,4523 },+ { 73,4523 }, { 74,4523 }, { 75,4523 }, { 76,4523 }, { 77,4523 },+ { 78,4523 }, { 79,4523 }, { 80,4523 }, { 81,4523 }, { 82,4523 },+ { 83,4523 }, { 84,4523 }, { 85,4523 }, { 86,4523 }, { 87,4523 },+ { 88,4523 }, { 89,4523 }, { 90,4523 }, { 91,4523 }, { 92,4523 },+ { 93,4523 }, { 94,4523 }, { 95,4523 }, { 96,4523 }, { 97,4523 },+ { 98,4523 }, { 99,4523 }, { 100,4523 }, { 101,4523 }, { 102,4523 },+ { 103,4523 }, { 104,4523 }, { 105,4523 }, { 106,4523 }, { 107,4523 },++ { 108,4523 }, { 109,4523 }, { 110,4523 }, { 111,4523 }, { 112,4523 },+ { 113,4523 }, { 114,4523 }, { 115,4523 }, { 116,4523 }, { 117,4523 },+ { 118,4523 }, { 119,4523 }, { 120,4523 }, { 121,4523 }, { 122,4523 },+ { 123,4523 }, { 124,4523 }, { 125,4523 }, { 126,4523 }, { 127,4523 },+ { 128,4523 }, { 129,4523 }, { 130,4523 }, { 131,4523 }, { 132,4523 },+ { 133,4523 }, { 134,4523 }, { 135,4523 }, { 136,4523 }, { 137,4523 },+ { 138,4523 }, { 139,4523 }, { 140,4523 }, { 141,4523 }, { 142,4523 },+ { 143,4523 }, { 144,4523 }, { 145,4523 }, { 146,4523 }, { 147,4523 },+ { 148,4523 }, { 149,4523 }, { 150,4523 }, { 151,4523 }, { 152,4523 },+ { 153,4523 }, { 154,4523 }, { 155,4523 }, { 156,4523 }, { 157,4523 },++ { 158,4523 }, { 159,4523 }, { 160,4523 }, { 161,4523 }, { 162,4523 },+ { 163,4523 }, { 164,4523 }, { 165,4523 }, { 166,4523 }, { 167,4523 },+ { 168,4523 }, { 169,4523 }, { 170,4523 }, { 171,4523 }, { 172,4523 },+ { 173,4523 }, { 174,4523 }, { 175,4523 }, { 176,4523 }, { 177,4523 },+ { 178,4523 }, { 179,4523 }, { 180,4523 }, { 181,4523 }, { 182,4523 },+ { 183,4523 }, { 184,4523 }, { 185,4523 }, { 186,4523 }, { 187,4523 },+ { 188,4523 }, { 189,4523 }, { 190,4523 }, { 191,4523 }, { 192,4523 },+ { 193,4523 }, { 194,4523 }, { 195,4523 }, { 196,4523 }, { 197,4523 },+ { 198,4523 }, { 199,4523 }, { 200,4523 }, { 201,4523 }, { 202,4523 },+ { 203,4523 }, { 204,4523 }, { 205,4523 }, { 206,4523 }, { 207,4523 },++ { 208,4523 }, { 209,4523 }, { 210,4523 }, { 211,4523 }, { 212,4523 },+ { 213,4523 }, { 214,4523 }, { 215,4523 }, { 216,4523 }, { 217,4523 },+ { 218,4523 }, { 219,4523 }, { 220,4523 }, { 221,4523 }, { 222,4523 },+ { 223,4523 }, { 224,4523 }, { 225,4523 }, { 226,4523 }, { 227,4523 },+ { 228,4523 }, { 229,4523 }, { 230,4523 }, { 231,4523 }, { 232,4523 },+ { 233,4523 }, { 234,4523 }, { 235,4523 }, { 236,4523 }, { 237,4523 },+ { 238,4523 }, { 239,4523 }, { 240,4523 }, { 241,4523 }, { 242,4523 },+ { 243,4523 }, { 244,4523 }, { 245,4523 }, { 246,4523 }, { 247,4523 },+ { 248,4523 }, { 249,4523 }, { 250,4523 }, { 251,4523 }, { 252,4523 },+ { 253,4523 }, { 254,4523 }, { 255,4523 }, { 256,4523 }, { 0, 24 },++ { 0,13450 }, { 1, 0 }, { 2, 0 }, { 3, 0 }, { 4, 0 },+ { 5, 0 }, { 6, 0 }, { 7, 0 }, { 8, 0 }, { 9, 258 },+ { 10,-7084 }, { 11, 0 }, { 12, 258 }, { 13,-7084 }, { 14, 0 },+ { 15, 0 }, { 16, 0 }, { 17, 0 }, { 18, 0 }, { 19, 0 },+ { 20, 0 }, { 21, 0 }, { 22, 0 }, { 23, 0 }, { 24, 0 },+ { 25, 0 }, { 26, 0 }, { 27, 0 }, { 28, 0 }, { 29, 0 },+ { 30, 0 }, { 31, 0 }, { 32, 258 }, { 33, 0 }, { 34, 0 },+ { 35, 0 }, { 36, 0 }, { 37, 0 }, { 38, 0 }, { 39, 0 },+ { 40, 0 }, { 41, 0 }, { 42, 0 }, { 43, 0 }, { 44, 0 },+ { 45, 516 }, { 46, 0 }, { 47, 0 }, { 48, 0 }, { 49, 0 },++ { 50, 0 }, { 51, 0 }, { 52, 0 }, { 53, 0 }, { 54, 0 },+ { 55, 0 }, { 56, 0 }, { 57, 0 }, { 58, 0 }, { 59, 0 },+ { 60, 0 }, { 61, 0 }, { 62, 0 }, { 63, 0 }, { 64, 0 },+ { 65, 0 }, { 66, 0 }, { 67, 0 }, { 68, 0 }, { 69, 0 },+ { 70, 0 }, { 71, 0 }, { 72, 0 }, { 73, 0 }, { 74, 0 },+ { 75, 0 }, { 76, 0 }, { 77, 0 }, { 78, 0 }, { 79, 0 },+ { 80, 0 }, { 81, 0 }, { 82, 0 }, { 83, 0 }, { 84, 0 },+ { 85, 0 }, { 86, 0 }, { 87, 0 }, { 88, 0 }, { 89, 0 },+ { 90, 0 }, { 91, 0 }, { 92, 0 }, { 93, 0 }, { 94, 0 },+ { 95, 0 }, { 96, 0 }, { 97, 0 }, { 98, 0 }, { 99, 0 },++ { 100, 0 }, { 101, 0 }, { 102, 0 }, { 103, 0 }, { 104, 0 },+ { 105, 0 }, { 106, 0 }, { 107, 0 }, { 108, 0 }, { 109, 0 },+ { 110, 0 }, { 111, 0 }, { 112, 0 }, { 113, 0 }, { 114, 0 },+ { 115, 0 }, { 116, 0 }, { 117, 0 }, { 118, 0 }, { 119, 0 },+ { 120, 0 }, { 121, 0 }, { 122, 0 }, { 123, 0 }, { 124, 0 },+ { 125, 0 }, { 126, 0 }, { 127, 0 }, { 128, 0 }, { 129, 0 },+ { 130, 0 }, { 131, 0 }, { 132, 0 }, { 133, 0 }, { 134, 0 },+ { 135, 0 }, { 136, 0 }, { 137, 0 }, { 138, 0 }, { 139, 0 },+ { 140, 0 }, { 141, 0 }, { 142, 0 }, { 143, 0 }, { 144, 0 },+ { 145, 0 }, { 146, 0 }, { 147, 0 }, { 148, 0 }, { 149, 0 },++ { 150, 0 }, { 151, 0 }, { 152, 0 }, { 153, 0 }, { 154, 0 },+ { 155, 0 }, { 156, 0 }, { 157, 0 }, { 158, 0 }, { 159, 0 },+ { 160, 0 }, { 161, 0 }, { 162, 0 }, { 163, 0 }, { 164, 0 },+ { 165, 0 }, { 166, 0 }, { 167, 0 }, { 168, 0 }, { 169, 0 },+ { 170, 0 }, { 171, 0 }, { 172, 0 }, { 173, 0 }, { 174, 0 },+ { 175, 0 }, { 176, 0 }, { 177, 0 }, { 178, 0 }, { 179, 0 },+ { 180, 0 }, { 181, 0 }, { 182, 0 }, { 183, 0 }, { 184, 0 },+ { 185, 0 }, { 186, 0 }, { 187, 0 }, { 188, 0 }, { 189, 0 },+ { 190, 0 }, { 191, 0 }, { 192, 0 }, { 193, 0 }, { 194, 0 },+ { 195, 0 }, { 196, 0 }, { 197, 0 }, { 198, 0 }, { 199, 0 },++ { 200, 0 }, { 201, 0 }, { 202, 0 }, { 203, 0 }, { 204, 0 },+ { 205, 0 }, { 206, 0 }, { 207, 0 }, { 208, 0 }, { 209, 0 },+ { 210, 0 }, { 211, 0 }, { 212, 0 }, { 213, 0 }, { 214, 0 },+ { 215, 0 }, { 216, 0 }, { 217, 0 }, { 218, 0 }, { 219, 0 },+ { 220, 0 }, { 221, 0 }, { 222, 0 }, { 223, 0 }, { 224, 0 },+ { 225, 0 }, { 226, 0 }, { 227, 0 }, { 228, 0 }, { 229, 0 },+ { 230, 0 }, { 231, 0 }, { 232, 0 }, { 233, 0 }, { 234, 0 },+ { 235, 0 }, { 236, 0 }, { 237, 0 }, { 238, 0 }, { 239, 0 },+ { 240, 0 }, { 241, 0 }, { 242, 0 }, { 243, 0 }, { 244, 0 },+ { 245, 0 }, { 246, 0 }, { 247, 0 }, { 248, 0 }, { 249, 0 },++ { 250, 0 }, { 251, 0 }, { 252, 0 }, { 253, 0 }, { 254, 0 },+ { 255, 0 }, { 256, 0 }, { 0, 24 }, { 0,13192 }, { 1,-258 },+ { 2,-258 }, { 3,-258 }, { 4,-258 }, { 5,-258 }, { 6,-258 },+ { 7,-258 }, { 8,-258 }, { 9, 0 }, { 10,-7342 }, { 11,-258 },+ { 12, 0 }, { 13,-7342 }, { 14,-258 }, { 15,-258 }, { 16,-258 },+ { 17,-258 }, { 18,-258 }, { 19,-258 }, { 20,-258 }, { 21,-258 },+ { 22,-258 }, { 23,-258 }, { 24,-258 }, { 25,-258 }, { 26,-258 },+ { 27,-258 }, { 28,-258 }, { 29,-258 }, { 30,-258 }, { 31,-258 },+ { 32, 0 }, { 33,-258 }, { 34,-258 }, { 35,-258 }, { 36,-258 },+ { 37,-258 }, { 38,-258 }, { 39,-258 }, { 40,-258 }, { 41,-258 },++ { 42,-258 }, { 43,-258 }, { 44,-258 }, { 45, 258 }, { 46,-258 },+ { 47,-258 }, { 48,-258 }, { 49,-258 }, { 50,-258 }, { 51,-258 },+ { 52,-258 }, { 53,-258 }, { 54,-258 }, { 55,-258 }, { 56,-258 },+ { 57,-258 }, { 58,-258 }, { 59,-258 }, { 60,-258 }, { 61,-258 },+ { 62,-258 }, { 63,-258 }, { 64,-258 }, { 65,-258 }, { 66,-258 },+ { 67,-258 }, { 68,-258 }, { 69,-258 }, { 70,-258 }, { 71,-258 },+ { 72,-258 }, { 73,-258 }, { 74,-258 }, { 75,-258 }, { 76,-258 },+ { 77,-258 }, { 78,-258 }, { 79,-258 }, { 80,-258 }, { 81,-258 },+ { 82,-258 }, { 83,-258 }, { 84,-258 }, { 85,-258 }, { 86,-258 },+ { 87,-258 }, { 88,-258 }, { 89,-258 }, { 90,-258 }, { 91,-258 },++ { 92,-258 }, { 93,-258 }, { 94,-258 }, { 95,-258 }, { 96,-258 },+ { 97,-258 }, { 98,-258 }, { 99,-258 }, { 100,-258 }, { 101,-258 },+ { 102,-258 }, { 103,-258 }, { 104,-258 }, { 105,-258 }, { 106,-258 },+ { 107,-258 }, { 108,-258 }, { 109,-258 }, { 110,-258 }, { 111,-258 },+ { 112,-258 }, { 113,-258 }, { 114,-258 }, { 115,-258 }, { 116,-258 },+ { 117,-258 }, { 118,-258 }, { 119,-258 }, { 120,-258 }, { 121,-258 },+ { 122,-258 }, { 123,-258 }, { 124,-258 }, { 125,-258 }, { 126,-258 },+ { 127,-258 }, { 128,-258 }, { 129,-258 }, { 130,-258 }, { 131,-258 },+ { 132,-258 }, { 133,-258 }, { 134,-258 }, { 135,-258 }, { 136,-258 },+ { 137,-258 }, { 138,-258 }, { 139,-258 }, { 140,-258 }, { 141,-258 },++ { 142,-258 }, { 143,-258 }, { 144,-258 }, { 145,-258 }, { 146,-258 },+ { 147,-258 }, { 148,-258 }, { 149,-258 }, { 150,-258 }, { 151,-258 },+ { 152,-258 }, { 153,-258 }, { 154,-258 }, { 155,-258 }, { 156,-258 },+ { 157,-258 }, { 158,-258 }, { 159,-258 }, { 160,-258 }, { 161,-258 },+ { 162,-258 }, { 163,-258 }, { 164,-258 }, { 165,-258 }, { 166,-258 },+ { 167,-258 }, { 168,-258 }, { 169,-258 }, { 170,-258 }, { 171,-258 },+ { 172,-258 }, { 173,-258 }, { 174,-258 }, { 175,-258 }, { 176,-258 },+ { 177,-258 }, { 178,-258 }, { 179,-258 }, { 180,-258 }, { 181,-258 },+ { 182,-258 }, { 183,-258 }, { 184,-258 }, { 185,-258 }, { 186,-258 },+ { 187,-258 }, { 188,-258 }, { 189,-258 }, { 190,-258 }, { 191,-258 },++ { 192,-258 }, { 193,-258 }, { 194,-258 }, { 195,-258 }, { 196,-258 },+ { 197,-258 }, { 198,-258 }, { 199,-258 }, { 200,-258 }, { 201,-258 },+ { 202,-258 }, { 203,-258 }, { 204,-258 }, { 205,-258 }, { 206,-258 },+ { 207,-258 }, { 208,-258 }, { 209,-258 }, { 210,-258 }, { 211,-258 },+ { 212,-258 }, { 213,-258 }, { 214,-258 }, { 215,-258 }, { 216,-258 },+ { 217,-258 }, { 218,-258 }, { 219,-258 }, { 220,-258 }, { 221,-258 },+ { 222,-258 }, { 223,-258 }, { 224,-258 }, { 225,-258 }, { 226,-258 },+ { 227,-258 }, { 228,-258 }, { 229,-258 }, { 230,-258 }, { 231,-258 },+ { 232,-258 }, { 233,-258 }, { 234,-258 }, { 235,-258 }, { 236,-258 },+ { 237,-258 }, { 238,-258 }, { 239,-258 }, { 240,-258 }, { 241,-258 },++ { 242,-258 }, { 243,-258 }, { 244,-258 }, { 245,-258 }, { 246,-258 },+ { 247,-258 }, { 248,-258 }, { 249,-258 }, { 250,-258 }, { 251,-258 },+ { 252,-258 }, { 253,-258 }, { 254,-258 }, { 255,-258 }, { 256,-258 },+ { 0, 24 }, { 0,12934 }, { 1,-516 }, { 2,-516 }, { 3,-516 },+ { 4,-516 }, { 5,-516 }, { 6,-516 }, { 7,-516 }, { 8,-516 },+ { 9,-258 }, { 10,-7600 }, { 11,-516 }, { 12,-258 }, { 13,-7600 },+ { 14,-516 }, { 15,-516 }, { 16,-516 }, { 17,-516 }, { 18,-516 },+ { 19,-516 }, { 20,-516 }, { 21,-516 }, { 22,-516 }, { 23,-516 },+ { 24,-516 }, { 25,-516 }, { 26,-516 }, { 27,-516 }, { 28,-516 },+ { 29,-516 }, { 30,-516 }, { 31,-516 }, { 32,-258 }, { 33,-516 },++ { 34,-516 }, { 35,-516 }, { 36,-516 }, { 37,-516 }, { 38,-516 },+ { 39,-516 }, { 40,-516 }, { 41,-516 }, { 42,-516 }, { 43,-516 },+ { 44,-516 }, { 45,4570 }, { 46,-516 }, { 47,-516 }, { 48,-516 },+ { 49,-516 }, { 50,-516 }, { 51,-516 }, { 52,-516 }, { 53,-516 },+ { 54,-516 }, { 55,-516 }, { 56,-516 }, { 57,-516 }, { 58,-516 },+ { 59,-516 }, { 60,-516 }, { 61,-516 }, { 62,-516 }, { 63,-516 },+ { 64,-516 }, { 65,-516 }, { 66,-516 }, { 67,-516 }, { 68,-516 },+ { 69,-516 }, { 70,-516 }, { 71,-516 }, { 72,-516 }, { 73,-516 },+ { 74,-516 }, { 75,-516 }, { 76,-516 }, { 77,-516 }, { 78,-516 },+ { 79,-516 }, { 80,-516 }, { 81,-516 }, { 82,-516 }, { 83,-516 },++ { 84,-516 }, { 85,-516 }, { 86,-516 }, { 87,-516 }, { 88,-516 },+ { 89,-516 }, { 90,-516 }, { 91,-516 }, { 92,-516 }, { 93,-516 },+ { 94,-516 }, { 95,-516 }, { 96,-516 }, { 97,-516 }, { 98,-516 },+ { 99,-516 }, { 100,-516 }, { 101,-516 }, { 102,-516 }, { 103,-516 },+ { 104,-516 }, { 105,-516 }, { 106,-516 }, { 107,-516 }, { 108,-516 },+ { 109,-516 }, { 110,-516 }, { 111,-516 }, { 112,-516 }, { 113,-516 },+ { 114,-516 }, { 115,-516 }, { 116,-516 }, { 117,-516 }, { 118,-516 },+ { 119,-516 }, { 120,-516 }, { 121,-516 }, { 122,-516 }, { 123,-516 },+ { 124,-516 }, { 125,-516 }, { 126,-516 }, { 127,-516 }, { 128,-516 },+ { 129,-516 }, { 130,-516 }, { 131,-516 }, { 132,-516 }, { 133,-516 },++ { 134,-516 }, { 135,-516 }, { 136,-516 }, { 137,-516 }, { 138,-516 },+ { 139,-516 }, { 140,-516 }, { 141,-516 }, { 142,-516 }, { 143,-516 },+ { 144,-516 }, { 145,-516 }, { 146,-516 }, { 147,-516 }, { 148,-516 },+ { 149,-516 }, { 150,-516 }, { 151,-516 }, { 152,-516 }, { 153,-516 },+ { 154,-516 }, { 155,-516 }, { 156,-516 }, { 157,-516 }, { 158,-516 },+ { 159,-516 }, { 160,-516 }, { 161,-516 }, { 162,-516 }, { 163,-516 },+ { 164,-516 }, { 165,-516 }, { 166,-516 }, { 167,-516 }, { 168,-516 },+ { 169,-516 }, { 170,-516 }, { 171,-516 }, { 172,-516 }, { 173,-516 },+ { 174,-516 }, { 175,-516 }, { 176,-516 }, { 177,-516 }, { 178,-516 },+ { 179,-516 }, { 180,-516 }, { 181,-516 }, { 182,-516 }, { 183,-516 },++ { 184,-516 }, { 185,-516 }, { 186,-516 }, { 187,-516 }, { 188,-516 },+ { 189,-516 }, { 190,-516 }, { 191,-516 }, { 192,-516 }, { 193,-516 },+ { 194,-516 }, { 195,-516 }, { 196,-516 }, { 197,-516 }, { 198,-516 },+ { 199,-516 }, { 200,-516 }, { 201,-516 }, { 202,-516 }, { 203,-516 },+ { 204,-516 }, { 205,-516 }, { 206,-516 }, { 207,-516 }, { 208,-516 },+ { 209,-516 }, { 210,-516 }, { 211,-516 }, { 212,-516 }, { 213,-516 },+ { 214,-516 }, { 215,-516 }, { 216,-516 }, { 217,-516 }, { 218,-516 },+ { 219,-516 }, { 220,-516 }, { 221,-516 }, { 222,-516 }, { 223,-516 },+ { 224,-516 }, { 225,-516 }, { 226,-516 }, { 227,-516 }, { 228,-516 },+ { 229,-516 }, { 230,-516 }, { 231,-516 }, { 232,-516 }, { 233,-516 },++ { 234,-516 }, { 235,-516 }, { 236,-516 }, { 237,-516 }, { 238,-516 },+ { 239,-516 }, { 240,-516 }, { 241,-516 }, { 242,-516 }, { 243,-516 },+ { 244,-516 }, { 245,-516 }, { 246,-516 }, { 247,-516 }, { 248,-516 },+ { 249,-516 }, { 250,-516 }, { 251,-516 }, { 252,-516 }, { 253,-516 },+ { 254,-516 }, { 255,-516 }, { 256,-516 }, { 0, 37 }, { 0,12676 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 37 }, { 0,12653 }, { 0, 0 }, { 0, 0 },++ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 48,4570 }, { 49,4570 }, { 50,4570 },+ { 51,4570 }, { 52,4570 }, { 53,4570 }, { 54,4570 }, { 55,4570 },+ { 56,4570 }, { 57,4570 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,4570 },+ { 66,4570 }, { 67,4570 }, { 68,4570 }, { 69,4570 }, { 70,4570 },+ { 48,4570 }, { 49,4570 }, { 50,4570 }, { 51,4570 }, { 52,4570 },++ { 53,4570 }, { 54,4570 }, { 55,4570 }, { 56,4570 }, { 57,4570 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 65,4570 }, { 66,4570 }, { 67,4570 },+ { 68,4570 }, { 69,4570 }, { 70,4570 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 97,4570 }, { 98,4570 }, { 99,4570 }, { 100,4570 },+ { 101,4570 }, { 102,4570 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 97,4570 },+ { 98,4570 }, { 99,4570 }, { 100,4570 }, { 101,4570 }, { 102,4570 },++ { 0, 9 }, { 0,12549 }, { 1, 0 }, { 2, 0 }, { 3, 0 },+ { 4, 0 }, { 5, 0 }, { 6, 0 }, { 7, 0 }, { 8, 0 },+ { 9, 258 }, { 10, 516 }, { 11, 0 }, { 12, 258 }, { 13, 516 },+ { 14, 0 }, { 15, 0 }, { 16, 0 }, { 17, 0 }, { 18, 0 },+ { 19, 0 }, { 20, 0 }, { 21, 0 }, { 22, 0 }, { 23, 0 },+ { 24, 0 }, { 25, 0 }, { 26, 0 }, { 27, 0 }, { 28, 0 },+ { 29, 0 }, { 30, 0 }, { 31, 0 }, { 32, 258 }, { 33, 0 },+ { 34, 0 }, { 35, 0 }, { 36, 0 }, { 37, 0 }, { 38, 0 },+ { 39, 0 }, { 40, 0 }, { 41, 0 }, { 42, 0 }, { 43, 0 },+ { 44, 0 }, { 45, 563 }, { 46, 0 }, { 47, 0 }, { 48, 0 },++ { 49, 0 }, { 50, 0 }, { 51, 0 }, { 52, 0 }, { 53, 0 },+ { 54, 0 }, { 55, 0 }, { 56, 0 }, { 57, 0 }, { 58, 0 },+ { 59, 0 }, { 60, 0 }, { 61, 0 }, { 62, 0 }, { 63, 0 },+ { 64, 0 }, { 65, 0 }, { 66, 0 }, { 67, 0 }, { 68, 0 },+ { 69, 0 }, { 70, 0 }, { 71, 0 }, { 72, 0 }, { 73, 0 },+ { 74, 0 }, { 75, 0 }, { 76, 0 }, { 77, 0 }, { 78, 0 },+ { 79, 0 }, { 80, 0 }, { 81, 0 }, { 82, 0 }, { 83, 0 },+ { 84, 0 }, { 85, 0 }, { 86, 0 }, { 87, 0 }, { 88, 0 },+ { 89, 0 }, { 90, 0 }, { 91, 0 }, { 92, 0 }, { 93, 0 },+ { 94, 0 }, { 95, 0 }, { 96, 0 }, { 97, 0 }, { 98, 0 },++ { 99, 0 }, { 100, 0 }, { 101, 0 }, { 102, 0 }, { 103, 0 },+ { 104, 0 }, { 105, 0 }, { 106, 0 }, { 107, 0 }, { 108, 0 },+ { 109, 0 }, { 110, 0 }, { 111, 0 }, { 112, 0 }, { 113, 0 },+ { 114, 0 }, { 115, 0 }, { 116, 0 }, { 117, 0 }, { 118, 0 },+ { 119, 0 }, { 120, 0 }, { 121, 0 }, { 122, 0 }, { 123, 0 },+ { 124, 0 }, { 125, 0 }, { 126, 0 }, { 127, 0 }, { 128, 0 },+ { 129, 0 }, { 130, 0 }, { 131, 0 }, { 132, 0 }, { 133, 0 },+ { 134, 0 }, { 135, 0 }, { 136, 0 }, { 137, 0 }, { 138, 0 },+ { 139, 0 }, { 140, 0 }, { 141, 0 }, { 142, 0 }, { 143, 0 },+ { 144, 0 }, { 145, 0 }, { 146, 0 }, { 147, 0 }, { 148, 0 },++ { 149, 0 }, { 150, 0 }, { 151, 0 }, { 152, 0 }, { 153, 0 },+ { 154, 0 }, { 155, 0 }, { 156, 0 }, { 157, 0 }, { 158, 0 },+ { 159, 0 }, { 160, 0 }, { 161, 0 }, { 162, 0 }, { 163, 0 },+ { 164, 0 }, { 165, 0 }, { 166, 0 }, { 167, 0 }, { 168, 0 },+ { 169, 0 }, { 170, 0 }, { 171, 0 }, { 172, 0 }, { 173, 0 },+ { 174, 0 }, { 175, 0 }, { 176, 0 }, { 177, 0 }, { 178, 0 },+ { 179, 0 }, { 180, 0 }, { 181, 0 }, { 182, 0 }, { 183, 0 },+ { 184, 0 }, { 185, 0 }, { 186, 0 }, { 187, 0 }, { 188, 0 },+ { 189, 0 }, { 190, 0 }, { 191, 0 }, { 192, 0 }, { 193, 0 },+ { 194, 0 }, { 195, 0 }, { 196, 0 }, { 197, 0 }, { 198, 0 },++ { 199, 0 }, { 200, 0 }, { 201, 0 }, { 202, 0 }, { 203, 0 },+ { 204, 0 }, { 205, 0 }, { 206, 0 }, { 207, 0 }, { 208, 0 },+ { 209, 0 }, { 210, 0 }, { 211, 0 }, { 212, 0 }, { 213, 0 },+ { 214, 0 }, { 215, 0 }, { 216, 0 }, { 217, 0 }, { 218, 0 },+ { 219, 0 }, { 220, 0 }, { 221, 0 }, { 222, 0 }, { 223, 0 },+ { 224, 0 }, { 225, 0 }, { 226, 0 }, { 227, 0 }, { 228, 0 },+ { 229, 0 }, { 230, 0 }, { 231, 0 }, { 232, 0 }, { 233, 0 },+ { 234, 0 }, { 235, 0 }, { 236, 0 }, { 237, 0 }, { 238, 0 },+ { 239, 0 }, { 240, 0 }, { 241, 0 }, { 242, 0 }, { 243, 0 },+ { 244, 0 }, { 245, 0 }, { 246, 0 }, { 247, 0 }, { 248, 0 },++ { 249, 0 }, { 250, 0 }, { 251, 0 }, { 252, 0 }, { 253, 0 },+ { 254, 0 }, { 255, 0 }, { 256, 0 }, { 0, 9 }, { 0,12291 },+ { 1,-258 }, { 2,-258 }, { 3,-258 }, { 4,-258 }, { 5,-258 },+ { 6,-258 }, { 7,-258 }, { 8,-258 }, { 9, 0 }, { 10, 258 },+ { 11,-258 }, { 12, 0 }, { 13, 258 }, { 14,-258 }, { 15,-258 },+ { 16,-258 }, { 17,-258 }, { 18,-258 }, { 19,-258 }, { 20,-258 },+ { 21,-258 }, { 22,-258 }, { 23,-258 }, { 24,-258 }, { 25,-258 },+ { 26,-258 }, { 27,-258 }, { 28,-258 }, { 29,-258 }, { 30,-258 },+ { 31,-258 }, { 32, 0 }, { 33,-258 }, { 34,-258 }, { 35,-258 },+ { 36,-258 }, { 37,-258 }, { 38,-258 }, { 39,-258 }, { 40,-258 },++ { 41,-258 }, { 42,-258 }, { 43,-258 }, { 44,-258 }, { 45, 305 },+ { 46,-258 }, { 47,-258 }, { 48,-258 }, { 49,-258 }, { 50,-258 },+ { 51,-258 }, { 52,-258 }, { 53,-258 }, { 54,-258 }, { 55,-258 },+ { 56,-258 }, { 57,-258 }, { 58,-258 }, { 59,-258 }, { 60,-258 },+ { 61,-258 }, { 62,-258 }, { 63,-258 }, { 64,-258 }, { 65,-258 },+ { 66,-258 }, { 67,-258 }, { 68,-258 }, { 69,-258 }, { 70,-258 },+ { 71,-258 }, { 72,-258 }, { 73,-258 }, { 74,-258 }, { 75,-258 },+ { 76,-258 }, { 77,-258 }, { 78,-258 }, { 79,-258 }, { 80,-258 },+ { 81,-258 }, { 82,-258 }, { 83,-258 }, { 84,-258 }, { 85,-258 },+ { 86,-258 }, { 87,-258 }, { 88,-258 }, { 89,-258 }, { 90,-258 },++ { 91,-258 }, { 92,-258 }, { 93,-258 }, { 94,-258 }, { 95,-258 },+ { 96,-258 }, { 97,-258 }, { 98,-258 }, { 99,-258 }, { 100,-258 },+ { 101,-258 }, { 102,-258 }, { 103,-258 }, { 104,-258 }, { 105,-258 },+ { 106,-258 }, { 107,-258 }, { 108,-258 }, { 109,-258 }, { 110,-258 },+ { 111,-258 }, { 112,-258 }, { 113,-258 }, { 114,-258 }, { 115,-258 },+ { 116,-258 }, { 117,-258 }, { 118,-258 }, { 119,-258 }, { 120,-258 },+ { 121,-258 }, { 122,-258 }, { 123,-258 }, { 124,-258 }, { 125,-258 },+ { 126,-258 }, { 127,-258 }, { 128,-258 }, { 129,-258 }, { 130,-258 },+ { 131,-258 }, { 132,-258 }, { 133,-258 }, { 134,-258 }, { 135,-258 },+ { 136,-258 }, { 137,-258 }, { 138,-258 }, { 139,-258 }, { 140,-258 },++ { 141,-258 }, { 142,-258 }, { 143,-258 }, { 144,-258 }, { 145,-258 },+ { 146,-258 }, { 147,-258 }, { 148,-258 }, { 149,-258 }, { 150,-258 },+ { 151,-258 }, { 152,-258 }, { 153,-258 }, { 154,-258 }, { 155,-258 },+ { 156,-258 }, { 157,-258 }, { 158,-258 }, { 159,-258 }, { 160,-258 },+ { 161,-258 }, { 162,-258 }, { 163,-258 }, { 164,-258 }, { 165,-258 },+ { 166,-258 }, { 167,-258 }, { 168,-258 }, { 169,-258 }, { 170,-258 },+ { 171,-258 }, { 172,-258 }, { 173,-258 }, { 174,-258 }, { 175,-258 },+ { 176,-258 }, { 177,-258 }, { 178,-258 }, { 179,-258 }, { 180,-258 },+ { 181,-258 }, { 182,-258 }, { 183,-258 }, { 184,-258 }, { 185,-258 },+ { 186,-258 }, { 187,-258 }, { 188,-258 }, { 189,-258 }, { 190,-258 },++ { 191,-258 }, { 192,-258 }, { 193,-258 }, { 194,-258 }, { 195,-258 },+ { 196,-258 }, { 197,-258 }, { 198,-258 }, { 199,-258 }, { 200,-258 },+ { 201,-258 }, { 202,-258 }, { 203,-258 }, { 204,-258 }, { 205,-258 },+ { 206,-258 }, { 207,-258 }, { 208,-258 }, { 209,-258 }, { 210,-258 },+ { 211,-258 }, { 212,-258 }, { 213,-258 }, { 214,-258 }, { 215,-258 },+ { 216,-258 }, { 217,-258 }, { 218,-258 }, { 219,-258 }, { 220,-258 },+ { 221,-258 }, { 222,-258 }, { 223,-258 }, { 224,-258 }, { 225,-258 },+ { 226,-258 }, { 227,-258 }, { 228,-258 }, { 229,-258 }, { 230,-258 },+ { 231,-258 }, { 232,-258 }, { 233,-258 }, { 234,-258 }, { 235,-258 },+ { 236,-258 }, { 237,-258 }, { 238,-258 }, { 239,-258 }, { 240,-258 },++ { 241,-258 }, { 242,-258 }, { 243,-258 }, { 244,-258 }, { 245,-258 },+ { 246,-258 }, { 247,-258 }, { 248,-258 }, { 249,-258 }, { 250,-258 },+ { 251,-258 }, { 252,-258 }, { 253,-258 }, { 254,-258 }, { 255,-258 },+ { 256,-258 }, { 0, 9 }, { 0,12033 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 9,-7240 }, { 10,-7240 }, { 0, 0 }, { 12,-7240 },+ { 13,-7240 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 32,-7240 },++ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 39,-17444 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 45,-17442 }, { 0, 9 }, { 0,11986 },+ { 1,-563 }, { 2,-563 }, { 3,-563 }, { 4,-563 }, { 5,-563 },+ { 6,-563 }, { 7,-563 }, { 8,-563 }, { 9,-305 }, { 10, -47 },+ { 11,-563 }, { 12,-305 }, { 13, -47 }, { 14,-563 }, { 15,-563 },+ { 16,-563 }, { 17,-563 }, { 18,-563 }, { 19,-563 }, { 20,-563 },+ { 21,-563 }, { 22,-563 }, { 23,-563 }, { 24,-563 }, { 25,-563 },+ { 26,-563 }, { 27,-563 }, { 28,-563 }, { 29,-563 }, { 30,-563 },+ { 31,-563 }, { 32,-305 }, { 33,-563 }, { 34,-563 }, { 35,-563 },++ { 36,-563 }, { 37,-563 }, { 38,-563 }, { 39,-563 }, { 40,-563 },+ { 41,-563 }, { 42,-563 }, { 43,-563 }, { 44,-563 }, { 45,4007 },+ { 46,-563 }, { 47,-563 }, { 48,-563 }, { 49,-563 }, { 50,-563 },+ { 51,-563 }, { 52,-563 }, { 53,-563 }, { 54,-563 }, { 55,-563 },+ { 56,-563 }, { 57,-563 }, { 58,-563 }, { 59,-563 }, { 60,-563 },+ { 61,-563 }, { 62,-563 }, { 63,-563 }, { 64,-563 }, { 65,-563 },+ { 66,-563 }, { 67,-563 }, { 68,-563 }, { 69,-563 }, { 70,-563 },+ { 71,-563 }, { 72,-563 }, { 73,-563 }, { 74,-563 }, { 75,-563 },+ { 76,-563 }, { 77,-563 }, { 78,-563 }, { 79,-563 }, { 80,-563 },+ { 81,-563 }, { 82,-563 }, { 83,-563 }, { 84,-563 }, { 85,-563 },++ { 86,-563 }, { 87,-563 }, { 88,-563 }, { 89,-563 }, { 90,-563 },+ { 91,-563 }, { 92,-563 }, { 93,-563 }, { 94,-563 }, { 95,-563 },+ { 96,-563 }, { 97,-563 }, { 98,-563 }, { 99,-563 }, { 100,-563 },+ { 101,-563 }, { 102,-563 }, { 103,-563 }, { 104,-563 }, { 105,-563 },+ { 106,-563 }, { 107,-563 }, { 108,-563 }, { 109,-563 }, { 110,-563 },+ { 111,-563 }, { 112,-563 }, { 113,-563 }, { 114,-563 }, { 115,-563 },+ { 116,-563 }, { 117,-563 }, { 118,-563 }, { 119,-563 }, { 120,-563 },+ { 121,-563 }, { 122,-563 }, { 123,-563 }, { 124,-563 }, { 125,-563 },+ { 126,-563 }, { 127,-563 }, { 128,-563 }, { 129,-563 }, { 130,-563 },+ { 131,-563 }, { 132,-563 }, { 133,-563 }, { 134,-563 }, { 135,-563 },++ { 136,-563 }, { 137,-563 }, { 138,-563 }, { 139,-563 }, { 140,-563 },+ { 141,-563 }, { 142,-563 }, { 143,-563 }, { 144,-563 }, { 145,-563 },+ { 146,-563 }, { 147,-563 }, { 148,-563 }, { 149,-563 }, { 150,-563 },+ { 151,-563 }, { 152,-563 }, { 153,-563 }, { 154,-563 }, { 155,-563 },+ { 156,-563 }, { 157,-563 }, { 158,-563 }, { 159,-563 }, { 160,-563 },+ { 161,-563 }, { 162,-563 }, { 163,-563 }, { 164,-563 }, { 165,-563 },+ { 166,-563 }, { 167,-563 }, { 168,-563 }, { 169,-563 }, { 170,-563 },+ { 171,-563 }, { 172,-563 }, { 173,-563 }, { 174,-563 }, { 175,-563 },+ { 176,-563 }, { 177,-563 }, { 178,-563 }, { 179,-563 }, { 180,-563 },+ { 181,-563 }, { 182,-563 }, { 183,-563 }, { 184,-563 }, { 185,-563 },++ { 186,-563 }, { 187,-563 }, { 188,-563 }, { 189,-563 }, { 190,-563 },+ { 191,-563 }, { 192,-563 }, { 193,-563 }, { 194,-563 }, { 195,-563 },+ { 196,-563 }, { 197,-563 }, { 198,-563 }, { 199,-563 }, { 200,-563 },+ { 201,-563 }, { 202,-563 }, { 203,-563 }, { 204,-563 }, { 205,-563 },+ { 206,-563 }, { 207,-563 }, { 208,-563 }, { 209,-563 }, { 210,-563 },+ { 211,-563 }, { 212,-563 }, { 213,-563 }, { 214,-563 }, { 215,-563 },+ { 216,-563 }, { 217,-563 }, { 218,-563 }, { 219,-563 }, { 220,-563 },+ { 221,-563 }, { 222,-563 }, { 223,-563 }, { 224,-563 }, { 225,-563 },+ { 226,-563 }, { 227,-563 }, { 228,-563 }, { 229,-563 }, { 230,-563 },+ { 231,-563 }, { 232,-563 }, { 233,-563 }, { 234,-563 }, { 235,-563 },++ { 236,-563 }, { 237,-563 }, { 238,-563 }, { 239,-563 }, { 240,-563 },+ { 241,-563 }, { 242,-563 }, { 243,-563 }, { 244,-563 }, { 245,-563 },+ { 246,-563 }, { 247,-563 }, { 248,-563 }, { 249,-563 }, { 250,-563 },+ { 251,-563 }, { 252,-563 }, { 253,-563 }, { 254,-563 }, { 255,-563 },+ { 256,-563 }, { 0, 9 }, { 0,11728 }, { 1,-4945 }, { 2,-4945 },+ { 3,-4945 }, { 4,-4945 }, { 5,-4945 }, { 6,-4945 }, { 7,-4945 },+ { 8,-4945 }, { 9,-4687 }, { 10,-11286 }, { 11,-4945 }, { 12,-4687 },+ { 13,-11286 }, { 14,-4945 }, { 15,-4945 }, { 16,-4945 }, { 17,-4945 },+ { 18,-4945 }, { 19,-4945 }, { 20,-4945 }, { 21,-4945 }, { 22,-4945 },+ { 23,-4945 }, { 24,-4945 }, { 25,-4945 }, { 26,-4945 }, { 27,-4945 },++ { 28,-4945 }, { 29,-4945 }, { 30,-4945 }, { 31,-4945 }, { 32,-4687 },+ { 33,-4945 }, { 34,-4945 }, { 35,-4945 }, { 36,-4945 }, { 37,-4945 },+ { 38,-4945 }, { 39,-4945 }, { 40,-4945 }, { 41,-4945 }, { 42,-4945 },+ { 43,-4945 }, { 44,-4945 }, { 45, 0 }, { 46,-4945 }, { 47,-4945 },+ { 48,-4945 }, { 49,-4945 }, { 50,-4945 }, { 51,-4945 }, { 52,-4945 },+ { 53,-4945 }, { 54,-4945 }, { 55,-4945 }, { 56,-4945 }, { 57,-4945 },+ { 58,-4945 }, { 59,-4945 }, { 60,-4945 }, { 61,-4945 }, { 62,-4945 },+ { 63,-4945 }, { 64,-4945 }, { 65,-4945 }, { 66,-4945 }, { 67,-4945 },+ { 68,-4945 }, { 69,-4945 }, { 70,-4945 }, { 71,-4945 }, { 72,-4945 },+ { 73,-4945 }, { 74,-4945 }, { 75,-4945 }, { 76,-4945 }, { 77,-4945 },++ { 78,-4945 }, { 79,-4945 }, { 80,-4945 }, { 81,-4945 }, { 82,-4945 },+ { 83,-4945 }, { 84,-4945 }, { 85,-4945 }, { 86,-4945 }, { 87,-4945 },+ { 88,-4945 }, { 89,-4945 }, { 90,-4945 }, { 91,-4945 }, { 92,-4945 },+ { 93,-4945 }, { 94,-4945 }, { 95,-4945 }, { 96,-4945 }, { 97,-4945 },+ { 98,-4945 }, { 99,-4945 }, { 100,-4945 }, { 101,-4945 }, { 102,-4945 },+ { 103,-4945 }, { 104,-4945 }, { 105,-4945 }, { 106,-4945 }, { 107,-4945 },+ { 108,-4945 }, { 109,-4945 }, { 110,-4945 }, { 111,-4945 }, { 112,-4945 },+ { 113,-4945 }, { 114,-4945 }, { 115,-4945 }, { 116,-4945 }, { 117,-4945 },+ { 118,-4945 }, { 119,-4945 }, { 120,-4945 }, { 121,-4945 }, { 122,-4945 },+ { 123,-4945 }, { 124,-4945 }, { 125,-4945 }, { 126,-4945 }, { 127,-4945 },++ { 128,-4945 }, { 129,-4945 }, { 130,-4945 }, { 131,-4945 }, { 132,-4945 },+ { 133,-4945 }, { 134,-4945 }, { 135,-4945 }, { 136,-4945 }, { 137,-4945 },+ { 138,-4945 }, { 139,-4945 }, { 140,-4945 }, { 141,-4945 }, { 142,-4945 },+ { 143,-4945 }, { 144,-4945 }, { 145,-4945 }, { 146,-4945 }, { 147,-4945 },+ { 148,-4945 }, { 149,-4945 }, { 150,-4945 }, { 151,-4945 }, { 152,-4945 },+ { 153,-4945 }, { 154,-4945 }, { 155,-4945 }, { 156,-4945 }, { 157,-4945 },+ { 158,-4945 }, { 159,-4945 }, { 160,-4945 }, { 161,-4945 }, { 162,-4945 },+ { 163,-4945 }, { 164,-4945 }, { 165,-4945 }, { 166,-4945 }, { 167,-4945 },+ { 168,-4945 }, { 169,-4945 }, { 170,-4945 }, { 171,-4945 }, { 172,-4945 },+ { 173,-4945 }, { 174,-4945 }, { 175,-4945 }, { 176,-4945 }, { 177,-4945 },++ { 178,-4945 }, { 179,-4945 }, { 180,-4945 }, { 181,-4945 }, { 182,-4945 },+ { 183,-4945 }, { 184,-4945 }, { 185,-4945 }, { 186,-4945 }, { 187,-4945 },+ { 188,-4945 }, { 189,-4945 }, { 190,-4945 }, { 191,-4945 }, { 192,-4945 },+ { 193,-4945 }, { 194,-4945 }, { 195,-4945 }, { 196,-4945 }, { 197,-4945 },+ { 198,-4945 }, { 199,-4945 }, { 200,-4945 }, { 201,-4945 }, { 202,-4945 },+ { 203,-4945 }, { 204,-4945 }, { 205,-4945 }, { 206,-4945 }, { 207,-4945 },+ { 208,-4945 }, { 209,-4945 }, { 210,-4945 }, { 211,-4945 }, { 212,-4945 },+ { 213,-4945 }, { 214,-4945 }, { 215,-4945 }, { 216,-4945 }, { 217,-4945 },+ { 218,-4945 }, { 219,-4945 }, { 220,-4945 }, { 221,-4945 }, { 222,-4945 },+ { 223,-4945 }, { 224,-4945 }, { 225,-4945 }, { 226,-4945 }, { 227,-4945 },++ { 228,-4945 }, { 229,-4945 }, { 230,-4945 }, { 231,-4945 }, { 232,-4945 },+ { 233,-4945 }, { 234,-4945 }, { 235,-4945 }, { 236,-4945 }, { 237,-4945 },+ { 238,-4945 }, { 239,-4945 }, { 240,-4945 }, { 241,-4945 }, { 242,-4945 },+ { 243,-4945 }, { 244,-4945 }, { 245,-4945 }, { 246,-4945 }, { 247,-4945 },+ { 248,-4945 }, { 249,-4945 }, { 250,-4945 }, { 251,-4945 }, { 252,-4945 },+ { 253,-4945 }, { 254,-4945 }, { 255,-4945 }, { 256,-4945 }, { 0, 16 },+ { 0,11470 }, { 1, 0 }, { 2, 0 }, { 3, 0 }, { 4, 0 },+ { 5, 0 }, { 6, 0 }, { 7, 0 }, { 8, 0 }, { 9, 258 },+ { 10, 516 }, { 11, 0 }, { 12, 258 }, { 13, 516 }, { 14, 0 },+ { 15, 0 }, { 16, 0 }, { 17, 0 }, { 18, 0 }, { 19, 0 },++ { 20, 0 }, { 21, 0 }, { 22, 0 }, { 23, 0 }, { 24, 0 },+ { 25, 0 }, { 26, 0 }, { 27, 0 }, { 28, 0 }, { 29, 0 },+ { 30, 0 }, { 31, 0 }, { 32, 258 }, { 33, 0 }, { 34, 0 },+ { 35, 0 }, { 36, 0 }, { 37, 0 }, { 38, 0 }, { 39, 0 },+ { 40, 0 }, { 41, 0 }, { 42, 0 }, { 43, 0 }, { 44, 0 },+ { 45, 563 }, { 46, 0 }, { 47, 0 }, { 48, 0 }, { 49, 0 },+ { 50, 0 }, { 51, 0 }, { 52, 0 }, { 53, 0 }, { 54, 0 },+ { 55, 0 }, { 56, 0 }, { 57, 0 }, { 58, 0 }, { 59, 0 },+ { 60, 0 }, { 61, 0 }, { 62, 0 }, { 63, 0 }, { 64, 0 },+ { 65, 0 }, { 66, 0 }, { 67, 0 }, { 68, 0 }, { 69, 0 },++ { 70, 0 }, { 71, 0 }, { 72, 0 }, { 73, 0 }, { 74, 0 },+ { 75, 0 }, { 76, 0 }, { 77, 0 }, { 78, 0 }, { 79, 0 },+ { 80, 0 }, { 81, 0 }, { 82, 0 }, { 83, 0 }, { 84, 0 },+ { 85, 0 }, { 86, 0 }, { 87, 0 }, { 88, 0 }, { 89, 0 },+ { 90, 0 }, { 91, 0 }, { 92, 0 }, { 93, 0 }, { 94, 0 },+ { 95, 0 }, { 96, 0 }, { 97, 0 }, { 98, 0 }, { 99, 0 },+ { 100, 0 }, { 101, 0 }, { 102, 0 }, { 103, 0 }, { 104, 0 },+ { 105, 0 }, { 106, 0 }, { 107, 0 }, { 108, 0 }, { 109, 0 },+ { 110, 0 }, { 111, 0 }, { 112, 0 }, { 113, 0 }, { 114, 0 },+ { 115, 0 }, { 116, 0 }, { 117, 0 }, { 118, 0 }, { 119, 0 },++ { 120, 0 }, { 121, 0 }, { 122, 0 }, { 123, 0 }, { 124, 0 },+ { 125, 0 }, { 126, 0 }, { 127, 0 }, { 128, 0 }, { 129, 0 },+ { 130, 0 }, { 131, 0 }, { 132, 0 }, { 133, 0 }, { 134, 0 },+ { 135, 0 }, { 136, 0 }, { 137, 0 }, { 138, 0 }, { 139, 0 },+ { 140, 0 }, { 141, 0 }, { 142, 0 }, { 143, 0 }, { 144, 0 },+ { 145, 0 }, { 146, 0 }, { 147, 0 }, { 148, 0 }, { 149, 0 },+ { 150, 0 }, { 151, 0 }, { 152, 0 }, { 153, 0 }, { 154, 0 },+ { 155, 0 }, { 156, 0 }, { 157, 0 }, { 158, 0 }, { 159, 0 },+ { 160, 0 }, { 161, 0 }, { 162, 0 }, { 163, 0 }, { 164, 0 },+ { 165, 0 }, { 166, 0 }, { 167, 0 }, { 168, 0 }, { 169, 0 },++ { 170, 0 }, { 171, 0 }, { 172, 0 }, { 173, 0 }, { 174, 0 },+ { 175, 0 }, { 176, 0 }, { 177, 0 }, { 178, 0 }, { 179, 0 },+ { 180, 0 }, { 181, 0 }, { 182, 0 }, { 183, 0 }, { 184, 0 },+ { 185, 0 }, { 186, 0 }, { 187, 0 }, { 188, 0 }, { 189, 0 },+ { 190, 0 }, { 191, 0 }, { 192, 0 }, { 193, 0 }, { 194, 0 },+ { 195, 0 }, { 196, 0 }, { 197, 0 }, { 198, 0 }, { 199, 0 },+ { 200, 0 }, { 201, 0 }, { 202, 0 }, { 203, 0 }, { 204, 0 },+ { 205, 0 }, { 206, 0 }, { 207, 0 }, { 208, 0 }, { 209, 0 },+ { 210, 0 }, { 211, 0 }, { 212, 0 }, { 213, 0 }, { 214, 0 },+ { 215, 0 }, { 216, 0 }, { 217, 0 }, { 218, 0 }, { 219, 0 },++ { 220, 0 }, { 221, 0 }, { 222, 0 }, { 223, 0 }, { 224, 0 },+ { 225, 0 }, { 226, 0 }, { 227, 0 }, { 228, 0 }, { 229, 0 },+ { 230, 0 }, { 231, 0 }, { 232, 0 }, { 233, 0 }, { 234, 0 },+ { 235, 0 }, { 236, 0 }, { 237, 0 }, { 238, 0 }, { 239, 0 },+ { 240, 0 }, { 241, 0 }, { 242, 0 }, { 243, 0 }, { 244, 0 },+ { 245, 0 }, { 246, 0 }, { 247, 0 }, { 248, 0 }, { 249, 0 },+ { 250, 0 }, { 251, 0 }, { 252, 0 }, { 253, 0 }, { 254, 0 },+ { 255, 0 }, { 256, 0 }, { 0, 16 }, { 0,11212 }, { 1,-258 },+ { 2,-258 }, { 3,-258 }, { 4,-258 }, { 5,-258 }, { 6,-258 },+ { 7,-258 }, { 8,-258 }, { 9, 0 }, { 10, 258 }, { 11,-258 },++ { 12, 0 }, { 13, 258 }, { 14,-258 }, { 15,-258 }, { 16,-258 },+ { 17,-258 }, { 18,-258 }, { 19,-258 }, { 20,-258 }, { 21,-258 },+ { 22,-258 }, { 23,-258 }, { 24,-258 }, { 25,-258 }, { 26,-258 },+ { 27,-258 }, { 28,-258 }, { 29,-258 }, { 30,-258 }, { 31,-258 },+ { 32, 0 }, { 33,-258 }, { 34,-258 }, { 35,-258 }, { 36,-258 },+ { 37,-258 }, { 38,-258 }, { 39,-258 }, { 40,-258 }, { 41,-258 },+ { 42,-258 }, { 43,-258 }, { 44,-258 }, { 45, 305 }, { 46,-258 },+ { 47,-258 }, { 48,-258 }, { 49,-258 }, { 50,-258 }, { 51,-258 },+ { 52,-258 }, { 53,-258 }, { 54,-258 }, { 55,-258 }, { 56,-258 },+ { 57,-258 }, { 58,-258 }, { 59,-258 }, { 60,-258 }, { 61,-258 },++ { 62,-258 }, { 63,-258 }, { 64,-258 }, { 65,-258 }, { 66,-258 },+ { 67,-258 }, { 68,-258 }, { 69,-258 }, { 70,-258 }, { 71,-258 },+ { 72,-258 }, { 73,-258 }, { 74,-258 }, { 75,-258 }, { 76,-258 },+ { 77,-258 }, { 78,-258 }, { 79,-258 }, { 80,-258 }, { 81,-258 },+ { 82,-258 }, { 83,-258 }, { 84,-258 }, { 85,-258 }, { 86,-258 },+ { 87,-258 }, { 88,-258 }, { 89,-258 }, { 90,-258 }, { 91,-258 },+ { 92,-258 }, { 93,-258 }, { 94,-258 }, { 95,-258 }, { 96,-258 },+ { 97,-258 }, { 98,-258 }, { 99,-258 }, { 100,-258 }, { 101,-258 },+ { 102,-258 }, { 103,-258 }, { 104,-258 }, { 105,-258 }, { 106,-258 },+ { 107,-258 }, { 108,-258 }, { 109,-258 }, { 110,-258 }, { 111,-258 },++ { 112,-258 }, { 113,-258 }, { 114,-258 }, { 115,-258 }, { 116,-258 },+ { 117,-258 }, { 118,-258 }, { 119,-258 }, { 120,-258 }, { 121,-258 },+ { 122,-258 }, { 123,-258 }, { 124,-258 }, { 125,-258 }, { 126,-258 },+ { 127,-258 }, { 128,-258 }, { 129,-258 }, { 130,-258 }, { 131,-258 },+ { 132,-258 }, { 133,-258 }, { 134,-258 }, { 135,-258 }, { 136,-258 },+ { 137,-258 }, { 138,-258 }, { 139,-258 }, { 140,-258 }, { 141,-258 },+ { 142,-258 }, { 143,-258 }, { 144,-258 }, { 145,-258 }, { 146,-258 },+ { 147,-258 }, { 148,-258 }, { 149,-258 }, { 150,-258 }, { 151,-258 },+ { 152,-258 }, { 153,-258 }, { 154,-258 }, { 155,-258 }, { 156,-258 },+ { 157,-258 }, { 158,-258 }, { 159,-258 }, { 160,-258 }, { 161,-258 },++ { 162,-258 }, { 163,-258 }, { 164,-258 }, { 165,-258 }, { 166,-258 },+ { 167,-258 }, { 168,-258 }, { 169,-258 }, { 170,-258 }, { 171,-258 },+ { 172,-258 }, { 173,-258 }, { 174,-258 }, { 175,-258 }, { 176,-258 },+ { 177,-258 }, { 178,-258 }, { 179,-258 }, { 180,-258 }, { 181,-258 },+ { 182,-258 }, { 183,-258 }, { 184,-258 }, { 185,-258 }, { 186,-258 },+ { 187,-258 }, { 188,-258 }, { 189,-258 }, { 190,-258 }, { 191,-258 },+ { 192,-258 }, { 193,-258 }, { 194,-258 }, { 195,-258 }, { 196,-258 },+ { 197,-258 }, { 198,-258 }, { 199,-258 }, { 200,-258 }, { 201,-258 },+ { 202,-258 }, { 203,-258 }, { 204,-258 }, { 205,-258 }, { 206,-258 },+ { 207,-258 }, { 208,-258 }, { 209,-258 }, { 210,-258 }, { 211,-258 },++ { 212,-258 }, { 213,-258 }, { 214,-258 }, { 215,-258 }, { 216,-258 },+ { 217,-258 }, { 218,-258 }, { 219,-258 }, { 220,-258 }, { 221,-258 },+ { 222,-258 }, { 223,-258 }, { 224,-258 }, { 225,-258 }, { 226,-258 },+ { 227,-258 }, { 228,-258 }, { 229,-258 }, { 230,-258 }, { 231,-258 },+ { 232,-258 }, { 233,-258 }, { 234,-258 }, { 235,-258 }, { 236,-258 },+ { 237,-258 }, { 238,-258 }, { 239,-258 }, { 240,-258 }, { 241,-258 },+ { 242,-258 }, { 243,-258 }, { 244,-258 }, { 245,-258 }, { 246,-258 },+ { 247,-258 }, { 248,-258 }, { 249,-258 }, { 250,-258 }, { 251,-258 },+ { 252,-258 }, { 253,-258 }, { 254,-258 }, { 255,-258 }, { 256,-258 },+ { 0, 16 }, { 0,10954 }, { 0, 0 }, { 0, 0 }, { 0, 0 },++ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 9,-8007 }, { 10,-8007 }, { 0, 0 }, { 12,-8007 }, { 13,-8007 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 32,-8007 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 39,-18519 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 45,-18514 }, { 0, 16 }, { 0,10907 }, { 1,-563 },+ { 2,-563 }, { 3,-563 }, { 4,-563 }, { 5,-563 }, { 6,-563 },++ { 7,-563 }, { 8,-563 }, { 9,-305 }, { 10, -47 }, { 11,-563 },+ { 12,-305 }, { 13, -47 }, { 14,-563 }, { 15,-563 }, { 16,-563 },+ { 17,-563 }, { 18,-563 }, { 19,-563 }, { 20,-563 }, { 21,-563 },+ { 22,-563 }, { 23,-563 }, { 24,-563 }, { 25,-563 }, { 26,-563 },+ { 27,-563 }, { 28,-563 }, { 29,-563 }, { 30,-563 }, { 31,-563 },+ { 32,-305 }, { 33,-563 }, { 34,-563 }, { 35,-563 }, { 36,-563 },+ { 37,-563 }, { 38,-563 }, { 39,-563 }, { 40,-563 }, { 41,-563 },+ { 42,-563 }, { 43,-563 }, { 44,-563 }, { 45,3186 }, { 46,-563 },+ { 47,-563 }, { 48,-563 }, { 49,-563 }, { 50,-563 }, { 51,-563 },+ { 52,-563 }, { 53,-563 }, { 54,-563 }, { 55,-563 }, { 56,-563 },++ { 57,-563 }, { 58,-563 }, { 59,-563 }, { 60,-563 }, { 61,-563 },+ { 62,-563 }, { 63,-563 }, { 64,-563 }, { 65,-563 }, { 66,-563 },+ { 67,-563 }, { 68,-563 }, { 69,-563 }, { 70,-563 }, { 71,-563 },+ { 72,-563 }, { 73,-563 }, { 74,-563 }, { 75,-563 }, { 76,-563 },+ { 77,-563 }, { 78,-563 }, { 79,-563 }, { 80,-563 }, { 81,-563 },+ { 82,-563 }, { 83,-563 }, { 84,-563 }, { 85,-563 }, { 86,-563 },+ { 87,-563 }, { 88,-563 }, { 89,-563 }, { 90,-563 }, { 91,-563 },+ { 92,-563 }, { 93,-563 }, { 94,-563 }, { 95,-563 }, { 96,-563 },+ { 97,-563 }, { 98,-563 }, { 99,-563 }, { 100,-563 }, { 101,-563 },+ { 102,-563 }, { 103,-563 }, { 104,-563 }, { 105,-563 }, { 106,-563 },++ { 107,-563 }, { 108,-563 }, { 109,-563 }, { 110,-563 }, { 111,-563 },+ { 112,-563 }, { 113,-563 }, { 114,-563 }, { 115,-563 }, { 116,-563 },+ { 117,-563 }, { 118,-563 }, { 119,-563 }, { 120,-563 }, { 121,-563 },+ { 122,-563 }, { 123,-563 }, { 124,-563 }, { 125,-563 }, { 126,-563 },+ { 127,-563 }, { 128,-563 }, { 129,-563 }, { 130,-563 }, { 131,-563 },+ { 132,-563 }, { 133,-563 }, { 134,-563 }, { 135,-563 }, { 136,-563 },+ { 137,-563 }, { 138,-563 }, { 139,-563 }, { 140,-563 }, { 141,-563 },+ { 142,-563 }, { 143,-563 }, { 144,-563 }, { 145,-563 }, { 146,-563 },+ { 147,-563 }, { 148,-563 }, { 149,-563 }, { 150,-563 }, { 151,-563 },+ { 152,-563 }, { 153,-563 }, { 154,-563 }, { 155,-563 }, { 156,-563 },++ { 157,-563 }, { 158,-563 }, { 159,-563 }, { 160,-563 }, { 161,-563 },+ { 162,-563 }, { 163,-563 }, { 164,-563 }, { 165,-563 }, { 166,-563 },+ { 167,-563 }, { 168,-563 }, { 169,-563 }, { 170,-563 }, { 171,-563 },+ { 172,-563 }, { 173,-563 }, { 174,-563 }, { 175,-563 }, { 176,-563 },+ { 177,-563 }, { 178,-563 }, { 179,-563 }, { 180,-563 }, { 181,-563 },+ { 182,-563 }, { 183,-563 }, { 184,-563 }, { 185,-563 }, { 186,-563 },+ { 187,-563 }, { 188,-563 }, { 189,-563 }, { 190,-563 }, { 191,-563 },+ { 192,-563 }, { 193,-563 }, { 194,-563 }, { 195,-563 }, { 196,-563 },+ { 197,-563 }, { 198,-563 }, { 199,-563 }, { 200,-563 }, { 201,-563 },+ { 202,-563 }, { 203,-563 }, { 204,-563 }, { 205,-563 }, { 206,-563 },++ { 207,-563 }, { 208,-563 }, { 209,-563 }, { 210,-563 }, { 211,-563 },+ { 212,-563 }, { 213,-563 }, { 214,-563 }, { 215,-563 }, { 216,-563 },+ { 217,-563 }, { 218,-563 }, { 219,-563 }, { 220,-563 }, { 221,-563 },+ { 222,-563 }, { 223,-563 }, { 224,-563 }, { 225,-563 }, { 226,-563 },+ { 227,-563 }, { 228,-563 }, { 229,-563 }, { 230,-563 }, { 231,-563 },+ { 232,-563 }, { 233,-563 }, { 234,-563 }, { 235,-563 }, { 236,-563 },+ { 237,-563 }, { 238,-563 }, { 239,-563 }, { 240,-563 }, { 241,-563 },+ { 242,-563 }, { 243,-563 }, { 244,-563 }, { 245,-563 }, { 246,-563 },+ { 247,-563 }, { 248,-563 }, { 249,-563 }, { 250,-563 }, { 251,-563 },+ { 252,-563 }, { 253,-563 }, { 254,-563 }, { 255,-563 }, { 256,-563 },++ { 0, 16 }, { 0,10649 }, { 1,-4992 }, { 2,-4992 }, { 3,-4992 },+ { 4,-4992 }, { 5,-4992 }, { 6,-4992 }, { 7,-4992 }, { 8,-4992 },+ { 9,-4734 }, { 10,-11411 }, { 11,-4992 }, { 12,-4734 }, { 13,-11411 },+ { 14,-4992 }, { 15,-4992 }, { 16,-4992 }, { 17,-4992 }, { 18,-4992 },+ { 19,-4992 }, { 20,-4992 }, { 21,-4992 }, { 22,-4992 }, { 23,-4992 },+ { 24,-4992 }, { 25,-4992 }, { 26,-4992 }, { 27,-4992 }, { 28,-4992 },+ { 29,-4992 }, { 30,-4992 }, { 31,-4992 }, { 32,-4734 }, { 33,-4992 },+ { 34,-4992 }, { 35,-4992 }, { 36,-4992 }, { 37,-4992 }, { 38,-4992 },+ { 39,-4992 }, { 40,-4992 }, { 41,-4992 }, { 42,-4992 }, { 43,-4992 },+ { 44,-4992 }, { 45, 0 }, { 46,-4992 }, { 47,-4992 }, { 48,-4992 },++ { 49,-4992 }, { 50,-4992 }, { 51,-4992 }, { 52,-4992 }, { 53,-4992 },+ { 54,-4992 }, { 55,-4992 }, { 56,-4992 }, { 57,-4992 }, { 58,-4992 },+ { 59,-4992 }, { 60,-4992 }, { 61,-4992 }, { 62,-4992 }, { 63,-4992 },+ { 64,-4992 }, { 65,-4992 }, { 66,-4992 }, { 67,-4992 }, { 68,-4992 },+ { 69,-4992 }, { 70,-4992 }, { 71,-4992 }, { 72,-4992 }, { 73,-4992 },+ { 74,-4992 }, { 75,-4992 }, { 76,-4992 }, { 77,-4992 }, { 78,-4992 },+ { 79,-4992 }, { 80,-4992 }, { 81,-4992 }, { 82,-4992 }, { 83,-4992 },+ { 84,-4992 }, { 85,-4992 }, { 86,-4992 }, { 87,-4992 }, { 88,-4992 },+ { 89,-4992 }, { 90,-4992 }, { 91,-4992 }, { 92,-4992 }, { 93,-4992 },+ { 94,-4992 }, { 95,-4992 }, { 96,-4992 }, { 97,-4992 }, { 98,-4992 },++ { 99,-4992 }, { 100,-4992 }, { 101,-4992 }, { 102,-4992 }, { 103,-4992 },+ { 104,-4992 }, { 105,-4992 }, { 106,-4992 }, { 107,-4992 }, { 108,-4992 },+ { 109,-4992 }, { 110,-4992 }, { 111,-4992 }, { 112,-4992 }, { 113,-4992 },+ { 114,-4992 }, { 115,-4992 }, { 116,-4992 }, { 117,-4992 }, { 118,-4992 },+ { 119,-4992 }, { 120,-4992 }, { 121,-4992 }, { 122,-4992 }, { 123,-4992 },+ { 124,-4992 }, { 125,-4992 }, { 126,-4992 }, { 127,-4992 }, { 128,-4992 },+ { 129,-4992 }, { 130,-4992 }, { 131,-4992 }, { 132,-4992 }, { 133,-4992 },+ { 134,-4992 }, { 135,-4992 }, { 136,-4992 }, { 137,-4992 }, { 138,-4992 },+ { 139,-4992 }, { 140,-4992 }, { 141,-4992 }, { 142,-4992 }, { 143,-4992 },+ { 144,-4992 }, { 145,-4992 }, { 146,-4992 }, { 147,-4992 }, { 148,-4992 },++ { 149,-4992 }, { 150,-4992 }, { 151,-4992 }, { 152,-4992 }, { 153,-4992 },+ { 154,-4992 }, { 155,-4992 }, { 156,-4992 }, { 157,-4992 }, { 158,-4992 },+ { 159,-4992 }, { 160,-4992 }, { 161,-4992 }, { 162,-4992 }, { 163,-4992 },+ { 164,-4992 }, { 165,-4992 }, { 166,-4992 }, { 167,-4992 }, { 168,-4992 },+ { 169,-4992 }, { 170,-4992 }, { 171,-4992 }, { 172,-4992 }, { 173,-4992 },+ { 174,-4992 }, { 175,-4992 }, { 176,-4992 }, { 177,-4992 }, { 178,-4992 },+ { 179,-4992 }, { 180,-4992 }, { 181,-4992 }, { 182,-4992 }, { 183,-4992 },+ { 184,-4992 }, { 185,-4992 }, { 186,-4992 }, { 187,-4992 }, { 188,-4992 },+ { 189,-4992 }, { 190,-4992 }, { 191,-4992 }, { 192,-4992 }, { 193,-4992 },+ { 194,-4992 }, { 195,-4992 }, { 196,-4992 }, { 197,-4992 }, { 198,-4992 },++ { 199,-4992 }, { 200,-4992 }, { 201,-4992 }, { 202,-4992 }, { 203,-4992 },+ { 204,-4992 }, { 205,-4992 }, { 206,-4992 }, { 207,-4992 }, { 208,-4992 },+ { 209,-4992 }, { 210,-4992 }, { 211,-4992 }, { 212,-4992 }, { 213,-4992 },+ { 214,-4992 }, { 215,-4992 }, { 216,-4992 }, { 217,-4992 }, { 218,-4992 },+ { 219,-4992 }, { 220,-4992 }, { 221,-4992 }, { 222,-4992 }, { 223,-4992 },+ { 224,-4992 }, { 225,-4992 }, { 226,-4992 }, { 227,-4992 }, { 228,-4992 },+ { 229,-4992 }, { 230,-4992 }, { 231,-4992 }, { 232,-4992 }, { 233,-4992 },+ { 234,-4992 }, { 235,-4992 }, { 236,-4992 }, { 237,-4992 }, { 238,-4992 },+ { 239,-4992 }, { 240,-4992 }, { 241,-4992 }, { 242,-4992 }, { 243,-4992 },+ { 244,-4992 }, { 245,-4992 }, { 246,-4992 }, { 247,-4992 }, { 248,-4992 },++ { 249,-4992 }, { 250,-4992 }, { 251,-4992 }, { 252,-4992 }, { 253,-4992 },+ { 254,-4992 }, { 255,-4992 }, { 256,-4992 }, { 0, 22 }, { 0,10391 },+ { 1, 0 }, { 2, 0 }, { 3, 0 }, { 4, 0 }, { 5, 0 },+ { 6, 0 }, { 7, 0 }, { 8, 0 }, { 9, 258 }, { 10, 516 },+ { 11, 0 }, { 12, 258 }, { 13, 516 }, { 14, 0 }, { 15, 0 },+ { 16, 0 }, { 17, 0 }, { 18, 0 }, { 19, 0 }, { 20, 0 },+ { 21, 0 }, { 22, 0 }, { 23, 0 }, { 24, 0 }, { 25, 0 },+ { 26, 0 }, { 27, 0 }, { 28, 0 }, { 29, 0 }, { 30, 0 },+ { 31, 0 }, { 32, 258 }, { 33, 0 }, { 34, 0 }, { 35, 0 },+ { 36, 0 }, { 37, 0 }, { 38, 0 }, { 39, 0 }, { 40, 0 },++ { 41, 0 }, { 42, 0 }, { 43, 0 }, { 44, 0 }, { 45, 563 },+ { 46, 0 }, { 47, 0 }, { 48, 0 }, { 49, 0 }, { 50, 0 },+ { 51, 0 }, { 52, 0 }, { 53, 0 }, { 54, 0 }, { 55, 0 },+ { 56, 0 }, { 57, 0 }, { 58, 0 }, { 59, 0 }, { 60, 0 },+ { 61, 0 }, { 62, 0 }, { 63, 0 }, { 64, 0 }, { 65, 0 },+ { 66, 0 }, { 67, 0 }, { 68, 0 }, { 69, 0 }, { 70, 0 },+ { 71, 0 }, { 72, 0 }, { 73, 0 }, { 74, 0 }, { 75, 0 },+ { 76, 0 }, { 77, 0 }, { 78, 0 }, { 79, 0 }, { 80, 0 },+ { 81, 0 }, { 82, 0 }, { 83, 0 }, { 84, 0 }, { 85, 0 },+ { 86, 0 }, { 87, 0 }, { 88, 0 }, { 89, 0 }, { 90, 0 },++ { 91, 0 }, { 92, 0 }, { 93, 0 }, { 94, 0 }, { 95, 0 },+ { 96, 0 }, { 97, 0 }, { 98, 0 }, { 99, 0 }, { 100, 0 },+ { 101, 0 }, { 102, 0 }, { 103, 0 }, { 104, 0 }, { 105, 0 },+ { 106, 0 }, { 107, 0 }, { 108, 0 }, { 109, 0 }, { 110, 0 },+ { 111, 0 }, { 112, 0 }, { 113, 0 }, { 114, 0 }, { 115, 0 },+ { 116, 0 }, { 117, 0 }, { 118, 0 }, { 119, 0 }, { 120, 0 },+ { 121, 0 }, { 122, 0 }, { 123, 0 }, { 124, 0 }, { 125, 0 },+ { 126, 0 }, { 127, 0 }, { 128, 0 }, { 129, 0 }, { 130, 0 },+ { 131, 0 }, { 132, 0 }, { 133, 0 }, { 134, 0 }, { 135, 0 },+ { 136, 0 }, { 137, 0 }, { 138, 0 }, { 139, 0 }, { 140, 0 },++ { 141, 0 }, { 142, 0 }, { 143, 0 }, { 144, 0 }, { 145, 0 },+ { 146, 0 }, { 147, 0 }, { 148, 0 }, { 149, 0 }, { 150, 0 },+ { 151, 0 }, { 152, 0 }, { 153, 0 }, { 154, 0 }, { 155, 0 },+ { 156, 0 }, { 157, 0 }, { 158, 0 }, { 159, 0 }, { 160, 0 },+ { 161, 0 }, { 162, 0 }, { 163, 0 }, { 164, 0 }, { 165, 0 },+ { 166, 0 }, { 167, 0 }, { 168, 0 }, { 169, 0 }, { 170, 0 },+ { 171, 0 }, { 172, 0 }, { 173, 0 }, { 174, 0 }, { 175, 0 },+ { 176, 0 }, { 177, 0 }, { 178, 0 }, { 179, 0 }, { 180, 0 },+ { 181, 0 }, { 182, 0 }, { 183, 0 }, { 184, 0 }, { 185, 0 },+ { 186, 0 }, { 187, 0 }, { 188, 0 }, { 189, 0 }, { 190, 0 },++ { 191, 0 }, { 192, 0 }, { 193, 0 }, { 194, 0 }, { 195, 0 },+ { 196, 0 }, { 197, 0 }, { 198, 0 }, { 199, 0 }, { 200, 0 },+ { 201, 0 }, { 202, 0 }, { 203, 0 }, { 204, 0 }, { 205, 0 },+ { 206, 0 }, { 207, 0 }, { 208, 0 }, { 209, 0 }, { 210, 0 },+ { 211, 0 }, { 212, 0 }, { 213, 0 }, { 214, 0 }, { 215, 0 },+ { 216, 0 }, { 217, 0 }, { 218, 0 }, { 219, 0 }, { 220, 0 },+ { 221, 0 }, { 222, 0 }, { 223, 0 }, { 224, 0 }, { 225, 0 },+ { 226, 0 }, { 227, 0 }, { 228, 0 }, { 229, 0 }, { 230, 0 },+ { 231, 0 }, { 232, 0 }, { 233, 0 }, { 234, 0 }, { 235, 0 },+ { 236, 0 }, { 237, 0 }, { 238, 0 }, { 239, 0 }, { 240, 0 },++ { 241, 0 }, { 242, 0 }, { 243, 0 }, { 244, 0 }, { 245, 0 },+ { 246, 0 }, { 247, 0 }, { 248, 0 }, { 249, 0 }, { 250, 0 },+ { 251, 0 }, { 252, 0 }, { 253, 0 }, { 254, 0 }, { 255, 0 },+ { 256, 0 }, { 0, 22 }, { 0,10133 }, { 1,-258 }, { 2,-258 },+ { 3,-258 }, { 4,-258 }, { 5,-258 }, { 6,-258 }, { 7,-258 },+ { 8,-258 }, { 9, 0 }, { 10, 258 }, { 11,-258 }, { 12, 0 },+ { 13, 258 }, { 14,-258 }, { 15,-258 }, { 16,-258 }, { 17,-258 },+ { 18,-258 }, { 19,-258 }, { 20,-258 }, { 21,-258 }, { 22,-258 },+ { 23,-258 }, { 24,-258 }, { 25,-258 }, { 26,-258 }, { 27,-258 },+ { 28,-258 }, { 29,-258 }, { 30,-258 }, { 31,-258 }, { 32, 0 },++ { 33,-258 }, { 34,-258 }, { 35,-258 }, { 36,-258 }, { 37,-258 },+ { 38,-258 }, { 39,-258 }, { 40,-258 }, { 41,-258 }, { 42,-258 },+ { 43,-258 }, { 44,-258 }, { 45, 305 }, { 46,-258 }, { 47,-258 },+ { 48,-258 }, { 49,-258 }, { 50,-258 }, { 51,-258 }, { 52,-258 },+ { 53,-258 }, { 54,-258 }, { 55,-258 }, { 56,-258 }, { 57,-258 },+ { 58,-258 }, { 59,-258 }, { 60,-258 }, { 61,-258 }, { 62,-258 },+ { 63,-258 }, { 64,-258 }, { 65,-258 }, { 66,-258 }, { 67,-258 },+ { 68,-258 }, { 69,-258 }, { 70,-258 }, { 71,-258 }, { 72,-258 },+ { 73,-258 }, { 74,-258 }, { 75,-258 }, { 76,-258 }, { 77,-258 },+ { 78,-258 }, { 79,-258 }, { 80,-258 }, { 81,-258 }, { 82,-258 },++ { 83,-258 }, { 84,-258 }, { 85,-258 }, { 86,-258 }, { 87,-258 },+ { 88,-258 }, { 89,-258 }, { 90,-258 }, { 91,-258 }, { 92,-258 },+ { 93,-258 }, { 94,-258 }, { 95,-258 }, { 96,-258 }, { 97,-258 },+ { 98,-258 }, { 99,-258 }, { 100,-258 }, { 101,-258 }, { 102,-258 },+ { 103,-258 }, { 104,-258 }, { 105,-258 }, { 106,-258 }, { 107,-258 },+ { 108,-258 }, { 109,-258 }, { 110,-258 }, { 111,-258 }, { 112,-258 },+ { 113,-258 }, { 114,-258 }, { 115,-258 }, { 116,-258 }, { 117,-258 },+ { 118,-258 }, { 119,-258 }, { 120,-258 }, { 121,-258 }, { 122,-258 },+ { 123,-258 }, { 124,-258 }, { 125,-258 }, { 126,-258 }, { 127,-258 },+ { 128,-258 }, { 129,-258 }, { 130,-258 }, { 131,-258 }, { 132,-258 },++ { 133,-258 }, { 134,-258 }, { 135,-258 }, { 136,-258 }, { 137,-258 },+ { 138,-258 }, { 139,-258 }, { 140,-258 }, { 141,-258 }, { 142,-258 },+ { 143,-258 }, { 144,-258 }, { 145,-258 }, { 146,-258 }, { 147,-258 },+ { 148,-258 }, { 149,-258 }, { 150,-258 }, { 151,-258 }, { 152,-258 },+ { 153,-258 }, { 154,-258 }, { 155,-258 }, { 156,-258 }, { 157,-258 },+ { 158,-258 }, { 159,-258 }, { 160,-258 }, { 161,-258 }, { 162,-258 },+ { 163,-258 }, { 164,-258 }, { 165,-258 }, { 166,-258 }, { 167,-258 },+ { 168,-258 }, { 169,-258 }, { 170,-258 }, { 171,-258 }, { 172,-258 },+ { 173,-258 }, { 174,-258 }, { 175,-258 }, { 176,-258 }, { 177,-258 },+ { 178,-258 }, { 179,-258 }, { 180,-258 }, { 181,-258 }, { 182,-258 },++ { 183,-258 }, { 184,-258 }, { 185,-258 }, { 186,-258 }, { 187,-258 },+ { 188,-258 }, { 189,-258 }, { 190,-258 }, { 191,-258 }, { 192,-258 },+ { 193,-258 }, { 194,-258 }, { 195,-258 }, { 196,-258 }, { 197,-258 },+ { 198,-258 }, { 199,-258 }, { 200,-258 }, { 201,-258 }, { 202,-258 },+ { 203,-258 }, { 204,-258 }, { 205,-258 }, { 206,-258 }, { 207,-258 },+ { 208,-258 }, { 209,-258 }, { 210,-258 }, { 211,-258 }, { 212,-258 },+ { 213,-258 }, { 214,-258 }, { 215,-258 }, { 216,-258 }, { 217,-258 },+ { 218,-258 }, { 219,-258 }, { 220,-258 }, { 221,-258 }, { 222,-258 },+ { 223,-258 }, { 224,-258 }, { 225,-258 }, { 226,-258 }, { 227,-258 },+ { 228,-258 }, { 229,-258 }, { 230,-258 }, { 231,-258 }, { 232,-258 },++ { 233,-258 }, { 234,-258 }, { 235,-258 }, { 236,-258 }, { 237,-258 },+ { 238,-258 }, { 239,-258 }, { 240,-258 }, { 241,-258 }, { 242,-258 },+ { 243,-258 }, { 244,-258 }, { 245,-258 }, { 246,-258 }, { 247,-258 },+ { 248,-258 }, { 249,-258 }, { 250,-258 }, { 251,-258 }, { 252,-258 },+ { 253,-258 }, { 254,-258 }, { 255,-258 }, { 256,-258 }, { 0, 22 },+ { 0,9875 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 9,-8707 },+ { 10,-8707 }, { 0, 0 }, { 12,-8707 }, { 13,-8707 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },++ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 32,-8707 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 39,-19584 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 45,-19557 }, { 0, 22 }, { 0,9828 }, { 1,-563 }, { 2,-563 },+ { 3,-563 }, { 4,-563 }, { 5,-563 }, { 6,-563 }, { 7,-563 },+ { 8,-563 }, { 9,-305 }, { 10, -47 }, { 11,-563 }, { 12,-305 },+ { 13, -47 }, { 14,-563 }, { 15,-563 }, { 16,-563 }, { 17,-563 },+ { 18,-563 }, { 19,-563 }, { 20,-563 }, { 21,-563 }, { 22,-563 },+ { 23,-563 }, { 24,-563 }, { 25,-563 }, { 26,-563 }, { 27,-563 },++ { 28,-563 }, { 29,-563 }, { 30,-563 }, { 31,-563 }, { 32,-305 },+ { 33,-563 }, { 34,-563 }, { 35,-563 }, { 36,-563 }, { 37,-563 },+ { 38,-563 }, { 39,-563 }, { 40,-563 }, { 41,-563 }, { 42,-563 },+ { 43,-563 }, { 44,-563 }, { 45,2365 }, { 46,-563 }, { 47,-563 },+ { 48,-563 }, { 49,-563 }, { 50,-563 }, { 51,-563 }, { 52,-563 },+ { 53,-563 }, { 54,-563 }, { 55,-563 }, { 56,-563 }, { 57,-563 },+ { 58,-563 }, { 59,-563 }, { 60,-563 }, { 61,-563 }, { 62,-563 },+ { 63,-563 }, { 64,-563 }, { 65,-563 }, { 66,-563 }, { 67,-563 },+ { 68,-563 }, { 69,-563 }, { 70,-563 }, { 71,-563 }, { 72,-563 },+ { 73,-563 }, { 74,-563 }, { 75,-563 }, { 76,-563 }, { 77,-563 },++ { 78,-563 }, { 79,-563 }, { 80,-563 }, { 81,-563 }, { 82,-563 },+ { 83,-563 }, { 84,-563 }, { 85,-563 }, { 86,-563 }, { 87,-563 },+ { 88,-563 }, { 89,-563 }, { 90,-563 }, { 91,-563 }, { 92,-563 },+ { 93,-563 }, { 94,-563 }, { 95,-563 }, { 96,-563 }, { 97,-563 },+ { 98,-563 }, { 99,-563 }, { 100,-563 }, { 101,-563 }, { 102,-563 },+ { 103,-563 }, { 104,-563 }, { 105,-563 }, { 106,-563 }, { 107,-563 },+ { 108,-563 }, { 109,-563 }, { 110,-563 }, { 111,-563 }, { 112,-563 },+ { 113,-563 }, { 114,-563 }, { 115,-563 }, { 116,-563 }, { 117,-563 },+ { 118,-563 }, { 119,-563 }, { 120,-563 }, { 121,-563 }, { 122,-563 },+ { 123,-563 }, { 124,-563 }, { 125,-563 }, { 126,-563 }, { 127,-563 },++ { 128,-563 }, { 129,-563 }, { 130,-563 }, { 131,-563 }, { 132,-563 },+ { 133,-563 }, { 134,-563 }, { 135,-563 }, { 136,-563 }, { 137,-563 },+ { 138,-563 }, { 139,-563 }, { 140,-563 }, { 141,-563 }, { 142,-563 },+ { 143,-563 }, { 144,-563 }, { 145,-563 }, { 146,-563 }, { 147,-563 },+ { 148,-563 }, { 149,-563 }, { 150,-563 }, { 151,-563 }, { 152,-563 },+ { 153,-563 }, { 154,-563 }, { 155,-563 }, { 156,-563 }, { 157,-563 },+ { 158,-563 }, { 159,-563 }, { 160,-563 }, { 161,-563 }, { 162,-563 },+ { 163,-563 }, { 164,-563 }, { 165,-563 }, { 166,-563 }, { 167,-563 },+ { 168,-563 }, { 169,-563 }, { 170,-563 }, { 171,-563 }, { 172,-563 },+ { 173,-563 }, { 174,-563 }, { 175,-563 }, { 176,-563 }, { 177,-563 },++ { 178,-563 }, { 179,-563 }, { 180,-563 }, { 181,-563 }, { 182,-563 },+ { 183,-563 }, { 184,-563 }, { 185,-563 }, { 186,-563 }, { 187,-563 },+ { 188,-563 }, { 189,-563 }, { 190,-563 }, { 191,-563 }, { 192,-563 },+ { 193,-563 }, { 194,-563 }, { 195,-563 }, { 196,-563 }, { 197,-563 },+ { 198,-563 }, { 199,-563 }, { 200,-563 }, { 201,-563 }, { 202,-563 },+ { 203,-563 }, { 204,-563 }, { 205,-563 }, { 206,-563 }, { 207,-563 },+ { 208,-563 }, { 209,-563 }, { 210,-563 }, { 211,-563 }, { 212,-563 },+ { 213,-563 }, { 214,-563 }, { 215,-563 }, { 216,-563 }, { 217,-563 },+ { 218,-563 }, { 219,-563 }, { 220,-563 }, { 221,-563 }, { 222,-563 },+ { 223,-563 }, { 224,-563 }, { 225,-563 }, { 226,-563 }, { 227,-563 },++ { 228,-563 }, { 229,-563 }, { 230,-563 }, { 231,-563 }, { 232,-563 },+ { 233,-563 }, { 234,-563 }, { 235,-563 }, { 236,-563 }, { 237,-563 },+ { 238,-563 }, { 239,-563 }, { 240,-563 }, { 241,-563 }, { 242,-563 },+ { 243,-563 }, { 244,-563 }, { 245,-563 }, { 246,-563 }, { 247,-563 },+ { 248,-563 }, { 249,-563 }, { 250,-563 }, { 251,-563 }, { 252,-563 },+ { 253,-563 }, { 254,-563 }, { 255,-563 }, { 256,-563 }, { 0, 22 },+ { 0,9570 }, { 1,-5039 }, { 2,-5039 }, { 3,-5039 }, { 4,-5039 },+ { 5,-5039 }, { 6,-5039 }, { 7,-5039 }, { 8,-5039 }, { 9,-4781 },+ { 10,-12180 }, { 11,-5039 }, { 12,-4781 }, { 13,-12180 }, { 14,-5039 },+ { 15,-5039 }, { 16,-5039 }, { 17,-5039 }, { 18,-5039 }, { 19,-5039 },++ { 20,-5039 }, { 21,-5039 }, { 22,-5039 }, { 23,-5039 }, { 24,-5039 },+ { 25,-5039 }, { 26,-5039 }, { 27,-5039 }, { 28,-5039 }, { 29,-5039 },+ { 30,-5039 }, { 31,-5039 }, { 32,-4781 }, { 33,-5039 }, { 34,-5039 },+ { 35,-5039 }, { 36,-5039 }, { 37,-5039 }, { 38,-5039 }, { 39,-5039 },+ { 40,-5039 }, { 41,-5039 }, { 42,-5039 }, { 43,-5039 }, { 44,-5039 },+ { 45, 0 }, { 46,-5039 }, { 47,-5039 }, { 48,-5039 }, { 49,-5039 },+ { 50,-5039 }, { 51,-5039 }, { 52,-5039 }, { 53,-5039 }, { 54,-5039 },+ { 55,-5039 }, { 56,-5039 }, { 57,-5039 }, { 58,-5039 }, { 59,-5039 },+ { 60,-5039 }, { 61,-5039 }, { 62,-5039 }, { 63,-5039 }, { 64,-5039 },+ { 65,-5039 }, { 66,-5039 }, { 67,-5039 }, { 68,-5039 }, { 69,-5039 },++ { 70,-5039 }, { 71,-5039 }, { 72,-5039 }, { 73,-5039 }, { 74,-5039 },+ { 75,-5039 }, { 76,-5039 }, { 77,-5039 }, { 78,-5039 }, { 79,-5039 },+ { 80,-5039 }, { 81,-5039 }, { 82,-5039 }, { 83,-5039 }, { 84,-5039 },+ { 85,-5039 }, { 86,-5039 }, { 87,-5039 }, { 88,-5039 }, { 89,-5039 },+ { 90,-5039 }, { 91,-5039 }, { 92,-5039 }, { 93,-5039 }, { 94,-5039 },+ { 95,-5039 }, { 96,-5039 }, { 97,-5039 }, { 98,-5039 }, { 99,-5039 },+ { 100,-5039 }, { 101,-5039 }, { 102,-5039 }, { 103,-5039 }, { 104,-5039 },+ { 105,-5039 }, { 106,-5039 }, { 107,-5039 }, { 108,-5039 }, { 109,-5039 },+ { 110,-5039 }, { 111,-5039 }, { 112,-5039 }, { 113,-5039 }, { 114,-5039 },+ { 115,-5039 }, { 116,-5039 }, { 117,-5039 }, { 118,-5039 }, { 119,-5039 },++ { 120,-5039 }, { 121,-5039 }, { 122,-5039 }, { 123,-5039 }, { 124,-5039 },+ { 125,-5039 }, { 126,-5039 }, { 127,-5039 }, { 128,-5039 }, { 129,-5039 },+ { 130,-5039 }, { 131,-5039 }, { 132,-5039 }, { 133,-5039 }, { 134,-5039 },+ { 135,-5039 }, { 136,-5039 }, { 137,-5039 }, { 138,-5039 }, { 139,-5039 },+ { 140,-5039 }, { 141,-5039 }, { 142,-5039 }, { 143,-5039 }, { 144,-5039 },+ { 145,-5039 }, { 146,-5039 }, { 147,-5039 }, { 148,-5039 }, { 149,-5039 },+ { 150,-5039 }, { 151,-5039 }, { 152,-5039 }, { 153,-5039 }, { 154,-5039 },+ { 155,-5039 }, { 156,-5039 }, { 157,-5039 }, { 158,-5039 }, { 159,-5039 },+ { 160,-5039 }, { 161,-5039 }, { 162,-5039 }, { 163,-5039 }, { 164,-5039 },+ { 165,-5039 }, { 166,-5039 }, { 167,-5039 }, { 168,-5039 }, { 169,-5039 },++ { 170,-5039 }, { 171,-5039 }, { 172,-5039 }, { 173,-5039 }, { 174,-5039 },+ { 175,-5039 }, { 176,-5039 }, { 177,-5039 }, { 178,-5039 }, { 179,-5039 },+ { 180,-5039 }, { 181,-5039 }, { 182,-5039 }, { 183,-5039 }, { 184,-5039 },+ { 185,-5039 }, { 186,-5039 }, { 187,-5039 }, { 188,-5039 }, { 189,-5039 },+ { 190,-5039 }, { 191,-5039 }, { 192,-5039 }, { 193,-5039 }, { 194,-5039 },+ { 195,-5039 }, { 196,-5039 }, { 197,-5039 }, { 198,-5039 }, { 199,-5039 },+ { 200,-5039 }, { 201,-5039 }, { 202,-5039 }, { 203,-5039 }, { 204,-5039 },+ { 205,-5039 }, { 206,-5039 }, { 207,-5039 }, { 208,-5039 }, { 209,-5039 },+ { 210,-5039 }, { 211,-5039 }, { 212,-5039 }, { 213,-5039 }, { 214,-5039 },+ { 215,-5039 }, { 216,-5039 }, { 217,-5039 }, { 218,-5039 }, { 219,-5039 },++ { 220,-5039 }, { 221,-5039 }, { 222,-5039 }, { 223,-5039 }, { 224,-5039 },+ { 225,-5039 }, { 226,-5039 }, { 227,-5039 }, { 228,-5039 }, { 229,-5039 },+ { 230,-5039 }, { 231,-5039 }, { 232,-5039 }, { 233,-5039 }, { 234,-5039 },+ { 235,-5039 }, { 236,-5039 }, { 237,-5039 }, { 238,-5039 }, { 239,-5039 },+ { 240,-5039 }, { 241,-5039 }, { 242,-5039 }, { 243,-5039 }, { 244,-5039 },+ { 245,-5039 }, { 246,-5039 }, { 247,-5039 }, { 248,-5039 }, { 249,-5039 },+ { 250,-5039 }, { 251,-5039 }, { 252,-5039 }, { 253,-5039 }, { 254,-5039 },+ { 255,-5039 }, { 256,-5039 }, { 0, 37 }, { 0,9312 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },++ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 37 }, { 0,9289 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 48,2107 }, { 49,2107 }, { 50,2107 }, { 51,2107 },+ { 52,2107 }, { 53,2107 }, { 54,2107 }, { 55,2107 }, { 56,2107 },+ { 57,2107 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },++ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,2107 }, { 66,2107 },+ { 67,2107 }, { 68,2107 }, { 69,2107 }, { 70,2107 }, { 48,-19314 },+ { 49,-19314 }, { 50,-19314 }, { 51,-19314 }, { 52,-19314 }, { 53,-19314 },+ { 54,-19314 }, { 55,-19314 }, { 56,-19314 }, { 57,-19314 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 65,-19314 }, { 66,-19314 }, { 67,-19314 }, { 68,-19314 },+ { 69,-19314 }, { 70,-19314 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 97,2107 }, { 98,2107 }, { 99,2107 }, { 100,2107 }, { 101,2107 },+ { 102,2107 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },++ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 97,-19314 }, { 98,-19314 },+ { 99,-19314 }, { 100,-19314 }, { 101,-19314 }, { 102,-19314 }, { 0, 24 },+ { 0,9185 }, { 1, 0 }, { 2, 0 }, { 3, 0 }, { 4, 0 },+ { 5, 0 }, { 6, 0 }, { 7, 0 }, { 8, 0 }, { 9, 258 },+ { 10, 516 }, { 11, 0 }, { 12, 258 }, { 13, 516 }, { 14, 0 },+ { 15, 0 }, { 16, 0 }, { 17, 0 }, { 18, 0 }, { 19, 0 },+ { 20, 0 }, { 21, 0 }, { 22, 0 }, { 23, 0 }, { 24, 0 },+ { 25, 0 }, { 26, 0 }, { 27, 0 }, { 28, 0 }, { 29, 0 },+ { 30, 0 }, { 31, 0 }, { 32, 258 }, { 33, 0 }, { 34, 0 },++ { 35, 0 }, { 36, 0 }, { 37, 0 }, { 38, 0 }, { 39, 0 },+ { 40, 0 }, { 41, 0 }, { 42, 0 }, { 43, 0 }, { 44, 0 },+ { 45, 563 }, { 46, 0 }, { 47, 0 }, { 48, 0 }, { 49, 0 },+ { 50, 0 }, { 51, 0 }, { 52, 0 }, { 53, 0 }, { 54, 0 },+ { 55, 0 }, { 56, 0 }, { 57, 0 }, { 58, 0 }, { 59, 0 },+ { 60, 0 }, { 61, 0 }, { 62, 0 }, { 63, 0 }, { 64, 0 },+ { 65, 0 }, { 66, 0 }, { 67, 0 }, { 68, 0 }, { 69, 0 },+ { 70, 0 }, { 71, 0 }, { 72, 0 }, { 73, 0 }, { 74, 0 },+ { 75, 0 }, { 76, 0 }, { 77, 0 }, { 78, 0 }, { 79, 0 },+ { 80, 0 }, { 81, 0 }, { 82, 0 }, { 83, 0 }, { 84, 0 },++ { 85, 0 }, { 86, 0 }, { 87, 0 }, { 88, 0 }, { 89, 0 },+ { 90, 0 }, { 91, 0 }, { 92, 0 }, { 93, 0 }, { 94, 0 },+ { 95, 0 }, { 96, 0 }, { 97, 0 }, { 98, 0 }, { 99, 0 },+ { 100, 0 }, { 101, 0 }, { 102, 0 }, { 103, 0 }, { 104, 0 },+ { 105, 0 }, { 106, 0 }, { 107, 0 }, { 108, 0 }, { 109, 0 },+ { 110, 0 }, { 111, 0 }, { 112, 0 }, { 113, 0 }, { 114, 0 },+ { 115, 0 }, { 116, 0 }, { 117, 0 }, { 118, 0 }, { 119, 0 },+ { 120, 0 }, { 121, 0 }, { 122, 0 }, { 123, 0 }, { 124, 0 },+ { 125, 0 }, { 126, 0 }, { 127, 0 }, { 128, 0 }, { 129, 0 },+ { 130, 0 }, { 131, 0 }, { 132, 0 }, { 133, 0 }, { 134, 0 },++ { 135, 0 }, { 136, 0 }, { 137, 0 }, { 138, 0 }, { 139, 0 },+ { 140, 0 }, { 141, 0 }, { 142, 0 }, { 143, 0 }, { 144, 0 },+ { 145, 0 }, { 146, 0 }, { 147, 0 }, { 148, 0 }, { 149, 0 },+ { 150, 0 }, { 151, 0 }, { 152, 0 }, { 153, 0 }, { 154, 0 },+ { 155, 0 }, { 156, 0 }, { 157, 0 }, { 158, 0 }, { 159, 0 },+ { 160, 0 }, { 161, 0 }, { 162, 0 }, { 163, 0 }, { 164, 0 },+ { 165, 0 }, { 166, 0 }, { 167, 0 }, { 168, 0 }, { 169, 0 },+ { 170, 0 }, { 171, 0 }, { 172, 0 }, { 173, 0 }, { 174, 0 },+ { 175, 0 }, { 176, 0 }, { 177, 0 }, { 178, 0 }, { 179, 0 },+ { 180, 0 }, { 181, 0 }, { 182, 0 }, { 183, 0 }, { 184, 0 },++ { 185, 0 }, { 186, 0 }, { 187, 0 }, { 188, 0 }, { 189, 0 },+ { 190, 0 }, { 191, 0 }, { 192, 0 }, { 193, 0 }, { 194, 0 },+ { 195, 0 }, { 196, 0 }, { 197, 0 }, { 198, 0 }, { 199, 0 },+ { 200, 0 }, { 201, 0 }, { 202, 0 }, { 203, 0 }, { 204, 0 },+ { 205, 0 }, { 206, 0 }, { 207, 0 }, { 208, 0 }, { 209, 0 },+ { 210, 0 }, { 211, 0 }, { 212, 0 }, { 213, 0 }, { 214, 0 },+ { 215, 0 }, { 216, 0 }, { 217, 0 }, { 218, 0 }, { 219, 0 },+ { 220, 0 }, { 221, 0 }, { 222, 0 }, { 223, 0 }, { 224, 0 },+ { 225, 0 }, { 226, 0 }, { 227, 0 }, { 228, 0 }, { 229, 0 },+ { 230, 0 }, { 231, 0 }, { 232, 0 }, { 233, 0 }, { 234, 0 },++ { 235, 0 }, { 236, 0 }, { 237, 0 }, { 238, 0 }, { 239, 0 },+ { 240, 0 }, { 241, 0 }, { 242, 0 }, { 243, 0 }, { 244, 0 },+ { 245, 0 }, { 246, 0 }, { 247, 0 }, { 248, 0 }, { 249, 0 },+ { 250, 0 }, { 251, 0 }, { 252, 0 }, { 253, 0 }, { 254, 0 },+ { 255, 0 }, { 256, 0 }, { 0, 24 }, { 0,8927 }, { 1,-258 },+ { 2,-258 }, { 3,-258 }, { 4,-258 }, { 5,-258 }, { 6,-258 },+ { 7,-258 }, { 8,-258 }, { 9, 0 }, { 10, 258 }, { 11,-258 },+ { 12, 0 }, { 13, 258 }, { 14,-258 }, { 15,-258 }, { 16,-258 },+ { 17,-258 }, { 18,-258 }, { 19,-258 }, { 20,-258 }, { 21,-258 },+ { 22,-258 }, { 23,-258 }, { 24,-258 }, { 25,-258 }, { 26,-258 },++ { 27,-258 }, { 28,-258 }, { 29,-258 }, { 30,-258 }, { 31,-258 },+ { 32, 0 }, { 33,-258 }, { 34,-258 }, { 35,-258 }, { 36,-258 },+ { 37,-258 }, { 38,-258 }, { 39,-258 }, { 40,-258 }, { 41,-258 },+ { 42,-258 }, { 43,-258 }, { 44,-258 }, { 45, 305 }, { 46,-258 },+ { 47,-258 }, { 48,-258 }, { 49,-258 }, { 50,-258 }, { 51,-258 },+ { 52,-258 }, { 53,-258 }, { 54,-258 }, { 55,-258 }, { 56,-258 },+ { 57,-258 }, { 58,-258 }, { 59,-258 }, { 60,-258 }, { 61,-258 },+ { 62,-258 }, { 63,-258 }, { 64,-258 }, { 65,-258 }, { 66,-258 },+ { 67,-258 }, { 68,-258 }, { 69,-258 }, { 70,-258 }, { 71,-258 },+ { 72,-258 }, { 73,-258 }, { 74,-258 }, { 75,-258 }, { 76,-258 },++ { 77,-258 }, { 78,-258 }, { 79,-258 }, { 80,-258 }, { 81,-258 },+ { 82,-258 }, { 83,-258 }, { 84,-258 }, { 85,-258 }, { 86,-258 },+ { 87,-258 }, { 88,-258 }, { 89,-258 }, { 90,-258 }, { 91,-258 },+ { 92,-258 }, { 93,-258 }, { 94,-258 }, { 95,-258 }, { 96,-258 },+ { 97,-258 }, { 98,-258 }, { 99,-258 }, { 100,-258 }, { 101,-258 },+ { 102,-258 }, { 103,-258 }, { 104,-258 }, { 105,-258 }, { 106,-258 },+ { 107,-258 }, { 108,-258 }, { 109,-258 }, { 110,-258 }, { 111,-258 },+ { 112,-258 }, { 113,-258 }, { 114,-258 }, { 115,-258 }, { 116,-258 },+ { 117,-258 }, { 118,-258 }, { 119,-258 }, { 120,-258 }, { 121,-258 },+ { 122,-258 }, { 123,-258 }, { 124,-258 }, { 125,-258 }, { 126,-258 },++ { 127,-258 }, { 128,-258 }, { 129,-258 }, { 130,-258 }, { 131,-258 },+ { 132,-258 }, { 133,-258 }, { 134,-258 }, { 135,-258 }, { 136,-258 },+ { 137,-258 }, { 138,-258 }, { 139,-258 }, { 140,-258 }, { 141,-258 },+ { 142,-258 }, { 143,-258 }, { 144,-258 }, { 145,-258 }, { 146,-258 },+ { 147,-258 }, { 148,-258 }, { 149,-258 }, { 150,-258 }, { 151,-258 },+ { 152,-258 }, { 153,-258 }, { 154,-258 }, { 155,-258 }, { 156,-258 },+ { 157,-258 }, { 158,-258 }, { 159,-258 }, { 160,-258 }, { 161,-258 },+ { 162,-258 }, { 163,-258 }, { 164,-258 }, { 165,-258 }, { 166,-258 },+ { 167,-258 }, { 168,-258 }, { 169,-258 }, { 170,-258 }, { 171,-258 },+ { 172,-258 }, { 173,-258 }, { 174,-258 }, { 175,-258 }, { 176,-258 },++ { 177,-258 }, { 178,-258 }, { 179,-258 }, { 180,-258 }, { 181,-258 },+ { 182,-258 }, { 183,-258 }, { 184,-258 }, { 185,-258 }, { 186,-258 },+ { 187,-258 }, { 188,-258 }, { 189,-258 }, { 190,-258 }, { 191,-258 },+ { 192,-258 }, { 193,-258 }, { 194,-258 }, { 195,-258 }, { 196,-258 },+ { 197,-258 }, { 198,-258 }, { 199,-258 }, { 200,-258 }, { 201,-258 },+ { 202,-258 }, { 203,-258 }, { 204,-258 }, { 205,-258 }, { 206,-258 },+ { 207,-258 }, { 208,-258 }, { 209,-258 }, { 210,-258 }, { 211,-258 },+ { 212,-258 }, { 213,-258 }, { 214,-258 }, { 215,-258 }, { 216,-258 },+ { 217,-258 }, { 218,-258 }, { 219,-258 }, { 220,-258 }, { 221,-258 },+ { 222,-258 }, { 223,-258 }, { 224,-258 }, { 225,-258 }, { 226,-258 },++ { 227,-258 }, { 228,-258 }, { 229,-258 }, { 230,-258 }, { 231,-258 },+ { 232,-258 }, { 233,-258 }, { 234,-258 }, { 235,-258 }, { 236,-258 },+ { 237,-258 }, { 238,-258 }, { 239,-258 }, { 240,-258 }, { 241,-258 },+ { 242,-258 }, { 243,-258 }, { 244,-258 }, { 245,-258 }, { 246,-258 },+ { 247,-258 }, { 248,-258 }, { 249,-258 }, { 250,-258 }, { 251,-258 },+ { 252,-258 }, { 253,-258 }, { 254,-258 }, { 255,-258 }, { 256,-258 },+ { 0, 24 }, { 0,8669 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 9,-8952 }, { 10,-8952 }, { 0, 0 }, { 12,-8952 }, { 13,-8952 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },++ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 32,-8952 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 39,-20790 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 45,-20726 }, { 0, 24 }, { 0,8622 }, { 1,-563 },+ { 2,-563 }, { 3,-563 }, { 4,-563 }, { 5,-563 }, { 6,-563 },+ { 7,-563 }, { 8,-563 }, { 9,-305 }, { 10, -47 }, { 11,-563 },+ { 12,-305 }, { 13, -47 }, { 14,-563 }, { 15,-563 }, { 16,-563 },+ { 17,-563 }, { 18,-563 }, { 19,-563 }, { 20,-563 }, { 21,-563 },++ { 22,-563 }, { 23,-563 }, { 24,-563 }, { 25,-563 }, { 26,-563 },+ { 27,-563 }, { 28,-563 }, { 29,-563 }, { 30,-563 }, { 31,-563 },+ { 32,-305 }, { 33,-563 }, { 34,-563 }, { 35,-563 }, { 36,-563 },+ { 37,-563 }, { 38,-563 }, { 39,-563 }, { 40,-563 }, { 41,-563 },+ { 42,-563 }, { 43,-563 }, { 44,-563 }, { 45,1521 }, { 46,-563 },+ { 47,-563 }, { 48,-563 }, { 49,-563 }, { 50,-563 }, { 51,-563 },+ { 52,-563 }, { 53,-563 }, { 54,-563 }, { 55,-563 }, { 56,-563 },+ { 57,-563 }, { 58,-563 }, { 59,-563 }, { 60,-563 }, { 61,-563 },+ { 62,-563 }, { 63,-563 }, { 64,-563 }, { 65,-563 }, { 66,-563 },+ { 67,-563 }, { 68,-563 }, { 69,-563 }, { 70,-563 }, { 71,-563 },++ { 72,-563 }, { 73,-563 }, { 74,-563 }, { 75,-563 }, { 76,-563 },+ { 77,-563 }, { 78,-563 }, { 79,-563 }, { 80,-563 }, { 81,-563 },+ { 82,-563 }, { 83,-563 }, { 84,-563 }, { 85,-563 }, { 86,-563 },+ { 87,-563 }, { 88,-563 }, { 89,-563 }, { 90,-563 }, { 91,-563 },+ { 92,-563 }, { 93,-563 }, { 94,-563 }, { 95,-563 }, { 96,-563 },+ { 97,-563 }, { 98,-563 }, { 99,-563 }, { 100,-563 }, { 101,-563 },+ { 102,-563 }, { 103,-563 }, { 104,-563 }, { 105,-563 }, { 106,-563 },+ { 107,-563 }, { 108,-563 }, { 109,-563 }, { 110,-563 }, { 111,-563 },+ { 112,-563 }, { 113,-563 }, { 114,-563 }, { 115,-563 }, { 116,-563 },+ { 117,-563 }, { 118,-563 }, { 119,-563 }, { 120,-563 }, { 121,-563 },++ { 122,-563 }, { 123,-563 }, { 124,-563 }, { 125,-563 }, { 126,-563 },+ { 127,-563 }, { 128,-563 }, { 129,-563 }, { 130,-563 }, { 131,-563 },+ { 132,-563 }, { 133,-563 }, { 134,-563 }, { 135,-563 }, { 136,-563 },+ { 137,-563 }, { 138,-563 }, { 139,-563 }, { 140,-563 }, { 141,-563 },+ { 142,-563 }, { 143,-563 }, { 144,-563 }, { 145,-563 }, { 146,-563 },+ { 147,-563 }, { 148,-563 }, { 149,-563 }, { 150,-563 }, { 151,-563 },+ { 152,-563 }, { 153,-563 }, { 154,-563 }, { 155,-563 }, { 156,-563 },+ { 157,-563 }, { 158,-563 }, { 159,-563 }, { 160,-563 }, { 161,-563 },+ { 162,-563 }, { 163,-563 }, { 164,-563 }, { 165,-563 }, { 166,-563 },+ { 167,-563 }, { 168,-563 }, { 169,-563 }, { 170,-563 }, { 171,-563 },++ { 172,-563 }, { 173,-563 }, { 174,-563 }, { 175,-563 }, { 176,-563 },+ { 177,-563 }, { 178,-563 }, { 179,-563 }, { 180,-563 }, { 181,-563 },+ { 182,-563 }, { 183,-563 }, { 184,-563 }, { 185,-563 }, { 186,-563 },+ { 187,-563 }, { 188,-563 }, { 189,-563 }, { 190,-563 }, { 191,-563 },+ { 192,-563 }, { 193,-563 }, { 194,-563 }, { 195,-563 }, { 196,-563 },+ { 197,-563 }, { 198,-563 }, { 199,-563 }, { 200,-563 }, { 201,-563 },+ { 202,-563 }, { 203,-563 }, { 204,-563 }, { 205,-563 }, { 206,-563 },+ { 207,-563 }, { 208,-563 }, { 209,-563 }, { 210,-563 }, { 211,-563 },+ { 212,-563 }, { 213,-563 }, { 214,-563 }, { 215,-563 }, { 216,-563 },+ { 217,-563 }, { 218,-563 }, { 219,-563 }, { 220,-563 }, { 221,-563 },++ { 222,-563 }, { 223,-563 }, { 224,-563 }, { 225,-563 }, { 226,-563 },+ { 227,-563 }, { 228,-563 }, { 229,-563 }, { 230,-563 }, { 231,-563 },+ { 232,-563 }, { 233,-563 }, { 234,-563 }, { 235,-563 }, { 236,-563 },+ { 237,-563 }, { 238,-563 }, { 239,-563 }, { 240,-563 }, { 241,-563 },+ { 242,-563 }, { 243,-563 }, { 244,-563 }, { 245,-563 }, { 246,-563 },+ { 247,-563 }, { 248,-563 }, { 249,-563 }, { 250,-563 }, { 251,-563 },+ { 252,-563 }, { 253,-563 }, { 254,-563 }, { 255,-563 }, { 256,-563 },+ { 0, 24 }, { 0,8364 }, { 1,-5086 }, { 2,-5086 }, { 3,-5086 },+ { 4,-5086 }, { 5,-5086 }, { 6,-5086 }, { 7,-5086 }, { 8,-5086 },+ { 9,-4828 }, { 10,-12170 }, { 11,-5086 }, { 12,-4828 }, { 13,-12170 },++ { 14,-5086 }, { 15,-5086 }, { 16,-5086 }, { 17,-5086 }, { 18,-5086 },+ { 19,-5086 }, { 20,-5086 }, { 21,-5086 }, { 22,-5086 }, { 23,-5086 },+ { 24,-5086 }, { 25,-5086 }, { 26,-5086 }, { 27,-5086 }, { 28,-5086 },+ { 29,-5086 }, { 30,-5086 }, { 31,-5086 }, { 32,-4828 }, { 33,-5086 },+ { 34,-5086 }, { 35,-5086 }, { 36,-5086 }, { 37,-5086 }, { 38,-5086 },+ { 39,-5086 }, { 40,-5086 }, { 41,-5086 }, { 42,-5086 }, { 43,-5086 },+ { 44,-5086 }, { 45, 0 }, { 46,-5086 }, { 47,-5086 }, { 48,-5086 },+ { 49,-5086 }, { 50,-5086 }, { 51,-5086 }, { 52,-5086 }, { 53,-5086 },+ { 54,-5086 }, { 55,-5086 }, { 56,-5086 }, { 57,-5086 }, { 58,-5086 },+ { 59,-5086 }, { 60,-5086 }, { 61,-5086 }, { 62,-5086 }, { 63,-5086 },++ { 64,-5086 }, { 65,-5086 }, { 66,-5086 }, { 67,-5086 }, { 68,-5086 },+ { 69,-5086 }, { 70,-5086 }, { 71,-5086 }, { 72,-5086 }, { 73,-5086 },+ { 74,-5086 }, { 75,-5086 }, { 76,-5086 }, { 77,-5086 }, { 78,-5086 },+ { 79,-5086 }, { 80,-5086 }, { 81,-5086 }, { 82,-5086 }, { 83,-5086 },+ { 84,-5086 }, { 85,-5086 }, { 86,-5086 }, { 87,-5086 }, { 88,-5086 },+ { 89,-5086 }, { 90,-5086 }, { 91,-5086 }, { 92,-5086 }, { 93,-5086 },+ { 94,-5086 }, { 95,-5086 }, { 96,-5086 }, { 97,-5086 }, { 98,-5086 },+ { 99,-5086 }, { 100,-5086 }, { 101,-5086 }, { 102,-5086 }, { 103,-5086 },+ { 104,-5086 }, { 105,-5086 }, { 106,-5086 }, { 107,-5086 }, { 108,-5086 },+ { 109,-5086 }, { 110,-5086 }, { 111,-5086 }, { 112,-5086 }, { 113,-5086 },++ { 114,-5086 }, { 115,-5086 }, { 116,-5086 }, { 117,-5086 }, { 118,-5086 },+ { 119,-5086 }, { 120,-5086 }, { 121,-5086 }, { 122,-5086 }, { 123,-5086 },+ { 124,-5086 }, { 125,-5086 }, { 126,-5086 }, { 127,-5086 }, { 128,-5086 },+ { 129,-5086 }, { 130,-5086 }, { 131,-5086 }, { 132,-5086 }, { 133,-5086 },+ { 134,-5086 }, { 135,-5086 }, { 136,-5086 }, { 137,-5086 }, { 138,-5086 },+ { 139,-5086 }, { 140,-5086 }, { 141,-5086 }, { 142,-5086 }, { 143,-5086 },+ { 144,-5086 }, { 145,-5086 }, { 146,-5086 }, { 147,-5086 }, { 148,-5086 },+ { 149,-5086 }, { 150,-5086 }, { 151,-5086 }, { 152,-5086 }, { 153,-5086 },+ { 154,-5086 }, { 155,-5086 }, { 156,-5086 }, { 157,-5086 }, { 158,-5086 },+ { 159,-5086 }, { 160,-5086 }, { 161,-5086 }, { 162,-5086 }, { 163,-5086 },++ { 164,-5086 }, { 165,-5086 }, { 166,-5086 }, { 167,-5086 }, { 168,-5086 },+ { 169,-5086 }, { 170,-5086 }, { 171,-5086 }, { 172,-5086 }, { 173,-5086 },+ { 174,-5086 }, { 175,-5086 }, { 176,-5086 }, { 177,-5086 }, { 178,-5086 },+ { 179,-5086 }, { 180,-5086 }, { 181,-5086 }, { 182,-5086 }, { 183,-5086 },+ { 184,-5086 }, { 185,-5086 }, { 186,-5086 }, { 187,-5086 }, { 188,-5086 },+ { 189,-5086 }, { 190,-5086 }, { 191,-5086 }, { 192,-5086 }, { 193,-5086 },+ { 194,-5086 }, { 195,-5086 }, { 196,-5086 }, { 197,-5086 }, { 198,-5086 },+ { 199,-5086 }, { 200,-5086 }, { 201,-5086 }, { 202,-5086 }, { 203,-5086 },+ { 204,-5086 }, { 205,-5086 }, { 206,-5086 }, { 207,-5086 }, { 208,-5086 },+ { 209,-5086 }, { 210,-5086 }, { 211,-5086 }, { 212,-5086 }, { 213,-5086 },++ { 214,-5086 }, { 215,-5086 }, { 216,-5086 }, { 217,-5086 }, { 218,-5086 },+ { 219,-5086 }, { 220,-5086 }, { 221,-5086 }, { 222,-5086 }, { 223,-5086 },+ { 224,-5086 }, { 225,-5086 }, { 226,-5086 }, { 227,-5086 }, { 228,-5086 },+ { 229,-5086 }, { 230,-5086 }, { 231,-5086 }, { 232,-5086 }, { 233,-5086 },+ { 234,-5086 }, { 235,-5086 }, { 236,-5086 }, { 237,-5086 }, { 238,-5086 },+ { 239,-5086 }, { 240,-5086 }, { 241,-5086 }, { 242,-5086 }, { 243,-5086 },+ { 244,-5086 }, { 245,-5086 }, { 246,-5086 }, { 247,-5086 }, { 248,-5086 },+ { 249,-5086 }, { 250,-5086 }, { 251,-5086 }, { 252,-5086 }, { 253,-5086 },+ { 254,-5086 }, { 255,-5086 }, { 256,-5086 }, { 0, 37 }, { 0,8106 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },++ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 37 }, { 0,8083 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 48,1263 }, { 49,1263 }, { 50,1263 },+ { 51,1263 }, { 52,1263 }, { 53,1263 }, { 54,1263 }, { 55,1263 },++ { 56,1263 }, { 57,1263 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65,1263 },+ { 66,1263 }, { 67,1263 }, { 68,1263 }, { 69,1263 }, { 70,1263 },+ { 48,-20508 }, { 49,-20508 }, { 50,-20508 }, { 51,-20508 }, { 52,-20508 },+ { 53,-20508 }, { 54,-20508 }, { 55,-20508 }, { 56,-20508 }, { 57,-20508 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 65,-20508 }, { 66,-20508 }, { 67,-20508 },+ { 68,-20508 }, { 69,-20508 }, { 70,-20508 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 97,1263 }, { 98,1263 }, { 99,1263 }, { 100,1263 },+ { 101,1263 }, { 102,1263 }, { 0, 0 }, { 0, 0 }, { 0, 0 },++ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 97,-20508 },+ { 98,-20508 }, { 99,-20508 }, { 100,-20508 }, { 101,-20508 }, { 102,-20508 },+ { 0, 9 }, { 0,7979 }, { 1,-4570 }, { 2,-4570 }, { 3,-4570 },+ { 4,-4570 }, { 5,-4570 }, { 6,-4570 }, { 7,-4570 }, { 8,-4570 },+ { 9,-4312 }, { 10,-4054 }, { 11,-4570 }, { 12,-4312 }, { 13,-4054 },+ { 14,-4570 }, { 15,-4570 }, { 16,-4570 }, { 17,-4570 }, { 18,-4570 },+ { 19,-4570 }, { 20,-4570 }, { 21,-4570 }, { 22,-4570 }, { 23,-4570 },+ { 24,-4570 }, { 25,-4570 }, { 26,-4570 }, { 27,-4570 }, { 28,-4570 },++ { 29,-4570 }, { 30,-4570 }, { 31,-4570 }, { 32,-4312 }, { 33,-4570 },+ { 34,-4570 }, { 35,-4570 }, { 36,-4570 }, { 37,-4570 }, { 38,-4570 },+ { 39,-4570 }, { 40,-4570 }, { 41,-4570 }, { 42,-4570 }, { 43,-4570 },+ { 44,-4570 }, { 45, 0 }, { 46,-4570 }, { 47,-4570 }, { 48,-4570 },+ { 49,-4570 }, { 50,-4570 }, { 51,-4570 }, { 52,-4570 }, { 53,-4570 },+ { 54,-4570 }, { 55,-4570 }, { 56,-4570 }, { 57,-4570 }, { 58,-4570 },+ { 59,-4570 }, { 60,-4570 }, { 61,-4570 }, { 62,-4570 }, { 63,-4570 },+ { 64,-4570 }, { 65,-4570 }, { 66,-4570 }, { 67,-4570 }, { 68,-4570 },+ { 69,-4570 }, { 70,-4570 }, { 71,-4570 }, { 72,-4570 }, { 73,-4570 },+ { 74,-4570 }, { 75,-4570 }, { 76,-4570 }, { 77,-4570 }, { 78,-4570 },++ { 79,-4570 }, { 80,-4570 }, { 81,-4570 }, { 82,-4570 }, { 83,-4570 },+ { 84,-4570 }, { 85,-4570 }, { 86,-4570 }, { 87,-4570 }, { 88,-4570 },+ { 89,-4570 }, { 90,-4570 }, { 91,-4570 }, { 92,-4570 }, { 93,-4570 },+ { 94,-4570 }, { 95,-4570 }, { 96,-4570 }, { 97,-4570 }, { 98,-4570 },+ { 99,-4570 }, { 100,-4570 }, { 101,-4570 }, { 102,-4570 }, { 103,-4570 },+ { 104,-4570 }, { 105,-4570 }, { 106,-4570 }, { 107,-4570 }, { 108,-4570 },+ { 109,-4570 }, { 110,-4570 }, { 111,-4570 }, { 112,-4570 }, { 113,-4570 },+ { 114,-4570 }, { 115,-4570 }, { 116,-4570 }, { 117,-4570 }, { 118,-4570 },+ { 119,-4570 }, { 120,-4570 }, { 121,-4570 }, { 122,-4570 }, { 123,-4570 },+ { 124,-4570 }, { 125,-4570 }, { 126,-4570 }, { 127,-4570 }, { 128,-4570 },++ { 129,-4570 }, { 130,-4570 }, { 131,-4570 }, { 132,-4570 }, { 133,-4570 },+ { 134,-4570 }, { 135,-4570 }, { 136,-4570 }, { 137,-4570 }, { 138,-4570 },+ { 139,-4570 }, { 140,-4570 }, { 141,-4570 }, { 142,-4570 }, { 143,-4570 },+ { 144,-4570 }, { 145,-4570 }, { 146,-4570 }, { 147,-4570 }, { 148,-4570 },+ { 149,-4570 }, { 150,-4570 }, { 151,-4570 }, { 152,-4570 }, { 153,-4570 },+ { 154,-4570 }, { 155,-4570 }, { 156,-4570 }, { 157,-4570 }, { 158,-4570 },+ { 159,-4570 }, { 160,-4570 }, { 161,-4570 }, { 162,-4570 }, { 163,-4570 },+ { 164,-4570 }, { 165,-4570 }, { 166,-4570 }, { 167,-4570 }, { 168,-4570 },+ { 169,-4570 }, { 170,-4570 }, { 171,-4570 }, { 172,-4570 }, { 173,-4570 },+ { 174,-4570 }, { 175,-4570 }, { 176,-4570 }, { 177,-4570 }, { 178,-4570 },++ { 179,-4570 }, { 180,-4570 }, { 181,-4570 }, { 182,-4570 }, { 183,-4570 },+ { 184,-4570 }, { 185,-4570 }, { 186,-4570 }, { 187,-4570 }, { 188,-4570 },+ { 189,-4570 }, { 190,-4570 }, { 191,-4570 }, { 192,-4570 }, { 193,-4570 },+ { 194,-4570 }, { 195,-4570 }, { 196,-4570 }, { 197,-4570 }, { 198,-4570 },+ { 199,-4570 }, { 200,-4570 }, { 201,-4570 }, { 202,-4570 }, { 203,-4570 },+ { 204,-4570 }, { 205,-4570 }, { 206,-4570 }, { 207,-4570 }, { 208,-4570 },+ { 209,-4570 }, { 210,-4570 }, { 211,-4570 }, { 212,-4570 }, { 213,-4570 },+ { 214,-4570 }, { 215,-4570 }, { 216,-4570 }, { 217,-4570 }, { 218,-4570 },+ { 219,-4570 }, { 220,-4570 }, { 221,-4570 }, { 222,-4570 }, { 223,-4570 },+ { 224,-4570 }, { 225,-4570 }, { 226,-4570 }, { 227,-4570 }, { 228,-4570 },++ { 229,-4570 }, { 230,-4570 }, { 231,-4570 }, { 232,-4570 }, { 233,-4570 },+ { 234,-4570 }, { 235,-4570 }, { 236,-4570 }, { 237,-4570 }, { 238,-4570 },+ { 239,-4570 }, { 240,-4570 }, { 241,-4570 }, { 242,-4570 }, { 243,-4570 },+ { 244,-4570 }, { 245,-4570 }, { 246,-4570 }, { 247,-4570 }, { 248,-4570 },+ { 249,-4570 }, { 250,-4570 }, { 251,-4570 }, { 252,-4570 }, { 253,-4570 },+ { 254,-4570 }, { 255,-4570 }, { 256,-4570 }, { 0, 16 }, { 0,7721 },+ { 1,-3749 }, { 2,-3749 }, { 3,-3749 }, { 4,-3749 }, { 5,-3749 },+ { 6,-3749 }, { 7,-3749 }, { 8,-3749 }, { 9,-3491 }, { 10,-3233 },+ { 11,-3749 }, { 12,-3491 }, { 13,-3233 }, { 14,-3749 }, { 15,-3749 },+ { 16,-3749 }, { 17,-3749 }, { 18,-3749 }, { 19,-3749 }, { 20,-3749 },++ { 21,-3749 }, { 22,-3749 }, { 23,-3749 }, { 24,-3749 }, { 25,-3749 },+ { 26,-3749 }, { 27,-3749 }, { 28,-3749 }, { 29,-3749 }, { 30,-3749 },+ { 31,-3749 }, { 32,-3491 }, { 33,-3749 }, { 34,-3749 }, { 35,-3749 },+ { 36,-3749 }, { 37,-3749 }, { 38,-3749 }, { 39,-3749 }, { 40,-3749 },+ { 41,-3749 }, { 42,-3749 }, { 43,-3749 }, { 44,-3749 }, { 45, 0 },+ { 46,-3749 }, { 47,-3749 }, { 48,-3749 }, { 49,-3749 }, { 50,-3749 },+ { 51,-3749 }, { 52,-3749 }, { 53,-3749 }, { 54,-3749 }, { 55,-3749 },+ { 56,-3749 }, { 57,-3749 }, { 58,-3749 }, { 59,-3749 }, { 60,-3749 },+ { 61,-3749 }, { 62,-3749 }, { 63,-3749 }, { 64,-3749 }, { 65,-3749 },+ { 66,-3749 }, { 67,-3749 }, { 68,-3749 }, { 69,-3749 }, { 70,-3749 },++ { 71,-3749 }, { 72,-3749 }, { 73,-3749 }, { 74,-3749 }, { 75,-3749 },+ { 76,-3749 }, { 77,-3749 }, { 78,-3749 }, { 79,-3749 }, { 80,-3749 },+ { 81,-3749 }, { 82,-3749 }, { 83,-3749 }, { 84,-3749 }, { 85,-3749 },+ { 86,-3749 }, { 87,-3749 }, { 88,-3749 }, { 89,-3749 }, { 90,-3749 },+ { 91,-3749 }, { 92,-3749 }, { 93,-3749 }, { 94,-3749 }, { 95,-3749 },+ { 96,-3749 }, { 97,-3749 }, { 98,-3749 }, { 99,-3749 }, { 100,-3749 },+ { 101,-3749 }, { 102,-3749 }, { 103,-3749 }, { 104,-3749 }, { 105,-3749 },+ { 106,-3749 }, { 107,-3749 }, { 108,-3749 }, { 109,-3749 }, { 110,-3749 },+ { 111,-3749 }, { 112,-3749 }, { 113,-3749 }, { 114,-3749 }, { 115,-3749 },+ { 116,-3749 }, { 117,-3749 }, { 118,-3749 }, { 119,-3749 }, { 120,-3749 },++ { 121,-3749 }, { 122,-3749 }, { 123,-3749 }, { 124,-3749 }, { 125,-3749 },+ { 126,-3749 }, { 127,-3749 }, { 128,-3749 }, { 129,-3749 }, { 130,-3749 },+ { 131,-3749 }, { 132,-3749 }, { 133,-3749 }, { 134,-3749 }, { 135,-3749 },+ { 136,-3749 }, { 137,-3749 }, { 138,-3749 }, { 139,-3749 }, { 140,-3749 },+ { 141,-3749 }, { 142,-3749 }, { 143,-3749 }, { 144,-3749 }, { 145,-3749 },+ { 146,-3749 }, { 147,-3749 }, { 148,-3749 }, { 149,-3749 }, { 150,-3749 },+ { 151,-3749 }, { 152,-3749 }, { 153,-3749 }, { 154,-3749 }, { 155,-3749 },+ { 156,-3749 }, { 157,-3749 }, { 158,-3749 }, { 159,-3749 }, { 160,-3749 },+ { 161,-3749 }, { 162,-3749 }, { 163,-3749 }, { 164,-3749 }, { 165,-3749 },+ { 166,-3749 }, { 167,-3749 }, { 168,-3749 }, { 169,-3749 }, { 170,-3749 },++ { 171,-3749 }, { 172,-3749 }, { 173,-3749 }, { 174,-3749 }, { 175,-3749 },+ { 176,-3749 }, { 177,-3749 }, { 178,-3749 }, { 179,-3749 }, { 180,-3749 },+ { 181,-3749 }, { 182,-3749 }, { 183,-3749 }, { 184,-3749 }, { 185,-3749 },+ { 186,-3749 }, { 187,-3749 }, { 188,-3749 }, { 189,-3749 }, { 190,-3749 },+ { 191,-3749 }, { 192,-3749 }, { 193,-3749 }, { 194,-3749 }, { 195,-3749 },+ { 196,-3749 }, { 197,-3749 }, { 198,-3749 }, { 199,-3749 }, { 200,-3749 },+ { 201,-3749 }, { 202,-3749 }, { 203,-3749 }, { 204,-3749 }, { 205,-3749 },+ { 206,-3749 }, { 207,-3749 }, { 208,-3749 }, { 209,-3749 }, { 210,-3749 },+ { 211,-3749 }, { 212,-3749 }, { 213,-3749 }, { 214,-3749 }, { 215,-3749 },+ { 216,-3749 }, { 217,-3749 }, { 218,-3749 }, { 219,-3749 }, { 220,-3749 },++ { 221,-3749 }, { 222,-3749 }, { 223,-3749 }, { 224,-3749 }, { 225,-3749 },+ { 226,-3749 }, { 227,-3749 }, { 228,-3749 }, { 229,-3749 }, { 230,-3749 },+ { 231,-3749 }, { 232,-3749 }, { 233,-3749 }, { 234,-3749 }, { 235,-3749 },+ { 236,-3749 }, { 237,-3749 }, { 238,-3749 }, { 239,-3749 }, { 240,-3749 },+ { 241,-3749 }, { 242,-3749 }, { 243,-3749 }, { 244,-3749 }, { 245,-3749 },+ { 246,-3749 }, { 247,-3749 }, { 248,-3749 }, { 249,-3749 }, { 250,-3749 },+ { 251,-3749 }, { 252,-3749 }, { 253,-3749 }, { 254,-3749 }, { 255,-3749 },+ { 256,-3749 }, { 0, 22 }, { 0,7463 }, { 1,-2928 }, { 2,-2928 },+ { 3,-2928 }, { 4,-2928 }, { 5,-2928 }, { 6,-2928 }, { 7,-2928 },+ { 8,-2928 }, { 9,-2670 }, { 10,-2412 }, { 11,-2928 }, { 12,-2670 },++ { 13,-2412 }, { 14,-2928 }, { 15,-2928 }, { 16,-2928 }, { 17,-2928 },+ { 18,-2928 }, { 19,-2928 }, { 20,-2928 }, { 21,-2928 }, { 22,-2928 },+ { 23,-2928 }, { 24,-2928 }, { 25,-2928 }, { 26,-2928 }, { 27,-2928 },+ { 28,-2928 }, { 29,-2928 }, { 30,-2928 }, { 31,-2928 }, { 32,-2670 },+ { 33,-2928 }, { 34,-2928 }, { 35,-2928 }, { 36,-2928 }, { 37,-2928 },+ { 38,-2928 }, { 39,-2928 }, { 40,-2928 }, { 41,-2928 }, { 42,-2928 },+ { 43,-2928 }, { 44,-2928 }, { 45, 0 }, { 46,-2928 }, { 47,-2928 },+ { 48,-2928 }, { 49,-2928 }, { 50,-2928 }, { 51,-2928 }, { 52,-2928 },+ { 53,-2928 }, { 54,-2928 }, { 55,-2928 }, { 56,-2928 }, { 57,-2928 },+ { 58,-2928 }, { 59,-2928 }, { 60,-2928 }, { 61,-2928 }, { 62,-2928 },++ { 63,-2928 }, { 64,-2928 }, { 65,-2928 }, { 66,-2928 }, { 67,-2928 },+ { 68,-2928 }, { 69,-2928 }, { 70,-2928 }, { 71,-2928 }, { 72,-2928 },+ { 73,-2928 }, { 74,-2928 }, { 75,-2928 }, { 76,-2928 }, { 77,-2928 },+ { 78,-2928 }, { 79,-2928 }, { 80,-2928 }, { 81,-2928 }, { 82,-2928 },+ { 83,-2928 }, { 84,-2928 }, { 85,-2928 }, { 86,-2928 }, { 87,-2928 },+ { 88,-2928 }, { 89,-2928 }, { 90,-2928 }, { 91,-2928 }, { 92,-2928 },+ { 93,-2928 }, { 94,-2928 }, { 95,-2928 }, { 96,-2928 }, { 97,-2928 },+ { 98,-2928 }, { 99,-2928 }, { 100,-2928 }, { 101,-2928 }, { 102,-2928 },+ { 103,-2928 }, { 104,-2928 }, { 105,-2928 }, { 106,-2928 }, { 107,-2928 },+ { 108,-2928 }, { 109,-2928 }, { 110,-2928 }, { 111,-2928 }, { 112,-2928 },++ { 113,-2928 }, { 114,-2928 }, { 115,-2928 }, { 116,-2928 }, { 117,-2928 },+ { 118,-2928 }, { 119,-2928 }, { 120,-2928 }, { 121,-2928 }, { 122,-2928 },+ { 123,-2928 }, { 124,-2928 }, { 125,-2928 }, { 126,-2928 }, { 127,-2928 },+ { 128,-2928 }, { 129,-2928 }, { 130,-2928 }, { 131,-2928 }, { 132,-2928 },+ { 133,-2928 }, { 134,-2928 }, { 135,-2928 }, { 136,-2928 }, { 137,-2928 },+ { 138,-2928 }, { 139,-2928 }, { 140,-2928 }, { 141,-2928 }, { 142,-2928 },+ { 143,-2928 }, { 144,-2928 }, { 145,-2928 }, { 146,-2928 }, { 147,-2928 },+ { 148,-2928 }, { 149,-2928 }, { 150,-2928 }, { 151,-2928 }, { 152,-2928 },+ { 153,-2928 }, { 154,-2928 }, { 155,-2928 }, { 156,-2928 }, { 157,-2928 },+ { 158,-2928 }, { 159,-2928 }, { 160,-2928 }, { 161,-2928 }, { 162,-2928 },++ { 163,-2928 }, { 164,-2928 }, { 165,-2928 }, { 166,-2928 }, { 167,-2928 },+ { 168,-2928 }, { 169,-2928 }, { 170,-2928 }, { 171,-2928 }, { 172,-2928 },+ { 173,-2928 }, { 174,-2928 }, { 175,-2928 }, { 176,-2928 }, { 177,-2928 },+ { 178,-2928 }, { 179,-2928 }, { 180,-2928 }, { 181,-2928 }, { 182,-2928 },+ { 183,-2928 }, { 184,-2928 }, { 185,-2928 }, { 186,-2928 }, { 187,-2928 },+ { 188,-2928 }, { 189,-2928 }, { 190,-2928 }, { 191,-2928 }, { 192,-2928 },+ { 193,-2928 }, { 194,-2928 }, { 195,-2928 }, { 196,-2928 }, { 197,-2928 },+ { 198,-2928 }, { 199,-2928 }, { 200,-2928 }, { 201,-2928 }, { 202,-2928 },+ { 203,-2928 }, { 204,-2928 }, { 205,-2928 }, { 206,-2928 }, { 207,-2928 },+ { 208,-2928 }, { 209,-2928 }, { 210,-2928 }, { 211,-2928 }, { 212,-2928 },++ { 213,-2928 }, { 214,-2928 }, { 215,-2928 }, { 216,-2928 }, { 217,-2928 },+ { 218,-2928 }, { 219,-2928 }, { 220,-2928 }, { 221,-2928 }, { 222,-2928 },+ { 223,-2928 }, { 224,-2928 }, { 225,-2928 }, { 226,-2928 }, { 227,-2928 },+ { 228,-2928 }, { 229,-2928 }, { 230,-2928 }, { 231,-2928 }, { 232,-2928 },+ { 233,-2928 }, { 234,-2928 }, { 235,-2928 }, { 236,-2928 }, { 237,-2928 },+ { 238,-2928 }, { 239,-2928 }, { 240,-2928 }, { 241,-2928 }, { 242,-2928 },+ { 243,-2928 }, { 244,-2928 }, { 245,-2928 }, { 246,-2928 }, { 247,-2928 },+ { 248,-2928 }, { 249,-2928 }, { 250,-2928 }, { 251,-2928 }, { 252,-2928 },+ { 253,-2928 }, { 254,-2928 }, { 255,-2928 }, { 256,-2928 }, { 0, 37 },+ { 0,7205 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },++ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 48, 385 }, { 49, 385 },+ { 50, 385 }, { 51, 385 }, { 52, 385 }, { 53, 385 }, { 54, 385 },++ { 55, 385 }, { 56, 385 }, { 57, 385 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 65, 385 }, { 66, 385 }, { 67, 385 }, { 68, 385 }, { 69, 385 },+ { 70, 385 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 97, 385 }, { 98, 385 }, { 99, 385 },+ { 100, 385 }, { 101, 385 }, { 102, 385 }, { 0, 24 }, { 0,7101 },++ { 1,-2084 }, { 2,-2084 }, { 3,-2084 }, { 4,-2084 }, { 5,-2084 },+ { 6,-2084 }, { 7,-2084 }, { 8,-2084 }, { 9,-1826 }, { 10,-1568 },+ { 11,-2084 }, { 12,-1826 }, { 13,-1568 }, { 14,-2084 }, { 15,-2084 },+ { 16,-2084 }, { 17,-2084 }, { 18,-2084 }, { 19,-2084 }, { 20,-2084 },+ { 21,-2084 }, { 22,-2084 }, { 23,-2084 }, { 24,-2084 }, { 25,-2084 },+ { 26,-2084 }, { 27,-2084 }, { 28,-2084 }, { 29,-2084 }, { 30,-2084 },+ { 31,-2084 }, { 32,-1826 }, { 33,-2084 }, { 34,-2084 }, { 35,-2084 },+ { 36,-2084 }, { 37,-2084 }, { 38,-2084 }, { 39,-2084 }, { 40,-2084 },+ { 41,-2084 }, { 42,-2084 }, { 43,-2084 }, { 44,-2084 }, { 45, 0 },+ { 46,-2084 }, { 47,-2084 }, { 48,-2084 }, { 49,-2084 }, { 50,-2084 },++ { 51,-2084 }, { 52,-2084 }, { 53,-2084 }, { 54,-2084 }, { 55,-2084 },+ { 56,-2084 }, { 57,-2084 }, { 58,-2084 }, { 59,-2084 }, { 60,-2084 },+ { 61,-2084 }, { 62,-2084 }, { 63,-2084 }, { 64,-2084 }, { 65,-2084 },+ { 66,-2084 }, { 67,-2084 }, { 68,-2084 }, { 69,-2084 }, { 70,-2084 },+ { 71,-2084 }, { 72,-2084 }, { 73,-2084 }, { 74,-2084 }, { 75,-2084 },+ { 76,-2084 }, { 77,-2084 }, { 78,-2084 }, { 79,-2084 }, { 80,-2084 },+ { 81,-2084 }, { 82,-2084 }, { 83,-2084 }, { 84,-2084 }, { 85,-2084 },+ { 86,-2084 }, { 87,-2084 }, { 88,-2084 }, { 89,-2084 }, { 90,-2084 },+ { 91,-2084 }, { 92,-2084 }, { 93,-2084 }, { 94,-2084 }, { 95,-2084 },+ { 96,-2084 }, { 97,-2084 }, { 98,-2084 }, { 99,-2084 }, { 100,-2084 },++ { 101,-2084 }, { 102,-2084 }, { 103,-2084 }, { 104,-2084 }, { 105,-2084 },+ { 106,-2084 }, { 107,-2084 }, { 108,-2084 }, { 109,-2084 }, { 110,-2084 },+ { 111,-2084 }, { 112,-2084 }, { 113,-2084 }, { 114,-2084 }, { 115,-2084 },+ { 116,-2084 }, { 117,-2084 }, { 118,-2084 }, { 119,-2084 }, { 120,-2084 },+ { 121,-2084 }, { 122,-2084 }, { 123,-2084 }, { 124,-2084 }, { 125,-2084 },+ { 126,-2084 }, { 127,-2084 }, { 128,-2084 }, { 129,-2084 }, { 130,-2084 },+ { 131,-2084 }, { 132,-2084 }, { 133,-2084 }, { 134,-2084 }, { 135,-2084 },+ { 136,-2084 }, { 137,-2084 }, { 138,-2084 }, { 139,-2084 }, { 140,-2084 },+ { 141,-2084 }, { 142,-2084 }, { 143,-2084 }, { 144,-2084 }, { 145,-2084 },+ { 146,-2084 }, { 147,-2084 }, { 148,-2084 }, { 149,-2084 }, { 150,-2084 },++ { 151,-2084 }, { 152,-2084 }, { 153,-2084 }, { 154,-2084 }, { 155,-2084 },+ { 156,-2084 }, { 157,-2084 }, { 158,-2084 }, { 159,-2084 }, { 160,-2084 },+ { 161,-2084 }, { 162,-2084 }, { 163,-2084 }, { 164,-2084 }, { 165,-2084 },+ { 166,-2084 }, { 167,-2084 }, { 168,-2084 }, { 169,-2084 }, { 170,-2084 },+ { 171,-2084 }, { 172,-2084 }, { 173,-2084 }, { 174,-2084 }, { 175,-2084 },+ { 176,-2084 }, { 177,-2084 }, { 178,-2084 }, { 179,-2084 }, { 180,-2084 },+ { 181,-2084 }, { 182,-2084 }, { 183,-2084 }, { 184,-2084 }, { 185,-2084 },+ { 186,-2084 }, { 187,-2084 }, { 188,-2084 }, { 189,-2084 }, { 190,-2084 },+ { 191,-2084 }, { 192,-2084 }, { 193,-2084 }, { 194,-2084 }, { 195,-2084 },+ { 196,-2084 }, { 197,-2084 }, { 198,-2084 }, { 199,-2084 }, { 200,-2084 },++ { 201,-2084 }, { 202,-2084 }, { 203,-2084 }, { 204,-2084 }, { 205,-2084 },+ { 206,-2084 }, { 207,-2084 }, { 208,-2084 }, { 209,-2084 }, { 210,-2084 },+ { 211,-2084 }, { 212,-2084 }, { 213,-2084 }, { 214,-2084 }, { 215,-2084 },+ { 216,-2084 }, { 217,-2084 }, { 218,-2084 }, { 219,-2084 }, { 220,-2084 },+ { 221,-2084 }, { 222,-2084 }, { 223,-2084 }, { 224,-2084 }, { 225,-2084 },+ { 226,-2084 }, { 227,-2084 }, { 228,-2084 }, { 229,-2084 }, { 230,-2084 },+ { 231,-2084 }, { 232,-2084 }, { 233,-2084 }, { 234,-2084 }, { 235,-2084 },+ { 236,-2084 }, { 237,-2084 }, { 238,-2084 }, { 239,-2084 }, { 240,-2084 },+ { 241,-2084 }, { 242,-2084 }, { 243,-2084 }, { 244,-2084 }, { 245,-2084 },+ { 246,-2084 }, { 247,-2084 }, { 248,-2084 }, { 249,-2084 }, { 250,-2084 },++ { 251,-2084 }, { 252,-2084 }, { 253,-2084 }, { 254,-2084 }, { 255,-2084 },+ { 256,-2084 }, { 0, 37 }, { 0,6843 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 37 },+ { 0,6820 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },++ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 48, 136 }, { 49, 136 }, { 50, 136 }, { 51, 136 }, { 52, 136 },+ { 53, 136 }, { 54, 136 }, { 55, 136 }, { 56, 136 }, { 57, 136 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 65, 136 }, { 66, 136 }, { 67, 136 },+ { 68, 136 }, { 69, 136 }, { 70, 136 }, { 48, 137 }, { 49, 137 },+ { 50, 137 }, { 51, 137 }, { 52, 137 }, { 53, 137 }, { 54, 137 },+ { 55, 137 }, { 56, 137 }, { 57, 137 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 65, 137 }, { 66, 137 }, { 67, 137 }, { 68, 137 }, { 69, 137 },++ { 70, 137 }, { 0, 55 }, { 0,6748 }, { 0, 0 }, { 97, 136 },+ { 98, 136 }, { 99, 136 }, { 100, 136 }, { 101, 136 }, { 102, 136 },+ { 0, 0 }, { 9, 137 }, { 10, 137 }, { 0, 0 }, { 12, 137 },+ { 13, 137 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 28 }, { 0,6724 }, { 97, 137 }, { 98, 137 }, { 99, 137 },+ { 100, 137 }, { 101, 137 }, { 102, 137 }, { 0, 0 }, { 32, 137 },+ { 9, 418 }, { 10, 418 }, { 0, 0 }, { 12, 418 }, { 13, 418 },+ { 0, 0 }, { 39, 184 }, { 0, 37 }, { 0,6707 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 45,-21611 }, { 0, 0 }, { 0, 0 },++ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 32, 418 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 39, 465 }, { 0, 37 }, { 0,6683 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 45,-21624 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 48, 706 }, { 49, 706 }, { 50, 706 }, { 51, 706 },+ { 52, 706 }, { 53, 706 }, { 54, 706 }, { 55, 706 }, { 56, 706 },++ { 57, 706 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65, 706 }, { 66, 706 },+ { 67, 706 }, { 68, 706 }, { 69, 706 }, { 70, 706 }, { 0, 0 },+ { 48, 705 }, { 49, 705 }, { 50, 705 }, { 51, 705 }, { 52, 705 },+ { 53, 705 }, { 54, 705 }, { 55, 705 }, { 56, 705 }, { 57, 705 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 65, 705 }, { 66, 705 }, { 67, 705 },+ { 68, 705 }, { 69, 705 }, { 70, 705 }, { 0, 55 }, { 0,6611 },+ { 97, 706 }, { 98, 706 }, { 99, 706 }, { 100, 706 }, { 101, 706 },+ { 102, 706 }, { 0, 0 }, { 0, 0 }, { 9, 0 }, { 10, 0 },++ { 0, 0 }, { 12, 0 }, { 13, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 97, 705 },+ { 98, 705 }, { 99, 705 }, { 100, 705 }, { 101, 705 }, { 102, 705 },+ { 0, 0 }, { 32, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 39, 47 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 45,-21748 },+ { 0, 55 }, { 0,6564 }, { 1,-21777 }, { 2,-21777 }, { 3,-21777 },+ { 4,-21777 }, { 5,-21777 }, { 6,-21777 }, { 7,-21777 }, { 8,-21777 },+ { 9,-21777 }, { 10,-21777 }, { 11,-21777 }, { 12,-21777 }, { 13,-21777 },++ { 14,-21777 }, { 15,-21777 }, { 16,-21777 }, { 17,-21777 }, { 18,-21777 },+ { 19,-21777 }, { 20,-21777 }, { 21,-21777 }, { 22,-21777 }, { 23,-21777 },+ { 24,-21777 }, { 25,-21777 }, { 26,-21777 }, { 27,-21777 }, { 28,-21777 },+ { 29,-21777 }, { 30,-21777 }, { 31,-21777 }, { 32,-21777 }, { 33,-21777 },+ { 34,-21777 }, { 35,-21777 }, { 36,-21777 }, { 37,-21777 }, { 38,-21777 },+ { 0, 0 }, { 40,-21777 }, { 41,-21777 }, { 42,-21777 }, { 43,-21777 },+ { 44,-21777 }, { 45,-21777 }, { 46,-21777 }, { 47,-21777 }, { 48,-21777 },+ { 49,-21777 }, { 50,-21777 }, { 51,-21777 }, { 52,-21777 }, { 53,-21777 },+ { 54,-21777 }, { 55,-21777 }, { 56,-21777 }, { 57,-21777 }, { 58,-21777 },+ { 59,-21777 }, { 60,-21777 }, { 61,-21777 }, { 62,-21777 }, { 63,-21777 },++ { 64,-21777 }, { 65,-21777 }, { 66,-21777 }, { 67,-21777 }, { 68,-21777 },+ { 69,-21777 }, { 70,-21777 }, { 71,-21777 }, { 72,-21777 }, { 73,-21777 },+ { 74,-21777 }, { 75,-21777 }, { 76,-21777 }, { 77,-21777 }, { 78,-21777 },+ { 79,-21777 }, { 80,-21777 }, { 81,-21777 }, { 82,-21777 }, { 83,-21777 },+ { 84,-21777 }, { 85,-21777 }, { 86,-21777 }, { 87,-21777 }, { 88,-21777 },+ { 89,-21777 }, { 90,-21777 }, { 91,-21777 }, { 92,-21777 }, { 93,-21777 },+ { 94,-21777 }, { 95,-21777 }, { 96,-21777 }, { 97,-21777 }, { 98,-21777 },+ { 99,-21777 }, { 100,-21777 }, { 101,-21777 }, { 102,-21777 }, { 103,-21777 },+ { 104,-21777 }, { 105,-21777 }, { 106,-21777 }, { 107,-21777 }, { 108,-21777 },+ { 109,-21777 }, { 110,-21777 }, { 111,-21777 }, { 112,-21777 }, { 113,-21777 },++ { 114,-21777 }, { 115,-21777 }, { 116,-21777 }, { 117,-21777 }, { 118,-21777 },+ { 119,-21777 }, { 120,-21777 }, { 121,-21777 }, { 122,-21777 }, { 123,-21777 },+ { 124,-21777 }, { 125,-21777 }, { 126,-21777 }, { 127,-21777 }, { 128,-21777 },+ { 129,-21777 }, { 130,-21777 }, { 131,-21777 }, { 132,-21777 }, { 133,-21777 },+ { 134,-21777 }, { 135,-21777 }, { 136,-21777 }, { 137,-21777 }, { 138,-21777 },+ { 139,-21777 }, { 140,-21777 }, { 141,-21777 }, { 142,-21777 }, { 143,-21777 },+ { 144,-21777 }, { 145,-21777 }, { 146,-21777 }, { 147,-21777 }, { 148,-21777 },+ { 149,-21777 }, { 150,-21777 }, { 151,-21777 }, { 152,-21777 }, { 153,-21777 },+ { 154,-21777 }, { 155,-21777 }, { 156,-21777 }, { 157,-21777 }, { 158,-21777 },+ { 159,-21777 }, { 160,-21777 }, { 161,-21777 }, { 162,-21777 }, { 163,-21777 },++ { 164,-21777 }, { 165,-21777 }, { 166,-21777 }, { 167,-21777 }, { 168,-21777 },+ { 169,-21777 }, { 170,-21777 }, { 171,-21777 }, { 172,-21777 }, { 173,-21777 },+ { 174,-21777 }, { 175,-21777 }, { 176,-21777 }, { 177,-21777 }, { 178,-21777 },+ { 179,-21777 }, { 180,-21777 }, { 181,-21777 }, { 182,-21777 }, { 183,-21777 },+ { 184,-21777 }, { 185,-21777 }, { 186,-21777 }, { 187,-21777 }, { 188,-21777 },+ { 189,-21777 }, { 190,-21777 }, { 191,-21777 }, { 192,-21777 }, { 193,-21777 },+ { 194,-21777 }, { 195,-21777 }, { 196,-21777 }, { 197,-21777 }, { 198,-21777 },+ { 199,-21777 }, { 200,-21777 }, { 201,-21777 }, { 202,-21777 }, { 203,-21777 },+ { 204,-21777 }, { 205,-21777 }, { 206,-21777 }, { 207,-21777 }, { 208,-21777 },+ { 209,-21777 }, { 210,-21777 }, { 211,-21777 }, { 212,-21777 }, { 213,-21777 },++ { 214,-21777 }, { 215,-21777 }, { 216,-21777 }, { 217,-21777 }, { 218,-21777 },+ { 219,-21777 }, { 220,-21777 }, { 221,-21777 }, { 222,-21777 }, { 223,-21777 },+ { 224,-21777 }, { 225,-21777 }, { 226,-21777 }, { 227,-21777 }, { 228,-21777 },+ { 229,-21777 }, { 230,-21777 }, { 231,-21777 }, { 232,-21777 }, { 233,-21777 },+ { 234,-21777 }, { 235,-21777 }, { 236,-21777 }, { 237,-21777 }, { 238,-21777 },+ { 239,-21777 }, { 240,-21777 }, { 241,-21777 }, { 242,-21777 }, { 243,-21777 },+ { 244,-21777 }, { 245,-21777 }, { 246,-21777 }, { 247,-21777 }, { 248,-21777 },+ { 249,-21777 }, { 250,-21777 }, { 251,-21777 }, { 252,-21777 }, { 253,-21777 },+ { 254,-21777 }, { 255,-21777 }, { 256,-21777 }, { 0, 28 }, { 0,6306 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },++ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 9, 0 }, { 10, 0 },+ { 0, 0 }, { 12, 0 }, { 13, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 32, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 39, 47 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 45,-22042 },+ { 0, 28 }, { 0,6259 }, { 1,-22080 }, { 2,-22080 }, { 3,-22080 },+ { 4,-22080 }, { 5,-22080 }, { 6,-22080 }, { 7,-22080 }, { 8,-22080 },++ { 9,-22080 }, { 10,-22080 }, { 11,-22080 }, { 12,-22080 }, { 13,-22080 },+ { 14,-22080 }, { 15,-22080 }, { 16,-22080 }, { 17,-22080 }, { 18,-22080 },+ { 19,-22080 }, { 20,-22080 }, { 21,-22080 }, { 22,-22080 }, { 23,-22080 },+ { 24,-22080 }, { 25,-22080 }, { 26,-22080 }, { 27,-22080 }, { 28,-22080 },+ { 29,-22080 }, { 30,-22080 }, { 31,-22080 }, { 32,-22080 }, { 33,-22080 },+ { 34,-22080 }, { 35,-22080 }, { 36,-22080 }, { 37,-22080 }, { 38,-22080 },+ { 0, 0 }, { 40,-22080 }, { 41,-22080 }, { 42,-22080 }, { 43,-22080 },+ { 44,-22080 }, { 45,-22080 }, { 46,-22080 }, { 47,-22080 }, { 48,-22080 },+ { 49,-22080 }, { 50,-22080 }, { 51,-22080 }, { 52,-22080 }, { 53,-22080 },+ { 54,-22080 }, { 55,-22080 }, { 56,-22080 }, { 57,-22080 }, { 58,-22080 },++ { 59,-22080 }, { 60,-22080 }, { 61,-22080 }, { 62,-22080 }, { 63,-22080 },+ { 64,-22080 }, { 65,-22080 }, { 66,-22080 }, { 67,-22080 }, { 68,-22080 },+ { 69,-22080 }, { 70,-22080 }, { 71,-22080 }, { 72,-22080 }, { 73,-22080 },+ { 74,-22080 }, { 75,-22080 }, { 76,-22080 }, { 77,-22080 }, { 78,-22080 },+ { 79,-22080 }, { 80,-22080 }, { 81,-22080 }, { 82,-22080 }, { 83,-22080 },+ { 84,-22080 }, { 85,-22080 }, { 86,-22080 }, { 87,-22080 }, { 88,-22080 },+ { 89,-22080 }, { 90,-22080 }, { 91,-22080 }, { 92,-22080 }, { 93,-22080 },+ { 94,-22080 }, { 95,-22080 }, { 96,-22080 }, { 97,-22080 }, { 98,-22080 },+ { 99,-22080 }, { 100,-22080 }, { 101,-22080 }, { 102,-22080 }, { 103,-22080 },+ { 104,-22080 }, { 105,-22080 }, { 106,-22080 }, { 107,-22080 }, { 108,-22080 },++ { 109,-22080 }, { 110,-22080 }, { 111,-22080 }, { 112,-22080 }, { 113,-22080 },+ { 114,-22080 }, { 115,-22080 }, { 116,-22080 }, { 117,-22080 }, { 118,-22080 },+ { 119,-22080 }, { 120,-22080 }, { 121,-22080 }, { 122,-22080 }, { 123,-22080 },+ { 124,-22080 }, { 125,-22080 }, { 126,-22080 }, { 127,-22080 }, { 128,-22080 },+ { 129,-22080 }, { 130,-22080 }, { 131,-22080 }, { 132,-22080 }, { 133,-22080 },+ { 134,-22080 }, { 135,-22080 }, { 136,-22080 }, { 137,-22080 }, { 138,-22080 },+ { 139,-22080 }, { 140,-22080 }, { 141,-22080 }, { 142,-22080 }, { 143,-22080 },+ { 144,-22080 }, { 145,-22080 }, { 146,-22080 }, { 147,-22080 }, { 148,-22080 },+ { 149,-22080 }, { 150,-22080 }, { 151,-22080 }, { 152,-22080 }, { 153,-22080 },+ { 154,-22080 }, { 155,-22080 }, { 156,-22080 }, { 157,-22080 }, { 158,-22080 },++ { 159,-22080 }, { 160,-22080 }, { 161,-22080 }, { 162,-22080 }, { 163,-22080 },+ { 164,-22080 }, { 165,-22080 }, { 166,-22080 }, { 167,-22080 }, { 168,-22080 },+ { 169,-22080 }, { 170,-22080 }, { 171,-22080 }, { 172,-22080 }, { 173,-22080 },+ { 174,-22080 }, { 175,-22080 }, { 176,-22080 }, { 177,-22080 }, { 178,-22080 },+ { 179,-22080 }, { 180,-22080 }, { 181,-22080 }, { 182,-22080 }, { 183,-22080 },+ { 184,-22080 }, { 185,-22080 }, { 186,-22080 }, { 187,-22080 }, { 188,-22080 },+ { 189,-22080 }, { 190,-22080 }, { 191,-22080 }, { 192,-22080 }, { 193,-22080 },+ { 194,-22080 }, { 195,-22080 }, { 196,-22080 }, { 197,-22080 }, { 198,-22080 },+ { 199,-22080 }, { 200,-22080 }, { 201,-22080 }, { 202,-22080 }, { 203,-22080 },+ { 204,-22080 }, { 205,-22080 }, { 206,-22080 }, { 207,-22080 }, { 208,-22080 },++ { 209,-22080 }, { 210,-22080 }, { 211,-22080 }, { 212,-22080 }, { 213,-22080 },+ { 214,-22080 }, { 215,-22080 }, { 216,-22080 }, { 217,-22080 }, { 218,-22080 },+ { 219,-22080 }, { 220,-22080 }, { 221,-22080 }, { 222,-22080 }, { 223,-22080 },+ { 224,-22080 }, { 225,-22080 }, { 226,-22080 }, { 227,-22080 }, { 228,-22080 },+ { 229,-22080 }, { 230,-22080 }, { 231,-22080 }, { 232,-22080 }, { 233,-22080 },+ { 234,-22080 }, { 235,-22080 }, { 236,-22080 }, { 237,-22080 }, { 238,-22080 },+ { 239,-22080 }, { 240,-22080 }, { 241,-22080 }, { 242,-22080 }, { 243,-22080 },+ { 244,-22080 }, { 245,-22080 }, { 246,-22080 }, { 247,-22080 }, { 248,-22080 },+ { 249,-22080 }, { 250,-22080 }, { 251,-22080 }, { 252,-22080 }, { 253,-22080 },+ { 254,-22080 }, { 255,-22080 }, { 256,-22080 }, { 0, 37 }, { 0,6001 },++ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 37 }, { 0,5978 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 48, 643 }, { 49, 643 }, { 50, 643 },++ { 51, 643 }, { 52, 643 }, { 53, 643 }, { 54, 643 }, { 55, 643 },+ { 56, 643 }, { 57, 643 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 65, 643 },+ { 66, 643 }, { 67, 643 }, { 68, 643 }, { 69, 643 }, { 70, 643 },+ { 48,-22625 }, { 49,-22625 }, { 50,-22625 }, { 51,-22625 }, { 52,-22625 },+ { 53,-22625 }, { 54,-22625 }, { 55,-22625 }, { 56,-22625 }, { 57,-22625 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 65,-22625 }, { 66,-22625 }, { 67,-22625 },+ { 68,-22625 }, { 69,-22625 }, { 70,-22625 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 97, 643 }, { 98, 643 }, { 99, 643 }, { 100, 643 },++ { 101, 643 }, { 102, 643 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 97,-22625 },+ { 98,-22625 }, { 99,-22625 }, { 100,-22625 }, { 101,-22625 }, { 102,-22625 },+ { 0, 55 }, { 0,5874 }, { 1, 620 }, { 2, 620 }, { 3, 620 },+ { 4, 620 }, { 5, 620 }, { 6, 620 }, { 7, 620 }, { 8, 620 },+ { 9, 878 }, { 10,-737 }, { 11, 620 }, { 12, 878 }, { 13,-737 },+ { 14, 620 }, { 15, 620 }, { 16, 620 }, { 17, 620 }, { 18, 620 },+ { 19, 620 }, { 20, 620 }, { 21, 620 }, { 22, 620 }, { 23, 620 },++ { 24, 620 }, { 25, 620 }, { 26, 620 }, { 27, 620 }, { 28, 620 },+ { 29, 620 }, { 30, 620 }, { 31, 620 }, { 32, 878 }, { 33, 620 },+ { 34, 620 }, { 35, 620 }, { 36, 620 }, { 37, 620 }, { 38, 620 },+ { 39,1136 }, { 40, 620 }, { 41, 620 }, { 42, 620 }, { 43, 620 },+ { 44, 620 }, { 45,1394 }, { 46, 620 }, { 47, 620 }, { 48, 620 },+ { 49, 620 }, { 50, 620 }, { 51, 620 }, { 52, 620 }, { 53, 620 },+ { 54, 620 }, { 55, 620 }, { 56, 620 }, { 57, 620 }, { 58, 620 },+ { 59, 620 }, { 60, 620 }, { 61, 620 }, { 62, 620 }, { 63, 620 },+ { 64, 620 }, { 65, 620 }, { 66, 620 }, { 67, 620 }, { 68, 620 },+ { 69, 620 }, { 70, 620 }, { 71, 620 }, { 72, 620 }, { 73, 620 },++ { 74, 620 }, { 75, 620 }, { 76, 620 }, { 77, 620 }, { 78, 620 },+ { 79, 620 }, { 80, 620 }, { 81, 620 }, { 82, 620 }, { 83, 620 },+ { 84, 620 }, { 85, 620 }, { 86, 620 }, { 87, 620 }, { 88, 620 },+ { 89, 620 }, { 90, 620 }, { 91, 620 }, { 92, 620 }, { 93, 620 },+ { 94, 620 }, { 95, 620 }, { 96, 620 }, { 97, 620 }, { 98, 620 },+ { 99, 620 }, { 100, 620 }, { 101, 620 }, { 102, 620 }, { 103, 620 },+ { 104, 620 }, { 105, 620 }, { 106, 620 }, { 107, 620 }, { 108, 620 },+ { 109, 620 }, { 110, 620 }, { 111, 620 }, { 112, 620 }, { 113, 620 },+ { 114, 620 }, { 115, 620 }, { 116, 620 }, { 117, 620 }, { 118, 620 },+ { 119, 620 }, { 120, 620 }, { 121, 620 }, { 122, 620 }, { 123, 620 },++ { 124, 620 }, { 125, 620 }, { 126, 620 }, { 127, 620 }, { 128, 620 },+ { 129, 620 }, { 130, 620 }, { 131, 620 }, { 132, 620 }, { 133, 620 },+ { 134, 620 }, { 135, 620 }, { 136, 620 }, { 137, 620 }, { 138, 620 },+ { 139, 620 }, { 140, 620 }, { 141, 620 }, { 142, 620 }, { 143, 620 },+ { 144, 620 }, { 145, 620 }, { 146, 620 }, { 147, 620 }, { 148, 620 },+ { 149, 620 }, { 150, 620 }, { 151, 620 }, { 152, 620 }, { 153, 620 },+ { 154, 620 }, { 155, 620 }, { 156, 620 }, { 157, 620 }, { 158, 620 },+ { 159, 620 }, { 160, 620 }, { 161, 620 }, { 162, 620 }, { 163, 620 },+ { 164, 620 }, { 165, 620 }, { 166, 620 }, { 167, 620 }, { 168, 620 },+ { 169, 620 }, { 170, 620 }, { 171, 620 }, { 172, 620 }, { 173, 620 },++ { 174, 620 }, { 175, 620 }, { 176, 620 }, { 177, 620 }, { 178, 620 },+ { 179, 620 }, { 180, 620 }, { 181, 620 }, { 182, 620 }, { 183, 620 },+ { 184, 620 }, { 185, 620 }, { 186, 620 }, { 187, 620 }, { 188, 620 },+ { 189, 620 }, { 190, 620 }, { 191, 620 }, { 192, 620 }, { 193, 620 },+ { 194, 620 }, { 195, 620 }, { 196, 620 }, { 197, 620 }, { 198, 620 },+ { 199, 620 }, { 200, 620 }, { 201, 620 }, { 202, 620 }, { 203, 620 },+ { 204, 620 }, { 205, 620 }, { 206, 620 }, { 207, 620 }, { 208, 620 },+ { 209, 620 }, { 210, 620 }, { 211, 620 }, { 212, 620 }, { 213, 620 },+ { 214, 620 }, { 215, 620 }, { 216, 620 }, { 217, 620 }, { 218, 620 },+ { 219, 620 }, { 220, 620 }, { 221, 620 }, { 222, 620 }, { 223, 620 },++ { 224, 620 }, { 225, 620 }, { 226, 620 }, { 227, 620 }, { 228, 620 },+ { 229, 620 }, { 230, 620 }, { 231, 620 }, { 232, 620 }, { 233, 620 },+ { 234, 620 }, { 235, 620 }, { 236, 620 }, { 237, 620 }, { 238, 620 },+ { 239, 620 }, { 240, 620 }, { 241, 620 }, { 242, 620 }, { 243, 620 },+ { 244, 620 }, { 245, 620 }, { 246, 620 }, { 247, 620 }, { 248, 620 },+ { 249, 620 }, { 250, 620 }, { 251, 620 }, { 252, 620 }, { 253, 620 },+ { 254, 620 }, { 255, 620 }, { 256, 620 }, { 0, 28 }, { 0,5616 },+ { 1,1394 }, { 2,1394 }, { 3,1394 }, { 4,1394 }, { 5,1394 },+ { 6,1394 }, { 7,1394 }, { 8,1394 }, { 9,1652 }, { 10,-690 },+ { 11,1394 }, { 12,1652 }, { 13,-690 }, { 14,1394 }, { 15,1394 },++ { 16,1394 }, { 17,1394 }, { 18,1394 }, { 19,1394 }, { 20,1394 },+ { 21,1394 }, { 22,1394 }, { 23,1394 }, { 24,1394 }, { 25,1394 },+ { 26,1394 }, { 27,1394 }, { 28,1394 }, { 29,1394 }, { 30,1394 },+ { 31,1394 }, { 32,1652 }, { 33,1394 }, { 34,1394 }, { 35,1394 },+ { 36,1394 }, { 37,1394 }, { 38,1394 }, { 39,1910 }, { 40,1394 },+ { 41,1394 }, { 42,1394 }, { 43,1394 }, { 44,1394 }, { 45,2168 },+ { 46,1394 }, { 47,1394 }, { 48,1394 }, { 49,1394 }, { 50,1394 },+ { 51,1394 }, { 52,1394 }, { 53,1394 }, { 54,1394 }, { 55,1394 },+ { 56,1394 }, { 57,1394 }, { 58,1394 }, { 59,1394 }, { 60,1394 },+ { 61,1394 }, { 62,1394 }, { 63,1394 }, { 64,1394 }, { 65,1394 },++ { 66,1394 }, { 67,1394 }, { 68,1394 }, { 69,1394 }, { 70,1394 },+ { 71,1394 }, { 72,1394 }, { 73,1394 }, { 74,1394 }, { 75,1394 },+ { 76,1394 }, { 77,1394 }, { 78,1394 }, { 79,1394 }, { 80,1394 },+ { 81,1394 }, { 82,1394 }, { 83,1394 }, { 84,1394 }, { 85,1394 },+ { 86,1394 }, { 87,1394 }, { 88,1394 }, { 89,1394 }, { 90,1394 },+ { 91,1394 }, { 92,1394 }, { 93,1394 }, { 94,1394 }, { 95,1394 },+ { 96,1394 }, { 97,1394 }, { 98,1394 }, { 99,1394 }, { 100,1394 },+ { 101,1394 }, { 102,1394 }, { 103,1394 }, { 104,1394 }, { 105,1394 },+ { 106,1394 }, { 107,1394 }, { 108,1394 }, { 109,1394 }, { 110,1394 },+ { 111,1394 }, { 112,1394 }, { 113,1394 }, { 114,1394 }, { 115,1394 },++ { 116,1394 }, { 117,1394 }, { 118,1394 }, { 119,1394 }, { 120,1394 },+ { 121,1394 }, { 122,1394 }, { 123,1394 }, { 124,1394 }, { 125,1394 },+ { 126,1394 }, { 127,1394 }, { 128,1394 }, { 129,1394 }, { 130,1394 },+ { 131,1394 }, { 132,1394 }, { 133,1394 }, { 134,1394 }, { 135,1394 },+ { 136,1394 }, { 137,1394 }, { 138,1394 }, { 139,1394 }, { 140,1394 },+ { 141,1394 }, { 142,1394 }, { 143,1394 }, { 144,1394 }, { 145,1394 },+ { 146,1394 }, { 147,1394 }, { 148,1394 }, { 149,1394 }, { 150,1394 },+ { 151,1394 }, { 152,1394 }, { 153,1394 }, { 154,1394 }, { 155,1394 },+ { 156,1394 }, { 157,1394 }, { 158,1394 }, { 159,1394 }, { 160,1394 },+ { 161,1394 }, { 162,1394 }, { 163,1394 }, { 164,1394 }, { 165,1394 },++ { 166,1394 }, { 167,1394 }, { 168,1394 }, { 169,1394 }, { 170,1394 },+ { 171,1394 }, { 172,1394 }, { 173,1394 }, { 174,1394 }, { 175,1394 },+ { 176,1394 }, { 177,1394 }, { 178,1394 }, { 179,1394 }, { 180,1394 },+ { 181,1394 }, { 182,1394 }, { 183,1394 }, { 184,1394 }, { 185,1394 },+ { 186,1394 }, { 187,1394 }, { 188,1394 }, { 189,1394 }, { 190,1394 },+ { 191,1394 }, { 192,1394 }, { 193,1394 }, { 194,1394 }, { 195,1394 },+ { 196,1394 }, { 197,1394 }, { 198,1394 }, { 199,1394 }, { 200,1394 },+ { 201,1394 }, { 202,1394 }, { 203,1394 }, { 204,1394 }, { 205,1394 },+ { 206,1394 }, { 207,1394 }, { 208,1394 }, { 209,1394 }, { 210,1394 },+ { 211,1394 }, { 212,1394 }, { 213,1394 }, { 214,1394 }, { 215,1394 },++ { 216,1394 }, { 217,1394 }, { 218,1394 }, { 219,1394 }, { 220,1394 },+ { 221,1394 }, { 222,1394 }, { 223,1394 }, { 224,1394 }, { 225,1394 },+ { 226,1394 }, { 227,1394 }, { 228,1394 }, { 229,1394 }, { 230,1394 },+ { 231,1394 }, { 232,1394 }, { 233,1394 }, { 234,1394 }, { 235,1394 },+ { 236,1394 }, { 237,1394 }, { 238,1394 }, { 239,1394 }, { 240,1394 },+ { 241,1394 }, { 242,1394 }, { 243,1394 }, { 244,1394 }, { 245,1394 },+ { 246,1394 }, { 247,1394 }, { 248,1394 }, { 249,1394 }, { 250,1394 },+ { 251,1394 }, { 252,1394 }, { 253,1394 }, { 254,1394 }, { 255,1394 },+ { 256,1394 }, { 0, 37 }, { 0,5358 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },++ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 48,-23233 }, { 49,-23233 }, { 50,-23233 }, { 51,-23233 }, { 52,-23233 },+ { 53,-23233 }, { 54,-23233 }, { 55,-23233 }, { 56,-23233 }, { 57,-23233 },++ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 65,-23233 }, { 66,-23233 }, { 67,-23233 },+ { 68,-23233 }, { 69,-23233 }, { 70,-23233 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 97,-23233 },+ { 98,-23233 }, { 99,-23233 }, { 100,-23233 }, { 101,-23233 }, { 102,-23233 },+ { 0, 55 }, { 0,5254 }, { 1, 0 }, { 2, 0 }, { 3, 0 },++ { 4, 0 }, { 5, 0 }, { 6, 0 }, { 7, 0 }, { 8, 0 },+ { 9, 258 }, { 10,-1357 }, { 11, 0 }, { 12, 258 }, { 13,-1357 },+ { 14, 0 }, { 15, 0 }, { 16, 0 }, { 17, 0 }, { 18, 0 },+ { 19, 0 }, { 20, 0 }, { 21, 0 }, { 22, 0 }, { 23, 0 },+ { 24, 0 }, { 25, 0 }, { 26, 0 }, { 27, 0 }, { 28, 0 },+ { 29, 0 }, { 30, 0 }, { 31, 0 }, { 32, 258 }, { 33, 0 },+ { 34, 0 }, { 35, 0 }, { 36, 0 }, { 37, 0 }, { 38, 0 },+ { 39, 516 }, { 40, 0 }, { 41, 0 }, { 42, 0 }, { 43, 0 },+ { 44, 0 }, { 45, 774 }, { 46, 0 }, { 47, 0 }, { 48, 0 },+ { 49, 0 }, { 50, 0 }, { 51, 0 }, { 52, 0 }, { 53, 0 },++ { 54, 0 }, { 55, 0 }, { 56, 0 }, { 57, 0 }, { 58, 0 },+ { 59, 0 }, { 60, 0 }, { 61, 0 }, { 62, 0 }, { 63, 0 },+ { 64, 0 }, { 65, 0 }, { 66, 0 }, { 67, 0 }, { 68, 0 },+ { 69, 0 }, { 70, 0 }, { 71, 0 }, { 72, 0 }, { 73, 0 },+ { 74, 0 }, { 75, 0 }, { 76, 0 }, { 77, 0 }, { 78, 0 },+ { 79, 0 }, { 80, 0 }, { 81, 0 }, { 82, 0 }, { 83, 0 },+ { 84, 0 }, { 85, 0 }, { 86, 0 }, { 87, 0 }, { 88, 0 },+ { 89, 0 }, { 90, 0 }, { 91, 0 }, { 92, 0 }, { 93, 0 },+ { 94, 0 }, { 95, 0 }, { 96, 0 }, { 97, 0 }, { 98, 0 },+ { 99, 0 }, { 100, 0 }, { 101, 0 }, { 102, 0 }, { 103, 0 },++ { 104, 0 }, { 105, 0 }, { 106, 0 }, { 107, 0 }, { 108, 0 },+ { 109, 0 }, { 110, 0 }, { 111, 0 }, { 112, 0 }, { 113, 0 },+ { 114, 0 }, { 115, 0 }, { 116, 0 }, { 117, 0 }, { 118, 0 },+ { 119, 0 }, { 120, 0 }, { 121, 0 }, { 122, 0 }, { 123, 0 },+ { 124, 0 }, { 125, 0 }, { 126, 0 }, { 127, 0 }, { 128, 0 },+ { 129, 0 }, { 130, 0 }, { 131, 0 }, { 132, 0 }, { 133, 0 },+ { 134, 0 }, { 135, 0 }, { 136, 0 }, { 137, 0 }, { 138, 0 },+ { 139, 0 }, { 140, 0 }, { 141, 0 }, { 142, 0 }, { 143, 0 },+ { 144, 0 }, { 145, 0 }, { 146, 0 }, { 147, 0 }, { 148, 0 },+ { 149, 0 }, { 150, 0 }, { 151, 0 }, { 152, 0 }, { 153, 0 },++ { 154, 0 }, { 155, 0 }, { 156, 0 }, { 157, 0 }, { 158, 0 },+ { 159, 0 }, { 160, 0 }, { 161, 0 }, { 162, 0 }, { 163, 0 },+ { 164, 0 }, { 165, 0 }, { 166, 0 }, { 167, 0 }, { 168, 0 },+ { 169, 0 }, { 170, 0 }, { 171, 0 }, { 172, 0 }, { 173, 0 },+ { 174, 0 }, { 175, 0 }, { 176, 0 }, { 177, 0 }, { 178, 0 },+ { 179, 0 }, { 180, 0 }, { 181, 0 }, { 182, 0 }, { 183, 0 },+ { 184, 0 }, { 185, 0 }, { 186, 0 }, { 187, 0 }, { 188, 0 },+ { 189, 0 }, { 190, 0 }, { 191, 0 }, { 192, 0 }, { 193, 0 },+ { 194, 0 }, { 195, 0 }, { 196, 0 }, { 197, 0 }, { 198, 0 },+ { 199, 0 }, { 200, 0 }, { 201, 0 }, { 202, 0 }, { 203, 0 },++ { 204, 0 }, { 205, 0 }, { 206, 0 }, { 207, 0 }, { 208, 0 },+ { 209, 0 }, { 210, 0 }, { 211, 0 }, { 212, 0 }, { 213, 0 },+ { 214, 0 }, { 215, 0 }, { 216, 0 }, { 217, 0 }, { 218, 0 },+ { 219, 0 }, { 220, 0 }, { 221, 0 }, { 222, 0 }, { 223, 0 },+ { 224, 0 }, { 225, 0 }, { 226, 0 }, { 227, 0 }, { 228, 0 },+ { 229, 0 }, { 230, 0 }, { 231, 0 }, { 232, 0 }, { 233, 0 },+ { 234, 0 }, { 235, 0 }, { 236, 0 }, { 237, 0 }, { 238, 0 },+ { 239, 0 }, { 240, 0 }, { 241, 0 }, { 242, 0 }, { 243, 0 },+ { 244, 0 }, { 245, 0 }, { 246, 0 }, { 247, 0 }, { 248, 0 },+ { 249, 0 }, { 250, 0 }, { 251, 0 }, { 252, 0 }, { 253, 0 },++ { 254, 0 }, { 255, 0 }, { 256, 0 }, { 0, 55 }, { 0,4996 },+ { 1,-258 }, { 2,-258 }, { 3,-258 }, { 4,-258 }, { 5,-258 },+ { 6,-258 }, { 7,-258 }, { 8,-258 }, { 9, 0 }, { 10,-1615 },+ { 11,-258 }, { 12, 0 }, { 13,-1615 }, { 14,-258 }, { 15,-258 },+ { 16,-258 }, { 17,-258 }, { 18,-258 }, { 19,-258 }, { 20,-258 },+ { 21,-258 }, { 22,-258 }, { 23,-258 }, { 24,-258 }, { 25,-258 },+ { 26,-258 }, { 27,-258 }, { 28,-258 }, { 29,-258 }, { 30,-258 },+ { 31,-258 }, { 32, 0 }, { 33,-258 }, { 34,-258 }, { 35,-258 },+ { 36,-258 }, { 37,-258 }, { 38,-258 }, { 39, 258 }, { 40,-258 },+ { 41,-258 }, { 42,-258 }, { 43,-258 }, { 44,-258 }, { 45, 516 },++ { 46,-258 }, { 47,-258 }, { 48,-258 }, { 49,-258 }, { 50,-258 },+ { 51,-258 }, { 52,-258 }, { 53,-258 }, { 54,-258 }, { 55,-258 },+ { 56,-258 }, { 57,-258 }, { 58,-258 }, { 59,-258 }, { 60,-258 },+ { 61,-258 }, { 62,-258 }, { 63,-258 }, { 64,-258 }, { 65,-258 },+ { 66,-258 }, { 67,-258 }, { 68,-258 }, { 69,-258 }, { 70,-258 },+ { 71,-258 }, { 72,-258 }, { 73,-258 }, { 74,-258 }, { 75,-258 },+ { 76,-258 }, { 77,-258 }, { 78,-258 }, { 79,-258 }, { 80,-258 },+ { 81,-258 }, { 82,-258 }, { 83,-258 }, { 84,-258 }, { 85,-258 },+ { 86,-258 }, { 87,-258 }, { 88,-258 }, { 89,-258 }, { 90,-258 },+ { 91,-258 }, { 92,-258 }, { 93,-258 }, { 94,-258 }, { 95,-258 },++ { 96,-258 }, { 97,-258 }, { 98,-258 }, { 99,-258 }, { 100,-258 },+ { 101,-258 }, { 102,-258 }, { 103,-258 }, { 104,-258 }, { 105,-258 },+ { 106,-258 }, { 107,-258 }, { 108,-258 }, { 109,-258 }, { 110,-258 },+ { 111,-258 }, { 112,-258 }, { 113,-258 }, { 114,-258 }, { 115,-258 },+ { 116,-258 }, { 117,-258 }, { 118,-258 }, { 119,-258 }, { 120,-258 },+ { 121,-258 }, { 122,-258 }, { 123,-258 }, { 124,-258 }, { 125,-258 },+ { 126,-258 }, { 127,-258 }, { 128,-258 }, { 129,-258 }, { 130,-258 },+ { 131,-258 }, { 132,-258 }, { 133,-258 }, { 134,-258 }, { 135,-258 },+ { 136,-258 }, { 137,-258 }, { 138,-258 }, { 139,-258 }, { 140,-258 },+ { 141,-258 }, { 142,-258 }, { 143,-258 }, { 144,-258 }, { 145,-258 },++ { 146,-258 }, { 147,-258 }, { 148,-258 }, { 149,-258 }, { 150,-258 },+ { 151,-258 }, { 152,-258 }, { 153,-258 }, { 154,-258 }, { 155,-258 },+ { 156,-258 }, { 157,-258 }, { 158,-258 }, { 159,-258 }, { 160,-258 },+ { 161,-258 }, { 162,-258 }, { 163,-258 }, { 164,-258 }, { 165,-258 },+ { 166,-258 }, { 167,-258 }, { 168,-258 }, { 169,-258 }, { 170,-258 },+ { 171,-258 }, { 172,-258 }, { 173,-258 }, { 174,-258 }, { 175,-258 },+ { 176,-258 }, { 177,-258 }, { 178,-258 }, { 179,-258 }, { 180,-258 },+ { 181,-258 }, { 182,-258 }, { 183,-258 }, { 184,-258 }, { 185,-258 },+ { 186,-258 }, { 187,-258 }, { 188,-258 }, { 189,-258 }, { 190,-258 },+ { 191,-258 }, { 192,-258 }, { 193,-258 }, { 194,-258 }, { 195,-258 },++ { 196,-258 }, { 197,-258 }, { 198,-258 }, { 199,-258 }, { 200,-258 },+ { 201,-258 }, { 202,-258 }, { 203,-258 }, { 204,-258 }, { 205,-258 },+ { 206,-258 }, { 207,-258 }, { 208,-258 }, { 209,-258 }, { 210,-258 },+ { 211,-258 }, { 212,-258 }, { 213,-258 }, { 214,-258 }, { 215,-258 },+ { 216,-258 }, { 217,-258 }, { 218,-258 }, { 219,-258 }, { 220,-258 },+ { 221,-258 }, { 222,-258 }, { 223,-258 }, { 224,-258 }, { 225,-258 },+ { 226,-258 }, { 227,-258 }, { 228,-258 }, { 229,-258 }, { 230,-258 },+ { 231,-258 }, { 232,-258 }, { 233,-258 }, { 234,-258 }, { 235,-258 },+ { 236,-258 }, { 237,-258 }, { 238,-258 }, { 239,-258 }, { 240,-258 },+ { 241,-258 }, { 242,-258 }, { 243,-258 }, { 244,-258 }, { 245,-258 },++ { 246,-258 }, { 247,-258 }, { 248,-258 }, { 249,-258 }, { 250,-258 },+ { 251,-258 }, { 252,-258 }, { 253,-258 }, { 254,-258 }, { 255,-258 },+ { 256,-258 }, { 0, 55 }, { 0,4738 }, { 1,1548 }, { 2,1548 },+ { 3,1548 }, { 4,1548 }, { 5,1548 }, { 6,1548 }, { 7,1548 },+ { 8,1548 }, { 9,1806 }, { 10,2064 }, { 11,1548 }, { 12,1806 },+ { 13,2064 }, { 14,1548 }, { 15,1548 }, { 16,1548 }, { 17,1548 },+ { 18,1548 }, { 19,1548 }, { 20,1548 }, { 21,1548 }, { 22,1548 },+ { 23,1548 }, { 24,1548 }, { 25,1548 }, { 26,1548 }, { 27,1548 },+ { 28,1548 }, { 29,1548 }, { 30,1548 }, { 31,1548 }, { 32,1806 },+ { 33,1548 }, { 34,1548 }, { 35,1548 }, { 36,1548 }, { 37,1548 },++ { 38,1548 }, { 39, 0 }, { 40,1548 }, { 41,1548 }, { 42,1548 },+ { 43,1548 }, { 44,1548 }, { 45,2111 }, { 46,1548 }, { 47,1548 },+ { 48,1548 }, { 49,1548 }, { 50,1548 }, { 51,1548 }, { 52,1548 },+ { 53,1548 }, { 54,1548 }, { 55,1548 }, { 56,1548 }, { 57,1548 },+ { 58,1548 }, { 59,1548 }, { 60,1548 }, { 61,1548 }, { 62,1548 },+ { 63,1548 }, { 64,1548 }, { 65,1548 }, { 66,1548 }, { 67,1548 },+ { 68,1548 }, { 69,1548 }, { 70,1548 }, { 71,1548 }, { 72,1548 },+ { 73,1548 }, { 74,1548 }, { 75,1548 }, { 76,1548 }, { 77,1548 },+ { 78,1548 }, { 79,1548 }, { 80,1548 }, { 81,1548 }, { 82,1548 },+ { 83,1548 }, { 84,1548 }, { 85,1548 }, { 86,1548 }, { 87,1548 },++ { 88,1548 }, { 89,1548 }, { 90,1548 }, { 91,1548 }, { 92,1548 },+ { 93,1548 }, { 94,1548 }, { 95,1548 }, { 96,1548 }, { 97,1548 },+ { 98,1548 }, { 99,1548 }, { 100,1548 }, { 101,1548 }, { 102,1548 },+ { 103,1548 }, { 104,1548 }, { 105,1548 }, { 106,1548 }, { 107,1548 },+ { 108,1548 }, { 109,1548 }, { 110,1548 }, { 111,1548 }, { 112,1548 },+ { 113,1548 }, { 114,1548 }, { 115,1548 }, { 116,1548 }, { 117,1548 },+ { 118,1548 }, { 119,1548 }, { 120,1548 }, { 121,1548 }, { 122,1548 },+ { 123,1548 }, { 124,1548 }, { 125,1548 }, { 126,1548 }, { 127,1548 },+ { 128,1548 }, { 129,1548 }, { 130,1548 }, { 131,1548 }, { 132,1548 },+ { 133,1548 }, { 134,1548 }, { 135,1548 }, { 136,1548 }, { 137,1548 },++ { 138,1548 }, { 139,1548 }, { 140,1548 }, { 141,1548 }, { 142,1548 },+ { 143,1548 }, { 144,1548 }, { 145,1548 }, { 146,1548 }, { 147,1548 },+ { 148,1548 }, { 149,1548 }, { 150,1548 }, { 151,1548 }, { 152,1548 },+ { 153,1548 }, { 154,1548 }, { 155,1548 }, { 156,1548 }, { 157,1548 },+ { 158,1548 }, { 159,1548 }, { 160,1548 }, { 161,1548 }, { 162,1548 },+ { 163,1548 }, { 164,1548 }, { 165,1548 }, { 166,1548 }, { 167,1548 },+ { 168,1548 }, { 169,1548 }, { 170,1548 }, { 171,1548 }, { 172,1548 },+ { 173,1548 }, { 174,1548 }, { 175,1548 }, { 176,1548 }, { 177,1548 },+ { 178,1548 }, { 179,1548 }, { 180,1548 }, { 181,1548 }, { 182,1548 },+ { 183,1548 }, { 184,1548 }, { 185,1548 }, { 186,1548 }, { 187,1548 },++ { 188,1548 }, { 189,1548 }, { 190,1548 }, { 191,1548 }, { 192,1548 },+ { 193,1548 }, { 194,1548 }, { 195,1548 }, { 196,1548 }, { 197,1548 },+ { 198,1548 }, { 199,1548 }, { 200,1548 }, { 201,1548 }, { 202,1548 },+ { 203,1548 }, { 204,1548 }, { 205,1548 }, { 206,1548 }, { 207,1548 },+ { 208,1548 }, { 209,1548 }, { 210,1548 }, { 211,1548 }, { 212,1548 },+ { 213,1548 }, { 214,1548 }, { 215,1548 }, { 216,1548 }, { 217,1548 },+ { 218,1548 }, { 219,1548 }, { 220,1548 }, { 221,1548 }, { 222,1548 },+ { 223,1548 }, { 224,1548 }, { 225,1548 }, { 226,1548 }, { 227,1548 },+ { 228,1548 }, { 229,1548 }, { 230,1548 }, { 231,1548 }, { 232,1548 },+ { 233,1548 }, { 234,1548 }, { 235,1548 }, { 236,1548 }, { 237,1548 },++ { 238,1548 }, { 239,1548 }, { 240,1548 }, { 241,1548 }, { 242,1548 },+ { 243,1548 }, { 244,1548 }, { 245,1548 }, { 246,1548 }, { 247,1548 },+ { 248,1548 }, { 249,1548 }, { 250,1548 }, { 251,1548 }, { 252,1548 },+ { 253,1548 }, { 254,1548 }, { 255,1548 }, { 256,1548 }, { 0, 55 },+ { 0,4480 }, { 1,-774 }, { 2,-774 }, { 3,-774 }, { 4,-774 },+ { 5,-774 }, { 6,-774 }, { 7,-774 }, { 8,-774 }, { 9,-516 },+ { 10,-2131 }, { 11,-774 }, { 12,-516 }, { 13,-2131 }, { 14,-774 },+ { 15,-774 }, { 16,-774 }, { 17,-774 }, { 18,-774 }, { 19,-774 },+ { 20,-774 }, { 21,-774 }, { 22,-774 }, { 23,-774 }, { 24,-774 },+ { 25,-774 }, { 26,-774 }, { 27,-774 }, { 28,-774 }, { 29,-774 },++ { 30,-774 }, { 31,-774 }, { 32,-516 }, { 33,-774 }, { 34,-774 },+ { 35,-774 }, { 36,-774 }, { 37,-774 }, { 38,-774 }, { 39,-258 },+ { 40,-774 }, { 41,-774 }, { 42,-774 }, { 43,-774 }, { 44,-774 },+ { 45,2111 }, { 46,-774 }, { 47,-774 }, { 48,-774 }, { 49,-774 },+ { 50,-774 }, { 51,-774 }, { 52,-774 }, { 53,-774 }, { 54,-774 },+ { 55,-774 }, { 56,-774 }, { 57,-774 }, { 58,-774 }, { 59,-774 },+ { 60,-774 }, { 61,-774 }, { 62,-774 }, { 63,-774 }, { 64,-774 },+ { 65,-774 }, { 66,-774 }, { 67,-774 }, { 68,-774 }, { 69,-774 },+ { 70,-774 }, { 71,-774 }, { 72,-774 }, { 73,-774 }, { 74,-774 },+ { 75,-774 }, { 76,-774 }, { 77,-774 }, { 78,-774 }, { 79,-774 },++ { 80,-774 }, { 81,-774 }, { 82,-774 }, { 83,-774 }, { 84,-774 },+ { 85,-774 }, { 86,-774 }, { 87,-774 }, { 88,-774 }, { 89,-774 },+ { 90,-774 }, { 91,-774 }, { 92,-774 }, { 93,-774 }, { 94,-774 },+ { 95,-774 }, { 96,-774 }, { 97,-774 }, { 98,-774 }, { 99,-774 },+ { 100,-774 }, { 101,-774 }, { 102,-774 }, { 103,-774 }, { 104,-774 },+ { 105,-774 }, { 106,-774 }, { 107,-774 }, { 108,-774 }, { 109,-774 },+ { 110,-774 }, { 111,-774 }, { 112,-774 }, { 113,-774 }, { 114,-774 },+ { 115,-774 }, { 116,-774 }, { 117,-774 }, { 118,-774 }, { 119,-774 },+ { 120,-774 }, { 121,-774 }, { 122,-774 }, { 123,-774 }, { 124,-774 },+ { 125,-774 }, { 126,-774 }, { 127,-774 }, { 128,-774 }, { 129,-774 },++ { 130,-774 }, { 131,-774 }, { 132,-774 }, { 133,-774 }, { 134,-774 },+ { 135,-774 }, { 136,-774 }, { 137,-774 }, { 138,-774 }, { 139,-774 },+ { 140,-774 }, { 141,-774 }, { 142,-774 }, { 143,-774 }, { 144,-774 },+ { 145,-774 }, { 146,-774 }, { 147,-774 }, { 148,-774 }, { 149,-774 },+ { 150,-774 }, { 151,-774 }, { 152,-774 }, { 153,-774 }, { 154,-774 },+ { 155,-774 }, { 156,-774 }, { 157,-774 }, { 158,-774 }, { 159,-774 },+ { 160,-774 }, { 161,-774 }, { 162,-774 }, { 163,-774 }, { 164,-774 },+ { 165,-774 }, { 166,-774 }, { 167,-774 }, { 168,-774 }, { 169,-774 },+ { 170,-774 }, { 171,-774 }, { 172,-774 }, { 173,-774 }, { 174,-774 },+ { 175,-774 }, { 176,-774 }, { 177,-774 }, { 178,-774 }, { 179,-774 },++ { 180,-774 }, { 181,-774 }, { 182,-774 }, { 183,-774 }, { 184,-774 },+ { 185,-774 }, { 186,-774 }, { 187,-774 }, { 188,-774 }, { 189,-774 },+ { 190,-774 }, { 191,-774 }, { 192,-774 }, { 193,-774 }, { 194,-774 },+ { 195,-774 }, { 196,-774 }, { 197,-774 }, { 198,-774 }, { 199,-774 },+ { 200,-774 }, { 201,-774 }, { 202,-774 }, { 203,-774 }, { 204,-774 },+ { 205,-774 }, { 206,-774 }, { 207,-774 }, { 208,-774 }, { 209,-774 },+ { 210,-774 }, { 211,-774 }, { 212,-774 }, { 213,-774 }, { 214,-774 },+ { 215,-774 }, { 216,-774 }, { 217,-774 }, { 218,-774 }, { 219,-774 },+ { 220,-774 }, { 221,-774 }, { 222,-774 }, { 223,-774 }, { 224,-774 },+ { 225,-774 }, { 226,-774 }, { 227,-774 }, { 228,-774 }, { 229,-774 },++ { 230,-774 }, { 231,-774 }, { 232,-774 }, { 233,-774 }, { 234,-774 },+ { 235,-774 }, { 236,-774 }, { 237,-774 }, { 238,-774 }, { 239,-774 },+ { 240,-774 }, { 241,-774 }, { 242,-774 }, { 243,-774 }, { 244,-774 },+ { 245,-774 }, { 246,-774 }, { 247,-774 }, { 248,-774 }, { 249,-774 },+ { 250,-774 }, { 251,-774 }, { 252,-774 }, { 253,-774 }, { 254,-774 },+ { 255,-774 }, { 256,-774 }, { 0, 28 }, { 0,4222 }, { 1, 0 },+ { 2, 0 }, { 3, 0 }, { 4, 0 }, { 5, 0 }, { 6, 0 },+ { 7, 0 }, { 8, 0 }, { 9, 258 }, { 10,-2084 }, { 11, 0 },+ { 12, 258 }, { 13,-2084 }, { 14, 0 }, { 15, 0 }, { 16, 0 },+ { 17, 0 }, { 18, 0 }, { 19, 0 }, { 20, 0 }, { 21, 0 },++ { 22, 0 }, { 23, 0 }, { 24, 0 }, { 25, 0 }, { 26, 0 },+ { 27, 0 }, { 28, 0 }, { 29, 0 }, { 30, 0 }, { 31, 0 },+ { 32, 258 }, { 33, 0 }, { 34, 0 }, { 35, 0 }, { 36, 0 },+ { 37, 0 }, { 38, 0 }, { 39, 516 }, { 40, 0 }, { 41, 0 },+ { 42, 0 }, { 43, 0 }, { 44, 0 }, { 45, 774 }, { 46, 0 },+ { 47, 0 }, { 48, 0 }, { 49, 0 }, { 50, 0 }, { 51, 0 },+ { 52, 0 }, { 53, 0 }, { 54, 0 }, { 55, 0 }, { 56, 0 },+ { 57, 0 }, { 58, 0 }, { 59, 0 }, { 60, 0 }, { 61, 0 },+ { 62, 0 }, { 63, 0 }, { 64, 0 }, { 65, 0 }, { 66, 0 },+ { 67, 0 }, { 68, 0 }, { 69, 0 }, { 70, 0 }, { 71, 0 },++ { 72, 0 }, { 73, 0 }, { 74, 0 }, { 75, 0 }, { 76, 0 },+ { 77, 0 }, { 78, 0 }, { 79, 0 }, { 80, 0 }, { 81, 0 },+ { 82, 0 }, { 83, 0 }, { 84, 0 }, { 85, 0 }, { 86, 0 },+ { 87, 0 }, { 88, 0 }, { 89, 0 }, { 90, 0 }, { 91, 0 },+ { 92, 0 }, { 93, 0 }, { 94, 0 }, { 95, 0 }, { 96, 0 },+ { 97, 0 }, { 98, 0 }, { 99, 0 }, { 100, 0 }, { 101, 0 },+ { 102, 0 }, { 103, 0 }, { 104, 0 }, { 105, 0 }, { 106, 0 },+ { 107, 0 }, { 108, 0 }, { 109, 0 }, { 110, 0 }, { 111, 0 },+ { 112, 0 }, { 113, 0 }, { 114, 0 }, { 115, 0 }, { 116, 0 },+ { 117, 0 }, { 118, 0 }, { 119, 0 }, { 120, 0 }, { 121, 0 },++ { 122, 0 }, { 123, 0 }, { 124, 0 }, { 125, 0 }, { 126, 0 },+ { 127, 0 }, { 128, 0 }, { 129, 0 }, { 130, 0 }, { 131, 0 },+ { 132, 0 }, { 133, 0 }, { 134, 0 }, { 135, 0 }, { 136, 0 },+ { 137, 0 }, { 138, 0 }, { 139, 0 }, { 140, 0 }, { 141, 0 },+ { 142, 0 }, { 143, 0 }, { 144, 0 }, { 145, 0 }, { 146, 0 },+ { 147, 0 }, { 148, 0 }, { 149, 0 }, { 150, 0 }, { 151, 0 },+ { 152, 0 }, { 153, 0 }, { 154, 0 }, { 155, 0 }, { 156, 0 },+ { 157, 0 }, { 158, 0 }, { 159, 0 }, { 160, 0 }, { 161, 0 },+ { 162, 0 }, { 163, 0 }, { 164, 0 }, { 165, 0 }, { 166, 0 },+ { 167, 0 }, { 168, 0 }, { 169, 0 }, { 170, 0 }, { 171, 0 },++ { 172, 0 }, { 173, 0 }, { 174, 0 }, { 175, 0 }, { 176, 0 },+ { 177, 0 }, { 178, 0 }, { 179, 0 }, { 180, 0 }, { 181, 0 },+ { 182, 0 }, { 183, 0 }, { 184, 0 }, { 185, 0 }, { 186, 0 },+ { 187, 0 }, { 188, 0 }, { 189, 0 }, { 190, 0 }, { 191, 0 },+ { 192, 0 }, { 193, 0 }, { 194, 0 }, { 195, 0 }, { 196, 0 },+ { 197, 0 }, { 198, 0 }, { 199, 0 }, { 200, 0 }, { 201, 0 },+ { 202, 0 }, { 203, 0 }, { 204, 0 }, { 205, 0 }, { 206, 0 },+ { 207, 0 }, { 208, 0 }, { 209, 0 }, { 210, 0 }, { 211, 0 },+ { 212, 0 }, { 213, 0 }, { 214, 0 }, { 215, 0 }, { 216, 0 },+ { 217, 0 }, { 218, 0 }, { 219, 0 }, { 220, 0 }, { 221, 0 },++ { 222, 0 }, { 223, 0 }, { 224, 0 }, { 225, 0 }, { 226, 0 },+ { 227, 0 }, { 228, 0 }, { 229, 0 }, { 230, 0 }, { 231, 0 },+ { 232, 0 }, { 233, 0 }, { 234, 0 }, { 235, 0 }, { 236, 0 },+ { 237, 0 }, { 238, 0 }, { 239, 0 }, { 240, 0 }, { 241, 0 },+ { 242, 0 }, { 243, 0 }, { 244, 0 }, { 245, 0 }, { 246, 0 },+ { 247, 0 }, { 248, 0 }, { 249, 0 }, { 250, 0 }, { 251, 0 },+ { 252, 0 }, { 253, 0 }, { 254, 0 }, { 255, 0 }, { 256, 0 },+ { 0, 28 }, { 0,3964 }, { 1,-258 }, { 2,-258 }, { 3,-258 },+ { 4,-258 }, { 5,-258 }, { 6,-258 }, { 7,-258 }, { 8,-258 },+ { 9, 0 }, { 10,-2342 }, { 11,-258 }, { 12, 0 }, { 13,-2342 },++ { 14,-258 }, { 15,-258 }, { 16,-258 }, { 17,-258 }, { 18,-258 },+ { 19,-258 }, { 20,-258 }, { 21,-258 }, { 22,-258 }, { 23,-258 },+ { 24,-258 }, { 25,-258 }, { 26,-258 }, { 27,-258 }, { 28,-258 },+ { 29,-258 }, { 30,-258 }, { 31,-258 }, { 32, 0 }, { 33,-258 },+ { 34,-258 }, { 35,-258 }, { 36,-258 }, { 37,-258 }, { 38,-258 },+ { 39, 258 }, { 40,-258 }, { 41,-258 }, { 42,-258 }, { 43,-258 },+ { 44,-258 }, { 45, 516 }, { 46,-258 }, { 47,-258 }, { 48,-258 },+ { 49,-258 }, { 50,-258 }, { 51,-258 }, { 52,-258 }, { 53,-258 },+ { 54,-258 }, { 55,-258 }, { 56,-258 }, { 57,-258 }, { 58,-258 },+ { 59,-258 }, { 60,-258 }, { 61,-258 }, { 62,-258 }, { 63,-258 },++ { 64,-258 }, { 65,-258 }, { 66,-258 }, { 67,-258 }, { 68,-258 },+ { 69,-258 }, { 70,-258 }, { 71,-258 }, { 72,-258 }, { 73,-258 },+ { 74,-258 }, { 75,-258 }, { 76,-258 }, { 77,-258 }, { 78,-258 },+ { 79,-258 }, { 80,-258 }, { 81,-258 }, { 82,-258 }, { 83,-258 },+ { 84,-258 }, { 85,-258 }, { 86,-258 }, { 87,-258 }, { 88,-258 },+ { 89,-258 }, { 90,-258 }, { 91,-258 }, { 92,-258 }, { 93,-258 },+ { 94,-258 }, { 95,-258 }, { 96,-258 }, { 97,-258 }, { 98,-258 },+ { 99,-258 }, { 100,-258 }, { 101,-258 }, { 102,-258 }, { 103,-258 },+ { 104,-258 }, { 105,-258 }, { 106,-258 }, { 107,-258 }, { 108,-258 },+ { 109,-258 }, { 110,-258 }, { 111,-258 }, { 112,-258 }, { 113,-258 },++ { 114,-258 }, { 115,-258 }, { 116,-258 }, { 117,-258 }, { 118,-258 },+ { 119,-258 }, { 120,-258 }, { 121,-258 }, { 122,-258 }, { 123,-258 },+ { 124,-258 }, { 125,-258 }, { 126,-258 }, { 127,-258 }, { 128,-258 },+ { 129,-258 }, { 130,-258 }, { 131,-258 }, { 132,-258 }, { 133,-258 },+ { 134,-258 }, { 135,-258 }, { 136,-258 }, { 137,-258 }, { 138,-258 },+ { 139,-258 }, { 140,-258 }, { 141,-258 }, { 142,-258 }, { 143,-258 },+ { 144,-258 }, { 145,-258 }, { 146,-258 }, { 147,-258 }, { 148,-258 },+ { 149,-258 }, { 150,-258 }, { 151,-258 }, { 152,-258 }, { 153,-258 },+ { 154,-258 }, { 155,-258 }, { 156,-258 }, { 157,-258 }, { 158,-258 },+ { 159,-258 }, { 160,-258 }, { 161,-258 }, { 162,-258 }, { 163,-258 },++ { 164,-258 }, { 165,-258 }, { 166,-258 }, { 167,-258 }, { 168,-258 },+ { 169,-258 }, { 170,-258 }, { 171,-258 }, { 172,-258 }, { 173,-258 },+ { 174,-258 }, { 175,-258 }, { 176,-258 }, { 177,-258 }, { 178,-258 },+ { 179,-258 }, { 180,-258 }, { 181,-258 }, { 182,-258 }, { 183,-258 },+ { 184,-258 }, { 185,-258 }, { 186,-258 }, { 187,-258 }, { 188,-258 },+ { 189,-258 }, { 190,-258 }, { 191,-258 }, { 192,-258 }, { 193,-258 },+ { 194,-258 }, { 195,-258 }, { 196,-258 }, { 197,-258 }, { 198,-258 },+ { 199,-258 }, { 200,-258 }, { 201,-258 }, { 202,-258 }, { 203,-258 },+ { 204,-258 }, { 205,-258 }, { 206,-258 }, { 207,-258 }, { 208,-258 },+ { 209,-258 }, { 210,-258 }, { 211,-258 }, { 212,-258 }, { 213,-258 },++ { 214,-258 }, { 215,-258 }, { 216,-258 }, { 217,-258 }, { 218,-258 },+ { 219,-258 }, { 220,-258 }, { 221,-258 }, { 222,-258 }, { 223,-258 },+ { 224,-258 }, { 225,-258 }, { 226,-258 }, { 227,-258 }, { 228,-258 },+ { 229,-258 }, { 230,-258 }, { 231,-258 }, { 232,-258 }, { 233,-258 },+ { 234,-258 }, { 235,-258 }, { 236,-258 }, { 237,-258 }, { 238,-258 },+ { 239,-258 }, { 240,-258 }, { 241,-258 }, { 242,-258 }, { 243,-258 },+ { 244,-258 }, { 245,-258 }, { 246,-258 }, { 247,-258 }, { 248,-258 },+ { 249,-258 }, { 250,-258 }, { 251,-258 }, { 252,-258 }, { 253,-258 },+ { 254,-258 }, { 255,-258 }, { 256,-258 }, { 0, 28 }, { 0,3706 },+ { 1,1595 }, { 2,1595 }, { 3,1595 }, { 4,1595 }, { 5,1595 },++ { 6,1595 }, { 7,1595 }, { 8,1595 }, { 9,1853 }, { 10,2111 },+ { 11,1595 }, { 12,1853 }, { 13,2111 }, { 14,1595 }, { 15,1595 },+ { 16,1595 }, { 17,1595 }, { 18,1595 }, { 19,1595 }, { 20,1595 },+ { 21,1595 }, { 22,1595 }, { 23,1595 }, { 24,1595 }, { 25,1595 },+ { 26,1595 }, { 27,1595 }, { 28,1595 }, { 29,1595 }, { 30,1595 },+ { 31,1595 }, { 32,1853 }, { 33,1595 }, { 34,1595 }, { 35,1595 },+ { 36,1595 }, { 37,1595 }, { 38,1595 }, { 39, 0 }, { 40,1595 },+ { 41,1595 }, { 42,1595 }, { 43,1595 }, { 44,1595 }, { 45,2158 },+ { 46,1595 }, { 47,1595 }, { 48,1595 }, { 49,1595 }, { 50,1595 },+ { 51,1595 }, { 52,1595 }, { 53,1595 }, { 54,1595 }, { 55,1595 },++ { 56,1595 }, { 57,1595 }, { 58,1595 }, { 59,1595 }, { 60,1595 },+ { 61,1595 }, { 62,1595 }, { 63,1595 }, { 64,1595 }, { 65,1595 },+ { 66,1595 }, { 67,1595 }, { 68,1595 }, { 69,1595 }, { 70,1595 },+ { 71,1595 }, { 72,1595 }, { 73,1595 }, { 74,1595 }, { 75,1595 },+ { 76,1595 }, { 77,1595 }, { 78,1595 }, { 79,1595 }, { 80,1595 },+ { 81,1595 }, { 82,1595 }, { 83,1595 }, { 84,1595 }, { 85,1595 },+ { 86,1595 }, { 87,1595 }, { 88,1595 }, { 89,1595 }, { 90,1595 },+ { 91,1595 }, { 92,1595 }, { 93,1595 }, { 94,1595 }, { 95,1595 },+ { 96,1595 }, { 97,1595 }, { 98,1595 }, { 99,1595 }, { 100,1595 },+ { 101,1595 }, { 102,1595 }, { 103,1595 }, { 104,1595 }, { 105,1595 },++ { 106,1595 }, { 107,1595 }, { 108,1595 }, { 109,1595 }, { 110,1595 },+ { 111,1595 }, { 112,1595 }, { 113,1595 }, { 114,1595 }, { 115,1595 },+ { 116,1595 }, { 117,1595 }, { 118,1595 }, { 119,1595 }, { 120,1595 },+ { 121,1595 }, { 122,1595 }, { 123,1595 }, { 124,1595 }, { 125,1595 },+ { 126,1595 }, { 127,1595 }, { 128,1595 }, { 129,1595 }, { 130,1595 },+ { 131,1595 }, { 132,1595 }, { 133,1595 }, { 134,1595 }, { 135,1595 },+ { 136,1595 }, { 137,1595 }, { 138,1595 }, { 139,1595 }, { 140,1595 },+ { 141,1595 }, { 142,1595 }, { 143,1595 }, { 144,1595 }, { 145,1595 },+ { 146,1595 }, { 147,1595 }, { 148,1595 }, { 149,1595 }, { 150,1595 },+ { 151,1595 }, { 152,1595 }, { 153,1595 }, { 154,1595 }, { 155,1595 },++ { 156,1595 }, { 157,1595 }, { 158,1595 }, { 159,1595 }, { 160,1595 },+ { 161,1595 }, { 162,1595 }, { 163,1595 }, { 164,1595 }, { 165,1595 },+ { 166,1595 }, { 167,1595 }, { 168,1595 }, { 169,1595 }, { 170,1595 },+ { 171,1595 }, { 172,1595 }, { 173,1595 }, { 174,1595 }, { 175,1595 },+ { 176,1595 }, { 177,1595 }, { 178,1595 }, { 179,1595 }, { 180,1595 },+ { 181,1595 }, { 182,1595 }, { 183,1595 }, { 184,1595 }, { 185,1595 },+ { 186,1595 }, { 187,1595 }, { 188,1595 }, { 189,1595 }, { 190,1595 },+ { 191,1595 }, { 192,1595 }, { 193,1595 }, { 194,1595 }, { 195,1595 },+ { 196,1595 }, { 197,1595 }, { 198,1595 }, { 199,1595 }, { 200,1595 },+ { 201,1595 }, { 202,1595 }, { 203,1595 }, { 204,1595 }, { 205,1595 },++ { 206,1595 }, { 207,1595 }, { 208,1595 }, { 209,1595 }, { 210,1595 },+ { 211,1595 }, { 212,1595 }, { 213,1595 }, { 214,1595 }, { 215,1595 },+ { 216,1595 }, { 217,1595 }, { 218,1595 }, { 219,1595 }, { 220,1595 },+ { 221,1595 }, { 222,1595 }, { 223,1595 }, { 224,1595 }, { 225,1595 },+ { 226,1595 }, { 227,1595 }, { 228,1595 }, { 229,1595 }, { 230,1595 },+ { 231,1595 }, { 232,1595 }, { 233,1595 }, { 234,1595 }, { 235,1595 },+ { 236,1595 }, { 237,1595 }, { 238,1595 }, { 239,1595 }, { 240,1595 },+ { 241,1595 }, { 242,1595 }, { 243,1595 }, { 244,1595 }, { 245,1595 },+ { 246,1595 }, { 247,1595 }, { 248,1595 }, { 249,1595 }, { 250,1595 },+ { 251,1595 }, { 252,1595 }, { 253,1595 }, { 254,1595 }, { 255,1595 },++ { 256,1595 }, { 0, 28 }, { 0,3448 }, { 1,-774 }, { 2,-774 },+ { 3,-774 }, { 4,-774 }, { 5,-774 }, { 6,-774 }, { 7,-774 },+ { 8,-774 }, { 9,-516 }, { 10,-2858 }, { 11,-774 }, { 12,-516 },+ { 13,-2858 }, { 14,-774 }, { 15,-774 }, { 16,-774 }, { 17,-774 },+ { 18,-774 }, { 19,-774 }, { 20,-774 }, { 21,-774 }, { 22,-774 },+ { 23,-774 }, { 24,-774 }, { 25,-774 }, { 26,-774 }, { 27,-774 },+ { 28,-774 }, { 29,-774 }, { 30,-774 }, { 31,-774 }, { 32,-516 },+ { 33,-774 }, { 34,-774 }, { 35,-774 }, { 36,-774 }, { 37,-774 },+ { 38,-774 }, { 39,-258 }, { 40,-774 }, { 41,-774 }, { 42,-774 },+ { 43,-774 }, { 44,-774 }, { 45,2158 }, { 46,-774 }, { 47,-774 },++ { 48,-774 }, { 49,-774 }, { 50,-774 }, { 51,-774 }, { 52,-774 },+ { 53,-774 }, { 54,-774 }, { 55,-774 }, { 56,-774 }, { 57,-774 },+ { 58,-774 }, { 59,-774 }, { 60,-774 }, { 61,-774 }, { 62,-774 },+ { 63,-774 }, { 64,-774 }, { 65,-774 }, { 66,-774 }, { 67,-774 },+ { 68,-774 }, { 69,-774 }, { 70,-774 }, { 71,-774 }, { 72,-774 },+ { 73,-774 }, { 74,-774 }, { 75,-774 }, { 76,-774 }, { 77,-774 },+ { 78,-774 }, { 79,-774 }, { 80,-774 }, { 81,-774 }, { 82,-774 },+ { 83,-774 }, { 84,-774 }, { 85,-774 }, { 86,-774 }, { 87,-774 },+ { 88,-774 }, { 89,-774 }, { 90,-774 }, { 91,-774 }, { 92,-774 },+ { 93,-774 }, { 94,-774 }, { 95,-774 }, { 96,-774 }, { 97,-774 },++ { 98,-774 }, { 99,-774 }, { 100,-774 }, { 101,-774 }, { 102,-774 },+ { 103,-774 }, { 104,-774 }, { 105,-774 }, { 106,-774 }, { 107,-774 },+ { 108,-774 }, { 109,-774 }, { 110,-774 }, { 111,-774 }, { 112,-774 },+ { 113,-774 }, { 114,-774 }, { 115,-774 }, { 116,-774 }, { 117,-774 },+ { 118,-774 }, { 119,-774 }, { 120,-774 }, { 121,-774 }, { 122,-774 },+ { 123,-774 }, { 124,-774 }, { 125,-774 }, { 126,-774 }, { 127,-774 },+ { 128,-774 }, { 129,-774 }, { 130,-774 }, { 131,-774 }, { 132,-774 },+ { 133,-774 }, { 134,-774 }, { 135,-774 }, { 136,-774 }, { 137,-774 },+ { 138,-774 }, { 139,-774 }, { 140,-774 }, { 141,-774 }, { 142,-774 },+ { 143,-774 }, { 144,-774 }, { 145,-774 }, { 146,-774 }, { 147,-774 },++ { 148,-774 }, { 149,-774 }, { 150,-774 }, { 151,-774 }, { 152,-774 },+ { 153,-774 }, { 154,-774 }, { 155,-774 }, { 156,-774 }, { 157,-774 },+ { 158,-774 }, { 159,-774 }, { 160,-774 }, { 161,-774 }, { 162,-774 },+ { 163,-774 }, { 164,-774 }, { 165,-774 }, { 166,-774 }, { 167,-774 },+ { 168,-774 }, { 169,-774 }, { 170,-774 }, { 171,-774 }, { 172,-774 },+ { 173,-774 }, { 174,-774 }, { 175,-774 }, { 176,-774 }, { 177,-774 },+ { 178,-774 }, { 179,-774 }, { 180,-774 }, { 181,-774 }, { 182,-774 },+ { 183,-774 }, { 184,-774 }, { 185,-774 }, { 186,-774 }, { 187,-774 },+ { 188,-774 }, { 189,-774 }, { 190,-774 }, { 191,-774 }, { 192,-774 },+ { 193,-774 }, { 194,-774 }, { 195,-774 }, { 196,-774 }, { 197,-774 },++ { 198,-774 }, { 199,-774 }, { 200,-774 }, { 201,-774 }, { 202,-774 },+ { 203,-774 }, { 204,-774 }, { 205,-774 }, { 206,-774 }, { 207,-774 },+ { 208,-774 }, { 209,-774 }, { 210,-774 }, { 211,-774 }, { 212,-774 },+ { 213,-774 }, { 214,-774 }, { 215,-774 }, { 216,-774 }, { 217,-774 },+ { 218,-774 }, { 219,-774 }, { 220,-774 }, { 221,-774 }, { 222,-774 },+ { 223,-774 }, { 224,-774 }, { 225,-774 }, { 226,-774 }, { 227,-774 },+ { 228,-774 }, { 229,-774 }, { 230,-774 }, { 231,-774 }, { 232,-774 },+ { 233,-774 }, { 234,-774 }, { 235,-774 }, { 236,-774 }, { 237,-774 },+ { 238,-774 }, { 239,-774 }, { 240,-774 }, { 241,-774 }, { 242,-774 },+ { 243,-774 }, { 244,-774 }, { 245,-774 }, { 246,-774 }, { 247,-774 },++ { 248,-774 }, { 249,-774 }, { 250,-774 }, { 251,-774 }, { 252,-774 },+ { 253,-774 }, { 254,-774 }, { 255,-774 }, { 256,-774 }, { 0, 55 },+ { 0,3190 }, { 1,-2064 }, { 2,-2064 }, { 3,-2064 }, { 4,-2064 },+ { 5,-2064 }, { 6,-2064 }, { 7,-2064 }, { 8,-2064 }, { 9,-1806 },+ { 10,-3421 }, { 11,-2064 }, { 12,-1806 }, { 13,-3421 }, { 14,-2064 },+ { 15,-2064 }, { 16,-2064 }, { 17,-2064 }, { 18,-2064 }, { 19,-2064 },+ { 20,-2064 }, { 21,-2064 }, { 22,-2064 }, { 23,-2064 }, { 24,-2064 },+ { 25,-2064 }, { 26,-2064 }, { 27,-2064 }, { 28,-2064 }, { 29,-2064 },+ { 30,-2064 }, { 31,-2064 }, { 32,-1806 }, { 33,-2064 }, { 34,-2064 },+ { 35,-2064 }, { 36,-2064 }, { 37,-2064 }, { 38,-2064 }, { 39,2158 },++ { 40,-2064 }, { 41,-2064 }, { 42,-2064 }, { 43,-2064 }, { 44,-2064 },+ { 45,-1290 }, { 46,-2064 }, { 47,-2064 }, { 48,-2064 }, { 49,-2064 },+ { 50,-2064 }, { 51,-2064 }, { 52,-2064 }, { 53,-2064 }, { 54,-2064 },+ { 55,-2064 }, { 56,-2064 }, { 57,-2064 }, { 58,-2064 }, { 59,-2064 },+ { 60,-2064 }, { 61,-2064 }, { 62,-2064 }, { 63,-2064 }, { 64,-2064 },+ { 65,-2064 }, { 66,-2064 }, { 67,-2064 }, { 68,-2064 }, { 69,-2064 },+ { 70,-2064 }, { 71,-2064 }, { 72,-2064 }, { 73,-2064 }, { 74,-2064 },+ { 75,-2064 }, { 76,-2064 }, { 77,-2064 }, { 78,-2064 }, { 79,-2064 },+ { 80,-2064 }, { 81,-2064 }, { 82,-2064 }, { 83,-2064 }, { 84,-2064 },+ { 85,-2064 }, { 86,-2064 }, { 87,-2064 }, { 88,-2064 }, { 89,-2064 },++ { 90,-2064 }, { 91,-2064 }, { 92,-2064 }, { 93,-2064 }, { 94,-2064 },+ { 95,-2064 }, { 96,-2064 }, { 97,-2064 }, { 98,-2064 }, { 99,-2064 },+ { 100,-2064 }, { 101,-2064 }, { 102,-2064 }, { 103,-2064 }, { 104,-2064 },+ { 105,-2064 }, { 106,-2064 }, { 107,-2064 }, { 108,-2064 }, { 109,-2064 },+ { 110,-2064 }, { 111,-2064 }, { 112,-2064 }, { 113,-2064 }, { 114,-2064 },+ { 115,-2064 }, { 116,-2064 }, { 117,-2064 }, { 118,-2064 }, { 119,-2064 },+ { 120,-2064 }, { 121,-2064 }, { 122,-2064 }, { 123,-2064 }, { 124,-2064 },+ { 125,-2064 }, { 126,-2064 }, { 127,-2064 }, { 128,-2064 }, { 129,-2064 },+ { 130,-2064 }, { 131,-2064 }, { 132,-2064 }, { 133,-2064 }, { 134,-2064 },+ { 135,-2064 }, { 136,-2064 }, { 137,-2064 }, { 138,-2064 }, { 139,-2064 },++ { 140,-2064 }, { 141,-2064 }, { 142,-2064 }, { 143,-2064 }, { 144,-2064 },+ { 145,-2064 }, { 146,-2064 }, { 147,-2064 }, { 148,-2064 }, { 149,-2064 },+ { 150,-2064 }, { 151,-2064 }, { 152,-2064 }, { 153,-2064 }, { 154,-2064 },+ { 155,-2064 }, { 156,-2064 }, { 157,-2064 }, { 158,-2064 }, { 159,-2064 },+ { 160,-2064 }, { 161,-2064 }, { 162,-2064 }, { 163,-2064 }, { 164,-2064 },+ { 165,-2064 }, { 166,-2064 }, { 167,-2064 }, { 168,-2064 }, { 169,-2064 },+ { 170,-2064 }, { 171,-2064 }, { 172,-2064 }, { 173,-2064 }, { 174,-2064 },+ { 175,-2064 }, { 176,-2064 }, { 177,-2064 }, { 178,-2064 }, { 179,-2064 },+ { 180,-2064 }, { 181,-2064 }, { 182,-2064 }, { 183,-2064 }, { 184,-2064 },+ { 185,-2064 }, { 186,-2064 }, { 187,-2064 }, { 188,-2064 }, { 189,-2064 },++ { 190,-2064 }, { 191,-2064 }, { 192,-2064 }, { 193,-2064 }, { 194,-2064 },+ { 195,-2064 }, { 196,-2064 }, { 197,-2064 }, { 198,-2064 }, { 199,-2064 },+ { 200,-2064 }, { 201,-2064 }, { 202,-2064 }, { 203,-2064 }, { 204,-2064 },+ { 205,-2064 }, { 206,-2064 }, { 207,-2064 }, { 208,-2064 }, { 209,-2064 },+ { 210,-2064 }, { 211,-2064 }, { 212,-2064 }, { 213,-2064 }, { 214,-2064 },+ { 215,-2064 }, { 216,-2064 }, { 217,-2064 }, { 218,-2064 }, { 219,-2064 },+ { 220,-2064 }, { 221,-2064 }, { 222,-2064 }, { 223,-2064 }, { 224,-2064 },+ { 225,-2064 }, { 226,-2064 }, { 227,-2064 }, { 228,-2064 }, { 229,-2064 },+ { 230,-2064 }, { 231,-2064 }, { 232,-2064 }, { 233,-2064 }, { 234,-2064 },+ { 235,-2064 }, { 236,-2064 }, { 237,-2064 }, { 238,-2064 }, { 239,-2064 },++ { 240,-2064 }, { 241,-2064 }, { 242,-2064 }, { 243,-2064 }, { 244,-2064 },+ { 245,-2064 }, { 246,-2064 }, { 247,-2064 }, { 248,-2064 }, { 249,-2064 },+ { 250,-2064 }, { 251,-2064 }, { 252,-2064 }, { 253,-2064 }, { 254,-2064 },+ { 255,-2064 }, { 256,-2064 }, { 0, 55 }, { 0,2932 }, { 1,-2322 },+ { 2,-2322 }, { 3,-2322 }, { 4,-2322 }, { 5,-2322 }, { 6,-2322 },+ { 7,-2322 }, { 8,-2322 }, { 9,-2064 }, { 10,-3679 }, { 11,-2322 },+ { 12,-2064 }, { 13,-3679 }, { 14,-2322 }, { 15,-2322 }, { 16,-2322 },+ { 17,-2322 }, { 18,-2322 }, { 19,-2322 }, { 20,-2322 }, { 21,-2322 },+ { 22,-2322 }, { 23,-2322 }, { 24,-2322 }, { 25,-2322 }, { 26,-2322 },+ { 27,-2322 }, { 28,-2322 }, { 29,-2322 }, { 30,-2322 }, { 31,-2322 },++ { 32,-2064 }, { 33,-2322 }, { 34,-2322 }, { 35,-2322 }, { 36,-2322 },+ { 37,-2322 }, { 38,-2322 }, { 39,1900 }, { 40,-2322 }, { 41,-2322 },+ { 42,-2322 }, { 43,-2322 }, { 44,-2322 }, { 45,-1548 }, { 46,-2322 },+ { 47,-2322 }, { 48,-2322 }, { 49,-2322 }, { 50,-2322 }, { 51,-2322 },+ { 52,-2322 }, { 53,-2322 }, { 54,-2322 }, { 55,-2322 }, { 56,-2322 },+ { 57,-2322 }, { 58,-2322 }, { 59,-2322 }, { 60,-2322 }, { 61,-2322 },+ { 62,-2322 }, { 63,-2322 }, { 64,-2322 }, { 65,-2322 }, { 66,-2322 },+ { 67,-2322 }, { 68,-2322 }, { 69,-2322 }, { 70,-2322 }, { 71,-2322 },+ { 72,-2322 }, { 73,-2322 }, { 74,-2322 }, { 75,-2322 }, { 76,-2322 },+ { 77,-2322 }, { 78,-2322 }, { 79,-2322 }, { 80,-2322 }, { 81,-2322 },++ { 82,-2322 }, { 83,-2322 }, { 84,-2322 }, { 85,-2322 }, { 86,-2322 },+ { 87,-2322 }, { 88,-2322 }, { 89,-2322 }, { 90,-2322 }, { 91,-2322 },+ { 92,-2322 }, { 93,-2322 }, { 94,-2322 }, { 95,-2322 }, { 96,-2322 },+ { 97,-2322 }, { 98,-2322 }, { 99,-2322 }, { 100,-2322 }, { 101,-2322 },+ { 102,-2322 }, { 103,-2322 }, { 104,-2322 }, { 105,-2322 }, { 106,-2322 },+ { 107,-2322 }, { 108,-2322 }, { 109,-2322 }, { 110,-2322 }, { 111,-2322 },+ { 112,-2322 }, { 113,-2322 }, { 114,-2322 }, { 115,-2322 }, { 116,-2322 },+ { 117,-2322 }, { 118,-2322 }, { 119,-2322 }, { 120,-2322 }, { 121,-2322 },+ { 122,-2322 }, { 123,-2322 }, { 124,-2322 }, { 125,-2322 }, { 126,-2322 },+ { 127,-2322 }, { 128,-2322 }, { 129,-2322 }, { 130,-2322 }, { 131,-2322 },++ { 132,-2322 }, { 133,-2322 }, { 134,-2322 }, { 135,-2322 }, { 136,-2322 },+ { 137,-2322 }, { 138,-2322 }, { 139,-2322 }, { 140,-2322 }, { 141,-2322 },+ { 142,-2322 }, { 143,-2322 }, { 144,-2322 }, { 145,-2322 }, { 146,-2322 },+ { 147,-2322 }, { 148,-2322 }, { 149,-2322 }, { 150,-2322 }, { 151,-2322 },+ { 152,-2322 }, { 153,-2322 }, { 154,-2322 }, { 155,-2322 }, { 156,-2322 },+ { 157,-2322 }, { 158,-2322 }, { 159,-2322 }, { 160,-2322 }, { 161,-2322 },+ { 162,-2322 }, { 163,-2322 }, { 164,-2322 }, { 165,-2322 }, { 166,-2322 },+ { 167,-2322 }, { 168,-2322 }, { 169,-2322 }, { 170,-2322 }, { 171,-2322 },+ { 172,-2322 }, { 173,-2322 }, { 174,-2322 }, { 175,-2322 }, { 176,-2322 },+ { 177,-2322 }, { 178,-2322 }, { 179,-2322 }, { 180,-2322 }, { 181,-2322 },++ { 182,-2322 }, { 183,-2322 }, { 184,-2322 }, { 185,-2322 }, { 186,-2322 },+ { 187,-2322 }, { 188,-2322 }, { 189,-2322 }, { 190,-2322 }, { 191,-2322 },+ { 192,-2322 }, { 193,-2322 }, { 194,-2322 }, { 195,-2322 }, { 196,-2322 },+ { 197,-2322 }, { 198,-2322 }, { 199,-2322 }, { 200,-2322 }, { 201,-2322 },+ { 202,-2322 }, { 203,-2322 }, { 204,-2322 }, { 205,-2322 }, { 206,-2322 },+ { 207,-2322 }, { 208,-2322 }, { 209,-2322 }, { 210,-2322 }, { 211,-2322 },+ { 212,-2322 }, { 213,-2322 }, { 214,-2322 }, { 215,-2322 }, { 216,-2322 },+ { 217,-2322 }, { 218,-2322 }, { 219,-2322 }, { 220,-2322 }, { 221,-2322 },+ { 222,-2322 }, { 223,-2322 }, { 224,-2322 }, { 225,-2322 }, { 226,-2322 },+ { 227,-2322 }, { 228,-2322 }, { 229,-2322 }, { 230,-2322 }, { 231,-2322 },++ { 232,-2322 }, { 233,-2322 }, { 234,-2322 }, { 235,-2322 }, { 236,-2322 },+ { 237,-2322 }, { 238,-2322 }, { 239,-2322 }, { 240,-2322 }, { 241,-2322 },+ { 242,-2322 }, { 243,-2322 }, { 244,-2322 }, { 245,-2322 }, { 246,-2322 },+ { 247,-2322 }, { 248,-2322 }, { 249,-2322 }, { 250,-2322 }, { 251,-2322 },+ { 252,-2322 }, { 253,-2322 }, { 254,-2322 }, { 255,-2322 }, { 256,-2322 },+ { 0, 55 }, { 0,2674 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 9,-3937 }, { 10,-3937 }, { 0, 0 }, { 12,-3937 }, { 13,-3937 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },++ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 32,-3937 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 39,1900 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 45,-25685 }, { 0, 55 }, { 0,2627 }, { 1,-2627 },+ { 2,-2627 }, { 3,-2627 }, { 4,-2627 }, { 5,-2627 }, { 6,-2627 },+ { 7,-2627 }, { 8,-2627 }, { 9,-2369 }, { 10,-3984 }, { 11,-2627 },+ { 12,-2369 }, { 13,-3984 }, { 14,-2627 }, { 15,-2627 }, { 16,-2627 },+ { 17,-2627 }, { 18,-2627 }, { 19,-2627 }, { 20,-2627 }, { 21,-2627 },+ { 22,-2627 }, { 23,-2627 }, { 24,-2627 }, { 25,-2627 }, { 26,-2627 },++ { 27,-2627 }, { 28,-2627 }, { 29,-2627 }, { 30,-2627 }, { 31,-2627 },+ { 32,-2369 }, { 33,-2627 }, { 34,-2627 }, { 35,-2627 }, { 36,-2627 },+ { 37,-2627 }, { 38,-2627 }, { 39,1595 }, { 40,-2627 }, { 41,-2627 },+ { 42,-2627 }, { 43,-2627 }, { 44,-2627 }, { 45, 258 }, { 46,-2627 },+ { 47,-2627 }, { 48,-2627 }, { 49,-2627 }, { 50,-2627 }, { 51,-2627 },+ { 52,-2627 }, { 53,-2627 }, { 54,-2627 }, { 55,-2627 }, { 56,-2627 },+ { 57,-2627 }, { 58,-2627 }, { 59,-2627 }, { 60,-2627 }, { 61,-2627 },+ { 62,-2627 }, { 63,-2627 }, { 64,-2627 }, { 65,-2627 }, { 66,-2627 },+ { 67,-2627 }, { 68,-2627 }, { 69,-2627 }, { 70,-2627 }, { 71,-2627 },+ { 72,-2627 }, { 73,-2627 }, { 74,-2627 }, { 75,-2627 }, { 76,-2627 },++ { 77,-2627 }, { 78,-2627 }, { 79,-2627 }, { 80,-2627 }, { 81,-2627 },+ { 82,-2627 }, { 83,-2627 }, { 84,-2627 }, { 85,-2627 }, { 86,-2627 },+ { 87,-2627 }, { 88,-2627 }, { 89,-2627 }, { 90,-2627 }, { 91,-2627 },+ { 92,-2627 }, { 93,-2627 }, { 94,-2627 }, { 95,-2627 }, { 96,-2627 },+ { 97,-2627 }, { 98,-2627 }, { 99,-2627 }, { 100,-2627 }, { 101,-2627 },+ { 102,-2627 }, { 103,-2627 }, { 104,-2627 }, { 105,-2627 }, { 106,-2627 },+ { 107,-2627 }, { 108,-2627 }, { 109,-2627 }, { 110,-2627 }, { 111,-2627 },+ { 112,-2627 }, { 113,-2627 }, { 114,-2627 }, { 115,-2627 }, { 116,-2627 },+ { 117,-2627 }, { 118,-2627 }, { 119,-2627 }, { 120,-2627 }, { 121,-2627 },+ { 122,-2627 }, { 123,-2627 }, { 124,-2627 }, { 125,-2627 }, { 126,-2627 },++ { 127,-2627 }, { 128,-2627 }, { 129,-2627 }, { 130,-2627 }, { 131,-2627 },+ { 132,-2627 }, { 133,-2627 }, { 134,-2627 }, { 135,-2627 }, { 136,-2627 },+ { 137,-2627 }, { 138,-2627 }, { 139,-2627 }, { 140,-2627 }, { 141,-2627 },+ { 142,-2627 }, { 143,-2627 }, { 144,-2627 }, { 145,-2627 }, { 146,-2627 },+ { 147,-2627 }, { 148,-2627 }, { 149,-2627 }, { 150,-2627 }, { 151,-2627 },+ { 152,-2627 }, { 153,-2627 }, { 154,-2627 }, { 155,-2627 }, { 156,-2627 },+ { 157,-2627 }, { 158,-2627 }, { 159,-2627 }, { 160,-2627 }, { 161,-2627 },+ { 162,-2627 }, { 163,-2627 }, { 164,-2627 }, { 165,-2627 }, { 166,-2627 },+ { 167,-2627 }, { 168,-2627 }, { 169,-2627 }, { 170,-2627 }, { 171,-2627 },+ { 172,-2627 }, { 173,-2627 }, { 174,-2627 }, { 175,-2627 }, { 176,-2627 },++ { 177,-2627 }, { 178,-2627 }, { 179,-2627 }, { 180,-2627 }, { 181,-2627 },+ { 182,-2627 }, { 183,-2627 }, { 184,-2627 }, { 185,-2627 }, { 186,-2627 },+ { 187,-2627 }, { 188,-2627 }, { 189,-2627 }, { 190,-2627 }, { 191,-2627 },+ { 192,-2627 }, { 193,-2627 }, { 194,-2627 }, { 195,-2627 }, { 196,-2627 },+ { 197,-2627 }, { 198,-2627 }, { 199,-2627 }, { 200,-2627 }, { 201,-2627 },+ { 202,-2627 }, { 203,-2627 }, { 204,-2627 }, { 205,-2627 }, { 206,-2627 },+ { 207,-2627 }, { 208,-2627 }, { 209,-2627 }, { 210,-2627 }, { 211,-2627 },+ { 212,-2627 }, { 213,-2627 }, { 214,-2627 }, { 215,-2627 }, { 216,-2627 },+ { 217,-2627 }, { 218,-2627 }, { 219,-2627 }, { 220,-2627 }, { 221,-2627 },+ { 222,-2627 }, { 223,-2627 }, { 224,-2627 }, { 225,-2627 }, { 226,-2627 },++ { 227,-2627 }, { 228,-2627 }, { 229,-2627 }, { 230,-2627 }, { 231,-2627 },+ { 232,-2627 }, { 233,-2627 }, { 234,-2627 }, { 235,-2627 }, { 236,-2627 },+ { 237,-2627 }, { 238,-2627 }, { 239,-2627 }, { 240,-2627 }, { 241,-2627 },+ { 242,-2627 }, { 243,-2627 }, { 244,-2627 }, { 245,-2627 }, { 246,-2627 },+ { 247,-2627 }, { 248,-2627 }, { 249,-2627 }, { 250,-2627 }, { 251,-2627 },+ { 252,-2627 }, { 253,-2627 }, { 254,-2627 }, { 255,-2627 }, { 256,-2627 },+ { 0, 55 }, { 0,2369 }, { 1,-2885 }, { 2,-2885 }, { 3,-2885 },+ { 4,-2885 }, { 5,-2885 }, { 6,-2885 }, { 7,-2885 }, { 8,-2885 },+ { 9,-2627 }, { 10,-4242 }, { 11,-2885 }, { 12,-2627 }, { 13,-4242 },+ { 14,-2885 }, { 15,-2885 }, { 16,-2885 }, { 17,-2885 }, { 18,-2885 },++ { 19,-2885 }, { 20,-2885 }, { 21,-2885 }, { 22,-2885 }, { 23,-2885 },+ { 24,-2885 }, { 25,-2885 }, { 26,-2885 }, { 27,-2885 }, { 28,-2885 },+ { 29,-2885 }, { 30,-2885 }, { 31,-2885 }, { 32,-2627 }, { 33,-2885 },+ { 34,-2885 }, { 35,-2885 }, { 36,-2885 }, { 37,-2885 }, { 38,-2885 },+ { 39,-2369 }, { 40,-2885 }, { 41,-2885 }, { 42,-2885 }, { 43,-2885 },+ { 44,-2885 }, { 45, 0 }, { 46,-2885 }, { 47,-2885 }, { 48,-2885 },+ { 49,-2885 }, { 50,-2885 }, { 51,-2885 }, { 52,-2885 }, { 53,-2885 },+ { 54,-2885 }, { 55,-2885 }, { 56,-2885 }, { 57,-2885 }, { 58,-2885 },+ { 59,-2885 }, { 60,-2885 }, { 61,-2885 }, { 62,-2885 }, { 63,-2885 },+ { 64,-2885 }, { 65,-2885 }, { 66,-2885 }, { 67,-2885 }, { 68,-2885 },++ { 69,-2885 }, { 70,-2885 }, { 71,-2885 }, { 72,-2885 }, { 73,-2885 },+ { 74,-2885 }, { 75,-2885 }, { 76,-2885 }, { 77,-2885 }, { 78,-2885 },+ { 79,-2885 }, { 80,-2885 }, { 81,-2885 }, { 82,-2885 }, { 83,-2885 },+ { 84,-2885 }, { 85,-2885 }, { 86,-2885 }, { 87,-2885 }, { 88,-2885 },+ { 89,-2885 }, { 90,-2885 }, { 91,-2885 }, { 92,-2885 }, { 93,-2885 },+ { 94,-2885 }, { 95,-2885 }, { 96,-2885 }, { 97,-2885 }, { 98,-2885 },+ { 99,-2885 }, { 100,-2885 }, { 101,-2885 }, { 102,-2885 }, { 103,-2885 },+ { 104,-2885 }, { 105,-2885 }, { 106,-2885 }, { 107,-2885 }, { 108,-2885 },+ { 109,-2885 }, { 110,-2885 }, { 111,-2885 }, { 112,-2885 }, { 113,-2885 },+ { 114,-2885 }, { 115,-2885 }, { 116,-2885 }, { 117,-2885 }, { 118,-2885 },++ { 119,-2885 }, { 120,-2885 }, { 121,-2885 }, { 122,-2885 }, { 123,-2885 },+ { 124,-2885 }, { 125,-2885 }, { 126,-2885 }, { 127,-2885 }, { 128,-2885 },+ { 129,-2885 }, { 130,-2885 }, { 131,-2885 }, { 132,-2885 }, { 133,-2885 },+ { 134,-2885 }, { 135,-2885 }, { 136,-2885 }, { 137,-2885 }, { 138,-2885 },+ { 139,-2885 }, { 140,-2885 }, { 141,-2885 }, { 142,-2885 }, { 143,-2885 },+ { 144,-2885 }, { 145,-2885 }, { 146,-2885 }, { 147,-2885 }, { 148,-2885 },+ { 149,-2885 }, { 150,-2885 }, { 151,-2885 }, { 152,-2885 }, { 153,-2885 },+ { 154,-2885 }, { 155,-2885 }, { 156,-2885 }, { 157,-2885 }, { 158,-2885 },+ { 159,-2885 }, { 160,-2885 }, { 161,-2885 }, { 162,-2885 }, { 163,-2885 },+ { 164,-2885 }, { 165,-2885 }, { 166,-2885 }, { 167,-2885 }, { 168,-2885 },++ { 169,-2885 }, { 170,-2885 }, { 171,-2885 }, { 172,-2885 }, { 173,-2885 },+ { 174,-2885 }, { 175,-2885 }, { 176,-2885 }, { 177,-2885 }, { 178,-2885 },+ { 179,-2885 }, { 180,-2885 }, { 181,-2885 }, { 182,-2885 }, { 183,-2885 },+ { 184,-2885 }, { 185,-2885 }, { 186,-2885 }, { 187,-2885 }, { 188,-2885 },+ { 189,-2885 }, { 190,-2885 }, { 191,-2885 }, { 192,-2885 }, { 193,-2885 },+ { 194,-2885 }, { 195,-2885 }, { 196,-2885 }, { 197,-2885 }, { 198,-2885 },+ { 199,-2885 }, { 200,-2885 }, { 201,-2885 }, { 202,-2885 }, { 203,-2885 },+ { 204,-2885 }, { 205,-2885 }, { 206,-2885 }, { 207,-2885 }, { 208,-2885 },+ { 209,-2885 }, { 210,-2885 }, { 211,-2885 }, { 212,-2885 }, { 213,-2885 },+ { 214,-2885 }, { 215,-2885 }, { 216,-2885 }, { 217,-2885 }, { 218,-2885 },++ { 219,-2885 }, { 220,-2885 }, { 221,-2885 }, { 222,-2885 }, { 223,-2885 },+ { 224,-2885 }, { 225,-2885 }, { 226,-2885 }, { 227,-2885 }, { 228,-2885 },+ { 229,-2885 }, { 230,-2885 }, { 231,-2885 }, { 232,-2885 }, { 233,-2885 },+ { 234,-2885 }, { 235,-2885 }, { 236,-2885 }, { 237,-2885 }, { 238,-2885 },+ { 239,-2885 }, { 240,-2885 }, { 241,-2885 }, { 242,-2885 }, { 243,-2885 },+ { 244,-2885 }, { 245,-2885 }, { 246,-2885 }, { 247,-2885 }, { 248,-2885 },+ { 249,-2885 }, { 250,-2885 }, { 251,-2885 }, { 252,-2885 }, { 253,-2885 },+ { 254,-2885 }, { 255,-2885 }, { 256,-2885 }, { 0, 28 }, { 0,2111 },+ { 1,-2111 }, { 2,-2111 }, { 3,-2111 }, { 4,-2111 }, { 5,-2111 },+ { 6,-2111 }, { 7,-2111 }, { 8,-2111 }, { 9,-1853 }, { 10,-4195 },++ { 11,-2111 }, { 12,-1853 }, { 13,-4195 }, { 14,-2111 }, { 15,-2111 },+ { 16,-2111 }, { 17,-2111 }, { 18,-2111 }, { 19,-2111 }, { 20,-2111 },+ { 21,-2111 }, { 22,-2111 }, { 23,-2111 }, { 24,-2111 }, { 25,-2111 },+ { 26,-2111 }, { 27,-2111 }, { 28,-2111 }, { 29,-2111 }, { 30,-2111 },+ { 31,-2111 }, { 32,-1853 }, { 33,-2111 }, { 34,-2111 }, { 35,-2111 },+ { 36,-2111 }, { 37,-2111 }, { 38,-2111 }, { 39,1595 }, { 40,-2111 },+ { 41,-2111 }, { 42,-2111 }, { 43,-2111 }, { 44,-2111 }, { 45,-1337 },+ { 46,-2111 }, { 47,-2111 }, { 48,-2111 }, { 49,-2111 }, { 50,-2111 },+ { 51,-2111 }, { 52,-2111 }, { 53,-2111 }, { 54,-2111 }, { 55,-2111 },+ { 56,-2111 }, { 57,-2111 }, { 58,-2111 }, { 59,-2111 }, { 60,-2111 },++ { 61,-2111 }, { 62,-2111 }, { 63,-2111 }, { 64,-2111 }, { 65,-2111 },+ { 66,-2111 }, { 67,-2111 }, { 68,-2111 }, { 69,-2111 }, { 70,-2111 },+ { 71,-2111 }, { 72,-2111 }, { 73,-2111 }, { 74,-2111 }, { 75,-2111 },+ { 76,-2111 }, { 77,-2111 }, { 78,-2111 }, { 79,-2111 }, { 80,-2111 },+ { 81,-2111 }, { 82,-2111 }, { 83,-2111 }, { 84,-2111 }, { 85,-2111 },+ { 86,-2111 }, { 87,-2111 }, { 88,-2111 }, { 89,-2111 }, { 90,-2111 },+ { 91,-2111 }, { 92,-2111 }, { 93,-2111 }, { 94,-2111 }, { 95,-2111 },+ { 96,-2111 }, { 97,-2111 }, { 98,-2111 }, { 99,-2111 }, { 100,-2111 },+ { 101,-2111 }, { 102,-2111 }, { 103,-2111 }, { 104,-2111 }, { 105,-2111 },+ { 106,-2111 }, { 107,-2111 }, { 108,-2111 }, { 109,-2111 }, { 110,-2111 },++ { 111,-2111 }, { 112,-2111 }, { 113,-2111 }, { 114,-2111 }, { 115,-2111 },+ { 116,-2111 }, { 117,-2111 }, { 118,-2111 }, { 119,-2111 }, { 120,-2111 },+ { 121,-2111 }, { 122,-2111 }, { 123,-2111 }, { 124,-2111 }, { 125,-2111 },+ { 126,-2111 }, { 127,-2111 }, { 128,-2111 }, { 129,-2111 }, { 130,-2111 },+ { 131,-2111 }, { 132,-2111 }, { 133,-2111 }, { 134,-2111 }, { 135,-2111 },+ { 136,-2111 }, { 137,-2111 }, { 138,-2111 }, { 139,-2111 }, { 140,-2111 },+ { 141,-2111 }, { 142,-2111 }, { 143,-2111 }, { 144,-2111 }, { 145,-2111 },+ { 146,-2111 }, { 147,-2111 }, { 148,-2111 }, { 149,-2111 }, { 150,-2111 },+ { 151,-2111 }, { 152,-2111 }, { 153,-2111 }, { 154,-2111 }, { 155,-2111 },+ { 156,-2111 }, { 157,-2111 }, { 158,-2111 }, { 159,-2111 }, { 160,-2111 },++ { 161,-2111 }, { 162,-2111 }, { 163,-2111 }, { 164,-2111 }, { 165,-2111 },+ { 166,-2111 }, { 167,-2111 }, { 168,-2111 }, { 169,-2111 }, { 170,-2111 },+ { 171,-2111 }, { 172,-2111 }, { 173,-2111 }, { 174,-2111 }, { 175,-2111 },+ { 176,-2111 }, { 177,-2111 }, { 178,-2111 }, { 179,-2111 }, { 180,-2111 },+ { 181,-2111 }, { 182,-2111 }, { 183,-2111 }, { 184,-2111 }, { 185,-2111 },+ { 186,-2111 }, { 187,-2111 }, { 188,-2111 }, { 189,-2111 }, { 190,-2111 },+ { 191,-2111 }, { 192,-2111 }, { 193,-2111 }, { 194,-2111 }, { 195,-2111 },+ { 196,-2111 }, { 197,-2111 }, { 198,-2111 }, { 199,-2111 }, { 200,-2111 },+ { 201,-2111 }, { 202,-2111 }, { 203,-2111 }, { 204,-2111 }, { 205,-2111 },+ { 206,-2111 }, { 207,-2111 }, { 208,-2111 }, { 209,-2111 }, { 210,-2111 },++ { 211,-2111 }, { 212,-2111 }, { 213,-2111 }, { 214,-2111 }, { 215,-2111 },+ { 216,-2111 }, { 217,-2111 }, { 218,-2111 }, { 219,-2111 }, { 220,-2111 },+ { 221,-2111 }, { 222,-2111 }, { 223,-2111 }, { 224,-2111 }, { 225,-2111 },+ { 226,-2111 }, { 227,-2111 }, { 228,-2111 }, { 229,-2111 }, { 230,-2111 },+ { 231,-2111 }, { 232,-2111 }, { 233,-2111 }, { 234,-2111 }, { 235,-2111 },+ { 236,-2111 }, { 237,-2111 }, { 238,-2111 }, { 239,-2111 }, { 240,-2111 },+ { 241,-2111 }, { 242,-2111 }, { 243,-2111 }, { 244,-2111 }, { 245,-2111 },+ { 246,-2111 }, { 247,-2111 }, { 248,-2111 }, { 249,-2111 }, { 250,-2111 },+ { 251,-2111 }, { 252,-2111 }, { 253,-2111 }, { 254,-2111 }, { 255,-2111 },+ { 256,-2111 }, { 0, 28 }, { 0,1853 }, { 1,-2369 }, { 2,-2369 },++ { 3,-2369 }, { 4,-2369 }, { 5,-2369 }, { 6,-2369 }, { 7,-2369 },+ { 8,-2369 }, { 9,-2111 }, { 10,-4453 }, { 11,-2369 }, { 12,-2111 },+ { 13,-4453 }, { 14,-2369 }, { 15,-2369 }, { 16,-2369 }, { 17,-2369 },+ { 18,-2369 }, { 19,-2369 }, { 20,-2369 }, { 21,-2369 }, { 22,-2369 },+ { 23,-2369 }, { 24,-2369 }, { 25,-2369 }, { 26,-2369 }, { 27,-2369 },+ { 28,-2369 }, { 29,-2369 }, { 30,-2369 }, { 31,-2369 }, { 32,-2111 },+ { 33,-2369 }, { 34,-2369 }, { 35,-2369 }, { 36,-2369 }, { 37,-2369 },+ { 38,-2369 }, { 39,1337 }, { 40,-2369 }, { 41,-2369 }, { 42,-2369 },+ { 43,-2369 }, { 44,-2369 }, { 45,-1595 }, { 46,-2369 }, { 47,-2369 },+ { 48,-2369 }, { 49,-2369 }, { 50,-2369 }, { 51,-2369 }, { 52,-2369 },++ { 53,-2369 }, { 54,-2369 }, { 55,-2369 }, { 56,-2369 }, { 57,-2369 },+ { 58,-2369 }, { 59,-2369 }, { 60,-2369 }, { 61,-2369 }, { 62,-2369 },+ { 63,-2369 }, { 64,-2369 }, { 65,-2369 }, { 66,-2369 }, { 67,-2369 },+ { 68,-2369 }, { 69,-2369 }, { 70,-2369 }, { 71,-2369 }, { 72,-2369 },+ { 73,-2369 }, { 74,-2369 }, { 75,-2369 }, { 76,-2369 }, { 77,-2369 },+ { 78,-2369 }, { 79,-2369 }, { 80,-2369 }, { 81,-2369 }, { 82,-2369 },+ { 83,-2369 }, { 84,-2369 }, { 85,-2369 }, { 86,-2369 }, { 87,-2369 },+ { 88,-2369 }, { 89,-2369 }, { 90,-2369 }, { 91,-2369 }, { 92,-2369 },+ { 93,-2369 }, { 94,-2369 }, { 95,-2369 }, { 96,-2369 }, { 97,-2369 },+ { 98,-2369 }, { 99,-2369 }, { 100,-2369 }, { 101,-2369 }, { 102,-2369 },++ { 103,-2369 }, { 104,-2369 }, { 105,-2369 }, { 106,-2369 }, { 107,-2369 },+ { 108,-2369 }, { 109,-2369 }, { 110,-2369 }, { 111,-2369 }, { 112,-2369 },+ { 113,-2369 }, { 114,-2369 }, { 115,-2369 }, { 116,-2369 }, { 117,-2369 },+ { 118,-2369 }, { 119,-2369 }, { 120,-2369 }, { 121,-2369 }, { 122,-2369 },+ { 123,-2369 }, { 124,-2369 }, { 125,-2369 }, { 126,-2369 }, { 127,-2369 },+ { 128,-2369 }, { 129,-2369 }, { 130,-2369 }, { 131,-2369 }, { 132,-2369 },+ { 133,-2369 }, { 134,-2369 }, { 135,-2369 }, { 136,-2369 }, { 137,-2369 },+ { 138,-2369 }, { 139,-2369 }, { 140,-2369 }, { 141,-2369 }, { 142,-2369 },+ { 143,-2369 }, { 144,-2369 }, { 145,-2369 }, { 146,-2369 }, { 147,-2369 },+ { 148,-2369 }, { 149,-2369 }, { 150,-2369 }, { 151,-2369 }, { 152,-2369 },++ { 153,-2369 }, { 154,-2369 }, { 155,-2369 }, { 156,-2369 }, { 157,-2369 },+ { 158,-2369 }, { 159,-2369 }, { 160,-2369 }, { 161,-2369 }, { 162,-2369 },+ { 163,-2369 }, { 164,-2369 }, { 165,-2369 }, { 166,-2369 }, { 167,-2369 },+ { 168,-2369 }, { 169,-2369 }, { 170,-2369 }, { 171,-2369 }, { 172,-2369 },+ { 173,-2369 }, { 174,-2369 }, { 175,-2369 }, { 176,-2369 }, { 177,-2369 },+ { 178,-2369 }, { 179,-2369 }, { 180,-2369 }, { 181,-2369 }, { 182,-2369 },+ { 183,-2369 }, { 184,-2369 }, { 185,-2369 }, { 186,-2369 }, { 187,-2369 },+ { 188,-2369 }, { 189,-2369 }, { 190,-2369 }, { 191,-2369 }, { 192,-2369 },+ { 193,-2369 }, { 194,-2369 }, { 195,-2369 }, { 196,-2369 }, { 197,-2369 },+ { 198,-2369 }, { 199,-2369 }, { 200,-2369 }, { 201,-2369 }, { 202,-2369 },++ { 203,-2369 }, { 204,-2369 }, { 205,-2369 }, { 206,-2369 }, { 207,-2369 },+ { 208,-2369 }, { 209,-2369 }, { 210,-2369 }, { 211,-2369 }, { 212,-2369 },+ { 213,-2369 }, { 214,-2369 }, { 215,-2369 }, { 216,-2369 }, { 217,-2369 },+ { 218,-2369 }, { 219,-2369 }, { 220,-2369 }, { 221,-2369 }, { 222,-2369 },+ { 223,-2369 }, { 224,-2369 }, { 225,-2369 }, { 226,-2369 }, { 227,-2369 },+ { 228,-2369 }, { 229,-2369 }, { 230,-2369 }, { 231,-2369 }, { 232,-2369 },+ { 233,-2369 }, { 234,-2369 }, { 235,-2369 }, { 236,-2369 }, { 237,-2369 },+ { 238,-2369 }, { 239,-2369 }, { 240,-2369 }, { 241,-2369 }, { 242,-2369 },+ { 243,-2369 }, { 244,-2369 }, { 245,-2369 }, { 246,-2369 }, { 247,-2369 },+ { 248,-2369 }, { 249,-2369 }, { 250,-2369 }, { 251,-2369 }, { 252,-2369 },++ { 253,-2369 }, { 254,-2369 }, { 255,-2369 }, { 256,-2369 }, { 0, 28 },+ { 0,1595 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 9,-4711 },+ { 10,-4711 }, { 0, 0 }, { 12,-4711 }, { 13,-4711 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 32,-4711 }, { 0, 0 }, { 0, 0 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 39,1337 },+ { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },++ { 45,-26753 }, { 0, 28 }, { 0,1548 }, { 1,-2674 }, { 2,-2674 },+ { 3,-2674 }, { 4,-2674 }, { 5,-2674 }, { 6,-2674 }, { 7,-2674 },+ { 8,-2674 }, { 9,-2416 }, { 10,-4758 }, { 11,-2674 }, { 12,-2416 },+ { 13,-4758 }, { 14,-2674 }, { 15,-2674 }, { 16,-2674 }, { 17,-2674 },+ { 18,-2674 }, { 19,-2674 }, { 20,-2674 }, { 21,-2674 }, { 22,-2674 },+ { 23,-2674 }, { 24,-2674 }, { 25,-2674 }, { 26,-2674 }, { 27,-2674 },+ { 28,-2674 }, { 29,-2674 }, { 30,-2674 }, { 31,-2674 }, { 32,-2416 },+ { 33,-2674 }, { 34,-2674 }, { 35,-2674 }, { 36,-2674 }, { 37,-2674 },+ { 38,-2674 }, { 39,1032 }, { 40,-2674 }, { 41,-2674 }, { 42,-2674 },+ { 43,-2674 }, { 44,-2674 }, { 45, 258 }, { 46,-2674 }, { 47,-2674 },++ { 48,-2674 }, { 49,-2674 }, { 50,-2674 }, { 51,-2674 }, { 52,-2674 },+ { 53,-2674 }, { 54,-2674 }, { 55,-2674 }, { 56,-2674 }, { 57,-2674 },+ { 58,-2674 }, { 59,-2674 }, { 60,-2674 }, { 61,-2674 }, { 62,-2674 },+ { 63,-2674 }, { 64,-2674 }, { 65,-2674 }, { 66,-2674 }, { 67,-2674 },+ { 68,-2674 }, { 69,-2674 }, { 70,-2674 }, { 71,-2674 }, { 72,-2674 },+ { 73,-2674 }, { 74,-2674 }, { 75,-2674 }, { 76,-2674 }, { 77,-2674 },+ { 78,-2674 }, { 79,-2674 }, { 80,-2674 }, { 81,-2674 }, { 82,-2674 },+ { 83,-2674 }, { 84,-2674 }, { 85,-2674 }, { 86,-2674 }, { 87,-2674 },+ { 88,-2674 }, { 89,-2674 }, { 90,-2674 }, { 91,-2674 }, { 92,-2674 },+ { 93,-2674 }, { 94,-2674 }, { 95,-2674 }, { 96,-2674 }, { 97,-2674 },++ { 98,-2674 }, { 99,-2674 }, { 100,-2674 }, { 101,-2674 }, { 102,-2674 },+ { 103,-2674 }, { 104,-2674 }, { 105,-2674 }, { 106,-2674 }, { 107,-2674 },+ { 108,-2674 }, { 109,-2674 }, { 110,-2674 }, { 111,-2674 }, { 112,-2674 },+ { 113,-2674 }, { 114,-2674 }, { 115,-2674 }, { 116,-2674 }, { 117,-2674 },+ { 118,-2674 }, { 119,-2674 }, { 120,-2674 }, { 121,-2674 }, { 122,-2674 },+ { 123,-2674 }, { 124,-2674 }, { 125,-2674 }, { 126,-2674 }, { 127,-2674 },+ { 128,-2674 }, { 129,-2674 }, { 130,-2674 }, { 131,-2674 }, { 132,-2674 },+ { 133,-2674 }, { 134,-2674 }, { 135,-2674 }, { 136,-2674 }, { 137,-2674 },+ { 138,-2674 }, { 139,-2674 }, { 140,-2674 }, { 141,-2674 }, { 142,-2674 },+ { 143,-2674 }, { 144,-2674 }, { 145,-2674 }, { 146,-2674 }, { 147,-2674 },++ { 148,-2674 }, { 149,-2674 }, { 150,-2674 }, { 151,-2674 }, { 152,-2674 },+ { 153,-2674 }, { 154,-2674 }, { 155,-2674 }, { 156,-2674 }, { 157,-2674 },+ { 158,-2674 }, { 159,-2674 }, { 160,-2674 }, { 161,-2674 }, { 162,-2674 },+ { 163,-2674 }, { 164,-2674 }, { 165,-2674 }, { 166,-2674 }, { 167,-2674 },+ { 168,-2674 }, { 169,-2674 }, { 170,-2674 }, { 171,-2674 }, { 172,-2674 },+ { 173,-2674 }, { 174,-2674 }, { 175,-2674 }, { 176,-2674 }, { 177,-2674 },+ { 178,-2674 }, { 179,-2674 }, { 180,-2674 }, { 181,-2674 }, { 182,-2674 },+ { 183,-2674 }, { 184,-2674 }, { 185,-2674 }, { 186,-2674 }, { 187,-2674 },+ { 188,-2674 }, { 189,-2674 }, { 190,-2674 }, { 191,-2674 }, { 192,-2674 },+ { 193,-2674 }, { 194,-2674 }, { 195,-2674 }, { 196,-2674 }, { 197,-2674 },++ { 198,-2674 }, { 199,-2674 }, { 200,-2674 }, { 201,-2674 }, { 202,-2674 },+ { 203,-2674 }, { 204,-2674 }, { 205,-2674 }, { 206,-2674 }, { 207,-2674 },+ { 208,-2674 }, { 209,-2674 }, { 210,-2674 }, { 211,-2674 }, { 212,-2674 },+ { 213,-2674 }, { 214,-2674 }, { 215,-2674 }, { 216,-2674 }, { 217,-2674 },+ { 218,-2674 }, { 219,-2674 }, { 220,-2674 }, { 221,-2674 }, { 222,-2674 },+ { 223,-2674 }, { 224,-2674 }, { 225,-2674 }, { 226,-2674 }, { 227,-2674 },+ { 228,-2674 }, { 229,-2674 }, { 230,-2674 }, { 231,-2674 }, { 232,-2674 },+ { 233,-2674 }, { 234,-2674 }, { 235,-2674 }, { 236,-2674 }, { 237,-2674 },+ { 238,-2674 }, { 239,-2674 }, { 240,-2674 }, { 241,-2674 }, { 242,-2674 },+ { 243,-2674 }, { 244,-2674 }, { 245,-2674 }, { 246,-2674 }, { 247,-2674 },++ { 248,-2674 }, { 249,-2674 }, { 250,-2674 }, { 251,-2674 }, { 252,-2674 },+ { 253,-2674 }, { 254,-2674 }, { 255,-2674 }, { 256,-2674 }, { 0, 28 },+ { 0,1290 }, { 1,-2932 }, { 2,-2932 }, { 3,-2932 }, { 4,-2932 },+ { 5,-2932 }, { 6,-2932 }, { 7,-2932 }, { 8,-2932 }, { 9,-2674 },+ { 10,-5016 }, { 11,-2932 }, { 12,-2674 }, { 13,-5016 }, { 14,-2932 },+ { 15,-2932 }, { 16,-2932 }, { 17,-2932 }, { 18,-2932 }, { 19,-2932 },+ { 20,-2932 }, { 21,-2932 }, { 22,-2932 }, { 23,-2932 }, { 24,-2932 },+ { 25,-2932 }, { 26,-2932 }, { 27,-2932 }, { 28,-2932 }, { 29,-2932 },+ { 30,-2932 }, { 31,-2932 }, { 32,-2674 }, { 33,-2932 }, { 34,-2932 },+ { 35,-2932 }, { 36,-2932 }, { 37,-2932 }, { 38,-2932 }, { 39,-2416 },++ { 40,-2932 }, { 41,-2932 }, { 42,-2932 }, { 43,-2932 }, { 44,-2932 },+ { 45, 0 }, { 46,-2932 }, { 47,-2932 }, { 48,-2932 }, { 49,-2932 },+ { 50,-2932 }, { 51,-2932 }, { 52,-2932 }, { 53,-2932 }, { 54,-2932 },+ { 55,-2932 }, { 56,-2932 }, { 57,-2932 }, { 58,-2932 }, { 59,-2932 },+ { 60,-2932 }, { 61,-2932 }, { 62,-2932 }, { 63,-2932 }, { 64,-2932 },+ { 65,-2932 }, { 66,-2932 }, { 67,-2932 }, { 68,-2932 }, { 69,-2932 },+ { 70,-2932 }, { 71,-2932 }, { 72,-2932 }, { 73,-2932 }, { 74,-2932 },+ { 75,-2932 }, { 76,-2932 }, { 77,-2932 }, { 78,-2932 }, { 79,-2932 },+ { 80,-2932 }, { 81,-2932 }, { 82,-2932 }, { 83,-2932 }, { 84,-2932 },+ { 85,-2932 }, { 86,-2932 }, { 87,-2932 }, { 88,-2932 }, { 89,-2932 },++ { 90,-2932 }, { 91,-2932 }, { 92,-2932 }, { 93,-2932 }, { 94,-2932 },+ { 95,-2932 }, { 96,-2932 }, { 97,-2932 }, { 98,-2932 }, { 99,-2932 },+ { 100,-2932 }, { 101,-2932 }, { 102,-2932 }, { 103,-2932 }, { 104,-2932 },+ { 105,-2932 }, { 106,-2932 }, { 107,-2932 }, { 108,-2932 }, { 109,-2932 },+ { 110,-2932 }, { 111,-2932 }, { 112,-2932 }, { 113,-2932 }, { 114,-2932 },+ { 115,-2932 }, { 116,-2932 }, { 117,-2932 }, { 118,-2932 }, { 119,-2932 },+ { 120,-2932 }, { 121,-2932 }, { 122,-2932 }, { 123,-2932 }, { 124,-2932 },+ { 125,-2932 }, { 126,-2932 }, { 127,-2932 }, { 128,-2932 }, { 129,-2932 },+ { 130,-2932 }, { 131,-2932 }, { 132,-2932 }, { 133,-2932 }, { 134,-2932 },+ { 135,-2932 }, { 136,-2932 }, { 137,-2932 }, { 138,-2932 }, { 139,-2932 },++ { 140,-2932 }, { 141,-2932 }, { 142,-2932 }, { 143,-2932 }, { 144,-2932 },+ { 145,-2932 }, { 146,-2932 }, { 147,-2932 }, { 148,-2932 }, { 149,-2932 },+ { 150,-2932 }, { 151,-2932 }, { 152,-2932 }, { 153,-2932 }, { 154,-2932 },+ { 155,-2932 }, { 156,-2932 }, { 157,-2932 }, { 158,-2932 }, { 159,-2932 },+ { 160,-2932 }, { 161,-2932 }, { 162,-2932 }, { 163,-2932 }, { 164,-2932 },+ { 165,-2932 }, { 166,-2932 }, { 167,-2932 }, { 168,-2932 }, { 169,-2932 },+ { 170,-2932 }, { 171,-2932 }, { 172,-2932 }, { 173,-2932 }, { 174,-2932 },+ { 175,-2932 }, { 176,-2932 }, { 177,-2932 }, { 178,-2932 }, { 179,-2932 },+ { 180,-2932 }, { 181,-2932 }, { 182,-2932 }, { 183,-2932 }, { 184,-2932 },+ { 185,-2932 }, { 186,-2932 }, { 187,-2932 }, { 188,-2932 }, { 189,-2932 },++ { 190,-2932 }, { 191,-2932 }, { 192,-2932 }, { 193,-2932 }, { 194,-2932 },+ { 195,-2932 }, { 196,-2932 }, { 197,-2932 }, { 198,-2932 }, { 199,-2932 },+ { 200,-2932 }, { 201,-2932 }, { 202,-2932 }, { 203,-2932 }, { 204,-2932 },+ { 205,-2932 }, { 206,-2932 }, { 207,-2932 }, { 208,-2932 }, { 209,-2932 },+ { 210,-2932 }, { 211,-2932 }, { 212,-2932 }, { 213,-2932 }, { 214,-2932 },+ { 215,-2932 }, { 216,-2932 }, { 217,-2932 }, { 218,-2932 }, { 219,-2932 },+ { 220,-2932 }, { 221,-2932 }, { 222,-2932 }, { 223,-2932 }, { 224,-2932 },+ { 225,-2932 }, { 226,-2932 }, { 227,-2932 }, { 228,-2932 }, { 229,-2932 },+ { 230,-2932 }, { 231,-2932 }, { 232,-2932 }, { 233,-2932 }, { 234,-2932 },+ { 235,-2932 }, { 236,-2932 }, { 237,-2932 }, { 238,-2932 }, { 239,-2932 },++ { 240,-2932 }, { 241,-2932 }, { 242,-2932 }, { 243,-2932 }, { 244,-2932 },+ { 245,-2932 }, { 246,-2932 }, { 247,-2932 }, { 248,-2932 }, { 249,-2932 },+ { 250,-2932 }, { 251,-2932 }, { 252,-2932 }, { 253,-2932 }, { 254,-2932 },+ { 255,-2932 }, { 256,-2932 }, { 0, 55 }, { 0,1032 }, { 1,-2158 },+ { 2,-2158 }, { 3,-2158 }, { 4,-2158 }, { 5,-2158 }, { 6,-2158 },+ { 7,-2158 }, { 8,-2158 }, { 9,-1900 }, { 10,-1642 }, { 11,-2158 },+ { 12,-1900 }, { 13,-1642 }, { 14,-2158 }, { 15,-2158 }, { 16,-2158 },+ { 17,-2158 }, { 18,-2158 }, { 19,-2158 }, { 20,-2158 }, { 21,-2158 },+ { 22,-2158 }, { 23,-2158 }, { 24,-2158 }, { 25,-2158 }, { 26,-2158 },+ { 27,-2158 }, { 28,-2158 }, { 29,-2158 }, { 30,-2158 }, { 31,-2158 },++ { 32,-1900 }, { 33,-2158 }, { 34,-2158 }, { 35,-2158 }, { 36,-2158 },+ { 37,-2158 }, { 38,-2158 }, { 39,-3706 }, { 40,-2158 }, { 41,-2158 },+ { 42,-2158 }, { 43,-2158 }, { 44,-2158 }, { 45,-1595 }, { 46,-2158 },+ { 47,-2158 }, { 48,-2158 }, { 49,-2158 }, { 50,-2158 }, { 51,-2158 },+ { 52,-2158 }, { 53,-2158 }, { 54,-2158 }, { 55,-2158 }, { 56,-2158 },+ { 57,-2158 }, { 58,-2158 }, { 59,-2158 }, { 60,-2158 }, { 61,-2158 },+ { 62,-2158 }, { 63,-2158 }, { 64,-2158 }, { 65,-2158 }, { 66,-2158 },+ { 67,-2158 }, { 68,-2158 }, { 69,-2158 }, { 70,-2158 }, { 71,-2158 },+ { 72,-2158 }, { 73,-2158 }, { 74,-2158 }, { 75,-2158 }, { 76,-2158 },+ { 77,-2158 }, { 78,-2158 }, { 79,-2158 }, { 80,-2158 }, { 81,-2158 },++ { 82,-2158 }, { 83,-2158 }, { 84,-2158 }, { 85,-2158 }, { 86,-2158 },+ { 87,-2158 }, { 88,-2158 }, { 89,-2158 }, { 90,-2158 }, { 91,-2158 },+ { 92,-2158 }, { 93,-2158 }, { 94,-2158 }, { 95,-2158 }, { 96,-2158 },+ { 97,-2158 }, { 98,-2158 }, { 99,-2158 }, { 100,-2158 }, { 101,-2158 },+ { 102,-2158 }, { 103,-2158 }, { 104,-2158 }, { 105,-2158 }, { 106,-2158 },+ { 107,-2158 }, { 108,-2158 }, { 109,-2158 }, { 110,-2158 }, { 111,-2158 },+ { 112,-2158 }, { 113,-2158 }, { 114,-2158 }, { 115,-2158 }, { 116,-2158 },+ { 117,-2158 }, { 118,-2158 }, { 119,-2158 }, { 120,-2158 }, { 121,-2158 },+ { 122,-2158 }, { 123,-2158 }, { 124,-2158 }, { 125,-2158 }, { 126,-2158 },+ { 127,-2158 }, { 128,-2158 }, { 129,-2158 }, { 130,-2158 }, { 131,-2158 },++ { 132,-2158 }, { 133,-2158 }, { 134,-2158 }, { 135,-2158 }, { 136,-2158 },+ { 137,-2158 }, { 138,-2158 }, { 139,-2158 }, { 140,-2158 }, { 141,-2158 },+ { 142,-2158 }, { 143,-2158 }, { 144,-2158 }, { 145,-2158 }, { 146,-2158 },+ { 147,-2158 }, { 148,-2158 }, { 149,-2158 }, { 150,-2158 }, { 151,-2158 },+ { 152,-2158 }, { 153,-2158 }, { 154,-2158 }, { 155,-2158 }, { 156,-2158 },+ { 157,-2158 }, { 158,-2158 }, { 159,-2158 }, { 160,-2158 }, { 161,-2158 },+ { 162,-2158 }, { 163,-2158 }, { 164,-2158 }, { 165,-2158 }, { 166,-2158 },+ { 167,-2158 }, { 168,-2158 }, { 169,-2158 }, { 170,-2158 }, { 171,-2158 },+ { 172,-2158 }, { 173,-2158 }, { 174,-2158 }, { 175,-2158 }, { 176,-2158 },+ { 177,-2158 }, { 178,-2158 }, { 179,-2158 }, { 180,-2158 }, { 181,-2158 },++ { 182,-2158 }, { 183,-2158 }, { 184,-2158 }, { 185,-2158 }, { 186,-2158 },+ { 187,-2158 }, { 188,-2158 }, { 189,-2158 }, { 190,-2158 }, { 191,-2158 },+ { 192,-2158 }, { 193,-2158 }, { 194,-2158 }, { 195,-2158 }, { 196,-2158 },+ { 197,-2158 }, { 198,-2158 }, { 199,-2158 }, { 200,-2158 }, { 201,-2158 },+ { 202,-2158 }, { 203,-2158 }, { 204,-2158 }, { 205,-2158 }, { 206,-2158 },+ { 207,-2158 }, { 208,-2158 }, { 209,-2158 }, { 210,-2158 }, { 211,-2158 },+ { 212,-2158 }, { 213,-2158 }, { 214,-2158 }, { 215,-2158 }, { 216,-2158 },+ { 217,-2158 }, { 218,-2158 }, { 219,-2158 }, { 220,-2158 }, { 221,-2158 },+ { 222,-2158 }, { 223,-2158 }, { 224,-2158 }, { 225,-2158 }, { 226,-2158 },+ { 227,-2158 }, { 228,-2158 }, { 229,-2158 }, { 230,-2158 }, { 231,-2158 },++ { 232,-2158 }, { 233,-2158 }, { 234,-2158 }, { 235,-2158 }, { 236,-2158 },+ { 237,-2158 }, { 238,-2158 }, { 239,-2158 }, { 240,-2158 }, { 241,-2158 },+ { 242,-2158 }, { 243,-2158 }, { 244,-2158 }, { 245,-2158 }, { 246,-2158 },+ { 247,-2158 }, { 248,-2158 }, { 249,-2158 }, { 250,-2158 }, { 251,-2158 },+ { 252,-2158 }, { 253,-2158 }, { 254,-2158 }, { 255,-2158 }, { 256,-2158 },+ { 0, 55 }, { 0, 774 }, { 1,-27567 }, { 2,-27567 }, { 3,-27567 },+ { 4,-27567 }, { 5,-27567 }, { 6,-27567 }, { 7,-27567 }, { 8,-27567 },+ { 9,-27567 }, { 10,-27567 }, { 11,-27567 }, { 12,-27567 }, { 13,-27567 },+ { 14,-27567 }, { 15,-27567 }, { 16,-27567 }, { 17,-27567 }, { 18,-27567 },+ { 19,-27567 }, { 20,-27567 }, { 21,-27567 }, { 22,-27567 }, { 23,-27567 },++ { 24,-27567 }, { 25,-27567 }, { 26,-27567 }, { 27,-27567 }, { 28,-27567 },+ { 29,-27567 }, { 30,-27567 }, { 31,-27567 }, { 32,-27567 }, { 33,-27567 },+ { 34,-27567 }, { 35,-27567 }, { 36,-27567 }, { 37,-27567 }, { 38,-27567 },+ { 0, 0 }, { 40,-27567 }, { 41,-27567 }, { 42,-27567 }, { 43,-27567 },+ { 44,-27567 }, { 45,-27567 }, { 46,-27567 }, { 47,-27567 }, { 48,-27567 },+ { 49,-27567 }, { 50,-27567 }, { 51,-27567 }, { 52,-27567 }, { 53,-27567 },+ { 54,-27567 }, { 55,-27567 }, { 56,-27567 }, { 57,-27567 }, { 58,-27567 },+ { 59,-27567 }, { 60,-27567 }, { 61,-27567 }, { 62,-27567 }, { 63,-27567 },+ { 64,-27567 }, { 65,-27567 }, { 66,-27567 }, { 67,-27567 }, { 68,-27567 },+ { 69,-27567 }, { 70,-27567 }, { 71,-27567 }, { 72,-27567 }, { 73,-27567 },++ { 74,-27567 }, { 75,-27567 }, { 76,-27567 }, { 77,-27567 }, { 78,-27567 },+ { 79,-27567 }, { 80,-27567 }, { 81,-27567 }, { 82,-27567 }, { 83,-27567 },+ { 84,-27567 }, { 85,-27567 }, { 86,-27567 }, { 87,-27567 }, { 88,-27567 },+ { 89,-27567 }, { 90,-27567 }, { 91,-27567 }, { 92,-27567 }, { 93,-27567 },+ { 94,-27567 }, { 95,-27567 }, { 96,-27567 }, { 97,-27567 }, { 98,-27567 },+ { 99,-27567 }, { 100,-27567 }, { 101,-27567 }, { 102,-27567 }, { 103,-27567 },+ { 104,-27567 }, { 105,-27567 }, { 106,-27567 }, { 107,-27567 }, { 108,-27567 },+ { 109,-27567 }, { 110,-27567 }, { 111,-27567 }, { 112,-27567 }, { 113,-27567 },+ { 114,-27567 }, { 115,-27567 }, { 116,-27567 }, { 117,-27567 }, { 118,-27567 },+ { 119,-27567 }, { 120,-27567 }, { 121,-27567 }, { 122,-27567 }, { 123,-27567 },++ { 124,-27567 }, { 125,-27567 }, { 126,-27567 }, { 127,-27567 }, { 128,-27567 },+ { 129,-27567 }, { 130,-27567 }, { 131,-27567 }, { 132,-27567 }, { 133,-27567 },+ { 134,-27567 }, { 135,-27567 }, { 136,-27567 }, { 137,-27567 }, { 138,-27567 },+ { 139,-27567 }, { 140,-27567 }, { 141,-27567 }, { 142,-27567 }, { 143,-27567 },+ { 144,-27567 }, { 145,-27567 }, { 146,-27567 }, { 147,-27567 }, { 148,-27567 },+ { 149,-27567 }, { 150,-27567 }, { 151,-27567 }, { 152,-27567 }, { 153,-27567 },+ { 154,-27567 }, { 155,-27567 }, { 156,-27567 }, { 157,-27567 }, { 158,-27567 },+ { 159,-27567 }, { 160,-27567 }, { 161,-27567 }, { 162,-27567 }, { 163,-27567 },+ { 164,-27567 }, { 165,-27567 }, { 166,-27567 }, { 167,-27567 }, { 168,-27567 },+ { 169,-27567 }, { 170,-27567 }, { 171,-27567 }, { 172,-27567 }, { 173,-27567 },++ { 174,-27567 }, { 175,-27567 }, { 176,-27567 }, { 177,-27567 }, { 178,-27567 },+ { 179,-27567 }, { 180,-27567 }, { 181,-27567 }, { 182,-27567 }, { 183,-27567 },+ { 184,-27567 }, { 185,-27567 }, { 186,-27567 }, { 187,-27567 }, { 188,-27567 },+ { 189,-27567 }, { 190,-27567 }, { 191,-27567 }, { 192,-27567 }, { 193,-27567 },+ { 194,-27567 }, { 195,-27567 }, { 196,-27567 }, { 197,-27567 }, { 198,-27567 },+ { 199,-27567 }, { 200,-27567 }, { 201,-27567 }, { 202,-27567 }, { 203,-27567 },+ { 204,-27567 }, { 205,-27567 }, { 206,-27567 }, { 207,-27567 }, { 208,-27567 },+ { 209,-27567 }, { 210,-27567 }, { 211,-27567 }, { 212,-27567 }, { 213,-27567 },+ { 214,-27567 }, { 215,-27567 }, { 216,-27567 }, { 217,-27567 }, { 218,-27567 },+ { 219,-27567 }, { 220,-27567 }, { 221,-27567 }, { 222,-27567 }, { 223,-27567 },++ { 224,-27567 }, { 225,-27567 }, { 226,-27567 }, { 227,-27567 }, { 228,-27567 },+ { 229,-27567 }, { 230,-27567 }, { 231,-27567 }, { 232,-27567 }, { 233,-27567 },+ { 234,-27567 }, { 235,-27567 }, { 236,-27567 }, { 237,-27567 }, { 238,-27567 },+ { 239,-27567 }, { 240,-27567 }, { 241,-27567 }, { 242,-27567 }, { 243,-27567 },+ { 244,-27567 }, { 245,-27567 }, { 246,-27567 }, { 247,-27567 }, { 248,-27567 },+ { 249,-27567 }, { 250,-27567 }, { 251,-27567 }, { 252,-27567 }, { 253,-27567 },+ { 254,-27567 }, { 255,-27567 }, { 256,-27567 }, { 0, 28 }, { 0, 516 },+ { 1,-1595 }, { 2,-1595 }, { 3,-1595 }, { 4,-1595 }, { 5,-1595 },+ { 6,-1595 }, { 7,-1595 }, { 8,-1595 }, { 9,-1337 }, { 10,-1079 },+ { 11,-1595 }, { 12,-1337 }, { 13,-1079 }, { 14,-1595 }, { 15,-1595 },++ { 16,-1595 }, { 17,-1595 }, { 18,-1595 }, { 19,-1595 }, { 20,-1595 },+ { 21,-1595 }, { 22,-1595 }, { 23,-1595 }, { 24,-1595 }, { 25,-1595 },+ { 26,-1595 }, { 27,-1595 }, { 28,-1595 }, { 29,-1595 }, { 30,-1595 },+ { 31,-1595 }, { 32,-1337 }, { 33,-1595 }, { 34,-1595 }, { 35,-1595 },+ { 36,-1595 }, { 37,-1595 }, { 38,-1595 }, { 39,-3190 }, { 40,-1595 },+ { 41,-1595 }, { 42,-1595 }, { 43,-1595 }, { 44,-1595 }, { 45,-1032 },+ { 46,-1595 }, { 47,-1595 }, { 48,-1595 }, { 49,-1595 }, { 50,-1595 },+ { 51,-1595 }, { 52,-1595 }, { 53,-1595 }, { 54,-1595 }, { 55,-1595 },+ { 56,-1595 }, { 57,-1595 }, { 58,-1595 }, { 59,-1595 }, { 60,-1595 },+ { 61,-1595 }, { 62,-1595 }, { 63,-1595 }, { 64,-1595 }, { 65,-1595 },++ { 66,-1595 }, { 67,-1595 }, { 68,-1595 }, { 69,-1595 }, { 70,-1595 },+ { 71,-1595 }, { 72,-1595 }, { 73,-1595 }, { 74,-1595 }, { 75,-1595 },+ { 76,-1595 }, { 77,-1595 }, { 78,-1595 }, { 79,-1595 }, { 80,-1595 },+ { 81,-1595 }, { 82,-1595 }, { 83,-1595 }, { 84,-1595 }, { 85,-1595 },+ { 86,-1595 }, { 87,-1595 }, { 88,-1595 }, { 89,-1595 }, { 90,-1595 },+ { 91,-1595 }, { 92,-1595 }, { 93,-1595 }, { 94,-1595 }, { 95,-1595 },+ { 96,-1595 }, { 97,-1595 }, { 98,-1595 }, { 99,-1595 }, { 100,-1595 },+ { 101,-1595 }, { 102,-1595 }, { 103,-1595 }, { 104,-1595 }, { 105,-1595 },+ { 106,-1595 }, { 107,-1595 }, { 108,-1595 }, { 109,-1595 }, { 110,-1595 },+ { 111,-1595 }, { 112,-1595 }, { 113,-1595 }, { 114,-1595 }, { 115,-1595 },++ { 116,-1595 }, { 117,-1595 }, { 118,-1595 }, { 119,-1595 }, { 120,-1595 },+ { 121,-1595 }, { 122,-1595 }, { 123,-1595 }, { 124,-1595 }, { 125,-1595 },+ { 126,-1595 }, { 127,-1595 }, { 128,-1595 }, { 129,-1595 }, { 130,-1595 },+ { 131,-1595 }, { 132,-1595 }, { 133,-1595 }, { 134,-1595 }, { 135,-1595 },+ { 136,-1595 }, { 137,-1595 }, { 138,-1595 }, { 139,-1595 }, { 140,-1595 },+ { 141,-1595 }, { 142,-1595 }, { 143,-1595 }, { 144,-1595 }, { 145,-1595 },+ { 146,-1595 }, { 147,-1595 }, { 148,-1595 }, { 149,-1595 }, { 150,-1595 },+ { 151,-1595 }, { 152,-1595 }, { 153,-1595 }, { 154,-1595 }, { 155,-1595 },+ { 156,-1595 }, { 157,-1595 }, { 158,-1595 }, { 159,-1595 }, { 160,-1595 },+ { 161,-1595 }, { 162,-1595 }, { 163,-1595 }, { 164,-1595 }, { 165,-1595 },++ { 166,-1595 }, { 167,-1595 }, { 168,-1595 }, { 169,-1595 }, { 170,-1595 },+ { 171,-1595 }, { 172,-1595 }, { 173,-1595 }, { 174,-1595 }, { 175,-1595 },+ { 176,-1595 }, { 177,-1595 }, { 178,-1595 }, { 179,-1595 }, { 180,-1595 },+ { 181,-1595 }, { 182,-1595 }, { 183,-1595 }, { 184,-1595 }, { 185,-1595 },+ { 186,-1595 }, { 187,-1595 }, { 188,-1595 }, { 189,-1595 }, { 190,-1595 },+ { 191,-1595 }, { 192,-1595 }, { 193,-1595 }, { 194,-1595 }, { 195,-1595 },+ { 196,-1595 }, { 197,-1595 }, { 198,-1595 }, { 199,-1595 }, { 200,-1595 },+ { 201,-1595 }, { 202,-1595 }, { 203,-1595 }, { 204,-1595 }, { 205,-1595 },+ { 206,-1595 }, { 207,-1595 }, { 208,-1595 }, { 209,-1595 }, { 210,-1595 },+ { 211,-1595 }, { 212,-1595 }, { 213,-1595 }, { 214,-1595 }, { 215,-1595 },++ { 216,-1595 }, { 217,-1595 }, { 218,-1595 }, { 219,-1595 }, { 220,-1595 },+ { 221,-1595 }, { 222,-1595 }, { 223,-1595 }, { 224,-1595 }, { 225,-1595 },+ { 226,-1595 }, { 227,-1595 }, { 228,-1595 }, { 229,-1595 }, { 230,-1595 },+ { 231,-1595 }, { 232,-1595 }, { 233,-1595 }, { 234,-1595 }, { 235,-1595 },+ { 236,-1595 }, { 237,-1595 }, { 238,-1595 }, { 239,-1595 }, { 240,-1595 },+ { 241,-1595 }, { 242,-1595 }, { 243,-1595 }, { 244,-1595 }, { 245,-1595 },+ { 246,-1595 }, { 247,-1595 }, { 248,-1595 }, { 249,-1595 }, { 250,-1595 },+ { 251,-1595 }, { 252,-1595 }, { 253,-1595 }, { 254,-1595 }, { 255,-1595 },+ { 256,-1595 }, { 0, 28 }, { 0, 258 }, { 1,-28081 }, { 2,-28081 },+ { 3,-28081 }, { 4,-28081 }, { 5,-28081 }, { 6,-28081 }, { 7,-28081 },++ { 8,-28081 }, { 9,-28081 }, { 10,-28081 }, { 11,-28081 }, { 12,-28081 },+ { 13,-28081 }, { 14,-28081 }, { 15,-28081 }, { 16,-28081 }, { 17,-28081 },+ { 18,-28081 }, { 19,-28081 }, { 20,-28081 }, { 21,-28081 }, { 22,-28081 },+ { 23,-28081 }, { 24,-28081 }, { 25,-28081 }, { 26,-28081 }, { 27,-28081 },+ { 28,-28081 }, { 29,-28081 }, { 30,-28081 }, { 31,-28081 }, { 32,-28081 },+ { 33,-28081 }, { 34,-28081 }, { 35,-28081 }, { 36,-28081 }, { 37,-28081 },+ { 38,-28081 }, { 0, 0 }, { 40,-28081 }, { 41,-28081 }, { 42,-28081 },+ { 43,-28081 }, { 44,-28081 }, { 45,-28081 }, { 46,-28081 }, { 47,-28081 },+ { 48,-28081 }, { 49,-28081 }, { 50,-28081 }, { 51,-28081 }, { 52,-28081 },+ { 53,-28081 }, { 54,-28081 }, { 55,-28081 }, { 56,-28081 }, { 57,-28081 },++ { 58,-28081 }, { 59,-28081 }, { 60,-28081 }, { 61,-28081 }, { 62,-28081 },+ { 63,-28081 }, { 64,-28081 }, { 65,-28081 }, { 66,-28081 }, { 67,-28081 },+ { 68,-28081 }, { 69,-28081 }, { 70,-28081 }, { 71,-28081 }, { 72,-28081 },+ { 73,-28081 }, { 74,-28081 }, { 75,-28081 }, { 76,-28081 }, { 77,-28081 },+ { 78,-28081 }, { 79,-28081 }, { 80,-28081 }, { 81,-28081 }, { 82,-28081 },+ { 83,-28081 }, { 84,-28081 }, { 85,-28081 }, { 86,-28081 }, { 87,-28081 },+ { 88,-28081 }, { 89,-28081 }, { 90,-28081 }, { 91,-28081 }, { 92,-28081 },+ { 93,-28081 }, { 94,-28081 }, { 95,-28081 }, { 96,-28081 }, { 97,-28081 },+ { 98,-28081 }, { 99,-28081 }, { 100,-28081 }, { 101,-28081 }, { 102,-28081 },+ { 103,-28081 }, { 104,-28081 }, { 105,-28081 }, { 106,-28081 }, { 107,-28081 },++ { 108,-28081 }, { 109,-28081 }, { 110,-28081 }, { 111,-28081 }, { 112,-28081 },+ { 113,-28081 }, { 114,-28081 }, { 115,-28081 }, { 116,-28081 }, { 117,-28081 },+ { 118,-28081 }, { 119,-28081 }, { 120,-28081 }, { 121,-28081 }, { 122,-28081 },+ { 123,-28081 }, { 124,-28081 }, { 125,-28081 }, { 126,-28081 }, { 127,-28081 },+ { 128,-28081 }, { 129,-28081 }, { 130,-28081 }, { 131,-28081 }, { 132,-28081 },+ { 133,-28081 }, { 134,-28081 }, { 135,-28081 }, { 136,-28081 }, { 137,-28081 },+ { 138,-28081 }, { 139,-28081 }, { 140,-28081 }, { 141,-28081 }, { 142,-28081 },+ { 143,-28081 }, { 144,-28081 }, { 145,-28081 }, { 146,-28081 }, { 147,-28081 },+ { 148,-28081 }, { 149,-28081 }, { 150,-28081 }, { 151,-28081 }, { 152,-28081 },+ { 153,-28081 }, { 154,-28081 }, { 155,-28081 }, { 156,-28081 }, { 157,-28081 },++ { 158,-28081 }, { 159,-28081 }, { 160,-28081 }, { 161,-28081 }, { 162,-28081 },+ { 163,-28081 }, { 164,-28081 }, { 165,-28081 }, { 166,-28081 }, { 167,-28081 },+ { 168,-28081 }, { 169,-28081 }, { 170,-28081 }, { 171,-28081 }, { 172,-28081 },+ { 173,-28081 }, { 174,-28081 }, { 175,-28081 }, { 176,-28081 }, { 177,-28081 },+ { 178,-28081 }, { 179,-28081 }, { 180,-28081 }, { 181,-28081 }, { 182,-28081 },+ { 183,-28081 }, { 184,-28081 }, { 185,-28081 }, { 186,-28081 }, { 187,-28081 },+ { 188,-28081 }, { 189,-28081 }, { 190,-28081 }, { 191,-28081 }, { 192,-28081 },+ { 193,-28081 }, { 194,-28081 }, { 195,-28081 }, { 196,-28081 }, { 197,-28081 },+ { 198,-28081 }, { 199,-28081 }, { 200,-28081 }, { 201,-28081 }, { 202,-28081 },+ { 203,-28081 }, { 204,-28081 }, { 205,-28081 }, { 206,-28081 }, { 207,-28081 },++ { 208,-28081 }, { 209,-28081 }, { 210,-28081 }, { 211,-28081 }, { 212,-28081 },+ { 213,-28081 }, { 214,-28081 }, { 215,-28081 }, { 216,-28081 }, { 217,-28081 },+ { 218,-28081 }, { 219,-28081 }, { 220,-28081 }, { 221,-28081 }, { 222,-28081 },+ { 223,-28081 }, { 224,-28081 }, { 225,-28081 }, { 226,-28081 }, { 227,-28081 },+ { 228,-28081 }, { 229,-28081 }, { 230,-28081 }, { 231,-28081 }, { 232,-28081 },+ { 233,-28081 }, { 234,-28081 }, { 235,-28081 }, { 236,-28081 }, { 237,-28081 },+ { 238,-28081 }, { 239,-28081 }, { 240,-28081 }, { 241,-28081 }, { 242,-28081 },+ { 243,-28081 }, { 244,-28081 }, { 245,-28081 }, { 246,-28081 }, { 247,-28081 },+ { 248,-28081 }, { 249,-28081 }, { 250,-28081 }, { 251,-28081 }, { 252,-28081 },+ { 253,-28081 }, { 254,-28081 }, { 255,-28081 }, { 256,-28081 }, { 257, 81 },++ { 1, 0 }, };++static yyconst struct yy_trans_info *yy_start_state_list[27] =+ {+ &yy_transition[1],+ &yy_transition[3],+ &yy_transition[261],+ &yy_transition[519],+ &yy_transition[777],+ &yy_transition[1035],+ &yy_transition[1293],+ &yy_transition[1551],+ &yy_transition[1809],+ &yy_transition[2067],+ &yy_transition[2325],+ &yy_transition[2583],+ &yy_transition[2841],+ &yy_transition[3099],+ &yy_transition[3357],+ &yy_transition[3615],+ &yy_transition[3873],+ &yy_transition[4131],+ &yy_transition[4389],+ &yy_transition[4647],+ &yy_transition[4905],+ &yy_transition[5163],+ &yy_transition[5421],+ &yy_transition[5679],+ &yy_transition[5937],+ &yy_transition[6195],+ &yy_transition[6453],++ } ;++/* The intent behind this definition is that it'll catch+ * any uses of REJECT which flex missed.+ */+#define REJECT reject_used_but_not_detected+#define yymore() yymore_used_but_not_detected+#define YY_MORE_ADJ 0+#define YY_RESTORE_YY_MORE_OFFSET+#line 1 "scan.l"+#line 2 "scan.l"+/*-------------------------------------------------------------------------+ *+ * scan.l+ * lexical scanner for PostgreSQL+ *+ * NOTE NOTE NOTE:+ *+ * The rules in this file must be kept in sync with psql's lexer!!!+ *+ * The rules are designed so that the scanner never has to backtrack,+ * in the sense that there is always a rule that can match the input+ * consumed so far (the rule action may internally throw back some input+ * with yyless(), however). As explained in the flex manual, this makes+ * for a useful speed increase --- about a third faster than a plain -CF+ * lexer, in simple testing. The extra complexity is mostly in the rules+ * for handling float numbers and continued string literals. If you change+ * the lexical rules, verify that you haven't broken the no-backtrack+ * property by running flex with the "-b" option and checking that the+ * resulting "lex.backup" file says that no backing up is needed. (As of+ * Postgres 9.2, this check is made automatically by the Makefile.)+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * IDENTIFICATION+ * src/backend/parser/scan.l+ *+ *-------------------------------------------------------------------------+ */+#include "postgres.h"++#include <ctype.h>+#include <unistd.h>++#include "parser/parser.h" /* only needed for GUC variables */+#include "parser/scanner.h"+#include "parser/scansup.h"+#include "mb/pg_wchar.h"+++/* Avoid exit() on fatal scanner errors (a bit ugly -- see yy_fatal_error) */+#undef fprintf+#define fprintf(file, fmt, msg) fprintf_to_ereport(fmt, msg)++static void+fprintf_to_ereport(const char *fmt, const char *msg)+{+ ereport(ERROR, (errmsg_internal("%s", msg)));+}++/*+ * GUC variables. This is a DIRECT violation of the warning given at the+ * head of gram.y, ie flex/bison code must not depend on any GUC variables;+ * as such, changing their values can induce very unintuitive behavior.+ * But we shall have to live with it as a short-term thing until the switch+ * to SQL-standard string syntax is complete.+ */+__thread int backslash_quote = BACKSLASH_QUOTE_SAFE_ENCODING;++__thread bool escape_string_warning = true;++__thread bool standard_conforming_strings = true;+++/*+ * Set the type of YYSTYPE.+ */+#define YYSTYPE core_YYSTYPE++/*+ * Set the type of yyextra. All state variables used by the scanner should+ * be in yyextra, *not* statically allocated.+ */+#define YY_EXTRA_TYPE core_yy_extra_type *++/*+ * Each call to core_yylex must set yylloc to the location of the found token+ * (expressed as a byte offset from the start of the input text).+ * When we parse a token that requires multiple lexer rules to process,+ * this should be done in the first such rule, else yylloc will point+ * into the middle of the token.+ */+#define SET_YYLLOC() (*(yylloc) = yytext - yyextra->scanbuf)++/*+ * Advance yylloc by the given number of bytes.+ */+#define ADVANCE_YYLLOC(delta) ( *(yylloc) += (delta) )++#define startlit() ( yyextra->literallen = 0 )+static void addlit(char *ytext, int yleng, core_yyscan_t yyscanner);+static void addlitchar(unsigned char ychar, core_yyscan_t yyscanner);+static char *litbufdup(core_yyscan_t yyscanner);+static char *litbuf_udeescape(unsigned char escape, core_yyscan_t yyscanner);+static unsigned char unescape_single_char(unsigned char c, core_yyscan_t yyscanner);+static int process_integer_literal(const char *token, YYSTYPE *lval);+static bool is_utf16_surrogate_first(pg_wchar c);+static bool is_utf16_surrogate_second(pg_wchar c);+static pg_wchar surrogate_pair_to_codepoint(pg_wchar first, pg_wchar second);+static void addunicode(pg_wchar c, yyscan_t yyscanner);+static bool check_uescapechar(unsigned char escape);++#define yyerror(msg) scanner_yyerror(msg, yyscanner)++#define lexer_errposition() scanner_errposition(*(yylloc), yyscanner)++static void check_string_escape_warning(unsigned char ychar, core_yyscan_t yyscanner);+static void check_escape_warning(core_yyscan_t yyscanner);++/*+ * Work around a bug in flex 2.5.35: it emits a couple of functions that+ * it forgets to emit declarations for. Since we use -Wmissing-prototypes,+ * this would cause warnings. Providing our own declarations should be+ * harmless even when the bug gets fixed.+ */+extern int core_yyget_column(yyscan_t yyscanner);+extern void core_yyset_column(int column_no, yyscan_t yyscanner);++#define YY_NO_INPUT 1+/*+ * OK, here is a short description of lex/flex rules behavior.+ * The longest pattern which matches an input string is always chosen.+ * For equal-length patterns, the first occurring in the rules list is chosen.+ * INITIAL is the starting state, to which all non-conditional rules apply.+ * Exclusive states change parsing rules while the state is active. When in+ * an exclusive state, only those rules defined for that state apply.+ *+ * We use exclusive states for quoted strings, extended comments,+ * and to eliminate parsing troubles for numeric strings.+ * Exclusive states:+ * <xb> bit string literal+ * <xc> extended C-style comments+ * <xd> delimited identifiers (double-quoted identifiers)+ * <xh> hexadecimal numeric string+ * <xq> standard quoted strings+ * <xe> extended quoted strings (support backslash escape sequences)+ * <xdolq> $foo$ quoted strings+ * <xui> quoted identifier with Unicode escapes+ * <xuiend> end of a quoted identifier with Unicode escapes, UESCAPE can follow+ * <xus> quoted string with Unicode escapes+ * <xusend> end of a quoted string with Unicode escapes, UESCAPE can follow+ * <xeu> Unicode surrogate pair in extended quoted string+ *+ * Remember to add an <<EOF>> case whenever you add a new exclusive state!+ * The default one is probably not the right thing.+ */+++++++++++++/*+ * In order to make the world safe for Windows and Mac clients as well as+ * Unix ones, we accept either \n or \r as a newline. A DOS-style \r\n+ * sequence will be seen as two successive newlines, but that doesn't cause+ * any problems. Comments that start with -- and extend to the next+ * newline are treated as equivalent to a single whitespace character.+ *+ * NOTE a fine point: if there is no newline following --, we will absorb+ * everything to the end of the input as a comment. This is correct. Older+ * versions of Postgres failed to recognize -- as a comment if the input+ * did not end with a newline.+ *+ * XXX perhaps \f (formfeed) should be treated as a newline as well?+ *+ * XXX if you change the set of whitespace characters, fix scanner_isspace()+ * to agree, and see also the plpgsql lexer.+ */+/*+ * SQL requires at least one newline in the whitespace separating+ * string literals that are to be concatenated. Silly, but who are we+ * to argue? Note that {whitespace_with_newline} should not have * after+ * it, whereas {whitespace} should generally have a * after it...+ */+/*+ * To ensure that {quotecontinue} can be scanned without having to back up+ * if the full pattern isn't matched, we include trailing whitespace in+ * {quotestop}. This matches all cases where {quotecontinue} fails to match,+ * except for {quote} followed by whitespace and just one "-" (not two,+ * which would start a {comment}). To cover that we have {quotefail}.+ * The actions for {quotestop} and {quotefail} must throw back characters+ * beyond the quote proper.+ */+/* Bit string+ * It is tempting to scan the string for only those characters+ * which are allowed. However, this leads to silently swallowed+ * characters if illegal characters are included in the string.+ * For example, if xbinside is [01] then B'ABCD' is interpreted+ * as a zero-length string, and the ABCD' is lost!+ * Better to pass the string forward and let the input routines+ * validate the contents.+ */+/* Hexadecimal number */+/* National character */+/* Quoted string that allows backslash escapes */+/* Normalized escaped string */+/* Extended quote+ * xqdouble implements embedded quote, ''''+ */+/* $foo$ style quotes ("dollar quoting")+ * The quoted string starts with $foo$ where "foo" is an optional string+ * in the form of an identifier, except that it may not contain "$",+ * and extends to the first occurrence of an identical string.+ * There is *no* processing of the quoted text.+ *+ * {dolqfailed} is an error rule to avoid scanner backup when {dolqdelim}+ * fails to match its trailing "$".+ */+/* Double quote+ * Allows embedded spaces and other special characters into identifiers.+ */+/* Unicode escapes */+/* error rule to avoid backup */+/* Quoted identifier with Unicode escapes */+/* Quoted string with Unicode escapes */+/* Optional UESCAPE after a quoted string or identifier with Unicode escapes. */+/* error rule to avoid backup */+/* C-style comments+ *+ * The "extended comment" syntax closely resembles allowable operator syntax.+ * The tricky part here is to get lex to recognize a string starting with+ * slash-star as a comment, when interpreting it as an operator would produce+ * a longer match --- remember lex will prefer a longer match! Also, if we+ * have something like plus-slash-star, lex will think this is a 3-character+ * operator whereas we want to see it as a + operator and a comment start.+ * The solution is two-fold:+ * 1. append {op_chars}* to xcstart so that it matches as much text as+ * {operator} would. Then the tie-breaker (first matching rule of same+ * length) ensures xcstart wins. We put back the extra stuff with yyless()+ * in case it contains a star-slash that should terminate the comment.+ * 2. In the operator rule, check for slash-star within the operator, and+ * if found throw it back with yyless(). This handles the plus-slash-star+ * problem.+ * Dash-dash comments have similar interactions with the operator rule.+ */+/* Assorted special-case operators and operator-like tokens */+/*+ * "self" is the set of chars that should be returned as single-character+ * tokens. "op_chars" is the set of chars that can make up "Op" tokens,+ * which can be one or more characters long (but if a single-char token+ * appears in the "self" set, it is not to be returned as an Op). Note+ * that the sets overlap, but each has some chars that are not in the other.+ *+ * If you change either set, adjust the character lists appearing in the+ * rule for "operator"!+ */+/* we no longer allow unary minus in numbers.+ * instead we pass it separately to parser. there it gets+ * coerced via doNegate() -- Leon aug 20 1999+ *+* {decimalfail} is used because we would like "1..10" to lex as 1, dot_dot, 10.+*+ * {realfail1} and {realfail2} are added to prevent the need for scanner+ * backup when the {real} rule fails to match completely.+ */+/*+ * Dollar quoted strings are totally opaque, and no escaping is done on them.+ * Other quoted strings must allow some special characters such as single-quote+ * and newline.+ * Embedded single-quotes are implemented both in the SQL standard+ * style of two adjacent single quotes "''" and in the Postgres/Java style+ * of escaped-quote "\'".+ * Other embedded escaped characters are matched explicitly and the leading+ * backslash is dropped from the string.+ * Note that xcstart must appear before operator, as explained above!+ * Also whitespace (comment) must appear before operator.+ */+#line 8763 "scan.c"++#define INITIAL 0+#define xb 1+#define xc 2+#define xd 3+#define xh 4+#define xe 5+#define xq 6+#define xdolq 7+#define xui 8+#define xuiend 9+#define xus 10+#define xusend 11+#define xeu 12++#ifndef YY_NO_UNISTD_H+/* Special case for "unistd.h", since it is non-ANSI. We include it way+ * down here because we want the user's section 1 to have been scanned first.+ * The user has a chance to override it with an option.+ */+#include <unistd.h>+#endif++#ifndef YY_EXTRA_TYPE+#define YY_EXTRA_TYPE void *+#endif++/* Holds the entire state of the reentrant scanner. */+struct yyguts_t+ {++ /* User-defined. Not touched by flex. */+ YY_EXTRA_TYPE yyextra_r;++ /* The rest are the same as the globals declared in the non-reentrant scanner. */+ FILE *yyin_r, *yyout_r;+ size_t yy_buffer_stack_top; /**< index of top of stack. */+ size_t yy_buffer_stack_max; /**< capacity of stack. */+ YY_BUFFER_STATE * yy_buffer_stack; /**< Stack as an array. */+ char yy_hold_char;+ yy_size_t yy_n_chars;+ yy_size_t yyleng_r;+ char *yy_c_buf_p;+ int yy_init;+ int yy_start;+ int yy_did_buffer_switch_on_eof;+ int yy_start_stack_ptr;+ int yy_start_stack_depth;+ int *yy_start_stack;+ yy_state_type yy_last_accepting_state;+ char* yy_last_accepting_cpos;++ int yylineno_r;+ int yy_flex_debug_r;++ char *yytext_r;+ int yy_more_flag;+ int yy_more_len;++ YYSTYPE * yylval_r;++ YYLTYPE * yylloc_r;++ }; /* end struct yyguts_t */++static int yy_init_globals (yyscan_t yyscanner );++ /* This must go here because YYSTYPE and YYLTYPE are included+ * from bison output in section 1.*/+ # define yylval yyg->yylval_r+ + # define yylloc yyg->yylloc_r+ +int core_yylex_init (yyscan_t* scanner);++int core_yylex_init_extra (YY_EXTRA_TYPE user_defined,yyscan_t* scanner);++/* Accessor methods to globals.+ These are made visible to non-reentrant scanners for convenience. */++int core_yylex_destroy (yyscan_t yyscanner );++int core_yyget_debug (yyscan_t yyscanner );++void core_yyset_debug (int debug_flag ,yyscan_t yyscanner );++YY_EXTRA_TYPE core_yyget_extra (yyscan_t yyscanner );++void core_yyset_extra (YY_EXTRA_TYPE user_defined ,yyscan_t yyscanner );++FILE *core_yyget_in (yyscan_t yyscanner );++void core_yyset_in (FILE * in_str ,yyscan_t yyscanner );++FILE *core_yyget_out (yyscan_t yyscanner );++void core_yyset_out (FILE * out_str ,yyscan_t yyscanner );++yy_size_t core_yyget_leng (yyscan_t yyscanner );++char *core_yyget_text (yyscan_t yyscanner );++int core_yyget_lineno (yyscan_t yyscanner );++void core_yyset_lineno (int line_number ,yyscan_t yyscanner );++YYSTYPE * core_yyget_lval (yyscan_t yyscanner );++void core_yyset_lval (YYSTYPE * yylval_param ,yyscan_t yyscanner );++ YYLTYPE *core_yyget_lloc (yyscan_t yyscanner );+ + void core_yyset_lloc (YYLTYPE * yylloc_param ,yyscan_t yyscanner );+ +/* Macros after this point can all be overridden by user definitions in+ * section 1.+ */++#ifndef YY_SKIP_YYWRAP+#ifdef __cplusplus+extern "C" int core_yywrap (yyscan_t yyscanner );+#else+extern int core_yywrap (yyscan_t yyscanner );+#endif+#endif++#ifndef yytext_ptr+static void yy_flex_strncpy (char *,yyconst char *,int ,yyscan_t yyscanner);+#endif++#ifdef YY_NEED_STRLEN+static int yy_flex_strlen (yyconst char * ,yyscan_t yyscanner);+#endif++#ifndef YY_NO_INPUT++#ifdef __cplusplus+static int yyinput (yyscan_t yyscanner );+#else+static int input (yyscan_t yyscanner );+#endif++#endif++/* Amount of stuff to slurp up with each read. */+#ifndef YY_READ_BUF_SIZE+#define YY_READ_BUF_SIZE 8192+#endif++/* Copy whatever the last rule matched to the standard output. */+#ifndef ECHO+/* This used to be an fputs(), but since the string might contain NUL's,+ * we now use fwrite().+ */+#define ECHO fwrite( yytext, yyleng, 1, yyout )+#endif++/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL,+ * is returned in "result".+ */+#ifndef YY_INPUT+#define YY_INPUT(buf,result,max_size) \+ if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \+ { \+ int c = '*'; \+ yy_size_t n; \+ for ( n = 0; n < max_size && \+ (c = getc( yyin )) != EOF && c != '\n'; ++n ) \+ buf[n] = (char) c; \+ if ( c == '\n' ) \+ buf[n++] = (char) c; \+ if ( c == EOF && ferror( yyin ) ) \+ YY_FATAL_ERROR( "input in flex scanner failed" ); \+ result = n; \+ } \+ else \+ { \+ errno=0; \+ while ( (result = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \+ { \+ if( errno != EINTR) \+ { \+ YY_FATAL_ERROR( "input in flex scanner failed" ); \+ break; \+ } \+ errno=0; \+ clearerr(yyin); \+ } \+ }\+\++#endif++/* No semi-colon after return; correct usage is to write "yyterminate();" -+ * we don't want an extra ';' after the "return" because that will cause+ * some compilers to complain about unreachable statements.+ */+#ifndef yyterminate+#define yyterminate() return YY_NULL+#endif++/* Number of entries by which start-condition stack grows. */+#ifndef YY_START_STACK_INCR+#define YY_START_STACK_INCR 25+#endif++/* Report a fatal error. */+#ifndef YY_FATAL_ERROR+#define YY_FATAL_ERROR(msg) yy_fatal_error( msg , yyscanner)+#endif++/* end tables serialization structures and prototypes */++/* Default declaration of generated scanner - a define so the user can+ * easily add parameters.+ */+#ifndef YY_DECL+#define YY_DECL_IS_OURS 1++extern int core_yylex \+ (YYSTYPE * yylval_param,YYLTYPE * yylloc_param ,yyscan_t yyscanner);++#define YY_DECL int core_yylex \+ (YYSTYPE * yylval_param, YYLTYPE * yylloc_param , yyscan_t yyscanner)+#endif /* !YY_DECL */++/* Code executed at the beginning of each rule, after yytext and yyleng+ * have been set up.+ */+#ifndef YY_USER_ACTION+#define YY_USER_ACTION+#endif++/* Code executed at the end of each rule. */+#ifndef YY_BREAK+#define YY_BREAK break;+#endif++#define YY_RULE_SETUP \+ YY_USER_ACTION++/** The main scanner function which does all the work.+ */+YY_DECL+{+ register yy_state_type yy_current_state;+ register char *yy_cp, *yy_bp;+ register int yy_act;+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;++#line 396 "scan.l"+++#line 9017 "scan.c"++ yylval = yylval_param;++ yylloc = yylloc_param;++ if ( !yyg->yy_init )+ {+ yyg->yy_init = 1;++#ifdef YY_USER_INIT+ YY_USER_INIT;+#endif++ if ( ! yyg->yy_start )+ yyg->yy_start = 1; /* first start state */++ if ( ! yyin )+ yyin = stdin;++ if ( ! yyout )+ yyout = stdout;++ if ( ! YY_CURRENT_BUFFER ) {+ core_yyensure_buffer_stack (yyscanner);+ YY_CURRENT_BUFFER_LVALUE =+ core_yy_create_buffer(yyin,YY_BUF_SIZE ,yyscanner);+ }++ core_yy_load_buffer_state(yyscanner );+ }++ while ( 1 ) /* loops until end-of-file is reached */+ {+ yy_cp = yyg->yy_c_buf_p;++ /* Support of yytext. */+ *yy_cp = yyg->yy_hold_char;++ /* yy_bp points to the position in yy_ch_buf of the start of+ * the current run.+ */+ yy_bp = yy_cp;++ yy_current_state = yy_start_state_list[yyg->yy_start];+yy_match:+ {+ register yyconst struct yy_trans_info *yy_trans_info;++ register YY_CHAR yy_c;++ for ( yy_c = YY_SC_TO_UI(*yy_cp);+ (yy_trans_info = &yy_current_state[(unsigned int) yy_c])->+ yy_verify == yy_c;+ yy_c = YY_SC_TO_UI(*++yy_cp) )+ yy_current_state += yy_trans_info->yy_nxt;+ }++yy_find_action:+ yy_act = yy_current_state[-1].yy_nxt;++ YY_DO_BEFORE_ACTION;++do_action: /* This label is used only to access EOF actions. */++ switch ( yy_act )+ { /* beginning of action switch */+case 1:+/* rule 1 can match eol */+YY_RULE_SETUP+#line 398 "scan.l"+{+ /* ignore */+ }+ YY_BREAK+case 2:+YY_RULE_SETUP+#line 402 "scan.l"+{+ /* Set location in case of syntax error in comment */+ SET_YYLLOC();+ yyextra->xcdepth = 0;+ BEGIN(xc);+ /* Put back any characters past slash-star; see above */+ yyless(2);+ }+ YY_BREAK+case 3:+YY_RULE_SETUP+#line 411 "scan.l"+{+ (yyextra->xcdepth)++;+ /* Put back any characters past slash-star; see above */+ yyless(2);+ }+ YY_BREAK+case 4:+YY_RULE_SETUP+#line 417 "scan.l"+{+ if (yyextra->xcdepth <= 0)+ BEGIN(INITIAL);+ else+ (yyextra->xcdepth)--;+ }+ YY_BREAK+case 5:+/* rule 5 can match eol */+YY_RULE_SETUP+#line 424 "scan.l"+{+ /* ignore */+ }+ YY_BREAK+case 6:+YY_RULE_SETUP+#line 428 "scan.l"+{+ /* ignore */+ }+ YY_BREAK+case 7:+YY_RULE_SETUP+#line 432 "scan.l"+{+ /* ignore */+ }+ YY_BREAK+case YY_STATE_EOF(xc):+#line 436 "scan.l"+{ yyerror("unterminated /* comment"); }+ YY_BREAK+case 8:+YY_RULE_SETUP+#line 438 "scan.l"+{+ /* Binary bit type.+ * At some point we should simply pass the string+ * forward to the parser and label it there.+ * In the meantime, place a leading "b" on the string+ * to mark it for the input routine as a binary string.+ */+ SET_YYLLOC();+ BEGIN(xb);+ startlit();+ addlitchar('b', yyscanner);+ }+ YY_BREAK+case 9:+/* rule 9 can match eol */+#line 451 "scan.l"+case 10:+/* rule 10 can match eol */+YY_RULE_SETUP+#line 451 "scan.l"+{+ yyless(1);+ BEGIN(INITIAL);+ yylval->str = litbufdup(yyscanner);+ return BCONST;+ }+ YY_BREAK+case 11:+/* rule 11 can match eol */+#line 458 "scan.l"+case 12:+/* rule 12 can match eol */+YY_RULE_SETUP+#line 458 "scan.l"+{+ addlit(yytext, yyleng, yyscanner);+ }+ YY_BREAK+case 13:+/* rule 13 can match eol */+#line 462 "scan.l"+case 14:+/* rule 14 can match eol */+YY_RULE_SETUP+#line 462 "scan.l"+{+ /* ignore */+ }+ YY_BREAK+case YY_STATE_EOF(xb):+#line 465 "scan.l"+{ yyerror("unterminated bit string literal"); }+ YY_BREAK+case 15:+YY_RULE_SETUP+#line 467 "scan.l"+{+ /* Hexadecimal bit type.+ * At some point we should simply pass the string+ * forward to the parser and label it there.+ * In the meantime, place a leading "x" on the string+ * to mark it for the input routine as a hex string.+ */+ SET_YYLLOC();+ BEGIN(xh);+ startlit();+ addlitchar('x', yyscanner);+ }+ YY_BREAK+case 16:+/* rule 16 can match eol */+#line 480 "scan.l"+case 17:+/* rule 17 can match eol */+YY_RULE_SETUP+#line 480 "scan.l"+{+ yyless(1);+ BEGIN(INITIAL);+ yylval->str = litbufdup(yyscanner);+ return XCONST;+ }+ YY_BREAK+case YY_STATE_EOF(xh):+#line 486 "scan.l"+{ yyerror("unterminated hexadecimal string literal"); }+ YY_BREAK+case 18:+YY_RULE_SETUP+#line 488 "scan.l"+{+ /* National character.+ * We will pass this along as a normal character string,+ * but preceded with an internally-generated "NCHAR".+ */+ const ScanKeyword *keyword;++ SET_YYLLOC();+ yyless(1); /* eat only 'n' this time */++ keyword = ScanKeywordLookup("nchar",+ yyextra->keywords,+ yyextra->num_keywords);+ if (keyword != NULL)+ {+ yylval->keyword = keyword->name;+ return keyword->value;+ }+ else+ {+ /* If NCHAR isn't a keyword, just return "n" */+ yylval->str = pstrdup("n");+ return IDENT;+ }+ }+ YY_BREAK+case 19:+YY_RULE_SETUP+#line 514 "scan.l"+{+ yyextra->warn_on_first_escape = true;+ yyextra->saw_non_ascii = false;+ SET_YYLLOC();+ if (yyextra->standard_conforming_strings)+ BEGIN(xq);+ else+ BEGIN(xe);+ startlit();+ }+ YY_BREAK+case 20:+YY_RULE_SETUP+#line 524 "scan.l"+{+ yyextra->warn_on_first_escape = false;+ yyextra->saw_non_ascii = false;+ SET_YYLLOC();+ BEGIN(xe);+ startlit();+ }+ YY_BREAK+case 21:+YY_RULE_SETUP+#line 531 "scan.l"+{+ SET_YYLLOC();+ if (!yyextra->standard_conforming_strings)+ ereport(ERROR,+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),+ errmsg("unsafe use of string constant with Unicode escapes"),+ errdetail("String constants with Unicode escapes cannot be used when standard_conforming_strings is off."),+ lexer_errposition()));+ BEGIN(xus);+ startlit();+ }+ YY_BREAK+case 22:+/* rule 22 can match eol */+#line 543 "scan.l"+case 23:+/* rule 23 can match eol */+YY_RULE_SETUP+#line 543 "scan.l"+{+ yyless(1);+ BEGIN(INITIAL);+ /*+ * check that the data remains valid if it might have been+ * made invalid by unescaping any chars.+ */+ if (yyextra->saw_non_ascii)+ pg_verifymbstr(yyextra->literalbuf,+ yyextra->literallen,+ false);+ yylval->str = litbufdup(yyscanner);+ return SCONST;+ }+ YY_BREAK+case 24:+/* rule 24 can match eol */+#line 558 "scan.l"+case 25:+/* rule 25 can match eol */+YY_RULE_SETUP+#line 558 "scan.l"+{+ /* throw back all but the quote */+ yyless(1);+ /* xusend state looks for possible UESCAPE */+ BEGIN(xusend);+ }+ YY_BREAK+case 26:+/* rule 26 can match eol */+YY_RULE_SETUP+#line 564 "scan.l"+{ /* stay in xusend state over whitespace */ }+ YY_BREAK+case 27:+#line 566 "scan.l"+case 28:+/* rule 28 can match eol */+#line 567 "scan.l"+case YY_STATE_EOF(xusend):+#line 567 "scan.l"+{+ /* no UESCAPE after the quote, throw back everything */+ yyless(0);+ BEGIN(INITIAL);+ yylval->str = litbuf_udeescape('\\', yyscanner);+ return SCONST;+ }+ YY_BREAK+case 29:+/* rule 29 can match eol */+YY_RULE_SETUP+#line 574 "scan.l"+{+ /* found UESCAPE after the end quote */+ BEGIN(INITIAL);+ if (!check_uescapechar(yytext[yyleng-2]))+ {+ SET_YYLLOC();+ ADVANCE_YYLLOC(yyleng-2);+ yyerror("invalid Unicode escape character");+ }+ yylval->str = litbuf_udeescape(yytext[yyleng-2], yyscanner);+ return SCONST;+ }+ YY_BREAK+case 30:+YY_RULE_SETUP+#line 586 "scan.l"+{+ addlitchar('\'', yyscanner);+ }+ YY_BREAK+case 31:+/* rule 31 can match eol */+YY_RULE_SETUP+#line 589 "scan.l"+{+ addlit(yytext, yyleng, yyscanner);+ }+ YY_BREAK+case 32:+/* rule 32 can match eol */+YY_RULE_SETUP+#line 592 "scan.l"+{+ addlit(yytext, yyleng, yyscanner);+ }+ YY_BREAK+case 33:+YY_RULE_SETUP+#line 595 "scan.l"+{+ pg_wchar c = strtoul(yytext+2, NULL, 16);++ check_escape_warning(yyscanner);++ if (is_utf16_surrogate_first(c))+ {+ yyextra->utf16_first_part = c;+ BEGIN(xeu);+ }+ else if (is_utf16_surrogate_second(c))+ yyerror("invalid Unicode surrogate pair");+ else+ addunicode(c, yyscanner);+ }+ YY_BREAK+case 34:+YY_RULE_SETUP+#line 610 "scan.l"+{+ pg_wchar c = strtoul(yytext+2, NULL, 16);++ if (!is_utf16_surrogate_second(c))+ yyerror("invalid Unicode surrogate pair");++ c = surrogate_pair_to_codepoint(yyextra->utf16_first_part, c);++ addunicode(c, yyscanner);++ BEGIN(xe);+ }+ YY_BREAK+case 35:+YY_RULE_SETUP+#line 622 "scan.l"+{ yyerror("invalid Unicode surrogate pair"); }+ YY_BREAK+case 36:+/* rule 36 can match eol */+YY_RULE_SETUP+#line 623 "scan.l"+{ yyerror("invalid Unicode surrogate pair"); }+ YY_BREAK+case YY_STATE_EOF(xeu):+#line 624 "scan.l"+{ yyerror("invalid Unicode surrogate pair"); }+ YY_BREAK+case 37:+YY_RULE_SETUP+#line 625 "scan.l"+{+ ereport(ERROR,+ (errcode(ERRCODE_INVALID_ESCAPE_SEQUENCE),+ errmsg("invalid Unicode escape"),+ errhint("Unicode escapes must be \\uXXXX or \\UXXXXXXXX."),+ lexer_errposition()));+ }+ YY_BREAK+case 38:+/* rule 38 can match eol */+YY_RULE_SETUP+#line 632 "scan.l"+{+ if (yytext[1] == '\'')+ {+ if (yyextra->backslash_quote == BACKSLASH_QUOTE_OFF ||+ (yyextra->backslash_quote == BACKSLASH_QUOTE_SAFE_ENCODING &&+ PG_ENCODING_IS_CLIENT_ONLY(pg_get_client_encoding())))+ ereport(ERROR,+ (errcode(ERRCODE_NONSTANDARD_USE_OF_ESCAPE_CHARACTER),+ errmsg("unsafe use of \\' in a string literal"),+ errhint("Use '' to write quotes in strings. \\' is insecure in client-only encodings."),+ lexer_errposition()));+ }+ check_string_escape_warning(yytext[1], yyscanner);+ addlitchar(unescape_single_char(yytext[1], yyscanner),+ yyscanner);+ }+ YY_BREAK+case 39:+YY_RULE_SETUP+#line 648 "scan.l"+{+ unsigned char c = strtoul(yytext+1, NULL, 8);++ check_escape_warning(yyscanner);+ addlitchar(c, yyscanner);+ if (c == '\0' || IS_HIGHBIT_SET(c))+ yyextra->saw_non_ascii = true;+ }+ YY_BREAK+case 40:+YY_RULE_SETUP+#line 656 "scan.l"+{+ unsigned char c = strtoul(yytext+2, NULL, 16);++ check_escape_warning(yyscanner);+ addlitchar(c, yyscanner);+ if (c == '\0' || IS_HIGHBIT_SET(c))+ yyextra->saw_non_ascii = true;+ }+ YY_BREAK+case 41:+/* rule 41 can match eol */+YY_RULE_SETUP+#line 664 "scan.l"+{+ /* ignore */+ }+ YY_BREAK+case 42:+YY_RULE_SETUP+#line 667 "scan.l"+{+ /* This is only needed for \ just before EOF */+ addlitchar(yytext[0], yyscanner);+ }+ YY_BREAK+case YY_STATE_EOF(xq):+case YY_STATE_EOF(xe):+case YY_STATE_EOF(xus):+#line 671 "scan.l"+{ yyerror("unterminated quoted string"); }+ YY_BREAK+case 43:+YY_RULE_SETUP+#line 673 "scan.l"+{+ SET_YYLLOC();+ yyextra->dolqstart = pstrdup(yytext);+ BEGIN(xdolq);+ startlit();+ }+ YY_BREAK+case 44:+YY_RULE_SETUP+#line 679 "scan.l"+{+ SET_YYLLOC();+ /* throw back all but the initial "$" */+ yyless(1);+ /* and treat it as {other} */+ return yytext[0];+ }+ YY_BREAK+case 45:+YY_RULE_SETUP+#line 686 "scan.l"+{+ if (strcmp(yytext, yyextra->dolqstart) == 0)+ {+ pfree(yyextra->dolqstart);+ yyextra->dolqstart = NULL;+ BEGIN(INITIAL);+ yylval->str = litbufdup(yyscanner);+ return SCONST;+ }+ else+ {+ /*+ * When we fail to match $...$ to dolqstart, transfer+ * the $... part to the output, but put back the final+ * $ for rescanning. Consider $delim$...$junk$delim$+ */+ addlit(yytext, yyleng-1, yyscanner);+ yyless(yyleng-1);+ }+ }+ YY_BREAK+case 46:+/* rule 46 can match eol */+YY_RULE_SETUP+#line 706 "scan.l"+{+ addlit(yytext, yyleng, yyscanner);+ }+ YY_BREAK+case 47:+YY_RULE_SETUP+#line 709 "scan.l"+{+ addlit(yytext, yyleng, yyscanner);+ }+ YY_BREAK+case 48:+YY_RULE_SETUP+#line 712 "scan.l"+{+ /* This is only needed for $ inside the quoted text */+ addlitchar(yytext[0], yyscanner);+ }+ YY_BREAK+case YY_STATE_EOF(xdolq):+#line 716 "scan.l"+{ yyerror("unterminated dollar-quoted string"); }+ YY_BREAK+case 49:+YY_RULE_SETUP+#line 718 "scan.l"+{+ SET_YYLLOC();+ BEGIN(xd);+ startlit();+ }+ YY_BREAK+case 50:+YY_RULE_SETUP+#line 723 "scan.l"+{+ SET_YYLLOC();+ BEGIN(xui);+ startlit();+ }+ YY_BREAK+case 51:+YY_RULE_SETUP+#line 728 "scan.l"+{+ char *ident;++ BEGIN(INITIAL);+ if (yyextra->literallen == 0)+ yyerror("zero-length delimited identifier");+ ident = litbufdup(yyscanner);+ if (yyextra->literallen >= NAMEDATALEN)+ truncate_identifier(ident, yyextra->literallen, true);+ yylval->str = ident;+ return IDENT;+ }+ YY_BREAK+case 52:+YY_RULE_SETUP+#line 740 "scan.l"+{+ yyless(1);+ /* xuiend state looks for possible UESCAPE */+ BEGIN(xuiend);+ }+ YY_BREAK+case 53:+/* rule 53 can match eol */+YY_RULE_SETUP+#line 745 "scan.l"+{ /* stay in xuiend state over whitespace */ }+ YY_BREAK+case 54:+#line 747 "scan.l"+case 55:+/* rule 55 can match eol */+#line 748 "scan.l"+case YY_STATE_EOF(xuiend):+#line 748 "scan.l"+{+ /* no UESCAPE after the quote, throw back everything */+ char *ident;+ int identlen;++ yyless(0);++ BEGIN(INITIAL);+ if (yyextra->literallen == 0)+ yyerror("zero-length delimited identifier");+ ident = litbuf_udeescape('\\', yyscanner);+ identlen = strlen(ident);+ if (identlen >= NAMEDATALEN)+ truncate_identifier(ident, identlen, true);+ yylval->str = ident;+ return IDENT;+ }+ YY_BREAK+case 56:+/* rule 56 can match eol */+YY_RULE_SETUP+#line 765 "scan.l"+{+ /* found UESCAPE after the end quote */+ char *ident;+ int identlen;++ BEGIN(INITIAL);+ if (yyextra->literallen == 0)+ yyerror("zero-length delimited identifier");+ if (!check_uescapechar(yytext[yyleng-2]))+ {+ SET_YYLLOC();+ ADVANCE_YYLLOC(yyleng-2);+ yyerror("invalid Unicode escape character");+ }+ ident = litbuf_udeescape(yytext[yyleng - 2], yyscanner);+ identlen = strlen(ident);+ if (identlen >= NAMEDATALEN)+ truncate_identifier(ident, identlen, true);+ yylval->str = ident;+ return IDENT;+ }+ YY_BREAK+case 57:+YY_RULE_SETUP+#line 786 "scan.l"+{+ addlitchar('"', yyscanner);+ }+ YY_BREAK+case 58:+/* rule 58 can match eol */+YY_RULE_SETUP+#line 789 "scan.l"+{+ addlit(yytext, yyleng, yyscanner);+ }+ YY_BREAK+case YY_STATE_EOF(xd):+case YY_STATE_EOF(xui):+#line 792 "scan.l"+{ yyerror("unterminated quoted identifier"); }+ YY_BREAK+case 59:+YY_RULE_SETUP+#line 794 "scan.l"+{+ char *ident;++ SET_YYLLOC();+ /* throw back all but the initial u/U */+ yyless(1);+ /* and treat it as {identifier} */+ ident = downcase_truncate_identifier(yytext, yyleng, true);+ yylval->str = ident;+ return IDENT;+ }+ YY_BREAK+case 60:+YY_RULE_SETUP+#line 806 "scan.l"+{+ /* ignore E */+ return yytext[1];+ }+ YY_BREAK+case 61:+YY_RULE_SETUP+#line 811 "scan.l"+{+ SET_YYLLOC();+ return TYPECAST;+ }+ YY_BREAK+case 62:+YY_RULE_SETUP+#line 816 "scan.l"+{+ SET_YYLLOC();+ return DOT_DOT;+ }+ YY_BREAK+case 63:+YY_RULE_SETUP+#line 821 "scan.l"+{+ SET_YYLLOC();+ return COLON_EQUALS;+ }+ YY_BREAK+case 64:+YY_RULE_SETUP+#line 826 "scan.l"+{+ SET_YYLLOC();+ return EQUALS_GREATER;+ }+ YY_BREAK+case 65:+YY_RULE_SETUP+#line 831 "scan.l"+{+ SET_YYLLOC();+ return LESS_EQUALS;+ }+ YY_BREAK+case 66:+YY_RULE_SETUP+#line 836 "scan.l"+{+ SET_YYLLOC();+ return GREATER_EQUALS;+ }+ YY_BREAK+case 67:+YY_RULE_SETUP+#line 841 "scan.l"+{+ /* We accept both "<>" and "!=" as meaning NOT_EQUALS */+ SET_YYLLOC();+ return NOT_EQUALS;+ }+ YY_BREAK+case 68:+YY_RULE_SETUP+#line 847 "scan.l"+{+ /* We accept both "<>" and "!=" as meaning NOT_EQUALS */+ SET_YYLLOC();+ return NOT_EQUALS;+ }+ YY_BREAK+case 69:+YY_RULE_SETUP+#line 853 "scan.l"+{+ SET_YYLLOC();+ return yytext[0];+ }+ YY_BREAK+case 70:+YY_RULE_SETUP+#line 858 "scan.l"+{+ /*+ * Check for embedded slash-star or dash-dash; those+ * are comment starts, so operator must stop there.+ * Note that slash-star or dash-dash at the first+ * character will match a prior rule, not this one.+ */+ int nchars = yyleng;+ char *slashstar = strstr(yytext, "/*");+ char *dashdash = strstr(yytext, "--");++ if (slashstar && dashdash)+ {+ /* if both appear, take the first one */+ if (slashstar > dashdash)+ slashstar = dashdash;+ }+ else if (!slashstar)+ slashstar = dashdash;+ if (slashstar)+ nchars = slashstar - yytext;++ /*+ * For SQL compatibility, '+' and '-' cannot be the+ * last char of a multi-char operator unless the operator+ * contains chars that are not in SQL operators.+ * The idea is to lex '=-' as two operators, but not+ * to forbid operator names like '?-' that could not be+ * sequences of SQL operators.+ */+ while (nchars > 1 &&+ (yytext[nchars-1] == '+' ||+ yytext[nchars-1] == '-'))+ {+ int ic;++ for (ic = nchars-2; ic >= 0; ic--)+ {+ if (strchr("~!@#^&|`?%", yytext[ic]))+ break;+ }+ if (ic >= 0)+ break; /* found a char that makes it OK */+ nchars--; /* else remove the +/-, and check again */+ }++ /* We don't accept leading ? in any multi-character operators+ * except for those in use by hstore, JSON and geometric operators.+ *+ * We don't accept contained or trailing ? in any+ * multi-character operators.+ *+ * This is necessary in order to support normalized queries without+ * spacing between ? as a substition character and a simple operator (e.g. "?=?")+ */+ if (yytext[0] == '?' &&+ strcmp(yytext, "?|") != 0 && strcmp(yytext, "?&") != 0 &&+ strcmp(yytext, "?#") != 0 && strcmp(yytext, "?-") != 0 &&+ strcmp(yytext, "?-|") != 0 && strcmp(yytext, "?||") != 0)+ nchars = 1;++ if (yytext[0] != '?' && strchr(yytext, '?'))+ /* Lex up to just before the ? character */+ nchars = strchr(yytext, '?') - yytext;++ SET_YYLLOC();++ if (nchars < yyleng)+ {+ /* Strip the unwanted chars from the token */+ yyless(nchars);+ /*+ * If what we have left is only one char, and it's+ * one of the characters matching "self", then+ * return it as a character token the same way+ * that the "self" rule would have.+ */+ if (nchars == 1 &&+ strchr(",()[].;:+-*/%^<>=?", yytext[0]))+ return yytext[0];+ }++ /*+ * Complain if operator is too long. Unlike the case+ * for identifiers, we make this an error not a notice-+ * and-truncate, because the odds are we are looking at+ * a syntactic mistake anyway.+ */+ if (nchars >= NAMEDATALEN)+ yyerror("operator too long");++ yylval->str = pstrdup(yytext);+ return Op;+ }+ YY_BREAK+case 71:+YY_RULE_SETUP+#line 953 "scan.l"+{+ SET_YYLLOC();+ yylval->ival = atol(yytext + 1);+ return PARAM;+ }+ YY_BREAK+case 72:+YY_RULE_SETUP+#line 959 "scan.l"+{+ SET_YYLLOC();+ return process_integer_literal(yytext, yylval);+ }+ YY_BREAK+case 73:+YY_RULE_SETUP+#line 963 "scan.l"+{+ SET_YYLLOC();+ yylval->str = pstrdup(yytext);+ return FCONST;+ }+ YY_BREAK+case 74:+YY_RULE_SETUP+#line 968 "scan.l"+{+ /* throw back the .., and treat as integer */+ yyless(yyleng-2);+ SET_YYLLOC();+ return process_integer_literal(yytext, yylval);+ }+ YY_BREAK+case 75:+YY_RULE_SETUP+#line 974 "scan.l"+{+ SET_YYLLOC();+ yylval->str = pstrdup(yytext);+ return FCONST;+ }+ YY_BREAK+case 76:+YY_RULE_SETUP+#line 979 "scan.l"+{+ /*+ * throw back the [Ee], and treat as {decimal}. Note+ * that it is possible the input is actually {integer},+ * but since this case will almost certainly lead to a+ * syntax error anyway, we don't bother to distinguish.+ */+ yyless(yyleng-1);+ SET_YYLLOC();+ yylval->str = pstrdup(yytext);+ return FCONST;+ }+ YY_BREAK+case 77:+YY_RULE_SETUP+#line 991 "scan.l"+{+ /* throw back the [Ee][+-], and proceed as above */+ yyless(yyleng-2);+ SET_YYLLOC();+ yylval->str = pstrdup(yytext);+ return FCONST;+ }+ YY_BREAK+case 78:+YY_RULE_SETUP+#line 1000 "scan.l"+{+ const ScanKeyword *keyword;+ char *ident;+ char *keyword_text = pstrdup(yytext);++ SET_YYLLOC();++ /* Is it a keyword? */+ if (yytext[yyleng - 1] == '?')+ keyword_text[yyleng - 1] = '\0';++ keyword = ScanKeywordLookup(keyword_text,+ yyextra->keywords,+ yyextra->num_keywords);+ if (keyword != NULL)+ {+ if (keyword_text[yyleng - 1] == '\0')+ yyless(yyleng - 1);+ yylval->keyword = keyword->name;+ return keyword->value;+ }++ /*+ * No. Convert the identifier to lower case, and truncate+ * if necessary.+ */+ ident = downcase_truncate_identifier(yytext, yyleng, true);+ yylval->str = ident;+ return IDENT;+ }+ YY_BREAK+case 79:+YY_RULE_SETUP+#line 1031 "scan.l"+{+ SET_YYLLOC();+ return yytext[0];+ }+ YY_BREAK+case YY_STATE_EOF(INITIAL):+#line 1036 "scan.l"+{+ SET_YYLLOC();+ yyterminate();+ }+ YY_BREAK+case 80:+YY_RULE_SETUP+#line 1041 "scan.l"+YY_FATAL_ERROR( "flex scanner jammed" );+ YY_BREAK+#line 10046 "scan.c"++ case YY_END_OF_BUFFER:+ {+ /* Amount of text matched not including the EOB char. */+ int yy_amount_of_matched_text = (int) (yy_cp - yyg->yytext_ptr) - 1;++ /* Undo the effects of YY_DO_BEFORE_ACTION. */+ *yy_cp = yyg->yy_hold_char;+ YY_RESTORE_YY_MORE_OFFSET++ if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW )+ {+ /* We're scanning a new file or input source. It's+ * possible that this happened because the user+ * just pointed yyin at a new source and called+ * core_yylex(). If so, then we have to assure+ * consistency between YY_CURRENT_BUFFER and our+ * globals. Here is the right place to do so, because+ * this is the first action (other than possibly a+ * back-up) that will match for the new input source.+ */+ yyg->yy_n_chars = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;+ YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin;+ YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL;+ }++ /* Note that here we test for yy_c_buf_p "<=" to the position+ * of the first EOB in the buffer, since yy_c_buf_p will+ * already have been incremented past the NUL character+ * (since all states make transitions on EOB to the+ * end-of-buffer state). Contrast this with the test+ * in input().+ */+ if ( yyg->yy_c_buf_p <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] )+ { /* This was really a NUL. */+ yy_state_type yy_next_state;++ yyg->yy_c_buf_p = yyg->yytext_ptr + yy_amount_of_matched_text;++ yy_current_state = yy_get_previous_state( yyscanner );++ /* Okay, we're now positioned to make the NUL+ * transition. We couldn't have+ * yy_get_previous_state() go ahead and do it+ * for us because it doesn't know how to deal+ * with the possibility of jamming (and we don't+ * want to build jamming into it because then it+ * will run more slowly).+ */++ yy_next_state = yy_try_NUL_trans( yy_current_state , yyscanner);++ yy_bp = yyg->yytext_ptr + YY_MORE_ADJ;++ if ( yy_next_state )+ {+ /* Consume the NUL. */+ yy_cp = ++yyg->yy_c_buf_p;+ yy_current_state = yy_next_state;+ goto yy_match;+ }++ else+ {+ yy_cp = yyg->yy_c_buf_p;+ goto yy_find_action;+ }+ }++ else switch ( yy_get_next_buffer( yyscanner ) )+ {+ case EOB_ACT_END_OF_FILE:+ {+ yyg->yy_did_buffer_switch_on_eof = 0;++ if ( core_yywrap(yyscanner ) )+ {+ /* Note: because we've taken care in+ * yy_get_next_buffer() to have set up+ * yytext, we can now set up+ * yy_c_buf_p so that if some total+ * hoser (like flex itself) wants to+ * call the scanner after we return the+ * YY_NULL, it'll still work - another+ * YY_NULL will get returned.+ */+ yyg->yy_c_buf_p = yyg->yytext_ptr + YY_MORE_ADJ;++ yy_act = YY_STATE_EOF(YY_START);+ goto do_action;+ }++ else+ {+ if ( ! yyg->yy_did_buffer_switch_on_eof )+ YY_NEW_FILE;+ }+ break;+ }++ case EOB_ACT_CONTINUE_SCAN:+ yyg->yy_c_buf_p =+ yyg->yytext_ptr + yy_amount_of_matched_text;++ yy_current_state = yy_get_previous_state( yyscanner );++ yy_cp = yyg->yy_c_buf_p;+ yy_bp = yyg->yytext_ptr + YY_MORE_ADJ;+ goto yy_match;++ case EOB_ACT_LAST_MATCH:+ yyg->yy_c_buf_p =+ &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars];++ yy_current_state = yy_get_previous_state( yyscanner );++ yy_cp = yyg->yy_c_buf_p;+ yy_bp = yyg->yytext_ptr + YY_MORE_ADJ;+ goto yy_find_action;+ }+ break;+ }++ default:+ YY_FATAL_ERROR(+ "fatal flex scanner internal error--no action found" );+ } /* end of action switch */+ } /* end of scanning one token */+} /* end of core_yylex */++/* yy_get_next_buffer - try to read in a new buffer+ *+ * Returns a code representing an action:+ * EOB_ACT_LAST_MATCH -+ * EOB_ACT_CONTINUE_SCAN - continue scanning from current position+ * EOB_ACT_END_OF_FILE - end of file+ */+static int yy_get_next_buffer (yyscan_t yyscanner)+{+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;+ register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;+ register char *source = yyg->yytext_ptr;+ register int number_to_move, i;+ int ret_val;++ if ( yyg->yy_c_buf_p > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars + 1] )+ YY_FATAL_ERROR(+ "fatal flex scanner internal error--end of buffer missed" );++ if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 )+ { /* Don't try to fill the buffer, so this is an EOF. */+ if ( yyg->yy_c_buf_p - yyg->yytext_ptr - YY_MORE_ADJ == 1 )+ {+ /* We matched a single character, the EOB, so+ * treat this as a final EOF.+ */+ return EOB_ACT_END_OF_FILE;+ }++ else+ {+ /* We matched some text prior to the EOB, first+ * process it.+ */+ return EOB_ACT_LAST_MATCH;+ }+ }++ /* Try to read more data. */++ /* First move last chars to start of buffer. */+ number_to_move = (int) (yyg->yy_c_buf_p - yyg->yytext_ptr) - 1;++ for ( i = 0; i < number_to_move; ++i )+ *(dest++) = *(source++);++ if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING )+ /* don't do the read, it's not guaranteed to return an EOF,+ * just force an EOF+ */+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars = 0;++ else+ {+ yy_size_t num_to_read =+ YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;++ while ( num_to_read <= 0 )+ { /* Not enough room in the buffer - grow it. */++ /* just a shorter name for the current buffer */+ YY_BUFFER_STATE b = YY_CURRENT_BUFFER;++ int yy_c_buf_p_offset =+ (int) (yyg->yy_c_buf_p - b->yy_ch_buf);++ if ( b->yy_is_our_buffer )+ {+ yy_size_t new_size = b->yy_buf_size * 2;++ if ( new_size <= 0 )+ b->yy_buf_size += b->yy_buf_size / 8;+ else+ b->yy_buf_size *= 2;++ b->yy_ch_buf = (char *)+ /* Include room in for 2 EOB chars. */+ core_yyrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ,yyscanner );+ }+ else+ /* Can't grow it, we don't own it. */+ b->yy_ch_buf = 0;++ if ( ! b->yy_ch_buf )+ YY_FATAL_ERROR(+ "fatal error - scanner input buffer overflow" );++ yyg->yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset];++ num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size -+ number_to_move - 1;++ }++ if ( num_to_read > YY_READ_BUF_SIZE )+ num_to_read = YY_READ_BUF_SIZE;++ /* Read in more data. */+ YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),+ yyg->yy_n_chars, num_to_read );++ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars;+ }++ if ( yyg->yy_n_chars == 0 )+ {+ if ( number_to_move == YY_MORE_ADJ )+ {+ ret_val = EOB_ACT_END_OF_FILE;+ core_yyrestart(yyin ,yyscanner);+ }++ else+ {+ ret_val = EOB_ACT_LAST_MATCH;+ YY_CURRENT_BUFFER_LVALUE->yy_buffer_status =+ YY_BUFFER_EOF_PENDING;+ }+ }++ else+ ret_val = EOB_ACT_CONTINUE_SCAN;++ if ((yy_size_t) (yyg->yy_n_chars + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) {+ /* Extend the array by 50%, plus the number we really need. */+ yy_size_t new_size = yyg->yy_n_chars + number_to_move + (yyg->yy_n_chars >> 1);+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) core_yyrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ,yyscanner );+ if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )+ YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" );+ }++ yyg->yy_n_chars += number_to_move;+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] = YY_END_OF_BUFFER_CHAR;+ YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR;++ yyg->yytext_ptr = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0];++ return ret_val;+}++/* yy_get_previous_state - get the state just before the EOB char was reached */++ static yy_state_type yy_get_previous_state (yyscan_t yyscanner)+{+ register yy_state_type yy_current_state;+ register char *yy_cp;+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;++ yy_current_state = yy_start_state_list[yyg->yy_start];++ for ( yy_cp = yyg->yytext_ptr + YY_MORE_ADJ; yy_cp < yyg->yy_c_buf_p; ++yy_cp )+ {+ yy_current_state += yy_current_state[(*yy_cp ? YY_SC_TO_UI(*yy_cp) : 256)].yy_nxt;+ }++ return yy_current_state;+}++/* yy_try_NUL_trans - try to make a transition on the NUL character+ *+ * synopsis+ * next_state = yy_try_NUL_trans( current_state );+ */+ static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state , yyscan_t yyscanner)+{+ register int yy_is_jam;+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; /* This var may be unused depending upon options. */++ register int yy_c = 256;+ register yyconst struct yy_trans_info *yy_trans_info;++ yy_trans_info = &yy_current_state[(unsigned int) yy_c];+ yy_current_state += yy_trans_info->yy_nxt;+ yy_is_jam = (yy_trans_info->yy_verify != yy_c);++ return yy_is_jam ? 0 : yy_current_state;+}++#ifndef YY_NO_INPUT+#ifdef __cplusplus+ static int yyinput (yyscan_t yyscanner)+#else+ static int input (yyscan_t yyscanner)+#endif++{+ int c;+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;++ *yyg->yy_c_buf_p = yyg->yy_hold_char;++ if ( *yyg->yy_c_buf_p == YY_END_OF_BUFFER_CHAR )+ {+ /* yy_c_buf_p now points to the character we want to return.+ * If this occurs *before* the EOB characters, then it's a+ * valid NUL; if not, then we've hit the end of the buffer.+ */+ if ( yyg->yy_c_buf_p < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] )+ /* This was really a NUL. */+ *yyg->yy_c_buf_p = '\0';++ else+ { /* need more input */+ yy_size_t offset = yyg->yy_c_buf_p - yyg->yytext_ptr;+ ++yyg->yy_c_buf_p;++ switch ( yy_get_next_buffer( yyscanner ) )+ {+ case EOB_ACT_LAST_MATCH:+ /* This happens because yy_g_n_b()+ * sees that we've accumulated a+ * token and flags that we need to+ * try matching the token before+ * proceeding. But for input(),+ * there's no matching to consider.+ * So convert the EOB_ACT_LAST_MATCH+ * to EOB_ACT_END_OF_FILE.+ */++ /* Reset buffer status. */+ core_yyrestart(yyin ,yyscanner);++ /*FALLTHROUGH*/++ case EOB_ACT_END_OF_FILE:+ {+ if ( core_yywrap(yyscanner ) )+ return 0;++ if ( ! yyg->yy_did_buffer_switch_on_eof )+ YY_NEW_FILE;+#ifdef __cplusplus+ return yyinput(yyscanner);+#else+ return input(yyscanner);+#endif+ }++ case EOB_ACT_CONTINUE_SCAN:+ yyg->yy_c_buf_p = yyg->yytext_ptr + offset;+ break;+ }+ }+ }++ c = *(unsigned char *) yyg->yy_c_buf_p; /* cast for 8-bit char's */+ *yyg->yy_c_buf_p = '\0'; /* preserve yytext */+ yyg->yy_hold_char = *++yyg->yy_c_buf_p;++ return c;+}+#endif /* ifndef YY_NO_INPUT */++/** Immediately switch to a different input stream.+ * @param input_file A readable stream.+ * @param yyscanner The scanner object.+ * @note This function does not reset the start condition to @c INITIAL .+ */+ void core_yyrestart (FILE * input_file , yyscan_t yyscanner)+{+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;++ if ( ! YY_CURRENT_BUFFER ){+ core_yyensure_buffer_stack (yyscanner);+ YY_CURRENT_BUFFER_LVALUE =+ core_yy_create_buffer(yyin,YY_BUF_SIZE ,yyscanner);+ }++ core_yy_init_buffer(YY_CURRENT_BUFFER,input_file ,yyscanner);+ core_yy_load_buffer_state(yyscanner );+}++/** Switch to a different input buffer.+ * @param new_buffer The new input buffer.+ * @param yyscanner The scanner object.+ */+ void core_yy_switch_to_buffer (YY_BUFFER_STATE new_buffer , yyscan_t yyscanner)+{+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;++ /* TODO. We should be able to replace this entire function body+ * with+ * core_yypop_buffer_state();+ * core_yypush_buffer_state(new_buffer);+ */+ core_yyensure_buffer_stack (yyscanner);+ if ( YY_CURRENT_BUFFER == new_buffer )+ return;++ if ( YY_CURRENT_BUFFER )+ {+ /* Flush out information for old buffer. */+ *yyg->yy_c_buf_p = yyg->yy_hold_char;+ YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = yyg->yy_c_buf_p;+ YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars;+ }++ YY_CURRENT_BUFFER_LVALUE = new_buffer;+ core_yy_load_buffer_state(yyscanner );++ /* We don't actually know whether we did this switch during+ * EOF (core_yywrap()) processing, but the only time this flag+ * is looked at is after core_yywrap() is called, so it's safe+ * to go ahead and always set it.+ */+ yyg->yy_did_buffer_switch_on_eof = 1;+}++static void core_yy_load_buffer_state (yyscan_t yyscanner)+{+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;+ yyg->yy_n_chars = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;+ yyg->yytext_ptr = yyg->yy_c_buf_p = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos;+ yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file;+ yyg->yy_hold_char = *yyg->yy_c_buf_p;+}++/** Allocate and initialize an input buffer state.+ * @param file A readable stream.+ * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE.+ * @param yyscanner The scanner object.+ * @return the allocated buffer state.+ */+ YY_BUFFER_STATE core_yy_create_buffer (FILE * file, int size , yyscan_t yyscanner)+{+ YY_BUFFER_STATE b;+ + b = (YY_BUFFER_STATE) core_yyalloc(sizeof( struct yy_buffer_state ) ,yyscanner );+ if ( ! b )+ YY_FATAL_ERROR( "out of dynamic memory in core_yy_create_buffer()" );++ b->yy_buf_size = size;++ /* yy_ch_buf has to be 2 characters longer than the size given because+ * we need to put in 2 end-of-buffer characters.+ */+ b->yy_ch_buf = (char *) core_yyalloc(b->yy_buf_size + 2 ,yyscanner );+ if ( ! b->yy_ch_buf )+ YY_FATAL_ERROR( "out of dynamic memory in core_yy_create_buffer()" );++ b->yy_is_our_buffer = 1;++ core_yy_init_buffer(b,file ,yyscanner);++ return b;+}++/** Destroy the buffer.+ * @param b a buffer created with core_yy_create_buffer()+ * @param yyscanner The scanner object.+ */+ +++/* Initializes or reinitializes a buffer.+ * This function is sometimes called more than once on the same buffer,+ * such as during a core_yyrestart() or at EOF.+ */+ static void core_yy_init_buffer (YY_BUFFER_STATE b, FILE * file , yyscan_t yyscanner)++{+ int oerrno = errno;+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;++ core_yy_flush_buffer(b ,yyscanner);++ b->yy_input_file = file;+ b->yy_fill_buffer = 1;++ /* If b is the current buffer, then core_yy_init_buffer was _probably_+ * called from core_yyrestart() or through yy_get_next_buffer.+ * In that case, we don't want to reset the lineno or column.+ */+ if (b != YY_CURRENT_BUFFER){+ b->yy_bs_lineno = 1;+ b->yy_bs_column = 0;+ }++ b->yy_is_interactive = 0;+ + errno = oerrno;+}++/** Discard all buffered characters. On the next scan, YY_INPUT will be called.+ * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER.+ * @param yyscanner The scanner object.+ */+ void core_yy_flush_buffer (YY_BUFFER_STATE b , yyscan_t yyscanner)+{+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;+ if ( ! b )+ return;++ b->yy_n_chars = 0;++ /* We always need two end-of-buffer characters. The first causes+ * a transition to the end-of-buffer state. The second causes+ * a jam in that state.+ */+ b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;+ b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;++ b->yy_buf_pos = &b->yy_ch_buf[0];++ b->yy_at_bol = 1;+ b->yy_buffer_status = YY_BUFFER_NEW;++ if ( b == YY_CURRENT_BUFFER )+ core_yy_load_buffer_state(yyscanner );+}++/** Pushes the new state onto the stack. The new state becomes+ * the current state. This function will allocate the stack+ * if necessary.+ * @param new_buffer The new state.+ * @param yyscanner The scanner object.+ */+++/** Removes and deletes the top of the stack, if present.+ * The next element becomes the new top.+ * @param yyscanner The scanner object.+ */+++/* Allocates the stack if it does not exist.+ * Guarantees space for at least one push.+ */+static void core_yyensure_buffer_stack (yyscan_t yyscanner)+{+ yy_size_t num_to_alloc;+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;++ if (!yyg->yy_buffer_stack) {++ /* First allocation is just for 2 elements, since we don't know if this+ * scanner will even need a stack. We use 2 instead of 1 to avoid an+ * immediate realloc on the next call.+ */+ num_to_alloc = 1;+ yyg->yy_buffer_stack = (struct yy_buffer_state**)core_yyalloc+ (num_to_alloc * sizeof(struct yy_buffer_state*)+ , yyscanner);+ if ( ! yyg->yy_buffer_stack )+ YY_FATAL_ERROR( "out of dynamic memory in core_yyensure_buffer_stack()" );+ + memset(yyg->yy_buffer_stack, 0, num_to_alloc * sizeof(struct yy_buffer_state*));+ + yyg->yy_buffer_stack_max = num_to_alloc;+ yyg->yy_buffer_stack_top = 0;+ return;+ }++ if (yyg->yy_buffer_stack_top >= (yyg->yy_buffer_stack_max) - 1){++ /* Increase the buffer to prepare for a possible push. */+ int grow_size = 8 /* arbitrary grow size */;++ num_to_alloc = yyg->yy_buffer_stack_max + grow_size;+ yyg->yy_buffer_stack = (struct yy_buffer_state**)core_yyrealloc+ (yyg->yy_buffer_stack,+ num_to_alloc * sizeof(struct yy_buffer_state*)+ , yyscanner);+ if ( ! yyg->yy_buffer_stack )+ YY_FATAL_ERROR( "out of dynamic memory in core_yyensure_buffer_stack()" );++ /* zero only the new slots.*/+ memset(yyg->yy_buffer_stack + yyg->yy_buffer_stack_max, 0, grow_size * sizeof(struct yy_buffer_state*));+ yyg->yy_buffer_stack_max = num_to_alloc;+ }+}++/** Setup the input buffer state to scan directly from a user-specified character buffer.+ * @param base the character buffer+ * @param size the size in bytes of the character buffer+ * @param yyscanner The scanner object.+ * @return the newly allocated buffer state object. + */+YY_BUFFER_STATE core_yy_scan_buffer (char * base, yy_size_t size , yyscan_t yyscanner)+{+ YY_BUFFER_STATE b;+ + if ( size < 2 ||+ base[size-2] != YY_END_OF_BUFFER_CHAR ||+ base[size-1] != YY_END_OF_BUFFER_CHAR )+ /* They forgot to leave room for the EOB's. */+ return 0;++ b = (YY_BUFFER_STATE) core_yyalloc(sizeof( struct yy_buffer_state ) ,yyscanner );+ if ( ! b )+ YY_FATAL_ERROR( "out of dynamic memory in core_yy_scan_buffer()" );++ b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */+ b->yy_buf_pos = b->yy_ch_buf = base;+ b->yy_is_our_buffer = 0;+ b->yy_input_file = 0;+ b->yy_n_chars = b->yy_buf_size;+ b->yy_is_interactive = 0;+ b->yy_at_bol = 1;+ b->yy_fill_buffer = 0;+ b->yy_buffer_status = YY_BUFFER_NEW;++ core_yy_switch_to_buffer(b ,yyscanner );++ return b;+}++/** Setup the input buffer state to scan a string. The next call to core_yylex() will+ * scan from a @e copy of @a str.+ * @param yystr a NUL-terminated string to scan+ * @param yyscanner The scanner object.+ * @return the newly allocated buffer state object.+ * @note If you want to scan bytes that may contain NUL values, then use+ * core_yy_scan_bytes() instead.+ */+++/** Setup the input buffer state to scan the given bytes. The next call to core_yylex() will+ * scan from a @e copy of @a bytes.+ * @param bytes the byte buffer to scan+ * @param len the number of bytes in the buffer pointed to by @a bytes.+ * @param yyscanner The scanner object.+ * @return the newly allocated buffer state object.+ */+++#ifndef YY_EXIT_FAILURE+#define YY_EXIT_FAILURE 2+#endif++static void yy_fatal_error (yyconst char* msg , yyscan_t yyscanner)+{+ (void) fprintf( stderr, "%s\n", msg );+ exit( YY_EXIT_FAILURE );+}++/* Redefine yyless() so it works in section 3 code. */++#undef yyless+#define yyless(n) \+ do \+ { \+ /* Undo effects of setting up yytext. */ \+ int yyless_macro_arg = (n); \+ YY_LESS_LINENO(yyless_macro_arg);\+ yytext[yyleng] = yyg->yy_hold_char; \+ yyg->yy_c_buf_p = yytext + yyless_macro_arg; \+ yyg->yy_hold_char = *yyg->yy_c_buf_p; \+ *yyg->yy_c_buf_p = '\0'; \+ yyleng = yyless_macro_arg; \+ } \+ while ( 0 )++/* Accessor methods (get/set functions) to struct members. */++/** Get the user-defined data for this scanner.+ * @param yyscanner The scanner object.+ */+++/** Get the current line number.+ * @param yyscanner The scanner object.+ */+++/** Get the current column number.+ * @param yyscanner The scanner object.+ */+++/** Get the input stream.+ * @param yyscanner The scanner object.+ */+++/** Get the output stream.+ * @param yyscanner The scanner object.+ */+++/** Get the length of the current token.+ * @param yyscanner The scanner object.+ */+++/** Get the current token.+ * @param yyscanner The scanner object.+ */++++/** Set the user-defined data. This data is never touched by the scanner.+ * @param user_defined The data to be associated with this scanner.+ * @param yyscanner The scanner object.+ */+void core_yyset_extra (YY_EXTRA_TYPE user_defined , yyscan_t yyscanner)+{+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;+ yyextra = user_defined ;+}++/** Set the current line number.+ * @param line_number+ * @param yyscanner The scanner object.+ */+++/** Set the current column.+ * @param line_number+ * @param yyscanner The scanner object.+ */+++/** Set the input stream. This does not discard the current+ * input buffer.+ * @param in_str A readable stream.+ * @param yyscanner The scanner object.+ * @see core_yy_switch_to_buffer+ */+++++++++/* Accessor methods for yylval and yylloc */+++++++ ++ +/* User-visible API */++/* core_yylex_init is special because it creates the scanner itself, so it is+ * the ONLY reentrant function that doesn't take the scanner as the last argument.+ * That's why we explicitly handle the declaration, instead of using our macros.+ */++int core_yylex_init(yyscan_t* ptr_yy_globals)++{+ if (ptr_yy_globals == NULL){+ errno = EINVAL;+ return 1;+ }++ *ptr_yy_globals = (yyscan_t) core_yyalloc ( sizeof( struct yyguts_t ), NULL );++ if (*ptr_yy_globals == NULL){+ errno = ENOMEM;+ return 1;+ }++ /* By setting to 0xAA, we expose bugs in yy_init_globals. Leave at 0x00 for releases. */+ memset(*ptr_yy_globals,0x00,sizeof(struct yyguts_t));++ return yy_init_globals ( *ptr_yy_globals );+}++/* core_yylex_init_extra has the same functionality as core_yylex_init, but follows the+ * convention of taking the scanner as the last argument. Note however, that+ * this is a *pointer* to a scanner, as it will be allocated by this call (and+ * is the reason, too, why this function also must handle its own declaration).+ * The user defined value in the first argument will be available to core_yyalloc in+ * the yyextra field.+ */++++static int yy_init_globals (yyscan_t yyscanner)+{+ struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;+ /* Initialization is the same as for the non-reentrant scanner.+ * This function is called from core_yylex_destroy(), so don't allocate here.+ */++ yyg->yy_buffer_stack = 0;+ yyg->yy_buffer_stack_top = 0;+ yyg->yy_buffer_stack_max = 0;+ yyg->yy_c_buf_p = (char *) 0;+ yyg->yy_init = 0;+ yyg->yy_start = 0;++ yyg->yy_start_stack_ptr = 0;+ yyg->yy_start_stack_depth = 0;+ yyg->yy_start_stack = NULL;++/* Defined in main.c */+#ifdef YY_STDINIT+ yyin = stdin;+ yyout = stdout;+#else+ yyin = (FILE *) 0;+ yyout = (FILE *) 0;+#endif++ /* For future reference: Set errno on error, since we are called by+ * core_yylex_init()+ */+ return 0;+}++/* core_yylex_destroy is for both reentrant and non-reentrant scanners. */+++/*+ * Internal utility routines.+ */++#ifndef yytext_ptr+static void yy_flex_strncpy (char* s1, yyconst char * s2, int n , yyscan_t yyscanner)+{+ register int i;+ for ( i = 0; i < n; ++i )+ s1[i] = s2[i];+}+#endif++#ifdef YY_NEED_STRLEN+static int yy_flex_strlen (yyconst char * s , yyscan_t yyscanner)+{+ register int n;+ for ( n = 0; s[n]; ++n )+ ;++ return n;+}+#endif++#define YYTABLES_NAME "yytables"++#line 1041 "scan.l"++++/*+ * Arrange access to yyextra for subroutines of the main core_yylex() function.+ * We expect each subroutine to have a yyscanner parameter. Rather than+ * use the yyget_xxx functions, which might or might not get inlined by the+ * compiler, we cheat just a bit and cast yyscanner to the right type.+ */+#undef yyextra+#define yyextra (((struct yyguts_t *) yyscanner)->yyextra_r)++/* Likewise for a couple of other things we need. */+#undef yylloc+#define yylloc (((struct yyguts_t *) yyscanner)->yylloc_r)+#undef yyleng+#define yyleng (((struct yyguts_t *) yyscanner)->yyleng_r)+++/*+ * scanner_errposition+ * Report a lexer or grammar error cursor position, if possible.+ *+ * This is expected to be used within an ereport() call. The return value+ * is a dummy (always 0, in fact).+ *+ * Note that this can only be used for messages emitted during raw parsing+ * (essentially, scan.l and gram.y), since it requires the yyscanner struct+ * to still be available.+ */+int+scanner_errposition(int location, core_yyscan_t yyscanner)+{+ int pos;++ if (location < 0)+ return 0; /* no-op if location is unknown */++ /* Convert byte offset to character number */+ pos = pg_mbstrlen_with_len(yyextra->scanbuf, location) + 1;+ /* And pass it to the ereport mechanism */+ return errposition(pos);+}++/*+ * scanner_yyerror+ * Report a lexer or grammar error.+ *+ * The message's cursor position is whatever YYLLOC was last set to,+ * ie, the start of the current token if called within core_yylex(), or the+ * most recently lexed token if called from the grammar.+ * This is OK for syntax error messages from the Bison parser, because Bison+ * parsers report error as soon as the first unparsable token is reached.+ * Beware of using yyerror for other purposes, as the cursor position might+ * be misleading!+ */+void+scanner_yyerror(const char *message, core_yyscan_t yyscanner)+{+ const char *loc = yyextra->scanbuf + *yylloc;++ if (*loc == YY_END_OF_BUFFER_CHAR)+ {+ ereport(ERROR,+ (errcode(ERRCODE_SYNTAX_ERROR),+ /* translator: %s is typically the translation of "syntax error" */+ errmsg("%s at end of input", _(message)),+ lexer_errposition()));+ }+ else+ {+ ereport(ERROR,+ (errcode(ERRCODE_SYNTAX_ERROR),+ /* translator: first %s is typically the translation of "syntax error" */+ errmsg("%s at or near \"%s\"", _(message), loc),+ lexer_errposition()));+ }+}+++/*+ * Called before any actual parsing is done+ */+core_yyscan_t+scanner_init(const char *str,+ core_yy_extra_type *yyext,+ const ScanKeyword *keywords,+ int num_keywords)+{+ Size slen = strlen(str);+ yyscan_t scanner;++ if (core_yylex_init(&scanner) != 0)+ elog(ERROR, "core_yylex_init() failed: %m");++ core_yyset_extra(yyext, scanner);++ yyext->keywords = keywords;+ yyext->num_keywords = num_keywords;++ yyext->backslash_quote = backslash_quote;+ yyext->escape_string_warning = escape_string_warning;+ yyext->standard_conforming_strings = standard_conforming_strings;++ /*+ * Make a scan buffer with special termination needed by flex.+ */+ yyext->scanbuf = (char *) palloc(slen + 2);+ yyext->scanbuflen = slen;+ memcpy(yyext->scanbuf, str, slen);+ yyext->scanbuf[slen] = yyext->scanbuf[slen + 1] = YY_END_OF_BUFFER_CHAR;+ core_yy_scan_buffer(yyext->scanbuf,slen + 2,scanner);++ /* initialize literal buffer to a reasonable but expansible size */+ yyext->literalalloc = 1024;+ yyext->literalbuf = (char *) palloc(yyext->literalalloc);+ yyext->literallen = 0;++ return scanner;+}+++/*+ * Called after parsing is done to clean up after scanner_init()+ */+void+scanner_finish(core_yyscan_t yyscanner)+{+ /*+ * We don't bother to call core_yylex_destroy(), because all it would do+ * is pfree a small amount of control storage. It's cheaper to leak+ * the storage until the parsing context is destroyed. The amount of+ * space involved is usually negligible compared to the output parse+ * tree anyway.+ *+ * We do bother to pfree the scanbuf and literal buffer, but only if they+ * represent a nontrivial amount of space. The 8K cutoff is arbitrary.+ */+ if (yyextra->scanbuflen >= 8192)+ pfree(yyextra->scanbuf);+ if (yyextra->literalalloc >= 8192)+ pfree(yyextra->literalbuf);+}+++static void+addlit(char *ytext, int yleng, core_yyscan_t yyscanner)+{+ /* enlarge buffer if needed */+ if ((yyextra->literallen + yleng) >= yyextra->literalalloc)+ {+ do {+ yyextra->literalalloc *= 2;+ } while ((yyextra->literallen + yleng) >= yyextra->literalalloc);+ yyextra->literalbuf = (char *) repalloc(yyextra->literalbuf,+ yyextra->literalalloc);+ }+ /* append new data */+ memcpy(yyextra->literalbuf + yyextra->literallen, ytext, yleng);+ yyextra->literallen += yleng;+}+++static void+addlitchar(unsigned char ychar, core_yyscan_t yyscanner)+{+ /* enlarge buffer if needed */+ if ((yyextra->literallen + 1) >= yyextra->literalalloc)+ {+ yyextra->literalalloc *= 2;+ yyextra->literalbuf = (char *) repalloc(yyextra->literalbuf,+ yyextra->literalalloc);+ }+ /* append new data */+ yyextra->literalbuf[yyextra->literallen] = ychar;+ yyextra->literallen += 1;+}+++/*+ * Create a palloc'd copy of literalbuf, adding a trailing null.+ */+static char *+litbufdup(core_yyscan_t yyscanner)+{+ int llen = yyextra->literallen;+ char *new;++ new = palloc(llen + 1);+ memcpy(new, yyextra->literalbuf, llen);+ new[llen] = '\0';+ return new;+}++static int+process_integer_literal(const char *token, YYSTYPE *lval)+{+ long val;+ char *endptr;++ errno = 0;+ val = strtol(token, &endptr, 10);+ if (*endptr != '\0' || errno == ERANGE+#ifdef HAVE_LONG_INT_64+ /* if long > 32 bits, check for overflow of int4 */+ || val != (long) ((int32) val)+#endif+ )+ {+ /* integer too large, treat it as a float */+ lval->str = pstrdup(token);+ return FCONST;+ }+ lval->ival = val;+ return ICONST;+}++static unsigned int+hexval(unsigned char c)+{+ if (c >= '0' && c <= '9')+ return c - '0';+ if (c >= 'a' && c <= 'f')+ return c - 'a' + 0xA;+ if (c >= 'A' && c <= 'F')+ return c - 'A' + 0xA;+ elog(ERROR, "invalid hexadecimal digit");+ return 0; /* not reached */+}++static void+check_unicode_value(pg_wchar c, char *loc, core_yyscan_t yyscanner)+{+ if (GetDatabaseEncoding() == PG_UTF8)+ return;++ if (c > 0x7F)+ {+ ADVANCE_YYLLOC(loc - yyextra->literalbuf + 3); /* 3 for U&" */+ yyerror("Unicode escape values cannot be used for code point values above 007F when the server encoding is not UTF8");+ }+}++static bool+is_utf16_surrogate_first(pg_wchar c)+{+ return (c >= 0xD800 && c <= 0xDBFF);+}++static bool+is_utf16_surrogate_second(pg_wchar c)+{+ return (c >= 0xDC00 && c <= 0xDFFF);+}++static pg_wchar+surrogate_pair_to_codepoint(pg_wchar first, pg_wchar second)+{+ return ((first & 0x3FF) << 10) + 0x10000 + (second & 0x3FF);+}++static void+addunicode(pg_wchar c, core_yyscan_t yyscanner)+{+ char buf[8];++ if (c == 0 || c > 0x10FFFF)+ yyerror("invalid Unicode escape value");+ if (c > 0x7F)+ {+ if (GetDatabaseEncoding() != PG_UTF8)+ yyerror("Unicode escape values cannot be used for code point values above 007F when the server encoding is not UTF8");+ yyextra->saw_non_ascii = true;+ }+ unicode_to_utf8(c, (unsigned char *) buf);+ addlit(buf, pg_mblen(buf), yyscanner);+}++/* is 'escape' acceptable as Unicode escape character (UESCAPE syntax) ? */+static bool+check_uescapechar(unsigned char escape)+{+ if (isxdigit(escape)+ || escape == '+'+ || escape == '\''+ || escape == '"'+ || scanner_isspace(escape))+ {+ return false;+ }+ else+ return true;+}++/* like litbufdup, but handle unicode escapes */+static char *+litbuf_udeescape(unsigned char escape, core_yyscan_t yyscanner)+{+ char *new;+ char *litbuf, *in, *out;+ pg_wchar pair_first = 0;++ /* Make literalbuf null-terminated to simplify the scanning loop */+ litbuf = yyextra->literalbuf;+ litbuf[yyextra->literallen] = '\0';++ /*+ * This relies on the subtle assumption that a UTF-8 expansion+ * cannot be longer than its escaped representation.+ */+ new = palloc(yyextra->literallen + 1);++ in = litbuf;+ out = new;+ while (*in)+ {+ if (in[0] == escape)+ {+ if (in[1] == escape)+ {+ if (pair_first)+ {+ ADVANCE_YYLLOC(in - litbuf + 3); /* 3 for U&" */+ yyerror("invalid Unicode surrogate pair");+ }+ *out++ = escape;+ in += 2;+ }+ else if (isxdigit((unsigned char) in[1]) &&+ isxdigit((unsigned char) in[2]) &&+ isxdigit((unsigned char) in[3]) &&+ isxdigit((unsigned char) in[4]))+ {+ pg_wchar unicode;++ unicode = (hexval(in[1]) << 12) ++ (hexval(in[2]) << 8) ++ (hexval(in[3]) << 4) ++ hexval(in[4]);+ check_unicode_value(unicode, in, yyscanner);+ if (pair_first)+ {+ if (is_utf16_surrogate_second(unicode))+ {+ unicode = surrogate_pair_to_codepoint(pair_first, unicode);+ pair_first = 0;+ }+ else+ {+ ADVANCE_YYLLOC(in - litbuf + 3); /* 3 for U&" */+ yyerror("invalid Unicode surrogate pair");+ }+ }+ else if (is_utf16_surrogate_second(unicode))+ yyerror("invalid Unicode surrogate pair");++ if (is_utf16_surrogate_first(unicode))+ pair_first = unicode;+ else+ {+ unicode_to_utf8(unicode, (unsigned char *) out);+ out += pg_mblen(out);+ }+ in += 5;+ }+ else if (in[1] == '+' &&+ isxdigit((unsigned char) in[2]) &&+ isxdigit((unsigned char) in[3]) &&+ isxdigit((unsigned char) in[4]) &&+ isxdigit((unsigned char) in[5]) &&+ isxdigit((unsigned char) in[6]) &&+ isxdigit((unsigned char) in[7]))+ {+ pg_wchar unicode;++ unicode = (hexval(in[2]) << 20) ++ (hexval(in[3]) << 16) ++ (hexval(in[4]) << 12) ++ (hexval(in[5]) << 8) ++ (hexval(in[6]) << 4) ++ hexval(in[7]);+ check_unicode_value(unicode, in, yyscanner);+ if (pair_first)+ {+ if (is_utf16_surrogate_second(unicode))+ {+ unicode = surrogate_pair_to_codepoint(pair_first, unicode);+ pair_first = 0;+ }+ else+ {+ ADVANCE_YYLLOC(in - litbuf + 3); /* 3 for U&" */+ yyerror("invalid Unicode surrogate pair");+ }+ }+ else if (is_utf16_surrogate_second(unicode))+ yyerror("invalid Unicode surrogate pair");++ if (is_utf16_surrogate_first(unicode))+ pair_first = unicode;+ else+ {+ unicode_to_utf8(unicode, (unsigned char *) out);+ out += pg_mblen(out);+ }+ in += 8;+ }+ else+ {+ ADVANCE_YYLLOC(in - litbuf + 3); /* 3 for U&" */+ yyerror("invalid Unicode escape value");+ }+ }+ else+ {+ if (pair_first)+ {+ ADVANCE_YYLLOC(in - litbuf + 3); /* 3 for U&" */+ yyerror("invalid Unicode surrogate pair");+ }+ *out++ = *in++;+ }+ }++ *out = '\0';+ /*+ * We could skip pg_verifymbstr if we didn't process any non-7-bit-ASCII+ * codes; but it's probably not worth the trouble, since this isn't+ * likely to be a performance-critical path.+ */+ pg_verifymbstr(new, out - new, false);+ return new;+}++static unsigned char+unescape_single_char(unsigned char c, core_yyscan_t yyscanner)+{+ switch (c)+ {+ case 'b':+ return '\b';+ case 'f':+ return '\f';+ case 'n':+ return '\n';+ case 'r':+ return '\r';+ case 't':+ return '\t';+ default:+ /* check for backslash followed by non-7-bit-ASCII */+ if (c == '\0' || IS_HIGHBIT_SET(c))+ yyextra->saw_non_ascii = true;++ return c;+ }+}++static void+check_string_escape_warning(unsigned char ychar, core_yyscan_t yyscanner)+{+ if (ychar == '\'')+ {+ if (yyextra->warn_on_first_escape && yyextra->escape_string_warning)+ ereport(WARNING,+ (errcode(ERRCODE_NONSTANDARD_USE_OF_ESCAPE_CHARACTER),+ errmsg("nonstandard use of \\' in a string literal"),+ errhint("Use '' to write quotes in strings, or use the escape string syntax (E'...')."),+ lexer_errposition()));+ yyextra->warn_on_first_escape = false; /* warn only once per string */+ }+ else if (ychar == '\\')+ {+ if (yyextra->warn_on_first_escape && yyextra->escape_string_warning)+ ereport(WARNING,+ (errcode(ERRCODE_NONSTANDARD_USE_OF_ESCAPE_CHARACTER),+ errmsg("nonstandard use of \\\\ in a string literal"),+ errhint("Use the escape string syntax for backslashes, e.g., E'\\\\'."),+ lexer_errposition()));+ yyextra->warn_on_first_escape = false; /* warn only once per string */+ }+ else+ check_escape_warning(yyscanner);+}++static void+check_escape_warning(core_yyscan_t yyscanner)+{+ if (yyextra->warn_on_first_escape && yyextra->escape_string_warning)+ ereport(WARNING,+ (errcode(ERRCODE_NONSTANDARD_USE_OF_ESCAPE_CHARACTER),+ errmsg("nonstandard use of escape in a string literal"),+ errhint("Use the escape string syntax for escapes, e.g., E'\\r\\n'."),+ lexer_errposition()));+ yyextra->warn_on_first_escape = false; /* warn only once per string */+}++/*+ * Interface functions to make flex use palloc() instead of malloc().+ * It'd be better to make these static, but flex insists otherwise.+ */++void *+core_yyalloc(yy_size_t bytes, core_yyscan_t yyscanner)+{+ return palloc(bytes);+}++void *+core_yyrealloc(void *ptr, yy_size_t bytes, core_yyscan_t yyscanner)+{+ if (ptr)+ return repalloc(ptr, bytes);+ else+ return palloc(bytes);+}+++
+ foreign/libpg_query/src/postgres/src_backend_catalog_namespace.c view
@@ -0,0 +1,963 @@+/*--------------------------------------------------------------------+ * Symbols referenced in this file:+ * - NameListToString+ * - get_collation_oid+ *--------------------------------------------------------------------+ */++/*-------------------------------------------------------------------------+ *+ * namespace.c+ * code to support accessing and searching namespaces+ *+ * This is separate from pg_namespace.c, which contains the routines that+ * directly manipulate the pg_namespace system catalog. This module+ * provides routines associated with defining a "namespace search path"+ * and implementing search-path-controlled searches.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * IDENTIFICATION+ * src/backend/catalog/namespace.c+ *+ *-------------------------------------------------------------------------+ */+#include "postgres.h"++#include "access/htup_details.h"+#include "access/parallel.h"+#include "access/xact.h"+#include "access/xlog.h"+#include "catalog/dependency.h"+#include "catalog/objectaccess.h"+#include "catalog/pg_authid.h"+#include "catalog/pg_collation.h"+#include "catalog/pg_conversion.h"+#include "catalog/pg_conversion_fn.h"+#include "catalog/pg_namespace.h"+#include "catalog/pg_opclass.h"+#include "catalog/pg_operator.h"+#include "catalog/pg_opfamily.h"+#include "catalog/pg_proc.h"+#include "catalog/pg_ts_config.h"+#include "catalog/pg_ts_dict.h"+#include "catalog/pg_ts_parser.h"+#include "catalog/pg_ts_template.h"+#include "catalog/pg_type.h"+#include "commands/dbcommands.h"+#include "funcapi.h"+#include "mb/pg_wchar.h"+#include "miscadmin.h"+#include "nodes/makefuncs.h"+#include "parser/parse_func.h"+#include "storage/ipc.h"+#include "storage/lmgr.h"+#include "storage/sinval.h"+#include "utils/acl.h"+#include "utils/builtins.h"+#include "utils/catcache.h"+#include "utils/guc.h"+#include "utils/inval.h"+#include "utils/lsyscache.h"+#include "utils/memutils.h"+#include "utils/syscache.h"+++/*+ * The namespace search path is a possibly-empty list of namespace OIDs.+ * In addition to the explicit list, implicitly-searched namespaces+ * may be included:+ *+ * 1. If a TEMP table namespace has been initialized in this session, it+ * is implicitly searched first. (The only time this doesn't happen is+ * when we are obeying an override search path spec that says not to use the+ * temp namespace, or the temp namespace is included in the explicit list.)+ *+ * 2. The system catalog namespace is always searched. If the system+ * namespace is present in the explicit path then it will be searched in+ * the specified order; otherwise it will be searched after TEMP tables and+ * *before* the explicit list. (It might seem that the system namespace+ * should be implicitly last, but this behavior appears to be required by+ * SQL99. Also, this provides a way to search the system namespace first+ * without thereby making it the default creation target namespace.)+ *+ * For security reasons, searches using the search path will ignore the temp+ * namespace when searching for any object type other than relations and+ * types. (We must allow types since temp tables have rowtypes.)+ *+ * The default creation target namespace is always the first element of the+ * explicit list. If the explicit list is empty, there is no default target.+ *+ * The textual specification of search_path can include "$user" to refer to+ * the namespace named the same as the current user, if any. (This is just+ * ignored if there is no such namespace.) Also, it can include "pg_temp"+ * to refer to the current backend's temp namespace. This is usually also+ * ignorable if the temp namespace hasn't been set up, but there's a special+ * case: if "pg_temp" appears first then it should be the default creation+ * target. We kluge this case a little bit so that the temp namespace isn't+ * set up until the first attempt to create something in it. (The reason for+ * klugery is that we can't create the temp namespace outside a transaction,+ * but initial GUC processing of search_path happens outside a transaction.)+ * activeTempCreationPending is TRUE if "pg_temp" appears first in the string+ * but is not reflected in activeCreationNamespace because the namespace isn't+ * set up yet.+ *+ * In bootstrap mode, the search path is set equal to "pg_catalog", so that+ * the system namespace is the only one searched or inserted into.+ * initdb is also careful to set search_path to "pg_catalog" for its+ * post-bootstrap standalone backend runs. Otherwise the default search+ * path is determined by GUC. The factory default path contains the PUBLIC+ * namespace (if it exists), preceded by the user's personal namespace+ * (if one exists).+ *+ * We support a stack of "override" search path settings for use within+ * specific sections of backend code. namespace_search_path is ignored+ * whenever the override stack is nonempty. activeSearchPath is always+ * the actually active path; it points either to the search list of the+ * topmost stack entry, or to baseSearchPath which is the list derived+ * from namespace_search_path.+ *+ * If baseSearchPathValid is false, then baseSearchPath (and other+ * derived variables) need to be recomputed from namespace_search_path.+ * We mark it invalid upon an assignment to namespace_search_path or receipt+ * of a syscache invalidation event for pg_namespace. The recomputation+ * is done during the next non-overridden lookup attempt. Note that an+ * override spec is never subject to recomputation.+ *+ * Any namespaces mentioned in namespace_search_path that are not readable+ * by the current user ID are simply left out of baseSearchPath; so+ * we have to be willing to recompute the path when current userid changes.+ * namespaceUser is the userid the path has been computed for.+ *+ * Note: all data pointed to by these List variables is in TopMemoryContext.+ */++/* These variables define the actually active state: */++++/* default place to create stuff; if InvalidOid, no default */+++/* if TRUE, activeCreationNamespace is wrong, it should be temp namespace */+++/* These variables are the values last derived from namespace_search_path: */++++++++++/* The above four values are valid only if baseSearchPathValid */+++/* Override requests are remembered in a stack of OverrideStackEntry structs */++typedef struct+{+ List *searchPath; /* the desired search path */+ Oid creationNamespace; /* the desired creation namespace */+ int nestLevel; /* subtransaction nesting level */+} OverrideStackEntry;++++/*+ * myTempNamespace is InvalidOid until and unless a TEMP namespace is set up+ * in a particular backend session (this happens when a CREATE TEMP TABLE+ * command is first executed). Thereafter it's the OID of the temp namespace.+ *+ * myTempToastNamespace is the OID of the namespace for my temp tables' toast+ * tables. It is set when myTempNamespace is, and is InvalidOid before that.+ *+ * myTempNamespaceSubID shows whether we've created the TEMP namespace in the+ * current subtransaction. The flag propagates up the subtransaction tree,+ * so the main transaction will correctly recognize the flag if all+ * intermediate subtransactions commit. When it is InvalidSubTransactionId,+ * we either haven't made the TEMP namespace yet, or have successfully+ * committed its creation, depending on whether myTempNamespace is valid.+ */+++++++/*+ * This is the user's textual search path specification --- it's the value+ * of the GUC variable 'search_path'.+ */++++/* Local functions */+static void recomputeNamespacePath(void);+static void InitTempTableNamespace(void);+static void RemoveTempRelations(Oid tempNamespaceId);+static void RemoveTempRelationsCallback(int code, Datum arg);+static void NamespaceCallback(Datum arg, int cacheid, uint32 hashvalue);+static bool MatchNamedCall(HeapTuple proctup, int nargs, List *argnames,+ int **argnumbers);++/* These don't really need to appear in any header file */+Datum pg_table_is_visible(PG_FUNCTION_ARGS);+Datum pg_type_is_visible(PG_FUNCTION_ARGS);+Datum pg_function_is_visible(PG_FUNCTION_ARGS);+Datum pg_operator_is_visible(PG_FUNCTION_ARGS);+Datum pg_opclass_is_visible(PG_FUNCTION_ARGS);+Datum pg_opfamily_is_visible(PG_FUNCTION_ARGS);+Datum pg_collation_is_visible(PG_FUNCTION_ARGS);+Datum pg_conversion_is_visible(PG_FUNCTION_ARGS);+Datum pg_ts_parser_is_visible(PG_FUNCTION_ARGS);+Datum pg_ts_dict_is_visible(PG_FUNCTION_ARGS);+Datum pg_ts_template_is_visible(PG_FUNCTION_ARGS);+Datum pg_ts_config_is_visible(PG_FUNCTION_ARGS);+Datum pg_my_temp_schema(PG_FUNCTION_ARGS);+Datum pg_is_other_temp_schema(PG_FUNCTION_ARGS);+++/*+ * RangeVarGetRelid+ * Given a RangeVar describing an existing relation,+ * select the proper namespace and look up the relation OID.+ *+ * If the schema or relation is not found, return InvalidOid if missing_ok+ * = true, otherwise raise an error.+ *+ * If nowait = true, throw an error if we'd have to wait for a lock.+ *+ * Callback allows caller to check permissions or acquire additional locks+ * prior to grabbing the relation lock.+ */+++/*+ * RangeVarGetCreationNamespace+ * Given a RangeVar describing a to-be-created relation,+ * choose which namespace to create it in.+ *+ * Note: calling this may result in a CommandCounterIncrement operation.+ * That will happen on the first request for a temp table in any particular+ * backend run; we will need to either create or clean out the temp schema.+ */+++/*+ * RangeVarGetAndCheckCreationNamespace+ *+ * This function returns the OID of the namespace in which a new relation+ * with a given name should be created. If the user does not have CREATE+ * permission on the target namespace, this function will instead signal+ * an ERROR.+ *+ * If non-NULL, *existing_oid is set to the OID of any existing relation with+ * the same name which already exists in that namespace, or to InvalidOid if+ * no such relation exists.+ *+ * If lockmode != NoLock, the specified lock mode is acquired on the existing+ * relation, if any, provided that the current user owns the target relation.+ * However, if lockmode != NoLock and the user does not own the target+ * relation, we throw an ERROR, as we must not try to lock relations the+ * user does not have permissions on.+ *+ * As a side effect, this function acquires AccessShareLock on the target+ * namespace. Without this, the namespace could be dropped before our+ * transaction commits, leaving behind relations with relnamespace pointing+ * to a no-longer-exstant namespace.+ *+ * As a further side-effect, if the select namespace is a temporary namespace,+ * we mark the RangeVar as RELPERSISTENCE_TEMP.+ */+++/*+ * Adjust the relpersistence for an about-to-be-created relation based on the+ * creation namespace, and throw an error for invalid combinations.+ */+++/*+ * RelnameGetRelid+ * Try to resolve an unqualified relation name.+ * Returns OID if relation found in search path, else InvalidOid.+ */++++/*+ * RelationIsVisible+ * Determine whether a relation (identified by OID) is visible in the+ * current search path. Visible means "would be found by searching+ * for the unqualified relation name".+ */++++/*+ * TypenameGetTypid+ * Try to resolve an unqualified datatype name.+ * Returns OID if type found in search path, else InvalidOid.+ *+ * This is essentially the same as RelnameGetRelid.+ */+++/*+ * TypeIsVisible+ * Determine whether a type (identified by OID) is visible in the+ * current search path. Visible means "would be found by searching+ * for the unqualified type name".+ */++++/*+ * FuncnameGetCandidates+ * Given a possibly-qualified function name and argument count,+ * retrieve a list of the possible matches.+ *+ * If nargs is -1, we return all functions matching the given name,+ * regardless of argument count. (argnames must be NIL, and expand_variadic+ * and expand_defaults must be false, in this case.)+ *+ * If argnames isn't NIL, we are considering a named- or mixed-notation call,+ * and only functions having all the listed argument names will be returned.+ * (We assume that length(argnames) <= nargs and all the passed-in names are+ * distinct.) The returned structs will include an argnumbers array showing+ * the actual argument index for each logical argument position.+ *+ * If expand_variadic is true, then variadic functions having the same number+ * or fewer arguments will be retrieved, with the variadic argument and any+ * additional argument positions filled with the variadic element type.+ * nvargs in the returned struct is set to the number of such arguments.+ * If expand_variadic is false, variadic arguments are not treated specially,+ * and the returned nvargs will always be zero.+ *+ * If expand_defaults is true, functions that could match after insertion of+ * default argument values will also be retrieved. In this case the returned+ * structs could have nargs > passed-in nargs, and ndargs is set to the number+ * of additional args (which can be retrieved from the function's+ * proargdefaults entry).+ *+ * It is not possible for nvargs and ndargs to both be nonzero in the same+ * list entry, since default insertion allows matches to functions with more+ * than nargs arguments while the variadic transformation requires the same+ * number or less.+ *+ * When argnames isn't NIL, the returned args[] type arrays are not ordered+ * according to the functions' declarations, but rather according to the call:+ * first any positional arguments, then the named arguments, then defaulted+ * arguments (if needed and allowed by expand_defaults). The argnumbers[]+ * array can be used to map this back to the catalog information.+ * argnumbers[k] is set to the proargtypes index of the k'th call argument.+ *+ * We search a single namespace if the function name is qualified, else+ * all namespaces in the search path. In the multiple-namespace case,+ * we arrange for entries in earlier namespaces to mask identical entries in+ * later namespaces.+ *+ * When expanding variadics, we arrange for non-variadic functions to mask+ * variadic ones if the expanded argument list is the same. It is still+ * possible for there to be conflicts between different variadic functions,+ * however.+ *+ * It is guaranteed that the return list will never contain multiple entries+ * with identical argument lists. When expand_defaults is true, the entries+ * could have more than nargs positions, but we still guarantee that they are+ * distinct in the first nargs positions. However, if argnames isn't NIL or+ * either expand_variadic or expand_defaults is true, there might be multiple+ * candidate functions that expand to identical argument lists. Rather than+ * throw error here, we report such situations by returning a single entry+ * with oid = 0 that represents a set of such conflicting candidates.+ * The caller might end up discarding such an entry anyway, but if it selects+ * such an entry it should react as though the call were ambiguous.+ *+ * If missing_ok is true, an empty list (NULL) is returned if the name was+ * schema- qualified with a schema that does not exist. Likewise if no+ * candidate is found for other reasons.+ */+++/*+ * MatchNamedCall+ * Given a pg_proc heap tuple and a call's list of argument names,+ * check whether the function could match the call.+ *+ * The call could match if all supplied argument names are accepted by+ * the function, in positions after the last positional argument, and there+ * are defaults for all unsupplied arguments.+ *+ * The number of positional arguments is nargs - list_length(argnames).+ * Note caller has already done basic checks on argument count.+ *+ * On match, return true and fill *argnumbers with a palloc'd array showing+ * the mapping from call argument positions to actual function argument+ * numbers. Defaulted arguments are included in this map, at positions+ * after the last supplied argument.+ */+++/*+ * FunctionIsVisible+ * Determine whether a function (identified by OID) is visible in the+ * current search path. Visible means "would be found by searching+ * for the unqualified function name with exact argument matches".+ */++++/*+ * OpernameGetOprid+ * Given a possibly-qualified operator name and exact input datatypes,+ * look up the operator. Returns InvalidOid if not found.+ *+ * Pass oprleft = InvalidOid for a prefix op, oprright = InvalidOid for+ * a postfix op.+ *+ * If the operator name is not schema-qualified, it is sought in the current+ * namespace search path. If the name is schema-qualified and the given+ * schema does not exist, InvalidOid is returned.+ */+++/*+ * OpernameGetCandidates+ * Given a possibly-qualified operator name and operator kind,+ * retrieve a list of the possible matches.+ *+ * If oprkind is '\0', we return all operators matching the given name,+ * regardless of arguments.+ *+ * We search a single namespace if the operator name is qualified, else+ * all namespaces in the search path. The return list will never contain+ * multiple entries with identical argument lists --- in the multiple-+ * namespace case, we arrange for entries in earlier namespaces to mask+ * identical entries in later namespaces.+ *+ * The returned items always have two args[] entries --- one or the other+ * will be InvalidOid for a prefix or postfix oprkind. nargs is 2, too.+ */+#define SPACE_PER_OP MAXALIGN(offsetof(struct _FuncCandidateList, args) + \+ 2 * sizeof(Oid))++/*+ * OperatorIsVisible+ * Determine whether an operator (identified by OID) is visible in the+ * current search path. Visible means "would be found by searching+ * for the unqualified operator name with exact argument matches".+ */++++/*+ * OpclassnameGetOpcid+ * Try to resolve an unqualified index opclass name.+ * Returns OID if opclass found in search path, else InvalidOid.+ *+ * This is essentially the same as TypenameGetTypid, but we have to have+ * an extra argument for the index AM OID.+ */+++/*+ * OpclassIsVisible+ * Determine whether an opclass (identified by OID) is visible in the+ * current search path. Visible means "would be found by searching+ * for the unqualified opclass name".+ */+++/*+ * OpfamilynameGetOpfid+ * Try to resolve an unqualified index opfamily name.+ * Returns OID if opfamily found in search path, else InvalidOid.+ *+ * This is essentially the same as TypenameGetTypid, but we have to have+ * an extra argument for the index AM OID.+ */+++/*+ * OpfamilyIsVisible+ * Determine whether an opfamily (identified by OID) is visible in the+ * current search path. Visible means "would be found by searching+ * for the unqualified opfamily name".+ */+++/*+ * CollationGetCollid+ * Try to resolve an unqualified collation name.+ * Returns OID if collation found in search path, else InvalidOid.+ */+++/*+ * CollationIsVisible+ * Determine whether a collation (identified by OID) is visible in the+ * current search path. Visible means "would be found by searching+ * for the unqualified collation name".+ */++++/*+ * ConversionGetConid+ * Try to resolve an unqualified conversion name.+ * Returns OID if conversion found in search path, else InvalidOid.+ *+ * This is essentially the same as RelnameGetRelid.+ */+++/*+ * ConversionIsVisible+ * Determine whether a conversion (identified by OID) is visible in the+ * current search path. Visible means "would be found by searching+ * for the unqualified conversion name".+ */+++/*+ * get_ts_parser_oid - find a TS parser by possibly qualified name+ *+ * If not found, returns InvalidOid if missing_ok, else throws error+ */+++/*+ * TSParserIsVisible+ * Determine whether a parser (identified by OID) is visible in the+ * current search path. Visible means "would be found by searching+ * for the unqualified parser name".+ */+++/*+ * get_ts_dict_oid - find a TS dictionary by possibly qualified name+ *+ * If not found, returns InvalidOid if failOK, else throws error+ */+++/*+ * TSDictionaryIsVisible+ * Determine whether a dictionary (identified by OID) is visible in the+ * current search path. Visible means "would be found by searching+ * for the unqualified dictionary name".+ */+++/*+ * get_ts_template_oid - find a TS template by possibly qualified name+ *+ * If not found, returns InvalidOid if missing_ok, else throws error+ */+++/*+ * TSTemplateIsVisible+ * Determine whether a template (identified by OID) is visible in the+ * current search path. Visible means "would be found by searching+ * for the unqualified template name".+ */+++/*+ * get_ts_config_oid - find a TS config by possibly qualified name+ *+ * If not found, returns InvalidOid if missing_ok, else throws error+ */+++/*+ * TSConfigIsVisible+ * Determine whether a text search configuration (identified by OID)+ * is visible in the current search path. Visible means "would be found+ * by searching for the unqualified text search configuration name".+ */++++/*+ * DeconstructQualifiedName+ * Given a possibly-qualified name expressed as a list of String nodes,+ * extract the schema name and object name.+ *+ * *nspname_p is set to NULL if there is no explicit schema name.+ */+++/*+ * LookupNamespaceNoError+ * Look up a schema name.+ *+ * Returns the namespace OID, or InvalidOid if not found.+ *+ * Note this does NOT perform any permissions check --- callers are+ * responsible for being sure that an appropriate check is made.+ * In the majority of cases LookupExplicitNamespace is preferable.+ */+++/*+ * LookupExplicitNamespace+ * Process an explicitly-specified schema name: look up the schema+ * and verify we have USAGE (lookup) rights in it.+ *+ * Returns the namespace OID+ */+++/*+ * LookupCreationNamespace+ * Look up the schema and verify we have CREATE rights on it.+ *+ * This is just like LookupExplicitNamespace except for the different+ * permission check, and that we are willing to create pg_temp if needed.+ *+ * Note: calling this may result in a CommandCounterIncrement operation,+ * if we have to create or clean out the temp namespace.+ */+++/*+ * Common checks on switching namespaces.+ *+ * We complain if (1) the old and new namespaces are the same, (2) either the+ * old or new namespaces is a temporary schema (or temporary toast schema), or+ * (3) either the old or new namespaces is the TOAST schema.+ */+++/*+ * QualifiedNameGetCreationNamespace+ * Given a possibly-qualified name for an object (in List-of-Values+ * format), determine what namespace the object should be created in.+ * Also extract and return the object name (last component of list).+ *+ * Note: this does not apply any permissions check. Callers must check+ * for CREATE rights on the selected namespace when appropriate.+ *+ * Note: calling this may result in a CommandCounterIncrement operation,+ * if we have to create or clean out the temp namespace.+ */+++/*+ * get_namespace_oid - given a namespace name, look up the OID+ *+ * If missing_ok is false, throw an error if namespace name not found. If+ * true, just return InvalidOid.+ */+++/*+ * makeRangeVarFromNameList+ * Utility routine to convert a qualified-name list into RangeVar form.+ */+++/*+ * NameListToString+ * Utility routine to convert a qualified-name list into a string.+ *+ * This is used primarily to form error messages, and so we do not quote+ * the list elements, for the sake of legibility.+ *+ * In most scenarios the list elements should always be Value strings,+ * but we also allow A_Star for the convenience of ColumnRef processing.+ */+char *+NameListToString(List *names)+{+ StringInfoData string;+ ListCell *l;++ initStringInfo(&string);++ foreach(l, names)+ {+ Node *name = (Node *) lfirst(l);++ if (l != list_head(names))+ appendStringInfoChar(&string, '.');++ if (IsA(name, String))+ appendStringInfoString(&string, strVal(name));+ else if (IsA(name, A_Star))+ appendStringInfoChar(&string, '*');+ else+ elog(ERROR, "unexpected node type in name list: %d",+ (int) nodeTag(name));+ }++ return string.data;+}++/*+ * NameListToQuotedString+ * Utility routine to convert a qualified-name list into a string.+ *+ * Same as above except that names will be double-quoted where necessary,+ * so the string could be re-parsed (eg, by textToQualifiedNameList).+ */+++/*+ * isTempNamespace - is the given namespace my temporary-table namespace?+ */+++/*+ * isTempToastNamespace - is the given namespace my temporary-toast-table+ * namespace?+ */+++/*+ * isTempOrTempToastNamespace - is the given namespace my temporary-table+ * namespace or my temporary-toast-table namespace?+ */+++/*+ * isAnyTempNamespace - is the given namespace a temporary-table namespace+ * (either my own, or another backend's)? Temporary-toast-table namespaces+ * are included, too.+ */+++/*+ * isOtherTempNamespace - is the given namespace some other backend's+ * temporary-table namespace (including temporary-toast-table namespaces)?+ *+ * Note: for most purposes in the C code, this function is obsolete. Use+ * RELATION_IS_OTHER_TEMP() instead to detect non-local temp relations.+ */+++/*+ * GetTempNamespaceBackendId - if the given namespace is a temporary-table+ * namespace (either my own, or another backend's), return the BackendId+ * that owns it. Temporary-toast-table namespaces are included, too.+ * If it isn't a temp namespace, return InvalidBackendId.+ */+++/*+ * GetTempToastNamespace - get the OID of my temporary-toast-table namespace,+ * which must already be assigned. (This is only used when creating a toast+ * table for a temp table, so we must have already done InitTempTableNamespace)+ */++++/*+ * GetOverrideSearchPath - fetch current search path definition in form+ * used by PushOverrideSearchPath.+ *+ * The result structure is allocated in the specified memory context+ * (which might or might not be equal to CurrentMemoryContext); but any+ * junk created by revalidation calculations will be in CurrentMemoryContext.+ */+++/*+ * CopyOverrideSearchPath - copy the specified OverrideSearchPath.+ *+ * The result structure is allocated in CurrentMemoryContext.+ */+++/*+ * OverrideSearchPathMatchesCurrent - does path match current setting?+ */+++/*+ * PushOverrideSearchPath - temporarily override the search path+ *+ * We allow nested overrides, hence the push/pop terminology. The GUC+ * search_path variable is ignored while an override is active.+ *+ * It's possible that newpath->useTemp is set but there is no longer any+ * active temp namespace, if the path was saved during a transaction that+ * created a temp namespace and was later rolled back. In that case we just+ * ignore useTemp. A plausible alternative would be to create a new temp+ * namespace, but for existing callers that's not necessary because an empty+ * temp namespace wouldn't affect their results anyway.+ *+ * It's also worth noting that other schemas listed in newpath might not+ * exist anymore either. We don't worry about this because OIDs that match+ * no existing namespace will simply not produce any hits during searches.+ */+++/*+ * PopOverrideSearchPath - undo a previous PushOverrideSearchPath+ *+ * Any push during a (sub)transaction will be popped automatically at abort.+ * But it's caller error if a push isn't popped in normal control flow.+ */++++/*+ * get_collation_oid - find a collation by possibly qualified name+ */+Oid get_collation_oid(List *name, bool missing_ok) { return -1; }+++/*+ * get_conversion_oid - find a conversion by possibly qualified name+ */+++/*+ * FindDefaultConversionProc - find default encoding conversion proc+ */+++/*+ * recomputeNamespacePath - recompute path derived variables if needed.+ */+++/*+ * InitTempTableNamespace+ * Initialize temp table namespace on first use in a particular backend+ */+++/*+ * End-of-transaction cleanup for namespaces.+ */+++/*+ * AtEOSubXact_Namespace+ *+ * At subtransaction commit, propagate the temp-namespace-creation+ * flag to the parent subtransaction.+ *+ * At subtransaction abort, forget the flag if we set it up.+ */+++/*+ * Remove all relations in the specified temp namespace.+ *+ * This is called at backend shutdown (if we made any temp relations).+ * It is also called when we begin using a pre-existing temp namespace,+ * in order to clean out any relations that might have been created by+ * a crashed backend.+ */+++/*+ * Callback to remove temp relations at backend exit.+ */+++/*+ * Remove all temp tables from the temporary namespace.+ */++++/*+ * Routines for handling the GUC variable 'search_path'.+ */++/* check_hook: validate new search_path value */+++/* assign_hook: do extra actions as needed */+++/*+ * InitializeSearchPath: initialize module during InitPostgres.+ *+ * This is called after we are up enough to be able to do catalog lookups.+ */+++/*+ * NamespaceCallback+ * Syscache inval callback function+ */+++/*+ * Fetch the active search path. The return value is a palloc'ed list+ * of OIDs; the caller is responsible for freeing this storage as+ * appropriate.+ *+ * The returned list includes the implicitly-prepended namespaces only if+ * includeImplicit is true.+ *+ * Note: calling this may result in a CommandCounterIncrement operation,+ * if we have to create or clean out the temp namespace.+ */+++/*+ * Fetch the active search path into a caller-allocated array of OIDs.+ * Returns the number of path entries. (If this is more than sarray_len,+ * then the data didn't fit and is not all stored.)+ *+ * The returned list always includes the implicitly-prepended namespaces,+ * but never includes the temp namespace. (This is suitable for existing+ * users, which would want to ignore the temp namespace anyway.) This+ * definition allows us to not worry about initializing the temp namespace.+ */++++/*+ * Export the FooIsVisible functions as SQL-callable functions.+ *+ * Note: as of Postgres 8.4, these will silently return NULL if called on+ * a nonexistent object OID, rather than failing. This is to avoid race+ * condition errors when a query that's scanning a catalog using an MVCC+ * snapshot uses one of these functions. The underlying IsVisible functions+ * always use an up-to-date snapshot and so might see the object as already+ * gone when it's still visible to the transaction snapshot. (There is no race+ * condition in the current coding because we don't accept sinval messages+ * between the SearchSysCacheExists test and the subsequent lookup.)+ */++++++++++++++++++++++++++++
+ foreign/libpg_query/src/postgres/src_backend_catalog_pg_proc.c view
@@ -0,0 +1,143 @@+/*--------------------------------------------------------------------+ * Symbols referenced in this file:+ * - function_parse_error_transpose+ *--------------------------------------------------------------------+ */++/*-------------------------------------------------------------------------+ *+ * pg_proc.c+ * routines to support manipulation of the pg_proc relation+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ *+ * IDENTIFICATION+ * src/backend/catalog/pg_proc.c+ *+ *-------------------------------------------------------------------------+ */+#include "postgres.h"++#include "access/htup_details.h"+#include "access/xact.h"+#include "catalog/dependency.h"+#include "catalog/indexing.h"+#include "catalog/objectaccess.h"+#include "catalog/pg_language.h"+#include "catalog/pg_namespace.h"+#include "catalog/pg_proc.h"+#include "catalog/pg_proc_fn.h"+#include "catalog/pg_transform.h"+#include "catalog/pg_type.h"+#include "commands/defrem.h"+#include "executor/functions.h"+#include "funcapi.h"+#include "mb/pg_wchar.h"+#include "miscadmin.h"+#include "nodes/nodeFuncs.h"+#include "parser/parse_type.h"+#include "tcop/pquery.h"+#include "tcop/tcopprot.h"+#include "utils/acl.h"+#include "utils/builtins.h"+#include "utils/lsyscache.h"+#include "utils/rel.h"+#include "utils/syscache.h"+++Datum fmgr_internal_validator(PG_FUNCTION_ARGS);+Datum fmgr_c_validator(PG_FUNCTION_ARGS);+Datum fmgr_sql_validator(PG_FUNCTION_ARGS);++typedef struct+{+ char *proname;+ char *prosrc;+} parse_error_callback_arg;++static void sql_function_parse_error_callback(void *arg);+static int match_prosrc_to_query(const char *prosrc, const char *queryText,+ int cursorpos);+static bool match_prosrc_to_literal(const char *prosrc, const char *literal,+ int cursorpos, int *newcursorpos);+++/* ----------------------------------------------------------------+ * ProcedureCreate+ *+ * Note: allParameterTypes, parameterModes, parameterNames, trftypes, and proconfig+ * are either arrays of the proper types or NULL. We declare them Datum,+ * not "ArrayType *", to avoid importing array.h into pg_proc_fn.h.+ * ----------------------------------------------------------------+ */+++++/*+ * Validator for internal functions+ *+ * Check that the given internal function name (the "prosrc" value) is+ * a known builtin function.+ */+++++/*+ * Validator for C language functions+ *+ * Make sure that the library file exists, is loadable, and contains+ * the specified link symbol. Also check for a valid function+ * information record.+ */++++/*+ * Validator for SQL language functions+ *+ * Parse it here in order to be sure that it contains no syntax errors.+ */+++/*+ * Error context callback for handling errors in SQL function definitions+ */+++/*+ * Adjust a syntax error occurring inside the function body of a CREATE+ * FUNCTION or DO command. This can be used by any function validator or+ * anonymous-block handler, not only for SQL-language functions.+ * It is assumed that the syntax error position is initially relative to the+ * function body string (as passed in). If possible, we adjust the position+ * to reference the original command text; if we can't manage that, we set+ * up an "internal query" syntax error instead.+ *+ * Returns true if a syntax error was processed, false if not.+ */+bool function_parse_error_transpose(const char *prosrc) { return false; }+++/*+ * Try to locate the string literal containing the function body in the+ * given text of the CREATE FUNCTION or DO command. If successful, return+ * the character (not byte) index within the command corresponding to the+ * given character index within the literal. If not successful, return 0.+ */+++/*+ * Try to match the given source text to a single-quoted literal.+ * If successful, adjust newcursorpos to correspond to the character+ * (not byte) index corresponding to cursorpos in the source text.+ *+ * At entry, literal points just past a ' character. We must check for the+ * trailing quote.+ */+++
+ foreign/libpg_query/src/postgres/src_backend_commands_define.c view
@@ -0,0 +1,102 @@+/*--------------------------------------------------------------------+ * Symbols referenced in this file:+ * - defWithOids+ *--------------------------------------------------------------------+ */++/*-------------------------------------------------------------------------+ *+ * define.c+ * Support routines for various kinds of object creation.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ *+ * IDENTIFICATION+ * src/backend/commands/define.c+ *+ * DESCRIPTION+ * The "DefineFoo" routines take the parse tree and pick out the+ * appropriate arguments/flags, passing the results to the+ * corresponding "FooDefine" routines (in src/catalog) that do+ * the actual catalog-munging. These routines also verify permission+ * of the user to execute the command.+ *+ * NOTES+ * These things must be defined and committed in the following order:+ * "create function":+ * input/output, recv/send procedures+ * "create type":+ * type+ * "create operator":+ * operators+ *+ *+ *-------------------------------------------------------------------------+ */+#include "postgres.h"++#include <ctype.h>+#include <math.h>++#include "catalog/namespace.h"+#include "commands/defrem.h"+#include "nodes/makefuncs.h"+#include "parser/parse_type.h"+#include "parser/scansup.h"+#include "utils/int8.h"++/*+ * Extract a string value (otherwise uninterpreted) from a DefElem.+ */+++/*+ * Extract a numeric value (actually double) from a DefElem.+ */+++/*+ * Extract a boolean value from a DefElem.+ */+++/*+ * Extract an int32 value from a DefElem.+ */+++/*+ * Extract an int64 value from a DefElem.+ */+++/*+ * Extract a possibly-qualified name (as a List of Strings) from a DefElem.+ */+++/*+ * Extract a TypeName from a DefElem.+ *+ * Note: we do not accept a List arg here, because the parser will only+ * return a bare List when the name looks like an operator name.+ */+++/*+ * Extract a type length indicator (either absolute bytes, or+ * -1 for "variable") from a DefElem.+ */+++/*+ * Create a DefElem setting "oids" to the specified value.+ */+DefElem *+defWithOids(bool value)+{+ return makeDefElem("oids", (Node *) makeInteger(value));+}
+ foreign/libpg_query/src/postgres/src_backend_lib_stringinfo.c view
@@ -0,0 +1,293 @@+/*--------------------------------------------------------------------+ * Symbols referenced in this file:+ * - initStringInfo+ * - resetStringInfo+ * - appendStringInfoString+ * - appendBinaryStringInfo+ * - appendStringInfoChar+ * - appendStringInfoVA+ * - enlargeStringInfo+ * - appendStringInfo+ * - appendStringInfoSpaces+ *--------------------------------------------------------------------+ */++/*-------------------------------------------------------------------------+ *+ * stringinfo.c+ *+ * StringInfo provides an indefinitely-extensible string data type.+ * It can be used to buffer either ordinary C strings (null-terminated text)+ * or arbitrary binary data. All storage is allocated with palloc().+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/backend/lib/stringinfo.c+ *+ *-------------------------------------------------------------------------+ */+#include "postgres.h"++#include "lib/stringinfo.h"+#include "utils/memutils.h"+++/*+ * makeStringInfo+ *+ * Create an empty 'StringInfoData' & return a pointer to it.+ */+++/*+ * initStringInfo+ *+ * Initialize a StringInfoData struct (with previously undefined contents)+ * to describe an empty string.+ */+void+initStringInfo(StringInfo str)+{+ int size = 1024; /* initial default buffer size */++ str->data = (char *) palloc(size);+ str->maxlen = size;+ resetStringInfo(str);+}++/*+ * resetStringInfo+ *+ * Reset the StringInfo: the data buffer remains valid, but its+ * previous content, if any, is cleared.+ */+void+resetStringInfo(StringInfo str)+{+ str->data[0] = '\0';+ str->len = 0;+ str->cursor = 0;+}++/*+ * appendStringInfo+ *+ * Format text data under the control of fmt (an sprintf-style format string)+ * and append it to whatever is already in str. More space is allocated+ * to str if necessary. This is sort of like a combination of sprintf and+ * strcat.+ */+void+appendStringInfo(StringInfo str, const char *fmt,...)+{+ for (;;)+ {+ va_list args;+ int needed;++ /* Try to format the data. */+ va_start(args, fmt);+ needed = appendStringInfoVA(str, fmt, args);+ va_end(args);++ if (needed == 0)+ break; /* success */++ /* Increase the buffer size and try again. */+ enlargeStringInfo(str, needed);+ }+}++/*+ * appendStringInfoVA+ *+ * Attempt to format text data under the control of fmt (an sprintf-style+ * format string) and append it to whatever is already in str. If successful+ * return zero; if not (because there's not enough space), return an estimate+ * of the space needed, without modifying str. Typically the caller should+ * pass the return value to enlargeStringInfo() before trying again; see+ * appendStringInfo for standard usage pattern.+ *+ * XXX This API is ugly, but there seems no alternative given the C spec's+ * restrictions on what can portably be done with va_list arguments: you have+ * to redo va_start before you can rescan the argument list, and we can't do+ * that from here.+ */+int+appendStringInfoVA(StringInfo str, const char *fmt, va_list args)+{+ int avail;+ size_t nprinted;++ Assert(str != NULL);++ /*+ * If there's hardly any space, don't bother trying, just fail to make the+ * caller enlarge the buffer first. We have to guess at how much to+ * enlarge, since we're skipping the formatting work.+ */+ avail = str->maxlen - str->len;+ if (avail < 16)+ return 32;++ nprinted = pvsnprintf(str->data + str->len, (size_t) avail, fmt, args);++ if (nprinted < (size_t) avail)+ {+ /* Success. Note nprinted does not include trailing null. */+ str->len += (int) nprinted;+ return 0;+ }++ /* Restore the trailing null so that str is unmodified. */+ str->data[str->len] = '\0';++ /*+ * Return pvsnprintf's estimate of the space needed. (Although this is+ * given as a size_t, we know it will fit in int because it's not more+ * than MaxAllocSize.)+ */+ return (int) nprinted;+}++/*+ * appendStringInfoString+ *+ * Append a null-terminated string to str.+ * Like appendStringInfo(str, "%s", s) but faster.+ */+void+appendStringInfoString(StringInfo str, const char *s)+{+ appendBinaryStringInfo(str, s, strlen(s));+}++/*+ * appendStringInfoChar+ *+ * Append a single byte to str.+ * Like appendStringInfo(str, "%c", ch) but much faster.+ */+void+appendStringInfoChar(StringInfo str, char ch)+{+ /* Make more room if needed */+ if (str->len + 1 >= str->maxlen)+ enlargeStringInfo(str, 1);++ /* OK, append the character */+ str->data[str->len] = ch;+ str->len++;+ str->data[str->len] = '\0';+}++/*+ * appendStringInfoSpaces+ *+ * Append the specified number of spaces to a buffer.+ */+void+appendStringInfoSpaces(StringInfo str, int count)+{+ if (count > 0)+ {+ /* Make more room if needed */+ enlargeStringInfo(str, count);++ /* OK, append the spaces */+ while (--count >= 0)+ str->data[str->len++] = ' ';+ str->data[str->len] = '\0';+ }+}++/*+ * appendBinaryStringInfo+ *+ * Append arbitrary binary data to a StringInfo, allocating more space+ * if necessary.+ */+void+appendBinaryStringInfo(StringInfo str, const char *data, int datalen)+{+ Assert(str != NULL);++ /* Make more room if needed */+ enlargeStringInfo(str, datalen);++ /* OK, append the data */+ memcpy(str->data + str->len, data, datalen);+ str->len += datalen;++ /*+ * Keep a trailing null in place, even though it's probably useless for+ * binary data. (Some callers are dealing with text but call this because+ * their input isn't null-terminated.)+ */+ str->data[str->len] = '\0';+}++/*+ * enlargeStringInfo+ *+ * Make sure there is enough space for 'needed' more bytes+ * ('needed' does not include the terminating null).+ *+ * External callers usually need not concern themselves with this, since+ * all stringinfo.c routines do it automatically. However, if a caller+ * knows that a StringInfo will eventually become X bytes large, it+ * can save some palloc overhead by enlarging the buffer before starting+ * to store data in it.+ *+ * NB: because we use repalloc() to enlarge the buffer, the string buffer+ * will remain allocated in the same memory context that was current when+ * initStringInfo was called, even if another context is now current.+ * This is the desired and indeed critical behavior!+ */+void+enlargeStringInfo(StringInfo str, int needed)+{+ int newlen;++ /*+ * Guard against out-of-range "needed" values. Without this, we can get+ * an overflow or infinite loop in the following.+ */+ if (needed < 0) /* should not happen */+ elog(ERROR, "invalid string enlargement request size: %d", needed);+ if (((Size) needed) >= (MaxAllocSize - (Size) str->len))+ ereport(ERROR,+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),+ errmsg("out of memory"),+ errdetail("Cannot enlarge string buffer containing %d bytes by %d more bytes.",+ str->len, needed)));++ needed += str->len + 1; /* total space required now */++ /* Because of the above test, we now have needed <= MaxAllocSize */++ if (needed <= str->maxlen)+ return; /* got enough space already */++ /*+ * We don't want to allocate just a little more space with each append;+ * for efficiency, double the buffer size each time it overflows.+ * Actually, we might need to more than double it if 'needed' is big...+ */+ newlen = 2 * str->maxlen;+ while (needed > newlen)+ newlen = 2 * newlen;++ /*+ * Clamp to MaxAllocSize in case we went past it. Note we are assuming+ * here that MaxAllocSize <= INT_MAX/2, else the above loop could+ * overflow. We will still have newlen >= needed.+ */+ if (newlen > (int) MaxAllocSize)+ newlen = (int) MaxAllocSize;++ str->data = (char *) repalloc(str->data, newlen);++ str->maxlen = newlen;+}
+ foreign/libpg_query/src/postgres/src_backend_libpq_pqcomm.c view
@@ -0,0 +1,634 @@+/*--------------------------------------------------------------------+ * Symbols referenced in this file:+ * - PqCommMethods+ *--------------------------------------------------------------------+ */++/*-------------------------------------------------------------------------+ *+ * pqcomm.c+ * Communication functions between the Frontend and the Backend+ *+ * These routines handle the low-level details of communication between+ * frontend and backend. They just shove data across the communication+ * channel, and are ignorant of the semantics of the data --- or would be,+ * except for major brain damage in the design of the old COPY OUT protocol.+ * Unfortunately, COPY OUT was designed to commandeer the communication+ * channel (it just transfers data without wrapping it into messages).+ * No other messages can be sent while COPY OUT is in progress; and if the+ * copy is aborted by an ereport(ERROR), we need to close out the copy so that+ * the frontend gets back into sync. Therefore, these routines have to be+ * aware of COPY OUT state. (New COPY-OUT is message-based and does *not*+ * set the DoingCopyOut flag.)+ *+ * NOTE: generally, it's a bad idea to emit outgoing messages directly with+ * pq_putbytes(), especially if the message would require multiple calls+ * to send. Instead, use the routines in pqformat.c to construct the message+ * in a buffer and then emit it in one call to pq_putmessage. This ensures+ * that the channel will not be clogged by an incomplete message if execution+ * is aborted by ereport(ERROR) partway through the message. The only+ * non-libpq code that should call pq_putbytes directly is old-style COPY OUT.+ *+ * At one time, libpq was shared between frontend and backend, but now+ * the backend's "backend/libpq" is quite separate from "interfaces/libpq".+ * All that remains is similarities of names to trap the unwary...+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * src/backend/libpq/pqcomm.c+ *+ *-------------------------------------------------------------------------+ */++/*------------------------+ * INTERFACE ROUTINES+ *+ * setup/teardown:+ * StreamServerPort - Open postmaster's server port+ * StreamConnection - Create new connection with client+ * StreamClose - Close a client/backend connection+ * TouchSocketFiles - Protect socket files against /tmp cleaners+ * pq_init - initialize libpq at backend startup+ * pq_comm_reset - reset libpq during error recovery+ * pq_close - shutdown libpq at backend exit+ *+ * low-level I/O:+ * pq_getbytes - get a known number of bytes from connection+ * pq_getstring - get a null terminated string from connection+ * pq_getmessage - get a message with length word from connection+ * pq_getbyte - get next byte from connection+ * pq_peekbyte - peek at next byte from connection+ * pq_putbytes - send bytes to connection (not flushed until pq_flush)+ * pq_flush - flush pending output+ * pq_flush_if_writable - flush pending output if writable without blocking+ * pq_getbyte_if_available - get a byte if available without blocking+ *+ * message-level I/O (and old-style-COPY-OUT cruft):+ * pq_putmessage - send a normal message (suppressed in COPY OUT mode)+ * pq_putmessage_noblock - buffer a normal message (suppressed in COPY OUT)+ * pq_startcopyout - inform libpq that a COPY OUT transfer is beginning+ * pq_endcopyout - end a COPY OUT transfer+ *+ *------------------------+ */+#include "postgres.h"++#include <signal.h>+#include <fcntl.h>+#include <grp.h>+#include <unistd.h>+#include <sys/file.h>+#include <sys/socket.h>+#include <sys/stat.h>+#include <sys/time.h>+#include <netdb.h>+#include <netinet/in.h>+#ifdef HAVE_NETINET_TCP_H+#include <netinet/tcp.h>+#endif+#include <arpa/inet.h>+#ifdef HAVE_UTIME_H+#include <utime.h>+#endif+#ifdef WIN32_ONLY_COMPILER /* mstcpip.h is missing on mingw */+#include <mstcpip.h>+#endif++#include "libpq/ip.h"+#include "libpq/libpq.h"+#include "miscadmin.h"+#include "storage/ipc.h"+#include "utils/guc.h"+#include "utils/memutils.h"++/*+ * Configuration options+ */++++/* Where the Unix socket files are (list of palloc'd strings) */+++/*+ * Buffers for low-level I/O.+ *+ * The receive buffer is fixed size. Send buffer is usually 8k, but can be+ * enlarged by pq_putmessage_noblock() if the message doesn't fit otherwise.+ */++#define PQ_SEND_BUFFER_SIZE 8192+#define PQ_RECV_BUFFER_SIZE 8192+++ /* Size send buffer */+ /* Next index to store a byte in PqSendBuffer */+ /* Next index to send a byte in PqSendBuffer */+++ /* Next index to read a byte from PqRecvBuffer */+ /* End of data available in PqRecvBuffer */++/*+ * Message status+ */+ /* busy sending data to the client */+ /* in the middle of reading a message */+ /* in old-protocol COPY OUT processing */+++/* Internal functions */+static void socket_comm_reset(void);+static void socket_close(int code, Datum arg);+static void socket_set_nonblocking(bool nonblocking);+static int socket_flush(void);+static int socket_flush_if_writable(void);+static bool socket_is_send_pending(void);+static int socket_putmessage(char msgtype, const char *s, size_t len);+static void socket_putmessage_noblock(char msgtype, const char *s, size_t len);+static void socket_startcopyout(void);+static void socket_endcopyout(bool errorAbort);+static int internal_putbytes(const char *s, size_t len);+static int internal_flush(void);+static void socket_set_nonblocking(bool nonblocking);++#ifdef HAVE_UNIX_SOCKETS+static int Lock_AF_UNIX(char *unixSocketDir, char *unixSocketPath);+static int Setup_AF_UNIX(char *sock_path);+#endif /* HAVE_UNIX_SOCKETS */++++PQcommMethods *PqCommMethods = NULL;+++++/* --------------------------------+ * pq_init - initialize libpq at backend startup+ * --------------------------------+ */+#ifndef WIN32+#endif++/* --------------------------------+ * socket_comm_reset - reset libpq during error recovery+ *+ * This is called from error recovery at the outer idle loop. It's+ * just to get us out of trouble if we somehow manage to elog() from+ * inside a pqcomm.c routine (which ideally will never happen, but...)+ * --------------------------------+ */+++/* --------------------------------+ * socket_close - shutdown libpq at backend exit+ *+ * This is the one pg_on_exit_callback in place during BackendInitialize().+ * That function's unusual signal handling constrains that this callback be+ * safe to run at any instant.+ * --------------------------------+ */+#if defined(ENABLE_GSS) || defined(ENABLE_SSPI)+#ifdef ENABLE_GSS+#endif /* ENABLE_GSS */+#endif /* ENABLE_GSS || ENABLE_SSPI */++++/*+ * Streams -- wrapper around Unix socket system calls+ *+ *+ * Stream functions are used for vanilla TCP connection protocol.+ */+++/*+ * StreamServerPort -- open a "listening" port to accept connections.+ *+ * family should be AF_UNIX or AF_UNSPEC; portNumber is the port number.+ * For AF_UNIX ports, hostName should be NULL and unixSocketDir must be+ * specified. For TCP ports, hostName is either NULL for all interfaces or+ * the interface to listen on, and unixSocketDir is ignored (can be NULL).+ *+ * Successfully opened sockets are added to the ListenSocket[] array (of+ * length MaxListen), at the first position that isn't PGINVALID_SOCKET.+ *+ * RETURNS: STATUS_OK or STATUS_ERROR+ */++#ifdef HAVE_UNIX_SOCKETS+#endif+#if !defined(WIN32) || defined(IPV6_V6ONLY)+#endif+#ifdef HAVE_UNIX_SOCKETS+#endif /* HAVE_UNIX_SOCKETS */+#ifdef HAVE_IPV6+#endif+#ifdef HAVE_UNIX_SOCKETS+#endif+#ifndef WIN32+#endif+#ifdef IPV6_V6ONLY+#endif+#ifdef HAVE_UNIX_SOCKETS+#endif+++#ifdef HAVE_UNIX_SOCKETS++/*+ * Lock_AF_UNIX -- configure unix socket file path+ */++++/*+ * Setup_AF_UNIX -- configure unix socket permissions+ */+#ifdef WIN32+#else+#endif+#endif /* HAVE_UNIX_SOCKETS */+++/*+ * StreamConnection -- create a new connection with client using+ * server port. Set port->sock to the FD of the new connection.+ *+ * ASSUME: that this doesn't need to be non-blocking because+ * the Postmaster uses select() to tell when the server master+ * socket is ready for accept().+ *+ * RETURNS: STATUS_OK or STATUS_ERROR+ */+#ifdef SCO_ACCEPT_BUG+#endif+#ifdef TCP_NODELAY+#endif+#ifdef WIN32+#endif++/*+ * StreamClose -- close a client/backend connection+ *+ * NOTE: this is NOT used to terminate a session; it is just used to release+ * the file descriptor in a process that should no longer have the socket+ * open. (For example, the postmaster calls this after passing ownership+ * of the connection to a child process.) It is expected that someone else+ * still has the socket open. So, we only want to close the descriptor,+ * we do NOT want to send anything to the far end.+ */+++/*+ * TouchSocketFiles -- mark socket files as recently accessed+ *+ * This routine should be called every so often to ensure that the socket+ * files have a recent mod date (ordinary operations on sockets usually won't+ * change the mod date). That saves them from being removed by+ * overenthusiastic /tmp-directory-cleaner daemons. (Another reason we should+ * never have put the socket file in /tmp...)+ */+#ifdef HAVE_UTIME+#else /* !HAVE_UTIME */+#ifdef HAVE_UTIMES+#endif /* HAVE_UTIMES */+#endif /* HAVE_UTIME */++/*+ * RemoveSocketFiles -- unlink socket files at postmaster shutdown+ */++++/* --------------------------------+ * Low-level I/O routines begin here.+ *+ * These routines communicate with a frontend client across a connection+ * already established by the preceding routines.+ * --------------------------------+ */++/* --------------------------------+ * socket_set_nonblocking - set socket blocking/non-blocking+ *+ * Sets the socket non-blocking if nonblocking is TRUE, or sets it+ * blocking otherwise.+ * --------------------------------+ */+++/* --------------------------------+ * pq_recvbuf - load some bytes into the input buffer+ *+ * returns 0 if OK, EOF if trouble+ * --------------------------------+ */+++/* --------------------------------+ * pq_getbyte - get a single byte from connection, or return EOF+ * --------------------------------+ */+++/* --------------------------------+ * pq_peekbyte - peek at next byte from connection+ *+ * Same as pq_getbyte() except we don't advance the pointer.+ * --------------------------------+ */+++/* --------------------------------+ * pq_getbyte_if_available - get a single byte from connection,+ * if available+ *+ * The received byte is stored in *c. Returns 1 if a byte was read,+ * 0 if no data was available, or EOF if trouble.+ * --------------------------------+ */+++/* --------------------------------+ * pq_getbytes - get a known number of bytes from connection+ *+ * returns 0 if OK, EOF if trouble+ * --------------------------------+ */+++/* --------------------------------+ * pq_discardbytes - throw away a known number of bytes+ *+ * same as pq_getbytes except we do not copy the data to anyplace.+ * this is used for resynchronizing after read errors.+ *+ * returns 0 if OK, EOF if trouble+ * --------------------------------+ */+++/* --------------------------------+ * pq_getstring - get a null terminated string from connection+ *+ * The return value is placed in an expansible StringInfo, which has+ * already been initialized by the caller.+ *+ * This is used only for dealing with old-protocol clients. The idea+ * is to produce a StringInfo that looks the same as we would get from+ * pq_getmessage() with a newer client; we will then process it with+ * pq_getmsgstring. Therefore, no character set conversion is done here,+ * even though this is presumably useful only for text.+ *+ * returns 0 if OK, EOF if trouble+ * --------------------------------+ */++++/* --------------------------------+ * pq_startmsgread - begin reading a message from the client.+ *+ * This must be called before any of the pq_get* functions.+ * --------------------------------+ */++++/* --------------------------------+ * pq_endmsgread - finish reading message.+ *+ * This must be called after reading a V2 protocol message with+ * pq_getstring() and friends, to indicate that we have read the whole+ * message. In V3 protocol, pq_getmessage() does this implicitly.+ * --------------------------------+ */+++/* --------------------------------+ * pq_is_reading_msg - are we currently reading a message?+ *+ * This is used in error recovery at the outer idle loop to detect if we have+ * lost protocol sync, and need to terminate the connection. pq_startmsgread()+ * will check for that too, but it's nicer to detect it earlier.+ * --------------------------------+ */+++/* --------------------------------+ * pq_getmessage - get a message with length word from connection+ *+ * The return value is placed in an expansible StringInfo, which has+ * already been initialized by the caller.+ * Only the message body is placed in the StringInfo; the length word+ * is removed. Also, s->cursor is initialized to zero for convenience+ * in scanning the message contents.+ *+ * If maxlen is not zero, it is an upper limit on the length of the+ * message we are willing to accept. We abort the connection (by+ * returning EOF) if client tries to send more than that.+ *+ * returns 0 if OK, EOF if trouble+ * --------------------------------+ */++++/* --------------------------------+ * pq_putbytes - send bytes to connection (not flushed until pq_flush)+ *+ * returns 0 if OK, EOF if trouble+ * --------------------------------+ */+++++/* --------------------------------+ * socket_flush - flush pending output+ *+ * returns 0 if OK, EOF if trouble+ * --------------------------------+ */+++/* --------------------------------+ * internal_flush - flush pending output+ *+ * Returns 0 if OK (meaning everything was sent, or operation would block+ * and the socket is in non-blocking mode), or EOF if trouble.+ * --------------------------------+ */+++/* --------------------------------+ * pq_flush_if_writable - flush pending output if writable without blocking+ *+ * Returns 0 if OK, or EOF if trouble.+ * --------------------------------+ */+++/* --------------------------------+ * socket_is_send_pending - is there any pending data in the output buffer?+ * --------------------------------+ */+++/* --------------------------------+ * Message-level I/O routines begin here.+ *+ * These routines understand about the old-style COPY OUT protocol.+ * --------------------------------+ */+++/* --------------------------------+ * socket_putmessage - send a normal message (suppressed in COPY OUT mode)+ *+ * If msgtype is not '\0', it is a message type code to place before+ * the message body. If msgtype is '\0', then the message has no type+ * code (this is only valid in pre-3.0 protocols).+ *+ * len is the length of the message body data at *s. In protocol 3.0+ * and later, a message length word (equal to len+4 because it counts+ * itself too) is inserted by this routine.+ *+ * All normal messages are suppressed while old-style COPY OUT is in+ * progress. (In practice only a few notice messages might get emitted+ * then; dropping them is annoying, but at least they will still appear+ * in the postmaster log.)+ *+ * We also suppress messages generated while pqcomm.c is busy. This+ * avoids any possibility of messages being inserted within other+ * messages. The only known trouble case arises if SIGQUIT occurs+ * during a pqcomm.c routine --- quickdie() will try to send a warning+ * message, and the most reasonable approach seems to be to drop it.+ *+ * returns 0 if OK, EOF if trouble+ * --------------------------------+ */+++/* --------------------------------+ * pq_putmessage_noblock - like pq_putmessage, but never blocks+ *+ * If the output buffer is too small to hold the message, the buffer+ * is enlarged.+ */++++/* --------------------------------+ * socket_startcopyout - inform libpq that an old-style COPY OUT transfer+ * is beginning+ * --------------------------------+ */+++/* --------------------------------+ * socket_endcopyout - end an old-style COPY OUT transfer+ *+ * If errorAbort is indicated, we are aborting a COPY OUT due to an error,+ * and must send a terminator line. Since a partial data line might have+ * been emitted, send a couple of newlines first (the first one could+ * get absorbed by a backslash...) Note that old-style COPY OUT does+ * not allow binary transfers, so a textual terminator is always correct.+ * --------------------------------+ */+++/*+ * Support for TCP Keepalive parameters+ */++/*+ * On Windows, we need to set both idle and interval at the same time.+ * We also cannot reset them to the default (setting to zero will+ * actually set them to zero, not default), therefore we fallback to+ * the out-of-the-box default instead.+ */+#if defined(WIN32) && defined(SIO_KEEPALIVE_VALS)+static int+pq_setkeepaliveswin32(Port *port, int idle, int interval)+{+ struct tcp_keepalive ka;+ DWORD retsize;++ if (idle <= 0)+ idle = 2 * 60 * 60; /* default = 2 hours */+ if (interval <= 0)+ interval = 1; /* default = 1 second */++ ka.onoff = 1;+ ka.keepalivetime = idle * 1000;+ ka.keepaliveinterval = interval * 1000;++ if (WSAIoctl(port->sock,+ SIO_KEEPALIVE_VALS,+ (LPVOID) &ka,+ sizeof(ka),+ NULL,+ 0,+ &retsize,+ NULL,+ NULL)+ != 0)+ {+ elog(LOG, "WSAIoctl(SIO_KEEPALIVE_VALS) failed: %ui",+ WSAGetLastError());+ return STATUS_ERROR;+ }+ if (port->keepalives_idle != idle)+ port->keepalives_idle = idle;+ if (port->keepalives_interval != interval)+ port->keepalives_interval = interval;+ return STATUS_OK;+}+#endif++#if defined(TCP_KEEPIDLE) || defined(TCP_KEEPALIVE) || defined(WIN32)+#ifndef WIN32+#ifdef TCP_KEEPIDLE+#else+#endif /* TCP_KEEPIDLE */+#else /* WIN32 */+#endif /* WIN32 */+#else+#endif++#if defined(TCP_KEEPIDLE) || defined(TCP_KEEPALIVE) || defined(SIO_KEEPALIVE_VALS)+#ifndef WIN32+#ifdef TCP_KEEPIDLE+#else+#endif+#else /* WIN32 */+#endif+#else /* TCP_KEEPIDLE || SIO_KEEPALIVE_VALS */+#endif++#if defined(TCP_KEEPINTVL) || defined(SIO_KEEPALIVE_VALS)+#ifndef WIN32+#else+#endif /* WIN32 */+#else+#endif++#if defined(TCP_KEEPINTVL) || defined (SIO_KEEPALIVE_VALS)+#ifndef WIN32+#else /* WIN32 */+#endif+#else+#endif++#ifdef TCP_KEEPCNT+#else+#endif++#ifdef TCP_KEEPCNT+#else+#endif
+ foreign/libpg_query/src/postgres/src_backend_nodes_bitmapset.c view
@@ -0,0 +1,413 @@+/*--------------------------------------------------------------------+ * Symbols referenced in this file:+ * - bms_copy+ * - bms_equal+ * - bms_is_empty+ * - bms_first_member+ * - rightmost_one_pos+ * - bms_free+ *--------------------------------------------------------------------+ */++/*-------------------------------------------------------------------------+ *+ * bitmapset.c+ * PostgreSQL generic bitmap set package+ *+ * A bitmap set can represent any set of nonnegative integers, although+ * it is mainly intended for sets where the maximum value is not large,+ * say at most a few hundred. By convention, a NULL pointer is always+ * accepted by all operations to represent the empty set. (But beware+ * that this is not the only representation of the empty set. Use+ * bms_is_empty() in preference to testing for NULL.)+ *+ *+ * Copyright (c) 2003-2015, PostgreSQL Global Development Group+ *+ * IDENTIFICATION+ * src/backend/nodes/bitmapset.c+ *+ *-------------------------------------------------------------------------+ */+#include "postgres.h"++#include "access/hash.h"+++#define WORDNUM(x) ((x) / BITS_PER_BITMAPWORD)+#define BITNUM(x) ((x) % BITS_PER_BITMAPWORD)++#define BITMAPSET_SIZE(nwords) \+ (offsetof(Bitmapset, words) + (nwords) * sizeof(bitmapword))++/*----------+ * This is a well-known cute trick for isolating the rightmost one-bit+ * in a word. It assumes two's complement arithmetic. Consider any+ * nonzero value, and focus attention on the rightmost one. The value is+ * then something like+ * xxxxxx10000+ * where x's are unspecified bits. The two's complement negative is formed+ * by inverting all the bits and adding one. Inversion gives+ * yyyyyy01111+ * where each y is the inverse of the corresponding x. Incrementing gives+ * yyyyyy10000+ * and then ANDing with the original value gives+ * 00000010000+ * This works for all cases except original value = zero, where of course+ * we get zero.+ *----------+ */+#define RIGHTMOST_ONE(x) ((signedbitmapword) (x) & -((signedbitmapword) (x)))++#define HAS_MULTIPLE_ONES(x) ((bitmapword) RIGHTMOST_ONE(x) != (x))+++/*+ * Lookup tables to avoid need for bit-by-bit groveling+ *+ * rightmost_one_pos[x] gives the bit number (0-7) of the rightmost one bit+ * in a nonzero byte value x. The entry for x=0 is never used.+ *+ * number_of_ones[x] gives the number of one-bits (0-8) in a byte value x.+ *+ * We could make these tables larger and reduce the number of iterations+ * in the functions that use them, but bytewise shifts and masks are+ * especially fast on many machines, so working a byte at a time seems best.+ */++static const uint8 rightmost_one_pos[256] = {+ 0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,+ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,+ 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,+ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,+ 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,+ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,+ 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,+ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,+ 7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,+ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,+ 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,+ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,+ 6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,+ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,+ 5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,+ 4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0+};+++++/*+ * bms_copy - make a palloc'd copy of a bitmapset+ */+Bitmapset *+bms_copy(const Bitmapset *a)+{+ Bitmapset *result;+ size_t size;++ if (a == NULL)+ return NULL;+ size = BITMAPSET_SIZE(a->nwords);+ result = (Bitmapset *) palloc(size);+ memcpy(result, a, size);+ return result;+}++/*+ * bms_equal - are two bitmapsets equal?+ *+ * This is logical not physical equality; in particular, a NULL pointer will+ * be reported as equal to a palloc'd value containing no members.+ */+bool+bms_equal(const Bitmapset *a, const Bitmapset *b)+{+ const Bitmapset *shorter;+ const Bitmapset *longer;+ int shortlen;+ int longlen;+ int i;++ /* Handle cases where either input is NULL */+ if (a == NULL)+ {+ if (b == NULL)+ return true;+ return bms_is_empty(b);+ }+ else if (b == NULL)+ return bms_is_empty(a);+ /* Identify shorter and longer input */+ if (a->nwords <= b->nwords)+ {+ shorter = a;+ longer = b;+ }+ else+ {+ shorter = b;+ longer = a;+ }+ /* And process */+ shortlen = shorter->nwords;+ for (i = 0; i < shortlen; i++)+ {+ if (shorter->words[i] != longer->words[i])+ return false;+ }+ longlen = longer->nwords;+ for (; i < longlen; i++)+ {+ if (longer->words[i] != 0)+ return false;+ }+ return true;+}++/*+ * bms_make_singleton - build a bitmapset containing a single member+ */+++/*+ * bms_free - free a bitmapset+ *+ * Same as pfree except for allowing NULL input+ */+void+bms_free(Bitmapset *a)+{+ if (a)+ pfree(a);+}+++/*+ * These operations all make a freshly palloc'd result,+ * leaving their inputs untouched+ */+++/*+ * bms_union - set union+ */+++/*+ * bms_intersect - set intersection+ */+++/*+ * bms_difference - set difference (ie, A without members of B)+ */+++/*+ * bms_is_subset - is A a subset of B?+ */+++/*+ * bms_subset_compare - compare A and B for equality/subset relationships+ *+ * This is more efficient than testing bms_is_subset in both directions.+ */+++/*+ * bms_is_member - is X a member of A?+ */+++/*+ * bms_overlap - do sets overlap (ie, have a nonempty intersection)?+ */+++/*+ * bms_nonempty_difference - do sets have a nonempty difference?+ */+++/*+ * bms_singleton_member - return the sole integer member of set+ *+ * Raises error if |a| is not 1.+ */+++/*+ * bms_get_singleton_member+ *+ * Test whether the given set is a singleton.+ * If so, set *member to the value of its sole member, and return TRUE.+ * If not, return FALSE, without changing *member.+ *+ * This is more convenient and faster than calling bms_membership() and then+ * bms_singleton_member(), if we don't care about distinguishing empty sets+ * from multiple-member sets.+ */+++/*+ * bms_num_members - count members of set+ */+++/*+ * bms_membership - does a set have zero, one, or multiple members?+ *+ * This is faster than making an exact count with bms_num_members().+ */+++/*+ * bms_is_empty - is a set empty?+ *+ * This is even faster than bms_membership().+ */+bool+bms_is_empty(const Bitmapset *a)+{+ int nwords;+ int wordnum;++ if (a == NULL)+ return true;+ nwords = a->nwords;+ for (wordnum = 0; wordnum < nwords; wordnum++)+ {+ bitmapword w = a->words[wordnum];++ if (w != 0)+ return false;+ }+ return true;+}+++/*+ * These operations all "recycle" their non-const inputs, ie, either+ * return the modified input or pfree it if it can't hold the result.+ *+ * These should generally be used in the style+ *+ * foo = bms_add_member(foo, x);+ */+++/*+ * bms_add_member - add a specified member to set+ *+ * Input set is modified or recycled!+ */+++/*+ * bms_del_member - remove a specified member from set+ *+ * No error if x is not currently a member of set+ *+ * Input set is modified in-place!+ */+++/*+ * bms_add_members - like bms_union, but left input is recycled+ */+++/*+ * bms_int_members - like bms_intersect, but left input is recycled+ */+++/*+ * bms_del_members - like bms_difference, but left input is recycled+ */+++/*+ * bms_join - like bms_union, but *both* inputs are recycled+ */+++/*+ * bms_first_member - find and remove first member of a set+ *+ * Returns -1 if set is empty. NB: set is destructively modified!+ *+ * This is intended as support for iterating through the members of a set.+ * The typical pattern is+ *+ * while ((x = bms_first_member(inputset)) >= 0)+ * process member x;+ *+ * CAUTION: this destroys the content of "inputset". If the set must+ * not be modified, use bms_next_member instead.+ */+int+bms_first_member(Bitmapset *a)+{+ int nwords;+ int wordnum;++ if (a == NULL)+ return -1;+ nwords = a->nwords;+ for (wordnum = 0; wordnum < nwords; wordnum++)+ {+ bitmapword w = a->words[wordnum];++ if (w != 0)+ {+ int result;++ w = RIGHTMOST_ONE(w);+ a->words[wordnum] &= ~w;++ result = wordnum * BITS_PER_BITMAPWORD;+ while ((w & 255) == 0)+ {+ w >>= 8;+ result += 8;+ }+ result += rightmost_one_pos[w & 255];+ return result;+ }+ }+ return -1;+}++/*+ * bms_next_member - find next member of a set+ *+ * Returns smallest member greater than "prevbit", or -2 if there is none.+ * "prevbit" must NOT be less than -1, or the behavior is unpredictable.+ *+ * This is intended as support for iterating through the members of a set.+ * The typical pattern is+ *+ * x = -1;+ * while ((x = bms_next_member(inputset, x)) >= 0)+ * process member x;+ *+ * Notice that when there are no more members, we return -2, not -1 as you+ * might expect. The rationale for that is to allow distinguishing the+ * loop-not-started state (x == -1) from the loop-completed state (x == -2).+ * It makes no difference in simple loop usage, but complex iteration logic+ * might need such an ability.+ */+++/*+ * bms_hash_value - compute a hash key for a Bitmapset+ *+ * Note: we must ensure that any two bitmapsets that are bms_equal() will+ * hash to the same value; in practice this means that trailing all-zero+ * words must not affect the result. Hence we strip those before applying+ * hash_any().+ */+
+ foreign/libpg_query/src/postgres/src_backend_nodes_copyfuncs.c view
@@ -0,0 +1,5195 @@+/*--------------------------------------------------------------------+ * Symbols referenced in this file:+ * - copyObject+ * - _copyPlannedStmt+ * - _copyPlan+ * - CopyPlanFields+ * - _copyResult+ * - _copyModifyTable+ * - _copyAppend+ * - _copyMergeAppend+ * - _copyRecursiveUnion+ * - _copyBitmapAnd+ * - _copyBitmapOr+ * - _copyScan+ * - CopyScanFields+ * - _copySeqScan+ * - _copySampleScan+ * - _copyIndexScan+ * - _copyIndexOnlyScan+ * - _copyBitmapIndexScan+ * - _copyBitmapHeapScan+ * - _copyTidScan+ * - _copySubqueryScan+ * - _copyFunctionScan+ * - _copyValuesScan+ * - _copyCteScan+ * - _copyWorkTableScan+ * - _copyForeignScan+ * - _copyCustomScan+ * - _copyJoin+ * - CopyJoinFields+ * - _copyNestLoop+ * - _copyMergeJoin+ * - _copyHashJoin+ * - _copyMaterial+ * - _copySort+ * - _copyGroup+ * - _copyAgg+ * - _copyWindowAgg+ * - _copyUnique+ * - _copyHash+ * - _copySetOp+ * - _copyLockRows+ * - _copyLimit+ * - _copyNestLoopParam+ * - _copyPlanRowMark+ * - _copyPlanInvalItem+ * - _copyAlias+ * - _copyRangeVar+ * - _copyIntoClause+ * - _copyVar+ * - _copyConst+ * - _copyParam+ * - _copyAggref+ * - _copyGroupingFunc+ * - _copyWindowFunc+ * - _copyArrayRef+ * - _copyFuncExpr+ * - _copyNamedArgExpr+ * - _copyOpExpr+ * - _copyDistinctExpr+ * - _copyNullIfExpr+ * - _copyScalarArrayOpExpr+ * - _copyBoolExpr+ * - _copySubLink+ * - _copySubPlan+ * - _copyAlternativeSubPlan+ * - _copyFieldSelect+ * - _copyFieldStore+ * - _copyRelabelType+ * - _copyCoerceViaIO+ * - _copyArrayCoerceExpr+ * - _copyConvertRowtypeExpr+ * - _copyCollateExpr+ * - _copyCaseExpr+ * - _copyCaseWhen+ * - _copyCaseTestExpr+ * - _copyArrayExpr+ * - _copyRowExpr+ * - _copyRowCompareExpr+ * - _copyCoalesceExpr+ * - _copyMinMaxExpr+ * - _copyXmlExpr+ * - _copyNullTest+ * - _copyBooleanTest+ * - _copyCoerceToDomain+ * - _copyCoerceToDomainValue+ * - _copySetToDefault+ * - _copyCurrentOfExpr+ * - _copyInferenceElem+ * - _copyTargetEntry+ * - _copyRangeTblRef+ * - _copyJoinExpr+ * - _copyFromExpr+ * - _copyOnConflictExpr+ * - _copyPathKey+ * - _copyRestrictInfo+ * - _copyPlaceHolderVar+ * - _copySpecialJoinInfo+ * - _copyAppendRelInfo+ * - _copyPlaceHolderInfo+ * - _copyValue+ * - _copyList+ * - _copyQuery+ * - _copyInsertStmt+ * - _copyDeleteStmt+ * - _copyUpdateStmt+ * - _copySelectStmt+ * - _copySetOperationStmt+ * - _copyAlterTableStmt+ * - _copyAlterTableCmd+ * - _copyAlterDomainStmt+ * - _copyGrantStmt+ * - _copyGrantRoleStmt+ * - _copyAlterDefaultPrivilegesStmt+ * - _copyDeclareCursorStmt+ * - _copyClosePortalStmt+ * - _copyClusterStmt+ * - _copyCopyStmt+ * - _copyCreateStmt+ * - CopyCreateStmtFields+ * - _copyTableLikeClause+ * - _copyDefineStmt+ * - _copyDropStmt+ * - _copyTruncateStmt+ * - _copyCommentStmt+ * - _copySecLabelStmt+ * - _copyFetchStmt+ * - _copyIndexStmt+ * - _copyCreateFunctionStmt+ * - _copyFunctionParameter+ * - _copyAlterFunctionStmt+ * - _copyDoStmt+ * - _copyRenameStmt+ * - _copyAlterObjectSchemaStmt+ * - _copyAlterOwnerStmt+ * - _copyRuleStmt+ * - _copyNotifyStmt+ * - _copyListenStmt+ * - _copyUnlistenStmt+ * - _copyTransactionStmt+ * - _copyCompositeTypeStmt+ * - _copyCreateEnumStmt+ * - _copyCreateRangeStmt+ * - _copyAlterEnumStmt+ * - _copyViewStmt+ * - _copyLoadStmt+ * - _copyCreateDomainStmt+ * - _copyCreateOpClassStmt+ * - _copyCreateOpClassItem+ * - _copyCreateOpFamilyStmt+ * - _copyAlterOpFamilyStmt+ * - _copyCreatedbStmt+ * - _copyAlterDatabaseStmt+ * - _copyAlterDatabaseSetStmt+ * - _copyDropdbStmt+ * - _copyVacuumStmt+ * - _copyExplainStmt+ * - _copyCreateTableAsStmt+ * - _copyRefreshMatViewStmt+ * - _copyReplicaIdentityStmt+ * - _copyAlterSystemStmt+ * - _copyCreateSeqStmt+ * - _copyAlterSeqStmt+ * - _copyVariableSetStmt+ * - _copyVariableShowStmt+ * - _copyDiscardStmt+ * - _copyCreateTableSpaceStmt+ * - _copyDropTableSpaceStmt+ * - _copyAlterTableSpaceOptionsStmt+ * - _copyAlterTableMoveAllStmt+ * - _copyCreateExtensionStmt+ * - _copyAlterExtensionStmt+ * - _copyAlterExtensionContentsStmt+ * - _copyCreateFdwStmt+ * - _copyAlterFdwStmt+ * - _copyCreateForeignServerStmt+ * - _copyAlterForeignServerStmt+ * - _copyCreateUserMappingStmt+ * - _copyAlterUserMappingStmt+ * - _copyDropUserMappingStmt+ * - _copyCreateForeignTableStmt+ * - _copyImportForeignSchemaStmt+ * - _copyCreateTransformStmt+ * - _copyCreateTrigStmt+ * - _copyCreateEventTrigStmt+ * - _copyAlterEventTrigStmt+ * - _copyCreatePLangStmt+ * - _copyCreateRoleStmt+ * - _copyAlterRoleStmt+ * - _copyAlterRoleSetStmt+ * - _copyDropRoleStmt+ * - _copyLockStmt+ * - _copyConstraintsSetStmt+ * - _copyReindexStmt+ * - _copyCreateSchemaStmt+ * - _copyCreateConversionStmt+ * - _copyCreateCastStmt+ * - _copyPrepareStmt+ * - _copyExecuteStmt+ * - _copyDeallocateStmt+ * - _copyDropOwnedStmt+ * - _copyReassignOwnedStmt+ * - _copyAlterTSDictionaryStmt+ * - _copyAlterTSConfigurationStmt+ * - _copyCreatePolicyStmt+ * - _copyAlterPolicyStmt+ * - _copyAExpr+ * - _copyColumnRef+ * - _copyParamRef+ * - _copyAConst+ * - _copyFuncCall+ * - _copyAStar+ * - _copyAIndices+ * - _copyA_Indirection+ * - _copyA_ArrayExpr+ * - _copyResTarget+ * - _copyMultiAssignRef+ * - _copyTypeCast+ * - _copyCollateClause+ * - _copySortBy+ * - _copyWindowDef+ * - _copyRangeSubselect+ * - _copyRangeFunction+ * - _copyRangeTableSample+ * - _copyTypeName+ * - _copyIndexElem+ * - _copyColumnDef+ * - _copyConstraint+ * - _copyDefElem+ * - _copyLockingClause+ * - _copyRangeTblEntry+ * - _copyRangeTblFunction+ * - _copyTableSampleClause+ * - _copyWithCheckOption+ * - _copySortGroupClause+ * - _copyGroupingSet+ * - _copyWindowClause+ * - _copyRowMarkClause+ * - _copyWithClause+ * - _copyInferClause+ * - _copyOnConflictClause+ * - _copyCommonTableExpr+ * - _copyFuncWithArgs+ * - _copyAccessPriv+ * - _copyXmlSerialize+ * - _copyRoleSpec+ *--------------------------------------------------------------------+ */++/*-------------------------------------------------------------------------+ *+ * copyfuncs.c+ * Copy functions for Postgres tree nodes.+ *+ * NOTE: we currently support copying all node types found in parse and+ * plan trees. We do not support copying executor state trees; there+ * is no need for that, and no point in maintaining all the code that+ * would be needed. We also do not support copying Path trees, mainly+ * because the circular linkages between RelOptInfo and Path nodes can't+ * be handled easily in a simple depth-first traversal.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * IDENTIFICATION+ * src/backend/nodes/copyfuncs.c+ *+ *-------------------------------------------------------------------------+ */++#include "postgres.h"++#include "miscadmin.h"+#include "nodes/plannodes.h"+#include "nodes/relation.h"+#include "utils/datum.h"+++/*+ * Macros to simplify copying of different kinds of fields. Use these+ * wherever possible to reduce the chance for silly typos. Note that these+ * hard-wire the convention that the local variables in a Copy routine are+ * named 'newnode' and 'from'.+ */++/* Copy a simple scalar field (int, float, bool, enum, etc) */+#define COPY_SCALAR_FIELD(fldname) \+ (newnode->fldname = from->fldname)++/* Copy a field that is a pointer to some kind of Node or Node tree */+#define COPY_NODE_FIELD(fldname) \+ (newnode->fldname = copyObject(from->fldname))++/* Copy a field that is a pointer to a Bitmapset */+#define COPY_BITMAPSET_FIELD(fldname) \+ (newnode->fldname = bms_copy(from->fldname))++/* Copy a field that is a pointer to a C string, or perhaps NULL */+#define COPY_STRING_FIELD(fldname) \+ (newnode->fldname = from->fldname ? pstrdup(from->fldname) : (char *) NULL)++/* Copy a field that is a pointer to a simple palloc'd object of size sz */+#define COPY_POINTER_FIELD(fldname, sz) \+ do { \+ Size _size = (sz); \+ newnode->fldname = palloc(_size); \+ memcpy(newnode->fldname, from->fldname, _size); \+ } while (0)++/* Copy a parse location field (for Copy, this is same as scalar case) */+#define COPY_LOCATION_FIELD(fldname) \+ (newnode->fldname = from->fldname)+++/* ****************************************************************+ * plannodes.h copy functions+ * ****************************************************************+ */++/*+ * _copyPlannedStmt+ */+static PlannedStmt *+_copyPlannedStmt(const PlannedStmt *from)+{+ PlannedStmt *newnode = makeNode(PlannedStmt);++ COPY_SCALAR_FIELD(commandType);+ COPY_SCALAR_FIELD(queryId);+ COPY_SCALAR_FIELD(hasReturning);+ COPY_SCALAR_FIELD(hasModifyingCTE);+ COPY_SCALAR_FIELD(canSetTag);+ COPY_SCALAR_FIELD(transientPlan);+ COPY_NODE_FIELD(planTree);+ COPY_NODE_FIELD(rtable);+ COPY_NODE_FIELD(resultRelations);+ COPY_NODE_FIELD(utilityStmt);+ COPY_NODE_FIELD(subplans);+ COPY_BITMAPSET_FIELD(rewindPlanIDs);+ COPY_NODE_FIELD(rowMarks);+ COPY_NODE_FIELD(relationOids);+ COPY_NODE_FIELD(invalItems);+ COPY_SCALAR_FIELD(nParamExec);+ COPY_SCALAR_FIELD(hasRowSecurity);++ return newnode;+}++/*+ * CopyPlanFields+ *+ * This function copies the fields of the Plan node. It is used by+ * all the copy functions for classes which inherit from Plan.+ */+static void+CopyPlanFields(const Plan *from, Plan *newnode)+{+ COPY_SCALAR_FIELD(startup_cost);+ COPY_SCALAR_FIELD(total_cost);+ COPY_SCALAR_FIELD(plan_rows);+ COPY_SCALAR_FIELD(plan_width);+ COPY_NODE_FIELD(targetlist);+ COPY_NODE_FIELD(qual);+ COPY_NODE_FIELD(lefttree);+ COPY_NODE_FIELD(righttree);+ COPY_NODE_FIELD(initPlan);+ COPY_BITMAPSET_FIELD(extParam);+ COPY_BITMAPSET_FIELD(allParam);+}++/*+ * _copyPlan+ */+static Plan *+_copyPlan(const Plan *from)+{+ Plan *newnode = makeNode(Plan);++ /*+ * copy node superclass fields+ */+ CopyPlanFields(from, newnode);++ return newnode;+}+++/*+ * _copyResult+ */+static Result *+_copyResult(const Result *from)+{+ Result *newnode = makeNode(Result);++ /*+ * copy node superclass fields+ */+ CopyPlanFields((const Plan *) from, (Plan *) newnode);++ /*+ * copy remainder of node+ */+ COPY_NODE_FIELD(resconstantqual);++ return newnode;+}++/*+ * _copyModifyTable+ */+static ModifyTable *+_copyModifyTable(const ModifyTable *from)+{+ ModifyTable *newnode = makeNode(ModifyTable);++ /*+ * copy node superclass fields+ */+ CopyPlanFields((const Plan *) from, (Plan *) newnode);++ /*+ * copy remainder of node+ */+ COPY_SCALAR_FIELD(operation);+ COPY_SCALAR_FIELD(canSetTag);+ COPY_SCALAR_FIELD(nominalRelation);+ COPY_NODE_FIELD(resultRelations);+ COPY_SCALAR_FIELD(resultRelIndex);+ COPY_NODE_FIELD(plans);+ COPY_NODE_FIELD(withCheckOptionLists);+ COPY_NODE_FIELD(returningLists);+ COPY_NODE_FIELD(fdwPrivLists);+ COPY_NODE_FIELD(rowMarks);+ COPY_SCALAR_FIELD(epqParam);+ COPY_SCALAR_FIELD(onConflictAction);+ COPY_NODE_FIELD(arbiterIndexes);+ COPY_NODE_FIELD(onConflictSet);+ COPY_NODE_FIELD(onConflictWhere);+ COPY_SCALAR_FIELD(exclRelRTI);+ COPY_NODE_FIELD(exclRelTlist);++ return newnode;+}++/*+ * _copyAppend+ */+static Append *+_copyAppend(const Append *from)+{+ Append *newnode = makeNode(Append);++ /*+ * copy node superclass fields+ */+ CopyPlanFields((const Plan *) from, (Plan *) newnode);++ /*+ * copy remainder of node+ */+ COPY_NODE_FIELD(appendplans);++ return newnode;+}++/*+ * _copyMergeAppend+ */+static MergeAppend *+_copyMergeAppend(const MergeAppend *from)+{+ MergeAppend *newnode = makeNode(MergeAppend);++ /*+ * copy node superclass fields+ */+ CopyPlanFields((const Plan *) from, (Plan *) newnode);++ /*+ * copy remainder of node+ */+ COPY_NODE_FIELD(mergeplans);+ COPY_SCALAR_FIELD(numCols);+ COPY_POINTER_FIELD(sortColIdx, from->numCols * sizeof(AttrNumber));+ COPY_POINTER_FIELD(sortOperators, from->numCols * sizeof(Oid));+ COPY_POINTER_FIELD(collations, from->numCols * sizeof(Oid));+ COPY_POINTER_FIELD(nullsFirst, from->numCols * sizeof(bool));++ return newnode;+}++/*+ * _copyRecursiveUnion+ */+static RecursiveUnion *+_copyRecursiveUnion(const RecursiveUnion *from)+{+ RecursiveUnion *newnode = makeNode(RecursiveUnion);++ /*+ * copy node superclass fields+ */+ CopyPlanFields((const Plan *) from, (Plan *) newnode);++ /*+ * copy remainder of node+ */+ COPY_SCALAR_FIELD(wtParam);+ COPY_SCALAR_FIELD(numCols);+ if (from->numCols > 0)+ {+ COPY_POINTER_FIELD(dupColIdx, from->numCols * sizeof(AttrNumber));+ COPY_POINTER_FIELD(dupOperators, from->numCols * sizeof(Oid));+ }+ COPY_SCALAR_FIELD(numGroups);++ return newnode;+}++/*+ * _copyBitmapAnd+ */+static BitmapAnd *+_copyBitmapAnd(const BitmapAnd *from)+{+ BitmapAnd *newnode = makeNode(BitmapAnd);++ /*+ * copy node superclass fields+ */+ CopyPlanFields((const Plan *) from, (Plan *) newnode);++ /*+ * copy remainder of node+ */+ COPY_NODE_FIELD(bitmapplans);++ return newnode;+}++/*+ * _copyBitmapOr+ */+static BitmapOr *+_copyBitmapOr(const BitmapOr *from)+{+ BitmapOr *newnode = makeNode(BitmapOr);++ /*+ * copy node superclass fields+ */+ CopyPlanFields((const Plan *) from, (Plan *) newnode);++ /*+ * copy remainder of node+ */+ COPY_NODE_FIELD(bitmapplans);++ return newnode;+}+++/*+ * CopyScanFields+ *+ * This function copies the fields of the Scan node. It is used by+ * all the copy functions for classes which inherit from Scan.+ */+static void+CopyScanFields(const Scan *from, Scan *newnode)+{+ CopyPlanFields((const Plan *) from, (Plan *) newnode);++ COPY_SCALAR_FIELD(scanrelid);+}++/*+ * _copyScan+ */+static Scan *+_copyScan(const Scan *from)+{+ Scan *newnode = makeNode(Scan);++ /*+ * copy node superclass fields+ */+ CopyScanFields((const Scan *) from, (Scan *) newnode);++ return newnode;+}++/*+ * _copySeqScan+ */+static SeqScan *+_copySeqScan(const SeqScan *from)+{+ SeqScan *newnode = makeNode(SeqScan);++ /*+ * copy node superclass fields+ */+ CopyScanFields((const Scan *) from, (Scan *) newnode);++ return newnode;+}++/*+ * _copySampleScan+ */+static SampleScan *+_copySampleScan(const SampleScan *from)+{+ SampleScan *newnode = makeNode(SampleScan);++ /*+ * copy node superclass fields+ */+ CopyScanFields((const Scan *) from, (Scan *) newnode);++ /*+ * copy remainder of node+ */+ COPY_NODE_FIELD(tablesample);++ return newnode;+}++/*+ * _copyIndexScan+ */+static IndexScan *+_copyIndexScan(const IndexScan *from)+{+ IndexScan *newnode = makeNode(IndexScan);++ /*+ * copy node superclass fields+ */+ CopyScanFields((const Scan *) from, (Scan *) newnode);++ /*+ * copy remainder of node+ */+ COPY_SCALAR_FIELD(indexid);+ COPY_NODE_FIELD(indexqual);+ COPY_NODE_FIELD(indexqualorig);+ COPY_NODE_FIELD(indexorderby);+ COPY_NODE_FIELD(indexorderbyorig);+ COPY_NODE_FIELD(indexorderbyops);+ COPY_SCALAR_FIELD(indexorderdir);++ return newnode;+}++/*+ * _copyIndexOnlyScan+ */+static IndexOnlyScan *+_copyIndexOnlyScan(const IndexOnlyScan *from)+{+ IndexOnlyScan *newnode = makeNode(IndexOnlyScan);++ /*+ * copy node superclass fields+ */+ CopyScanFields((const Scan *) from, (Scan *) newnode);++ /*+ * copy remainder of node+ */+ COPY_SCALAR_FIELD(indexid);+ COPY_NODE_FIELD(indexqual);+ COPY_NODE_FIELD(indexorderby);+ COPY_NODE_FIELD(indextlist);+ COPY_SCALAR_FIELD(indexorderdir);++ return newnode;+}++/*+ * _copyBitmapIndexScan+ */+static BitmapIndexScan *+_copyBitmapIndexScan(const BitmapIndexScan *from)+{+ BitmapIndexScan *newnode = makeNode(BitmapIndexScan);++ /*+ * copy node superclass fields+ */+ CopyScanFields((const Scan *) from, (Scan *) newnode);++ /*+ * copy remainder of node+ */+ COPY_SCALAR_FIELD(indexid);+ COPY_NODE_FIELD(indexqual);+ COPY_NODE_FIELD(indexqualorig);++ return newnode;+}++/*+ * _copyBitmapHeapScan+ */+static BitmapHeapScan *+_copyBitmapHeapScan(const BitmapHeapScan *from)+{+ BitmapHeapScan *newnode = makeNode(BitmapHeapScan);++ /*+ * copy node superclass fields+ */+ CopyScanFields((const Scan *) from, (Scan *) newnode);++ /*+ * copy remainder of node+ */+ COPY_NODE_FIELD(bitmapqualorig);++ return newnode;+}++/*+ * _copyTidScan+ */+static TidScan *+_copyTidScan(const TidScan *from)+{+ TidScan *newnode = makeNode(TidScan);++ /*+ * copy node superclass fields+ */+ CopyScanFields((const Scan *) from, (Scan *) newnode);++ /*+ * copy remainder of node+ */+ COPY_NODE_FIELD(tidquals);++ return newnode;+}++/*+ * _copySubqueryScan+ */+static SubqueryScan *+_copySubqueryScan(const SubqueryScan *from)+{+ SubqueryScan *newnode = makeNode(SubqueryScan);++ /*+ * copy node superclass fields+ */+ CopyScanFields((const Scan *) from, (Scan *) newnode);++ /*+ * copy remainder of node+ */+ COPY_NODE_FIELD(subplan);++ return newnode;+}++/*+ * _copyFunctionScan+ */+static FunctionScan *+_copyFunctionScan(const FunctionScan *from)+{+ FunctionScan *newnode = makeNode(FunctionScan);++ /*+ * copy node superclass fields+ */+ CopyScanFields((const Scan *) from, (Scan *) newnode);++ /*+ * copy remainder of node+ */+ COPY_NODE_FIELD(functions);+ COPY_SCALAR_FIELD(funcordinality);++ return newnode;+}++/*+ * _copyValuesScan+ */+static ValuesScan *+_copyValuesScan(const ValuesScan *from)+{+ ValuesScan *newnode = makeNode(ValuesScan);++ /*+ * copy node superclass fields+ */+ CopyScanFields((const Scan *) from, (Scan *) newnode);++ /*+ * copy remainder of node+ */+ COPY_NODE_FIELD(values_lists);++ return newnode;+}++/*+ * _copyCteScan+ */+static CteScan *+_copyCteScan(const CteScan *from)+{+ CteScan *newnode = makeNode(CteScan);++ /*+ * copy node superclass fields+ */+ CopyScanFields((const Scan *) from, (Scan *) newnode);++ /*+ * copy remainder of node+ */+ COPY_SCALAR_FIELD(ctePlanId);+ COPY_SCALAR_FIELD(cteParam);++ return newnode;+}++/*+ * _copyWorkTableScan+ */+static WorkTableScan *+_copyWorkTableScan(const WorkTableScan *from)+{+ WorkTableScan *newnode = makeNode(WorkTableScan);++ /*+ * copy node superclass fields+ */+ CopyScanFields((const Scan *) from, (Scan *) newnode);++ /*+ * copy remainder of node+ */+ COPY_SCALAR_FIELD(wtParam);++ return newnode;+}++/*+ * _copyForeignScan+ */+static ForeignScan *+_copyForeignScan(const ForeignScan *from)+{+ ForeignScan *newnode = makeNode(ForeignScan);++ /*+ * copy node superclass fields+ */+ CopyScanFields((const Scan *) from, (Scan *) newnode);++ /*+ * copy remainder of node+ */+ COPY_SCALAR_FIELD(fs_server);+ COPY_NODE_FIELD(fdw_exprs);+ COPY_NODE_FIELD(fdw_private);+ COPY_NODE_FIELD(fdw_scan_tlist);+ COPY_NODE_FIELD(fdw_recheck_quals);+ COPY_BITMAPSET_FIELD(fs_relids);+ COPY_SCALAR_FIELD(fsSystemCol);++ return newnode;+}++/*+ * _copyCustomScan+ */+static CustomScan *+_copyCustomScan(const CustomScan *from)+{+ CustomScan *newnode = makeNode(CustomScan);++ /*+ * copy node superclass fields+ */+ CopyScanFields((const Scan *) from, (Scan *) newnode);++ /*+ * copy remainder of node+ */+ COPY_SCALAR_FIELD(flags);+ COPY_NODE_FIELD(custom_plans);+ COPY_NODE_FIELD(custom_exprs);+ COPY_NODE_FIELD(custom_private);+ COPY_NODE_FIELD(custom_scan_tlist);+ COPY_BITMAPSET_FIELD(custom_relids);++ /*+ * NOTE: The method field of CustomScan is required to be a pointer to a+ * static table of callback functions. So we don't copy the table itself,+ * just reference the original one.+ */+ COPY_SCALAR_FIELD(methods);++ return newnode;+}++/*+ * CopyJoinFields+ *+ * This function copies the fields of the Join node. It is used by+ * all the copy functions for classes which inherit from Join.+ */+static void+CopyJoinFields(const Join *from, Join *newnode)+{+ CopyPlanFields((const Plan *) from, (Plan *) newnode);++ COPY_SCALAR_FIELD(jointype);+ COPY_NODE_FIELD(joinqual);+}+++/*+ * _copyJoin+ */+static Join *+_copyJoin(const Join *from)+{+ Join *newnode = makeNode(Join);++ /*+ * copy node superclass fields+ */+ CopyJoinFields(from, newnode);++ return newnode;+}+++/*+ * _copyNestLoop+ */+static NestLoop *+_copyNestLoop(const NestLoop *from)+{+ NestLoop *newnode = makeNode(NestLoop);++ /*+ * copy node superclass fields+ */+ CopyJoinFields((const Join *) from, (Join *) newnode);++ /*+ * copy remainder of node+ */+ COPY_NODE_FIELD(nestParams);++ return newnode;+}+++/*+ * _copyMergeJoin+ */+static MergeJoin *+_copyMergeJoin(const MergeJoin *from)+{+ MergeJoin *newnode = makeNode(MergeJoin);+ int numCols;++ /*+ * copy node superclass fields+ */+ CopyJoinFields((const Join *) from, (Join *) newnode);++ /*+ * copy remainder of node+ */+ COPY_NODE_FIELD(mergeclauses);+ numCols = list_length(from->mergeclauses);+ if (numCols > 0)+ {+ COPY_POINTER_FIELD(mergeFamilies, numCols * sizeof(Oid));+ COPY_POINTER_FIELD(mergeCollations, numCols * sizeof(Oid));+ COPY_POINTER_FIELD(mergeStrategies, numCols * sizeof(int));+ COPY_POINTER_FIELD(mergeNullsFirst, numCols * sizeof(bool));+ }++ return newnode;+}++/*+ * _copyHashJoin+ */+static HashJoin *+_copyHashJoin(const HashJoin *from)+{+ HashJoin *newnode = makeNode(HashJoin);++ /*+ * copy node superclass fields+ */+ CopyJoinFields((const Join *) from, (Join *) newnode);++ /*+ * copy remainder of node+ */+ COPY_NODE_FIELD(hashclauses);++ return newnode;+}+++/*+ * _copyMaterial+ */+static Material *+_copyMaterial(const Material *from)+{+ Material *newnode = makeNode(Material);++ /*+ * copy node superclass fields+ */+ CopyPlanFields((const Plan *) from, (Plan *) newnode);++ return newnode;+}+++/*+ * _copySort+ */+static Sort *+_copySort(const Sort *from)+{+ Sort *newnode = makeNode(Sort);++ /*+ * copy node superclass fields+ */+ CopyPlanFields((const Plan *) from, (Plan *) newnode);++ COPY_SCALAR_FIELD(numCols);+ COPY_POINTER_FIELD(sortColIdx, from->numCols * sizeof(AttrNumber));+ COPY_POINTER_FIELD(sortOperators, from->numCols * sizeof(Oid));+ COPY_POINTER_FIELD(collations, from->numCols * sizeof(Oid));+ COPY_POINTER_FIELD(nullsFirst, from->numCols * sizeof(bool));++ return newnode;+}+++/*+ * _copyGroup+ */+static Group *+_copyGroup(const Group *from)+{+ Group *newnode = makeNode(Group);++ CopyPlanFields((const Plan *) from, (Plan *) newnode);++ COPY_SCALAR_FIELD(numCols);+ COPY_POINTER_FIELD(grpColIdx, from->numCols * sizeof(AttrNumber));+ COPY_POINTER_FIELD(grpOperators, from->numCols * sizeof(Oid));++ return newnode;+}++/*+ * _copyAgg+ */+static Agg *+_copyAgg(const Agg *from)+{+ Agg *newnode = makeNode(Agg);++ CopyPlanFields((const Plan *) from, (Plan *) newnode);++ COPY_SCALAR_FIELD(aggstrategy);+ COPY_SCALAR_FIELD(numCols);+ if (from->numCols > 0)+ {+ COPY_POINTER_FIELD(grpColIdx, from->numCols * sizeof(AttrNumber));+ COPY_POINTER_FIELD(grpOperators, from->numCols * sizeof(Oid));+ }+ COPY_SCALAR_FIELD(numGroups);+ COPY_NODE_FIELD(groupingSets);+ COPY_NODE_FIELD(chain);++ return newnode;+}++/*+ * _copyWindowAgg+ */+static WindowAgg *+_copyWindowAgg(const WindowAgg *from)+{+ WindowAgg *newnode = makeNode(WindowAgg);++ CopyPlanFields((const Plan *) from, (Plan *) newnode);++ COPY_SCALAR_FIELD(winref);+ COPY_SCALAR_FIELD(partNumCols);+ if (from->partNumCols > 0)+ {+ COPY_POINTER_FIELD(partColIdx, from->partNumCols * sizeof(AttrNumber));+ COPY_POINTER_FIELD(partOperators, from->partNumCols * sizeof(Oid));+ }+ COPY_SCALAR_FIELD(ordNumCols);+ if (from->ordNumCols > 0)+ {+ COPY_POINTER_FIELD(ordColIdx, from->ordNumCols * sizeof(AttrNumber));+ COPY_POINTER_FIELD(ordOperators, from->ordNumCols * sizeof(Oid));+ }+ COPY_SCALAR_FIELD(frameOptions);+ COPY_NODE_FIELD(startOffset);+ COPY_NODE_FIELD(endOffset);++ return newnode;+}++/*+ * _copyUnique+ */+static Unique *+_copyUnique(const Unique *from)+{+ Unique *newnode = makeNode(Unique);++ /*+ * copy node superclass fields+ */+ CopyPlanFields((const Plan *) from, (Plan *) newnode);++ /*+ * copy remainder of node+ */+ COPY_SCALAR_FIELD(numCols);+ COPY_POINTER_FIELD(uniqColIdx, from->numCols * sizeof(AttrNumber));+ COPY_POINTER_FIELD(uniqOperators, from->numCols * sizeof(Oid));++ return newnode;+}++/*+ * _copyHash+ */+static Hash *+_copyHash(const Hash *from)+{+ Hash *newnode = makeNode(Hash);++ /*+ * copy node superclass fields+ */+ CopyPlanFields((const Plan *) from, (Plan *) newnode);++ /*+ * copy remainder of node+ */+ COPY_SCALAR_FIELD(skewTable);+ COPY_SCALAR_FIELD(skewColumn);+ COPY_SCALAR_FIELD(skewInherit);+ COPY_SCALAR_FIELD(skewColType);+ COPY_SCALAR_FIELD(skewColTypmod);++ return newnode;+}++/*+ * _copySetOp+ */+static SetOp *+_copySetOp(const SetOp *from)+{+ SetOp *newnode = makeNode(SetOp);++ /*+ * copy node superclass fields+ */+ CopyPlanFields((const Plan *) from, (Plan *) newnode);++ /*+ * copy remainder of node+ */+ COPY_SCALAR_FIELD(cmd);+ COPY_SCALAR_FIELD(strategy);+ COPY_SCALAR_FIELD(numCols);+ COPY_POINTER_FIELD(dupColIdx, from->numCols * sizeof(AttrNumber));+ COPY_POINTER_FIELD(dupOperators, from->numCols * sizeof(Oid));+ COPY_SCALAR_FIELD(flagColIdx);+ COPY_SCALAR_FIELD(firstFlag);+ COPY_SCALAR_FIELD(numGroups);++ return newnode;+}++/*+ * _copyLockRows+ */+static LockRows *+_copyLockRows(const LockRows *from)+{+ LockRows *newnode = makeNode(LockRows);++ /*+ * copy node superclass fields+ */+ CopyPlanFields((const Plan *) from, (Plan *) newnode);++ /*+ * copy remainder of node+ */+ COPY_NODE_FIELD(rowMarks);+ COPY_SCALAR_FIELD(epqParam);++ return newnode;+}++/*+ * _copyLimit+ */+static Limit *+_copyLimit(const Limit *from)+{+ Limit *newnode = makeNode(Limit);++ /*+ * copy node superclass fields+ */+ CopyPlanFields((const Plan *) from, (Plan *) newnode);++ /*+ * copy remainder of node+ */+ COPY_NODE_FIELD(limitOffset);+ COPY_NODE_FIELD(limitCount);++ return newnode;+}++/*+ * _copyNestLoopParam+ */+static NestLoopParam *+_copyNestLoopParam(const NestLoopParam *from)+{+ NestLoopParam *newnode = makeNode(NestLoopParam);++ COPY_SCALAR_FIELD(paramno);+ COPY_NODE_FIELD(paramval);++ return newnode;+}++/*+ * _copyPlanRowMark+ */+static PlanRowMark *+_copyPlanRowMark(const PlanRowMark *from)+{+ PlanRowMark *newnode = makeNode(PlanRowMark);++ COPY_SCALAR_FIELD(rti);+ COPY_SCALAR_FIELD(prti);+ COPY_SCALAR_FIELD(rowmarkId);+ COPY_SCALAR_FIELD(markType);+ COPY_SCALAR_FIELD(allMarkTypes);+ COPY_SCALAR_FIELD(strength);+ COPY_SCALAR_FIELD(waitPolicy);+ COPY_SCALAR_FIELD(isParent);++ return newnode;+}++/*+ * _copyPlanInvalItem+ */+static PlanInvalItem *+_copyPlanInvalItem(const PlanInvalItem *from)+{+ PlanInvalItem *newnode = makeNode(PlanInvalItem);++ COPY_SCALAR_FIELD(cacheId);+ COPY_SCALAR_FIELD(hashValue);++ return newnode;+}++/* ****************************************************************+ * primnodes.h copy functions+ * ****************************************************************+ */++/*+ * _copyAlias+ */+static Alias *+_copyAlias(const Alias *from)+{+ Alias *newnode = makeNode(Alias);++ COPY_STRING_FIELD(aliasname);+ COPY_NODE_FIELD(colnames);++ return newnode;+}++/*+ * _copyRangeVar+ */+static RangeVar *+_copyRangeVar(const RangeVar *from)+{+ RangeVar *newnode = makeNode(RangeVar);++ COPY_STRING_FIELD(catalogname);+ COPY_STRING_FIELD(schemaname);+ COPY_STRING_FIELD(relname);+ COPY_SCALAR_FIELD(inhOpt);+ COPY_SCALAR_FIELD(relpersistence);+ COPY_NODE_FIELD(alias);+ COPY_LOCATION_FIELD(location);++ return newnode;+}++/*+ * _copyIntoClause+ */+static IntoClause *+_copyIntoClause(const IntoClause *from)+{+ IntoClause *newnode = makeNode(IntoClause);++ COPY_NODE_FIELD(rel);+ COPY_NODE_FIELD(colNames);+ COPY_NODE_FIELD(options);+ COPY_SCALAR_FIELD(onCommit);+ COPY_STRING_FIELD(tableSpaceName);+ COPY_NODE_FIELD(viewQuery);+ COPY_SCALAR_FIELD(skipData);++ return newnode;+}++/*+ * We don't need a _copyExpr because Expr is an abstract supertype which+ * should never actually get instantiated. Also, since it has no common+ * fields except NodeTag, there's no need for a helper routine to factor+ * out copying the common fields...+ */++/*+ * _copyVar+ */+static Var *+_copyVar(const Var *from)+{+ Var *newnode = makeNode(Var);++ COPY_SCALAR_FIELD(varno);+ COPY_SCALAR_FIELD(varattno);+ COPY_SCALAR_FIELD(vartype);+ COPY_SCALAR_FIELD(vartypmod);+ COPY_SCALAR_FIELD(varcollid);+ COPY_SCALAR_FIELD(varlevelsup);+ COPY_SCALAR_FIELD(varnoold);+ COPY_SCALAR_FIELD(varoattno);+ COPY_LOCATION_FIELD(location);++ return newnode;+}++/*+ * _copyConst+ */+static Const *+_copyConst(const Const *from)+{+ Const *newnode = makeNode(Const);++ COPY_SCALAR_FIELD(consttype);+ COPY_SCALAR_FIELD(consttypmod);+ COPY_SCALAR_FIELD(constcollid);+ COPY_SCALAR_FIELD(constlen);++ if (from->constbyval || from->constisnull)+ {+ /*+ * passed by value so just copy the datum. Also, don't try to copy+ * struct when value is null!+ */+ newnode->constvalue = from->constvalue;+ }+ else+ {+ /*+ * passed by reference. We need a palloc'd copy.+ */+ newnode->constvalue = datumCopy(from->constvalue,+ from->constbyval,+ from->constlen);+ }++ COPY_SCALAR_FIELD(constisnull);+ COPY_SCALAR_FIELD(constbyval);+ COPY_LOCATION_FIELD(location);++ return newnode;+}++/*+ * _copyParam+ */+static Param *+_copyParam(const Param *from)+{+ Param *newnode = makeNode(Param);++ COPY_SCALAR_FIELD(paramkind);+ COPY_SCALAR_FIELD(paramid);+ COPY_SCALAR_FIELD(paramtype);+ COPY_SCALAR_FIELD(paramtypmod);+ COPY_SCALAR_FIELD(paramcollid);+ COPY_LOCATION_FIELD(location);++ return newnode;+}++/*+ * _copyAggref+ */+static Aggref *+_copyAggref(const Aggref *from)+{+ Aggref *newnode = makeNode(Aggref);++ COPY_SCALAR_FIELD(aggfnoid);+ COPY_SCALAR_FIELD(aggtype);+ COPY_SCALAR_FIELD(aggcollid);+ COPY_SCALAR_FIELD(inputcollid);+ COPY_NODE_FIELD(aggdirectargs);+ COPY_NODE_FIELD(args);+ COPY_NODE_FIELD(aggorder);+ COPY_NODE_FIELD(aggdistinct);+ COPY_NODE_FIELD(aggfilter);+ COPY_SCALAR_FIELD(aggstar);+ COPY_SCALAR_FIELD(aggvariadic);+ COPY_SCALAR_FIELD(aggkind);+ COPY_SCALAR_FIELD(agglevelsup);+ COPY_LOCATION_FIELD(location);++ return newnode;+}++/*+ * _copyGroupingFunc+ */+static GroupingFunc *+_copyGroupingFunc(const GroupingFunc *from)+{+ GroupingFunc *newnode = makeNode(GroupingFunc);++ COPY_NODE_FIELD(args);+ COPY_NODE_FIELD(refs);+ COPY_NODE_FIELD(cols);+ COPY_SCALAR_FIELD(agglevelsup);+ COPY_LOCATION_FIELD(location);++ return newnode;+}++/*+ * _copyWindowFunc+ */+static WindowFunc *+_copyWindowFunc(const WindowFunc *from)+{+ WindowFunc *newnode = makeNode(WindowFunc);++ COPY_SCALAR_FIELD(winfnoid);+ COPY_SCALAR_FIELD(wintype);+ COPY_SCALAR_FIELD(wincollid);+ COPY_SCALAR_FIELD(inputcollid);+ COPY_NODE_FIELD(args);+ COPY_NODE_FIELD(aggfilter);+ COPY_SCALAR_FIELD(winref);+ COPY_SCALAR_FIELD(winstar);+ COPY_SCALAR_FIELD(winagg);+ COPY_LOCATION_FIELD(location);++ return newnode;+}++/*+ * _copyArrayRef+ */+static ArrayRef *+_copyArrayRef(const ArrayRef *from)+{+ ArrayRef *newnode = makeNode(ArrayRef);++ COPY_SCALAR_FIELD(refarraytype);+ COPY_SCALAR_FIELD(refelemtype);+ COPY_SCALAR_FIELD(reftypmod);+ COPY_SCALAR_FIELD(refcollid);+ COPY_NODE_FIELD(refupperindexpr);+ COPY_NODE_FIELD(reflowerindexpr);+ COPY_NODE_FIELD(refexpr);+ COPY_NODE_FIELD(refassgnexpr);++ return newnode;+}++/*+ * _copyFuncExpr+ */+static FuncExpr *+_copyFuncExpr(const FuncExpr *from)+{+ FuncExpr *newnode = makeNode(FuncExpr);++ COPY_SCALAR_FIELD(funcid);+ COPY_SCALAR_FIELD(funcresulttype);+ COPY_SCALAR_FIELD(funcretset);+ COPY_SCALAR_FIELD(funcvariadic);+ COPY_SCALAR_FIELD(funcformat);+ COPY_SCALAR_FIELD(funccollid);+ COPY_SCALAR_FIELD(inputcollid);+ COPY_NODE_FIELD(args);+ COPY_LOCATION_FIELD(location);++ return newnode;+}++/*+ * _copyNamedArgExpr *+ */+static NamedArgExpr *+_copyNamedArgExpr(const NamedArgExpr *from)+{+ NamedArgExpr *newnode = makeNode(NamedArgExpr);++ COPY_NODE_FIELD(arg);+ COPY_STRING_FIELD(name);+ COPY_SCALAR_FIELD(argnumber);+ COPY_LOCATION_FIELD(location);++ return newnode;+}++/*+ * _copyOpExpr+ */+static OpExpr *+_copyOpExpr(const OpExpr *from)+{+ OpExpr *newnode = makeNode(OpExpr);++ COPY_SCALAR_FIELD(opno);+ COPY_SCALAR_FIELD(opfuncid);+ COPY_SCALAR_FIELD(opresulttype);+ COPY_SCALAR_FIELD(opretset);+ COPY_SCALAR_FIELD(opcollid);+ COPY_SCALAR_FIELD(inputcollid);+ COPY_NODE_FIELD(args);+ COPY_LOCATION_FIELD(location);++ return newnode;+}++/*+ * _copyDistinctExpr (same as OpExpr)+ */+static DistinctExpr *+_copyDistinctExpr(const DistinctExpr *from)+{+ DistinctExpr *newnode = makeNode(DistinctExpr);++ COPY_SCALAR_FIELD(opno);+ COPY_SCALAR_FIELD(opfuncid);+ COPY_SCALAR_FIELD(opresulttype);+ COPY_SCALAR_FIELD(opretset);+ COPY_SCALAR_FIELD(opcollid);+ COPY_SCALAR_FIELD(inputcollid);+ COPY_NODE_FIELD(args);+ COPY_LOCATION_FIELD(location);++ return newnode;+}++/*+ * _copyNullIfExpr (same as OpExpr)+ */+static NullIfExpr *+_copyNullIfExpr(const NullIfExpr *from)+{+ NullIfExpr *newnode = makeNode(NullIfExpr);++ COPY_SCALAR_FIELD(opno);+ COPY_SCALAR_FIELD(opfuncid);+ COPY_SCALAR_FIELD(opresulttype);+ COPY_SCALAR_FIELD(opretset);+ COPY_SCALAR_FIELD(opcollid);+ COPY_SCALAR_FIELD(inputcollid);+ COPY_NODE_FIELD(args);+ COPY_LOCATION_FIELD(location);++ return newnode;+}++/*+ * _copyScalarArrayOpExpr+ */+static ScalarArrayOpExpr *+_copyScalarArrayOpExpr(const ScalarArrayOpExpr *from)+{+ ScalarArrayOpExpr *newnode = makeNode(ScalarArrayOpExpr);++ COPY_SCALAR_FIELD(opno);+ COPY_SCALAR_FIELD(opfuncid);+ COPY_SCALAR_FIELD(useOr);+ COPY_SCALAR_FIELD(inputcollid);+ COPY_NODE_FIELD(args);+ COPY_LOCATION_FIELD(location);++ return newnode;+}++/*+ * _copyBoolExpr+ */+static BoolExpr *+_copyBoolExpr(const BoolExpr *from)+{+ BoolExpr *newnode = makeNode(BoolExpr);++ COPY_SCALAR_FIELD(boolop);+ COPY_NODE_FIELD(args);+ COPY_LOCATION_FIELD(location);++ return newnode;+}++/*+ * _copySubLink+ */+static SubLink *+_copySubLink(const SubLink *from)+{+ SubLink *newnode = makeNode(SubLink);++ COPY_SCALAR_FIELD(subLinkType);+ COPY_SCALAR_FIELD(subLinkId);+ COPY_NODE_FIELD(testexpr);+ COPY_NODE_FIELD(operName);+ COPY_NODE_FIELD(subselect);+ COPY_LOCATION_FIELD(location);++ return newnode;+}++/*+ * _copySubPlan+ */+static SubPlan *+_copySubPlan(const SubPlan *from)+{+ SubPlan *newnode = makeNode(SubPlan);++ COPY_SCALAR_FIELD(subLinkType);+ COPY_NODE_FIELD(testexpr);+ COPY_NODE_FIELD(paramIds);+ COPY_SCALAR_FIELD(plan_id);+ COPY_STRING_FIELD(plan_name);+ COPY_SCALAR_FIELD(firstColType);+ COPY_SCALAR_FIELD(firstColTypmod);+ COPY_SCALAR_FIELD(firstColCollation);+ COPY_SCALAR_FIELD(useHashTable);+ COPY_SCALAR_FIELD(unknownEqFalse);+ COPY_NODE_FIELD(setParam);+ COPY_NODE_FIELD(parParam);+ COPY_NODE_FIELD(args);+ COPY_SCALAR_FIELD(startup_cost);+ COPY_SCALAR_FIELD(per_call_cost);++ return newnode;+}++/*+ * _copyAlternativeSubPlan+ */+static AlternativeSubPlan *+_copyAlternativeSubPlan(const AlternativeSubPlan *from)+{+ AlternativeSubPlan *newnode = makeNode(AlternativeSubPlan);++ COPY_NODE_FIELD(subplans);++ return newnode;+}++/*+ * _copyFieldSelect+ */+static FieldSelect *+_copyFieldSelect(const FieldSelect *from)+{+ FieldSelect *newnode = makeNode(FieldSelect);++ COPY_NODE_FIELD(arg);+ COPY_SCALAR_FIELD(fieldnum);+ COPY_SCALAR_FIELD(resulttype);+ COPY_SCALAR_FIELD(resulttypmod);+ COPY_SCALAR_FIELD(resultcollid);++ return newnode;+}++/*+ * _copyFieldStore+ */+static FieldStore *+_copyFieldStore(const FieldStore *from)+{+ FieldStore *newnode = makeNode(FieldStore);++ COPY_NODE_FIELD(arg);+ COPY_NODE_FIELD(newvals);+ COPY_NODE_FIELD(fieldnums);+ COPY_SCALAR_FIELD(resulttype);++ return newnode;+}++/*+ * _copyRelabelType+ */+static RelabelType *+_copyRelabelType(const RelabelType *from)+{+ RelabelType *newnode = makeNode(RelabelType);++ COPY_NODE_FIELD(arg);+ COPY_SCALAR_FIELD(resulttype);+ COPY_SCALAR_FIELD(resulttypmod);+ COPY_SCALAR_FIELD(resultcollid);+ COPY_SCALAR_FIELD(relabelformat);+ COPY_LOCATION_FIELD(location);++ return newnode;+}++/*+ * _copyCoerceViaIO+ */+static CoerceViaIO *+_copyCoerceViaIO(const CoerceViaIO *from)+{+ CoerceViaIO *newnode = makeNode(CoerceViaIO);++ COPY_NODE_FIELD(arg);+ COPY_SCALAR_FIELD(resulttype);+ COPY_SCALAR_FIELD(resultcollid);+ COPY_SCALAR_FIELD(coerceformat);+ COPY_LOCATION_FIELD(location);++ return newnode;+}++/*+ * _copyArrayCoerceExpr+ */+static ArrayCoerceExpr *+_copyArrayCoerceExpr(const ArrayCoerceExpr *from)+{+ ArrayCoerceExpr *newnode = makeNode(ArrayCoerceExpr);++ COPY_NODE_FIELD(arg);+ COPY_SCALAR_FIELD(elemfuncid);+ COPY_SCALAR_FIELD(resulttype);+ COPY_SCALAR_FIELD(resulttypmod);+ COPY_SCALAR_FIELD(resultcollid);+ COPY_SCALAR_FIELD(isExplicit);+ COPY_SCALAR_FIELD(coerceformat);+ COPY_LOCATION_FIELD(location);++ return newnode;+}++/*+ * _copyConvertRowtypeExpr+ */+static ConvertRowtypeExpr *+_copyConvertRowtypeExpr(const ConvertRowtypeExpr *from)+{+ ConvertRowtypeExpr *newnode = makeNode(ConvertRowtypeExpr);++ COPY_NODE_FIELD(arg);+ COPY_SCALAR_FIELD(resulttype);+ COPY_SCALAR_FIELD(convertformat);+ COPY_LOCATION_FIELD(location);++ return newnode;+}++/*+ * _copyCollateExpr+ */+static CollateExpr *+_copyCollateExpr(const CollateExpr *from)+{+ CollateExpr *newnode = makeNode(CollateExpr);++ COPY_NODE_FIELD(arg);+ COPY_SCALAR_FIELD(collOid);+ COPY_LOCATION_FIELD(location);++ return newnode;+}++/*+ * _copyCaseExpr+ */+static CaseExpr *+_copyCaseExpr(const CaseExpr *from)+{+ CaseExpr *newnode = makeNode(CaseExpr);++ COPY_SCALAR_FIELD(casetype);+ COPY_SCALAR_FIELD(casecollid);+ COPY_NODE_FIELD(arg);+ COPY_NODE_FIELD(args);+ COPY_NODE_FIELD(defresult);+ COPY_LOCATION_FIELD(location);++ return newnode;+}++/*+ * _copyCaseWhen+ */+static CaseWhen *+_copyCaseWhen(const CaseWhen *from)+{+ CaseWhen *newnode = makeNode(CaseWhen);++ COPY_NODE_FIELD(expr);+ COPY_NODE_FIELD(result);+ COPY_LOCATION_FIELD(location);++ return newnode;+}++/*+ * _copyCaseTestExpr+ */+static CaseTestExpr *+_copyCaseTestExpr(const CaseTestExpr *from)+{+ CaseTestExpr *newnode = makeNode(CaseTestExpr);++ COPY_SCALAR_FIELD(typeId);+ COPY_SCALAR_FIELD(typeMod);+ COPY_SCALAR_FIELD(collation);++ return newnode;+}++/*+ * _copyArrayExpr+ */+static ArrayExpr *+_copyArrayExpr(const ArrayExpr *from)+{+ ArrayExpr *newnode = makeNode(ArrayExpr);++ COPY_SCALAR_FIELD(array_typeid);+ COPY_SCALAR_FIELD(array_collid);+ COPY_SCALAR_FIELD(element_typeid);+ COPY_NODE_FIELD(elements);+ COPY_SCALAR_FIELD(multidims);+ COPY_LOCATION_FIELD(location);++ return newnode;+}++/*+ * _copyRowExpr+ */+static RowExpr *+_copyRowExpr(const RowExpr *from)+{+ RowExpr *newnode = makeNode(RowExpr);++ COPY_NODE_FIELD(args);+ COPY_SCALAR_FIELD(row_typeid);+ COPY_SCALAR_FIELD(row_format);+ COPY_NODE_FIELD(colnames);+ COPY_LOCATION_FIELD(location);++ return newnode;+}++/*+ * _copyRowCompareExpr+ */+static RowCompareExpr *+_copyRowCompareExpr(const RowCompareExpr *from)+{+ RowCompareExpr *newnode = makeNode(RowCompareExpr);++ COPY_SCALAR_FIELD(rctype);+ COPY_NODE_FIELD(opnos);+ COPY_NODE_FIELD(opfamilies);+ COPY_NODE_FIELD(inputcollids);+ COPY_NODE_FIELD(largs);+ COPY_NODE_FIELD(rargs);++ return newnode;+}++/*+ * _copyCoalesceExpr+ */+static CoalesceExpr *+_copyCoalesceExpr(const CoalesceExpr *from)+{+ CoalesceExpr *newnode = makeNode(CoalesceExpr);++ COPY_SCALAR_FIELD(coalescetype);+ COPY_SCALAR_FIELD(coalescecollid);+ COPY_NODE_FIELD(args);+ COPY_LOCATION_FIELD(location);++ return newnode;+}++/*+ * _copyMinMaxExpr+ */+static MinMaxExpr *+_copyMinMaxExpr(const MinMaxExpr *from)+{+ MinMaxExpr *newnode = makeNode(MinMaxExpr);++ COPY_SCALAR_FIELD(minmaxtype);+ COPY_SCALAR_FIELD(minmaxcollid);+ COPY_SCALAR_FIELD(inputcollid);+ COPY_SCALAR_FIELD(op);+ COPY_NODE_FIELD(args);+ COPY_LOCATION_FIELD(location);++ return newnode;+}++/*+ * _copyXmlExpr+ */+static XmlExpr *+_copyXmlExpr(const XmlExpr *from)+{+ XmlExpr *newnode = makeNode(XmlExpr);++ COPY_SCALAR_FIELD(op);+ COPY_STRING_FIELD(name);+ COPY_NODE_FIELD(named_args);+ COPY_NODE_FIELD(arg_names);+ COPY_NODE_FIELD(args);+ COPY_SCALAR_FIELD(xmloption);+ COPY_SCALAR_FIELD(type);+ COPY_SCALAR_FIELD(typmod);+ COPY_LOCATION_FIELD(location);++ return newnode;+}++/*+ * _copyNullTest+ */+static NullTest *+_copyNullTest(const NullTest *from)+{+ NullTest *newnode = makeNode(NullTest);++ COPY_NODE_FIELD(arg);+ COPY_SCALAR_FIELD(nulltesttype);+ COPY_SCALAR_FIELD(argisrow);+ COPY_LOCATION_FIELD(location);++ return newnode;+}++/*+ * _copyBooleanTest+ */+static BooleanTest *+_copyBooleanTest(const BooleanTest *from)+{+ BooleanTest *newnode = makeNode(BooleanTest);++ COPY_NODE_FIELD(arg);+ COPY_SCALAR_FIELD(booltesttype);+ COPY_LOCATION_FIELD(location);++ return newnode;+}++/*+ * _copyCoerceToDomain+ */+static CoerceToDomain *+_copyCoerceToDomain(const CoerceToDomain *from)+{+ CoerceToDomain *newnode = makeNode(CoerceToDomain);++ COPY_NODE_FIELD(arg);+ COPY_SCALAR_FIELD(resulttype);+ COPY_SCALAR_FIELD(resulttypmod);+ COPY_SCALAR_FIELD(resultcollid);+ COPY_SCALAR_FIELD(coercionformat);+ COPY_LOCATION_FIELD(location);++ return newnode;+}++/*+ * _copyCoerceToDomainValue+ */+static CoerceToDomainValue *+_copyCoerceToDomainValue(const CoerceToDomainValue *from)+{+ CoerceToDomainValue *newnode = makeNode(CoerceToDomainValue);++ COPY_SCALAR_FIELD(typeId);+ COPY_SCALAR_FIELD(typeMod);+ COPY_SCALAR_FIELD(collation);+ COPY_LOCATION_FIELD(location);++ return newnode;+}++/*+ * _copySetToDefault+ */+static SetToDefault *+_copySetToDefault(const SetToDefault *from)+{+ SetToDefault *newnode = makeNode(SetToDefault);++ COPY_SCALAR_FIELD(typeId);+ COPY_SCALAR_FIELD(typeMod);+ COPY_SCALAR_FIELD(collation);+ COPY_LOCATION_FIELD(location);++ return newnode;+}++/*+ * _copyCurrentOfExpr+ */+static CurrentOfExpr *+_copyCurrentOfExpr(const CurrentOfExpr *from)+{+ CurrentOfExpr *newnode = makeNode(CurrentOfExpr);++ COPY_SCALAR_FIELD(cvarno);+ COPY_STRING_FIELD(cursor_name);+ COPY_SCALAR_FIELD(cursor_param);++ return newnode;+}++/*+ * _copyInferenceElem+ */+static InferenceElem *+_copyInferenceElem(const InferenceElem *from)+{+ InferenceElem *newnode = makeNode(InferenceElem);++ COPY_NODE_FIELD(expr);+ COPY_SCALAR_FIELD(infercollid);+ COPY_SCALAR_FIELD(inferopclass);++ return newnode;+}++/*+ * _copyTargetEntry+ */+static TargetEntry *+_copyTargetEntry(const TargetEntry *from)+{+ TargetEntry *newnode = makeNode(TargetEntry);++ COPY_NODE_FIELD(expr);+ COPY_SCALAR_FIELD(resno);+ COPY_STRING_FIELD(resname);+ COPY_SCALAR_FIELD(ressortgroupref);+ COPY_SCALAR_FIELD(resorigtbl);+ COPY_SCALAR_FIELD(resorigcol);+ COPY_SCALAR_FIELD(resjunk);++ return newnode;+}++/*+ * _copyRangeTblRef+ */+static RangeTblRef *+_copyRangeTblRef(const RangeTblRef *from)+{+ RangeTblRef *newnode = makeNode(RangeTblRef);++ COPY_SCALAR_FIELD(rtindex);++ return newnode;+}++/*+ * _copyJoinExpr+ */+static JoinExpr *+_copyJoinExpr(const JoinExpr *from)+{+ JoinExpr *newnode = makeNode(JoinExpr);++ COPY_SCALAR_FIELD(jointype);+ COPY_SCALAR_FIELD(isNatural);+ COPY_NODE_FIELD(larg);+ COPY_NODE_FIELD(rarg);+ COPY_NODE_FIELD(usingClause);+ COPY_NODE_FIELD(quals);+ COPY_NODE_FIELD(alias);+ COPY_SCALAR_FIELD(rtindex);++ return newnode;+}++/*+ * _copyFromExpr+ */+static FromExpr *+_copyFromExpr(const FromExpr *from)+{+ FromExpr *newnode = makeNode(FromExpr);++ COPY_NODE_FIELD(fromlist);+ COPY_NODE_FIELD(quals);++ return newnode;+}++/*+ * _copyOnConflictExpr+ */+static OnConflictExpr *+_copyOnConflictExpr(const OnConflictExpr *from)+{+ OnConflictExpr *newnode = makeNode(OnConflictExpr);++ COPY_SCALAR_FIELD(action);+ COPY_NODE_FIELD(arbiterElems);+ COPY_NODE_FIELD(arbiterWhere);+ COPY_SCALAR_FIELD(constraint);+ COPY_NODE_FIELD(onConflictSet);+ COPY_NODE_FIELD(onConflictWhere);+ COPY_SCALAR_FIELD(exclRelIndex);+ COPY_NODE_FIELD(exclRelTlist);++ return newnode;+}++/* ****************************************************************+ * relation.h copy functions+ *+ * We don't support copying RelOptInfo, IndexOptInfo, or Path nodes.+ * There are some subsidiary structs that are useful to copy, though.+ * ****************************************************************+ */++/*+ * _copyPathKey+ */+static PathKey *+_copyPathKey(const PathKey *from)+{+ PathKey *newnode = makeNode(PathKey);++ /* EquivalenceClasses are never moved, so just shallow-copy the pointer */+ COPY_SCALAR_FIELD(pk_eclass);+ COPY_SCALAR_FIELD(pk_opfamily);+ COPY_SCALAR_FIELD(pk_strategy);+ COPY_SCALAR_FIELD(pk_nulls_first);++ return newnode;+}++/*+ * _copyRestrictInfo+ */+static RestrictInfo *+_copyRestrictInfo(const RestrictInfo *from)+{+ RestrictInfo *newnode = makeNode(RestrictInfo);++ COPY_NODE_FIELD(clause);+ COPY_SCALAR_FIELD(is_pushed_down);+ COPY_SCALAR_FIELD(outerjoin_delayed);+ COPY_SCALAR_FIELD(can_join);+ COPY_SCALAR_FIELD(pseudoconstant);+ COPY_BITMAPSET_FIELD(clause_relids);+ COPY_BITMAPSET_FIELD(required_relids);+ COPY_BITMAPSET_FIELD(outer_relids);+ COPY_BITMAPSET_FIELD(nullable_relids);+ COPY_BITMAPSET_FIELD(left_relids);+ COPY_BITMAPSET_FIELD(right_relids);+ COPY_NODE_FIELD(orclause);+ /* EquivalenceClasses are never copied, so shallow-copy the pointers */+ COPY_SCALAR_FIELD(parent_ec);+ COPY_SCALAR_FIELD(eval_cost);+ COPY_SCALAR_FIELD(norm_selec);+ COPY_SCALAR_FIELD(outer_selec);+ COPY_NODE_FIELD(mergeopfamilies);+ /* EquivalenceClasses are never copied, so shallow-copy the pointers */+ COPY_SCALAR_FIELD(left_ec);+ COPY_SCALAR_FIELD(right_ec);+ COPY_SCALAR_FIELD(left_em);+ COPY_SCALAR_FIELD(right_em);+ /* MergeScanSelCache isn't a Node, so hard to copy; just reset cache */+ newnode->scansel_cache = NIL;+ COPY_SCALAR_FIELD(outer_is_left);+ COPY_SCALAR_FIELD(hashjoinoperator);+ COPY_SCALAR_FIELD(left_bucketsize);+ COPY_SCALAR_FIELD(right_bucketsize);++ return newnode;+}++/*+ * _copyPlaceHolderVar+ */+static PlaceHolderVar *+_copyPlaceHolderVar(const PlaceHolderVar *from)+{+ PlaceHolderVar *newnode = makeNode(PlaceHolderVar);++ COPY_NODE_FIELD(phexpr);+ COPY_BITMAPSET_FIELD(phrels);+ COPY_SCALAR_FIELD(phid);+ COPY_SCALAR_FIELD(phlevelsup);++ return newnode;+}++/*+ * _copySpecialJoinInfo+ */+static SpecialJoinInfo *+_copySpecialJoinInfo(const SpecialJoinInfo *from)+{+ SpecialJoinInfo *newnode = makeNode(SpecialJoinInfo);++ COPY_BITMAPSET_FIELD(min_lefthand);+ COPY_BITMAPSET_FIELD(min_righthand);+ COPY_BITMAPSET_FIELD(syn_lefthand);+ COPY_BITMAPSET_FIELD(syn_righthand);+ COPY_SCALAR_FIELD(jointype);+ COPY_SCALAR_FIELD(lhs_strict);+ COPY_SCALAR_FIELD(delay_upper_joins);+ COPY_SCALAR_FIELD(semi_can_btree);+ COPY_SCALAR_FIELD(semi_can_hash);+ COPY_NODE_FIELD(semi_operators);+ COPY_NODE_FIELD(semi_rhs_exprs);++ return newnode;+}++/*+ * _copyAppendRelInfo+ */+static AppendRelInfo *+_copyAppendRelInfo(const AppendRelInfo *from)+{+ AppendRelInfo *newnode = makeNode(AppendRelInfo);++ COPY_SCALAR_FIELD(parent_relid);+ COPY_SCALAR_FIELD(child_relid);+ COPY_SCALAR_FIELD(parent_reltype);+ COPY_SCALAR_FIELD(child_reltype);+ COPY_NODE_FIELD(translated_vars);+ COPY_SCALAR_FIELD(parent_reloid);++ return newnode;+}++/*+ * _copyPlaceHolderInfo+ */+static PlaceHolderInfo *+_copyPlaceHolderInfo(const PlaceHolderInfo *from)+{+ PlaceHolderInfo *newnode = makeNode(PlaceHolderInfo);++ COPY_SCALAR_FIELD(phid);+ COPY_NODE_FIELD(ph_var);+ COPY_BITMAPSET_FIELD(ph_eval_at);+ COPY_BITMAPSET_FIELD(ph_lateral);+ COPY_BITMAPSET_FIELD(ph_needed);+ COPY_SCALAR_FIELD(ph_width);++ return newnode;+}++/* ****************************************************************+ * parsenodes.h copy functions+ * ****************************************************************+ */++static RangeTblEntry *+_copyRangeTblEntry(const RangeTblEntry *from)+{+ RangeTblEntry *newnode = makeNode(RangeTblEntry);++ COPY_SCALAR_FIELD(rtekind);+ COPY_SCALAR_FIELD(relid);+ COPY_SCALAR_FIELD(relkind);+ COPY_NODE_FIELD(tablesample);+ COPY_NODE_FIELD(subquery);+ COPY_SCALAR_FIELD(security_barrier);+ COPY_SCALAR_FIELD(jointype);+ COPY_NODE_FIELD(joinaliasvars);+ COPY_NODE_FIELD(functions);+ COPY_SCALAR_FIELD(funcordinality);+ COPY_NODE_FIELD(values_lists);+ COPY_NODE_FIELD(values_collations);+ COPY_STRING_FIELD(ctename);+ COPY_SCALAR_FIELD(ctelevelsup);+ COPY_SCALAR_FIELD(self_reference);+ COPY_NODE_FIELD(ctecoltypes);+ COPY_NODE_FIELD(ctecoltypmods);+ COPY_NODE_FIELD(ctecolcollations);+ COPY_NODE_FIELD(alias);+ COPY_NODE_FIELD(eref);+ COPY_SCALAR_FIELD(lateral);+ COPY_SCALAR_FIELD(inh);+ COPY_SCALAR_FIELD(inFromCl);+ COPY_SCALAR_FIELD(requiredPerms);+ COPY_SCALAR_FIELD(checkAsUser);+ COPY_BITMAPSET_FIELD(selectedCols);+ COPY_BITMAPSET_FIELD(insertedCols);+ COPY_BITMAPSET_FIELD(updatedCols);+ COPY_NODE_FIELD(securityQuals);++ return newnode;+}++static RangeTblFunction *+_copyRangeTblFunction(const RangeTblFunction *from)+{+ RangeTblFunction *newnode = makeNode(RangeTblFunction);++ COPY_NODE_FIELD(funcexpr);+ COPY_SCALAR_FIELD(funccolcount);+ COPY_NODE_FIELD(funccolnames);+ COPY_NODE_FIELD(funccoltypes);+ COPY_NODE_FIELD(funccoltypmods);+ COPY_NODE_FIELD(funccolcollations);+ COPY_BITMAPSET_FIELD(funcparams);++ return newnode;+}++static TableSampleClause *+_copyTableSampleClause(const TableSampleClause *from)+{+ TableSampleClause *newnode = makeNode(TableSampleClause);++ COPY_SCALAR_FIELD(tsmhandler);+ COPY_NODE_FIELD(args);+ COPY_NODE_FIELD(repeatable);++ return newnode;+}++static WithCheckOption *+_copyWithCheckOption(const WithCheckOption *from)+{+ WithCheckOption *newnode = makeNode(WithCheckOption);++ COPY_SCALAR_FIELD(kind);+ COPY_STRING_FIELD(relname);+ COPY_STRING_FIELD(polname);+ COPY_NODE_FIELD(qual);+ COPY_SCALAR_FIELD(cascaded);++ return newnode;+}++static SortGroupClause *+_copySortGroupClause(const SortGroupClause *from)+{+ SortGroupClause *newnode = makeNode(SortGroupClause);++ COPY_SCALAR_FIELD(tleSortGroupRef);+ COPY_SCALAR_FIELD(eqop);+ COPY_SCALAR_FIELD(sortop);+ COPY_SCALAR_FIELD(nulls_first);+ COPY_SCALAR_FIELD(hashable);++ return newnode;+}++static GroupingSet *+_copyGroupingSet(const GroupingSet *from)+{+ GroupingSet *newnode = makeNode(GroupingSet);++ COPY_SCALAR_FIELD(kind);+ COPY_NODE_FIELD(content);+ COPY_LOCATION_FIELD(location);++ return newnode;+}++static WindowClause *+_copyWindowClause(const WindowClause *from)+{+ WindowClause *newnode = makeNode(WindowClause);++ COPY_STRING_FIELD(name);+ COPY_STRING_FIELD(refname);+ COPY_NODE_FIELD(partitionClause);+ COPY_NODE_FIELD(orderClause);+ COPY_SCALAR_FIELD(frameOptions);+ COPY_NODE_FIELD(startOffset);+ COPY_NODE_FIELD(endOffset);+ COPY_SCALAR_FIELD(winref);+ COPY_SCALAR_FIELD(copiedOrder);++ return newnode;+}++static RowMarkClause *+_copyRowMarkClause(const RowMarkClause *from)+{+ RowMarkClause *newnode = makeNode(RowMarkClause);++ COPY_SCALAR_FIELD(rti);+ COPY_SCALAR_FIELD(strength);+ COPY_SCALAR_FIELD(waitPolicy);+ COPY_SCALAR_FIELD(pushedDown);++ return newnode;+}++static WithClause *+_copyWithClause(const WithClause *from)+{+ WithClause *newnode = makeNode(WithClause);++ COPY_NODE_FIELD(ctes);+ COPY_SCALAR_FIELD(recursive);+ COPY_LOCATION_FIELD(location);++ return newnode;+}++static InferClause *+_copyInferClause(const InferClause *from)+{+ InferClause *newnode = makeNode(InferClause);++ COPY_NODE_FIELD(indexElems);+ COPY_NODE_FIELD(whereClause);+ COPY_STRING_FIELD(conname);+ COPY_LOCATION_FIELD(location);++ return newnode;+}++static OnConflictClause *+_copyOnConflictClause(const OnConflictClause *from)+{+ OnConflictClause *newnode = makeNode(OnConflictClause);++ COPY_SCALAR_FIELD(action);+ COPY_NODE_FIELD(infer);+ COPY_NODE_FIELD(targetList);+ COPY_NODE_FIELD(whereClause);+ COPY_LOCATION_FIELD(location);++ return newnode;+}++static CommonTableExpr *+_copyCommonTableExpr(const CommonTableExpr *from)+{+ CommonTableExpr *newnode = makeNode(CommonTableExpr);++ COPY_STRING_FIELD(ctename);+ COPY_NODE_FIELD(aliascolnames);+ COPY_NODE_FIELD(ctequery);+ COPY_LOCATION_FIELD(location);+ COPY_SCALAR_FIELD(cterecursive);+ COPY_SCALAR_FIELD(cterefcount);+ COPY_NODE_FIELD(ctecolnames);+ COPY_NODE_FIELD(ctecoltypes);+ COPY_NODE_FIELD(ctecoltypmods);+ COPY_NODE_FIELD(ctecolcollations);++ return newnode;+}++static A_Expr *+_copyAExpr(const A_Expr *from)+{+ A_Expr *newnode = makeNode(A_Expr);++ COPY_SCALAR_FIELD(kind);+ COPY_NODE_FIELD(name);+ COPY_NODE_FIELD(lexpr);+ COPY_NODE_FIELD(rexpr);+ COPY_LOCATION_FIELD(location);++ return newnode;+}++static ColumnRef *+_copyColumnRef(const ColumnRef *from)+{+ ColumnRef *newnode = makeNode(ColumnRef);++ COPY_NODE_FIELD(fields);+ COPY_LOCATION_FIELD(location);++ return newnode;+}++static ParamRef *+_copyParamRef(const ParamRef *from)+{+ ParamRef *newnode = makeNode(ParamRef);++ COPY_SCALAR_FIELD(number);+ COPY_LOCATION_FIELD(location);++ return newnode;+}++static A_Const *+_copyAConst(const A_Const *from)+{+ A_Const *newnode = makeNode(A_Const);++ /* This part must duplicate _copyValue */+ COPY_SCALAR_FIELD(val.type);+ switch (from->val.type)+ {+ case T_Integer:+ COPY_SCALAR_FIELD(val.val.ival);+ break;+ case T_Float:+ case T_String:+ case T_BitString:+ COPY_STRING_FIELD(val.val.str);+ break;+ case T_Null:+ /* nothing to do */+ break;+ default:+ elog(ERROR, "unrecognized node type: %d",+ (int) from->val.type);+ break;+ }++ COPY_LOCATION_FIELD(location);++ return newnode;+}++static FuncCall *+_copyFuncCall(const FuncCall *from)+{+ FuncCall *newnode = makeNode(FuncCall);++ COPY_NODE_FIELD(funcname);+ COPY_NODE_FIELD(args);+ COPY_NODE_FIELD(agg_order);+ COPY_NODE_FIELD(agg_filter);+ COPY_SCALAR_FIELD(agg_within_group);+ COPY_SCALAR_FIELD(agg_star);+ COPY_SCALAR_FIELD(agg_distinct);+ COPY_SCALAR_FIELD(func_variadic);+ COPY_NODE_FIELD(over);+ COPY_LOCATION_FIELD(location);++ return newnode;+}++static A_Star *+_copyAStar(const A_Star *from)+{+ A_Star *newnode = makeNode(A_Star);++ return newnode;+}++static A_Indices *+_copyAIndices(const A_Indices *from)+{+ A_Indices *newnode = makeNode(A_Indices);++ COPY_NODE_FIELD(lidx);+ COPY_NODE_FIELD(uidx);++ return newnode;+}++static A_Indirection *+_copyA_Indirection(const A_Indirection *from)+{+ A_Indirection *newnode = makeNode(A_Indirection);++ COPY_NODE_FIELD(arg);+ COPY_NODE_FIELD(indirection);++ return newnode;+}++static A_ArrayExpr *+_copyA_ArrayExpr(const A_ArrayExpr *from)+{+ A_ArrayExpr *newnode = makeNode(A_ArrayExpr);++ COPY_NODE_FIELD(elements);+ COPY_LOCATION_FIELD(location);++ return newnode;+}++static ResTarget *+_copyResTarget(const ResTarget *from)+{+ ResTarget *newnode = makeNode(ResTarget);++ COPY_STRING_FIELD(name);+ COPY_NODE_FIELD(indirection);+ COPY_NODE_FIELD(val);+ COPY_LOCATION_FIELD(location);++ return newnode;+}++static MultiAssignRef *+_copyMultiAssignRef(const MultiAssignRef *from)+{+ MultiAssignRef *newnode = makeNode(MultiAssignRef);++ COPY_NODE_FIELD(source);+ COPY_SCALAR_FIELD(colno);+ COPY_SCALAR_FIELD(ncolumns);++ return newnode;+}++static TypeName *+_copyTypeName(const TypeName *from)+{+ TypeName *newnode = makeNode(TypeName);++ COPY_NODE_FIELD(names);+ COPY_SCALAR_FIELD(typeOid);+ COPY_SCALAR_FIELD(setof);+ COPY_SCALAR_FIELD(pct_type);+ COPY_NODE_FIELD(typmods);+ COPY_SCALAR_FIELD(typemod);+ COPY_NODE_FIELD(arrayBounds);+ COPY_LOCATION_FIELD(location);++ return newnode;+}++static SortBy *+_copySortBy(const SortBy *from)+{+ SortBy *newnode = makeNode(SortBy);++ COPY_NODE_FIELD(node);+ COPY_SCALAR_FIELD(sortby_dir);+ COPY_SCALAR_FIELD(sortby_nulls);+ COPY_NODE_FIELD(useOp);+ COPY_LOCATION_FIELD(location);++ return newnode;+}++static WindowDef *+_copyWindowDef(const WindowDef *from)+{+ WindowDef *newnode = makeNode(WindowDef);++ COPY_STRING_FIELD(name);+ COPY_STRING_FIELD(refname);+ COPY_NODE_FIELD(partitionClause);+ COPY_NODE_FIELD(orderClause);+ COPY_SCALAR_FIELD(frameOptions);+ COPY_NODE_FIELD(startOffset);+ COPY_NODE_FIELD(endOffset);+ COPY_LOCATION_FIELD(location);++ return newnode;+}++static RangeSubselect *+_copyRangeSubselect(const RangeSubselect *from)+{+ RangeSubselect *newnode = makeNode(RangeSubselect);++ COPY_SCALAR_FIELD(lateral);+ COPY_NODE_FIELD(subquery);+ COPY_NODE_FIELD(alias);++ return newnode;+}++static RangeFunction *+_copyRangeFunction(const RangeFunction *from)+{+ RangeFunction *newnode = makeNode(RangeFunction);++ COPY_SCALAR_FIELD(lateral);+ COPY_SCALAR_FIELD(ordinality);+ COPY_SCALAR_FIELD(is_rowsfrom);+ COPY_NODE_FIELD(functions);+ COPY_NODE_FIELD(alias);+ COPY_NODE_FIELD(coldeflist);++ return newnode;+}++static RangeTableSample *+_copyRangeTableSample(const RangeTableSample *from)+{+ RangeTableSample *newnode = makeNode(RangeTableSample);++ COPY_NODE_FIELD(relation);+ COPY_NODE_FIELD(method);+ COPY_NODE_FIELD(args);+ COPY_NODE_FIELD(repeatable);+ COPY_LOCATION_FIELD(location);++ return newnode;+}++static TypeCast *+_copyTypeCast(const TypeCast *from)+{+ TypeCast *newnode = makeNode(TypeCast);++ COPY_NODE_FIELD(arg);+ COPY_NODE_FIELD(typeName);+ COPY_LOCATION_FIELD(location);++ return newnode;+}++static CollateClause *+_copyCollateClause(const CollateClause *from)+{+ CollateClause *newnode = makeNode(CollateClause);++ COPY_NODE_FIELD(arg);+ COPY_NODE_FIELD(collname);+ COPY_LOCATION_FIELD(location);++ return newnode;+}++static IndexElem *+_copyIndexElem(const IndexElem *from)+{+ IndexElem *newnode = makeNode(IndexElem);++ COPY_STRING_FIELD(name);+ COPY_NODE_FIELD(expr);+ COPY_STRING_FIELD(indexcolname);+ COPY_NODE_FIELD(collation);+ COPY_NODE_FIELD(opclass);+ COPY_SCALAR_FIELD(ordering);+ COPY_SCALAR_FIELD(nulls_ordering);++ return newnode;+}++static ColumnDef *+_copyColumnDef(const ColumnDef *from)+{+ ColumnDef *newnode = makeNode(ColumnDef);++ COPY_STRING_FIELD(colname);+ COPY_NODE_FIELD(typeName);+ COPY_SCALAR_FIELD(inhcount);+ COPY_SCALAR_FIELD(is_local);+ COPY_SCALAR_FIELD(is_not_null);+ COPY_SCALAR_FIELD(is_from_type);+ COPY_SCALAR_FIELD(storage);+ COPY_NODE_FIELD(raw_default);+ COPY_NODE_FIELD(cooked_default);+ COPY_NODE_FIELD(collClause);+ COPY_SCALAR_FIELD(collOid);+ COPY_NODE_FIELD(constraints);+ COPY_NODE_FIELD(fdwoptions);+ COPY_LOCATION_FIELD(location);++ return newnode;+}++static Constraint *+_copyConstraint(const Constraint *from)+{+ Constraint *newnode = makeNode(Constraint);++ COPY_SCALAR_FIELD(contype);+ COPY_STRING_FIELD(conname);+ COPY_SCALAR_FIELD(deferrable);+ COPY_SCALAR_FIELD(initdeferred);+ COPY_LOCATION_FIELD(location);+ COPY_SCALAR_FIELD(is_no_inherit);+ COPY_NODE_FIELD(raw_expr);+ COPY_STRING_FIELD(cooked_expr);+ COPY_NODE_FIELD(keys);+ COPY_NODE_FIELD(exclusions);+ COPY_NODE_FIELD(options);+ COPY_STRING_FIELD(indexname);+ COPY_STRING_FIELD(indexspace);+ COPY_STRING_FIELD(access_method);+ COPY_NODE_FIELD(where_clause);+ COPY_NODE_FIELD(pktable);+ COPY_NODE_FIELD(fk_attrs);+ COPY_NODE_FIELD(pk_attrs);+ COPY_SCALAR_FIELD(fk_matchtype);+ COPY_SCALAR_FIELD(fk_upd_action);+ COPY_SCALAR_FIELD(fk_del_action);+ COPY_NODE_FIELD(old_conpfeqop);+ COPY_SCALAR_FIELD(old_pktable_oid);+ COPY_SCALAR_FIELD(skip_validation);+ COPY_SCALAR_FIELD(initially_valid);++ return newnode;+}++static DefElem *+_copyDefElem(const DefElem *from)+{+ DefElem *newnode = makeNode(DefElem);++ COPY_STRING_FIELD(defnamespace);+ COPY_STRING_FIELD(defname);+ COPY_NODE_FIELD(arg);+ COPY_SCALAR_FIELD(defaction);++ return newnode;+}++static LockingClause *+_copyLockingClause(const LockingClause *from)+{+ LockingClause *newnode = makeNode(LockingClause);++ COPY_NODE_FIELD(lockedRels);+ COPY_SCALAR_FIELD(strength);+ COPY_SCALAR_FIELD(waitPolicy);++ return newnode;+}++static XmlSerialize *+_copyXmlSerialize(const XmlSerialize *from)+{+ XmlSerialize *newnode = makeNode(XmlSerialize);++ COPY_SCALAR_FIELD(xmloption);+ COPY_NODE_FIELD(expr);+ COPY_NODE_FIELD(typeName);+ COPY_LOCATION_FIELD(location);++ return newnode;+}++static RoleSpec *+_copyRoleSpec(const RoleSpec *from)+{+ RoleSpec *newnode = makeNode(RoleSpec);++ COPY_SCALAR_FIELD(roletype);+ COPY_STRING_FIELD(rolename);+ COPY_LOCATION_FIELD(location);++ return newnode;+}++static Query *+_copyQuery(const Query *from)+{+ Query *newnode = makeNode(Query);++ COPY_SCALAR_FIELD(commandType);+ COPY_SCALAR_FIELD(querySource);+ COPY_SCALAR_FIELD(queryId);+ COPY_SCALAR_FIELD(canSetTag);+ COPY_NODE_FIELD(utilityStmt);+ COPY_SCALAR_FIELD(resultRelation);+ COPY_SCALAR_FIELD(hasAggs);+ COPY_SCALAR_FIELD(hasWindowFuncs);+ COPY_SCALAR_FIELD(hasSubLinks);+ COPY_SCALAR_FIELD(hasDistinctOn);+ COPY_SCALAR_FIELD(hasRecursive);+ COPY_SCALAR_FIELD(hasModifyingCTE);+ COPY_SCALAR_FIELD(hasForUpdate);+ COPY_SCALAR_FIELD(hasRowSecurity);+ COPY_NODE_FIELD(cteList);+ COPY_NODE_FIELD(rtable);+ COPY_NODE_FIELD(jointree);+ COPY_NODE_FIELD(targetList);+ COPY_NODE_FIELD(onConflict);+ COPY_NODE_FIELD(returningList);+ COPY_NODE_FIELD(groupClause);+ COPY_NODE_FIELD(groupingSets);+ COPY_NODE_FIELD(havingQual);+ COPY_NODE_FIELD(windowClause);+ COPY_NODE_FIELD(distinctClause);+ COPY_NODE_FIELD(sortClause);+ COPY_NODE_FIELD(limitOffset);+ COPY_NODE_FIELD(limitCount);+ COPY_NODE_FIELD(rowMarks);+ COPY_NODE_FIELD(setOperations);+ COPY_NODE_FIELD(constraintDeps);+ COPY_NODE_FIELD(withCheckOptions);++ return newnode;+}++static InsertStmt *+_copyInsertStmt(const InsertStmt *from)+{+ InsertStmt *newnode = makeNode(InsertStmt);++ COPY_NODE_FIELD(relation);+ COPY_NODE_FIELD(cols);+ COPY_NODE_FIELD(selectStmt);+ COPY_NODE_FIELD(onConflictClause);+ COPY_NODE_FIELD(returningList);+ COPY_NODE_FIELD(withClause);++ return newnode;+}++static DeleteStmt *+_copyDeleteStmt(const DeleteStmt *from)+{+ DeleteStmt *newnode = makeNode(DeleteStmt);++ COPY_NODE_FIELD(relation);+ COPY_NODE_FIELD(usingClause);+ COPY_NODE_FIELD(whereClause);+ COPY_NODE_FIELD(returningList);+ COPY_NODE_FIELD(withClause);++ return newnode;+}++static UpdateStmt *+_copyUpdateStmt(const UpdateStmt *from)+{+ UpdateStmt *newnode = makeNode(UpdateStmt);++ COPY_NODE_FIELD(relation);+ COPY_NODE_FIELD(targetList);+ COPY_NODE_FIELD(whereClause);+ COPY_NODE_FIELD(fromClause);+ COPY_NODE_FIELD(returningList);+ COPY_NODE_FIELD(withClause);++ return newnode;+}++static SelectStmt *+_copySelectStmt(const SelectStmt *from)+{+ SelectStmt *newnode = makeNode(SelectStmt);++ COPY_NODE_FIELD(distinctClause);+ COPY_NODE_FIELD(intoClause);+ COPY_NODE_FIELD(targetList);+ COPY_NODE_FIELD(fromClause);+ COPY_NODE_FIELD(whereClause);+ COPY_NODE_FIELD(groupClause);+ COPY_NODE_FIELD(havingClause);+ COPY_NODE_FIELD(windowClause);+ COPY_NODE_FIELD(valuesLists);+ COPY_NODE_FIELD(sortClause);+ COPY_NODE_FIELD(limitOffset);+ COPY_NODE_FIELD(limitCount);+ COPY_NODE_FIELD(lockingClause);+ COPY_NODE_FIELD(withClause);+ COPY_SCALAR_FIELD(op);+ COPY_SCALAR_FIELD(all);+ COPY_NODE_FIELD(larg);+ COPY_NODE_FIELD(rarg);++ return newnode;+}++static SetOperationStmt *+_copySetOperationStmt(const SetOperationStmt *from)+{+ SetOperationStmt *newnode = makeNode(SetOperationStmt);++ COPY_SCALAR_FIELD(op);+ COPY_SCALAR_FIELD(all);+ COPY_NODE_FIELD(larg);+ COPY_NODE_FIELD(rarg);+ COPY_NODE_FIELD(colTypes);+ COPY_NODE_FIELD(colTypmods);+ COPY_NODE_FIELD(colCollations);+ COPY_NODE_FIELD(groupClauses);++ return newnode;+}++static AlterTableStmt *+_copyAlterTableStmt(const AlterTableStmt *from)+{+ AlterTableStmt *newnode = makeNode(AlterTableStmt);++ COPY_NODE_FIELD(relation);+ COPY_NODE_FIELD(cmds);+ COPY_SCALAR_FIELD(relkind);+ COPY_SCALAR_FIELD(missing_ok);++ return newnode;+}++static AlterTableCmd *+_copyAlterTableCmd(const AlterTableCmd *from)+{+ AlterTableCmd *newnode = makeNode(AlterTableCmd);++ COPY_SCALAR_FIELD(subtype);+ COPY_STRING_FIELD(name);+ COPY_NODE_FIELD(newowner);+ COPY_NODE_FIELD(def);+ COPY_SCALAR_FIELD(behavior);+ COPY_SCALAR_FIELD(missing_ok);++ return newnode;+}++static AlterDomainStmt *+_copyAlterDomainStmt(const AlterDomainStmt *from)+{+ AlterDomainStmt *newnode = makeNode(AlterDomainStmt);++ COPY_SCALAR_FIELD(subtype);+ COPY_NODE_FIELD(typeName);+ COPY_STRING_FIELD(name);+ COPY_NODE_FIELD(def);+ COPY_SCALAR_FIELD(behavior);+ COPY_SCALAR_FIELD(missing_ok);++ return newnode;+}++static GrantStmt *+_copyGrantStmt(const GrantStmt *from)+{+ GrantStmt *newnode = makeNode(GrantStmt);++ COPY_SCALAR_FIELD(is_grant);+ COPY_SCALAR_FIELD(targtype);+ COPY_SCALAR_FIELD(objtype);+ COPY_NODE_FIELD(objects);+ COPY_NODE_FIELD(privileges);+ COPY_NODE_FIELD(grantees);+ COPY_SCALAR_FIELD(grant_option);+ COPY_SCALAR_FIELD(behavior);++ return newnode;+}++static FuncWithArgs *+_copyFuncWithArgs(const FuncWithArgs *from)+{+ FuncWithArgs *newnode = makeNode(FuncWithArgs);++ COPY_NODE_FIELD(funcname);+ COPY_NODE_FIELD(funcargs);++ return newnode;+}++static AccessPriv *+_copyAccessPriv(const AccessPriv *from)+{+ AccessPriv *newnode = makeNode(AccessPriv);++ COPY_STRING_FIELD(priv_name);+ COPY_NODE_FIELD(cols);++ return newnode;+}++static GrantRoleStmt *+_copyGrantRoleStmt(const GrantRoleStmt *from)+{+ GrantRoleStmt *newnode = makeNode(GrantRoleStmt);++ COPY_NODE_FIELD(granted_roles);+ COPY_NODE_FIELD(grantee_roles);+ COPY_SCALAR_FIELD(is_grant);+ COPY_SCALAR_FIELD(admin_opt);+ COPY_NODE_FIELD(grantor);+ COPY_SCALAR_FIELD(behavior);++ return newnode;+}++static AlterDefaultPrivilegesStmt *+_copyAlterDefaultPrivilegesStmt(const AlterDefaultPrivilegesStmt *from)+{+ AlterDefaultPrivilegesStmt *newnode = makeNode(AlterDefaultPrivilegesStmt);++ COPY_NODE_FIELD(options);+ COPY_NODE_FIELD(action);++ return newnode;+}++static DeclareCursorStmt *+_copyDeclareCursorStmt(const DeclareCursorStmt *from)+{+ DeclareCursorStmt *newnode = makeNode(DeclareCursorStmt);++ COPY_STRING_FIELD(portalname);+ COPY_SCALAR_FIELD(options);+ COPY_NODE_FIELD(query);++ return newnode;+}++static ClosePortalStmt *+_copyClosePortalStmt(const ClosePortalStmt *from)+{+ ClosePortalStmt *newnode = makeNode(ClosePortalStmt);++ COPY_STRING_FIELD(portalname);++ return newnode;+}++static ClusterStmt *+_copyClusterStmt(const ClusterStmt *from)+{+ ClusterStmt *newnode = makeNode(ClusterStmt);++ COPY_NODE_FIELD(relation);+ COPY_STRING_FIELD(indexname);+ COPY_SCALAR_FIELD(verbose);++ return newnode;+}++static CopyStmt *+_copyCopyStmt(const CopyStmt *from)+{+ CopyStmt *newnode = makeNode(CopyStmt);++ COPY_NODE_FIELD(relation);+ COPY_NODE_FIELD(query);+ COPY_NODE_FIELD(attlist);+ COPY_SCALAR_FIELD(is_from);+ COPY_SCALAR_FIELD(is_program);+ COPY_STRING_FIELD(filename);+ COPY_NODE_FIELD(options);++ return newnode;+}++/*+ * CopyCreateStmtFields+ *+ * This function copies the fields of the CreateStmt node. It is used by+ * copy functions for classes which inherit from CreateStmt.+ */+static void+CopyCreateStmtFields(const CreateStmt *from, CreateStmt *newnode)+{+ COPY_NODE_FIELD(relation);+ COPY_NODE_FIELD(tableElts);+ COPY_NODE_FIELD(inhRelations);+ COPY_NODE_FIELD(ofTypename);+ COPY_NODE_FIELD(constraints);+ COPY_NODE_FIELD(options);+ COPY_SCALAR_FIELD(oncommit);+ COPY_STRING_FIELD(tablespacename);+ COPY_SCALAR_FIELD(if_not_exists);+}++static CreateStmt *+_copyCreateStmt(const CreateStmt *from)+{+ CreateStmt *newnode = makeNode(CreateStmt);++ CopyCreateStmtFields(from, newnode);++ return newnode;+}++static TableLikeClause *+_copyTableLikeClause(const TableLikeClause *from)+{+ TableLikeClause *newnode = makeNode(TableLikeClause);++ COPY_NODE_FIELD(relation);+ COPY_SCALAR_FIELD(options);++ return newnode;+}++static DefineStmt *+_copyDefineStmt(const DefineStmt *from)+{+ DefineStmt *newnode = makeNode(DefineStmt);++ COPY_SCALAR_FIELD(kind);+ COPY_SCALAR_FIELD(oldstyle);+ COPY_NODE_FIELD(defnames);+ COPY_NODE_FIELD(args);+ COPY_NODE_FIELD(definition);++ return newnode;+}++static DropStmt *+_copyDropStmt(const DropStmt *from)+{+ DropStmt *newnode = makeNode(DropStmt);++ COPY_NODE_FIELD(objects);+ COPY_NODE_FIELD(arguments);+ COPY_SCALAR_FIELD(removeType);+ COPY_SCALAR_FIELD(behavior);+ COPY_SCALAR_FIELD(missing_ok);+ COPY_SCALAR_FIELD(concurrent);++ return newnode;+}++static TruncateStmt *+_copyTruncateStmt(const TruncateStmt *from)+{+ TruncateStmt *newnode = makeNode(TruncateStmt);++ COPY_NODE_FIELD(relations);+ COPY_SCALAR_FIELD(restart_seqs);+ COPY_SCALAR_FIELD(behavior);++ return newnode;+}++static CommentStmt *+_copyCommentStmt(const CommentStmt *from)+{+ CommentStmt *newnode = makeNode(CommentStmt);++ COPY_SCALAR_FIELD(objtype);+ COPY_NODE_FIELD(objname);+ COPY_NODE_FIELD(objargs);+ COPY_STRING_FIELD(comment);++ return newnode;+}++static SecLabelStmt *+_copySecLabelStmt(const SecLabelStmt *from)+{+ SecLabelStmt *newnode = makeNode(SecLabelStmt);++ COPY_SCALAR_FIELD(objtype);+ COPY_NODE_FIELD(objname);+ COPY_NODE_FIELD(objargs);+ COPY_STRING_FIELD(provider);+ COPY_STRING_FIELD(label);++ return newnode;+}++static FetchStmt *+_copyFetchStmt(const FetchStmt *from)+{+ FetchStmt *newnode = makeNode(FetchStmt);++ COPY_SCALAR_FIELD(direction);+ COPY_SCALAR_FIELD(howMany);+ COPY_STRING_FIELD(portalname);+ COPY_SCALAR_FIELD(ismove);++ return newnode;+}++static IndexStmt *+_copyIndexStmt(const IndexStmt *from)+{+ IndexStmt *newnode = makeNode(IndexStmt);++ COPY_STRING_FIELD(idxname);+ COPY_NODE_FIELD(relation);+ COPY_STRING_FIELD(accessMethod);+ COPY_STRING_FIELD(tableSpace);+ COPY_NODE_FIELD(indexParams);+ COPY_NODE_FIELD(options);+ COPY_NODE_FIELD(whereClause);+ COPY_NODE_FIELD(excludeOpNames);+ COPY_STRING_FIELD(idxcomment);+ COPY_SCALAR_FIELD(indexOid);+ COPY_SCALAR_FIELD(oldNode);+ COPY_SCALAR_FIELD(unique);+ COPY_SCALAR_FIELD(primary);+ COPY_SCALAR_FIELD(isconstraint);+ COPY_SCALAR_FIELD(deferrable);+ COPY_SCALAR_FIELD(initdeferred);+ COPY_SCALAR_FIELD(transformed);+ COPY_SCALAR_FIELD(concurrent);+ COPY_SCALAR_FIELD(if_not_exists);++ return newnode;+}++static CreateFunctionStmt *+_copyCreateFunctionStmt(const CreateFunctionStmt *from)+{+ CreateFunctionStmt *newnode = makeNode(CreateFunctionStmt);++ COPY_SCALAR_FIELD(replace);+ COPY_NODE_FIELD(funcname);+ COPY_NODE_FIELD(parameters);+ COPY_NODE_FIELD(returnType);+ COPY_NODE_FIELD(options);+ COPY_NODE_FIELD(withClause);++ return newnode;+}++static FunctionParameter *+_copyFunctionParameter(const FunctionParameter *from)+{+ FunctionParameter *newnode = makeNode(FunctionParameter);++ COPY_STRING_FIELD(name);+ COPY_NODE_FIELD(argType);+ COPY_SCALAR_FIELD(mode);+ COPY_NODE_FIELD(defexpr);++ return newnode;+}++static AlterFunctionStmt *+_copyAlterFunctionStmt(const AlterFunctionStmt *from)+{+ AlterFunctionStmt *newnode = makeNode(AlterFunctionStmt);++ COPY_NODE_FIELD(func);+ COPY_NODE_FIELD(actions);++ return newnode;+}++static DoStmt *+_copyDoStmt(const DoStmt *from)+{+ DoStmt *newnode = makeNode(DoStmt);++ COPY_NODE_FIELD(args);++ return newnode;+}++static RenameStmt *+_copyRenameStmt(const RenameStmt *from)+{+ RenameStmt *newnode = makeNode(RenameStmt);++ COPY_SCALAR_FIELD(renameType);+ COPY_SCALAR_FIELD(relationType);+ COPY_NODE_FIELD(relation);+ COPY_NODE_FIELD(object);+ COPY_NODE_FIELD(objarg);+ COPY_STRING_FIELD(subname);+ COPY_STRING_FIELD(newname);+ COPY_SCALAR_FIELD(behavior);+ COPY_SCALAR_FIELD(missing_ok);++ return newnode;+}++static AlterObjectSchemaStmt *+_copyAlterObjectSchemaStmt(const AlterObjectSchemaStmt *from)+{+ AlterObjectSchemaStmt *newnode = makeNode(AlterObjectSchemaStmt);++ COPY_SCALAR_FIELD(objectType);+ COPY_NODE_FIELD(relation);+ COPY_NODE_FIELD(object);+ COPY_NODE_FIELD(objarg);+ COPY_STRING_FIELD(newschema);+ COPY_SCALAR_FIELD(missing_ok);++ return newnode;+}++static AlterOwnerStmt *+_copyAlterOwnerStmt(const AlterOwnerStmt *from)+{+ AlterOwnerStmt *newnode = makeNode(AlterOwnerStmt);++ COPY_SCALAR_FIELD(objectType);+ COPY_NODE_FIELD(relation);+ COPY_NODE_FIELD(object);+ COPY_NODE_FIELD(objarg);+ COPY_NODE_FIELD(newowner);++ return newnode;+}++static RuleStmt *+_copyRuleStmt(const RuleStmt *from)+{+ RuleStmt *newnode = makeNode(RuleStmt);++ COPY_NODE_FIELD(relation);+ COPY_STRING_FIELD(rulename);+ COPY_NODE_FIELD(whereClause);+ COPY_SCALAR_FIELD(event);+ COPY_SCALAR_FIELD(instead);+ COPY_NODE_FIELD(actions);+ COPY_SCALAR_FIELD(replace);++ return newnode;+}++static NotifyStmt *+_copyNotifyStmt(const NotifyStmt *from)+{+ NotifyStmt *newnode = makeNode(NotifyStmt);++ COPY_STRING_FIELD(conditionname);+ COPY_STRING_FIELD(payload);++ return newnode;+}++static ListenStmt *+_copyListenStmt(const ListenStmt *from)+{+ ListenStmt *newnode = makeNode(ListenStmt);++ COPY_STRING_FIELD(conditionname);++ return newnode;+}++static UnlistenStmt *+_copyUnlistenStmt(const UnlistenStmt *from)+{+ UnlistenStmt *newnode = makeNode(UnlistenStmt);++ COPY_STRING_FIELD(conditionname);++ return newnode;+}++static TransactionStmt *+_copyTransactionStmt(const TransactionStmt *from)+{+ TransactionStmt *newnode = makeNode(TransactionStmt);++ COPY_SCALAR_FIELD(kind);+ COPY_NODE_FIELD(options);+ COPY_STRING_FIELD(gid);++ return newnode;+}++static CompositeTypeStmt *+_copyCompositeTypeStmt(const CompositeTypeStmt *from)+{+ CompositeTypeStmt *newnode = makeNode(CompositeTypeStmt);++ COPY_NODE_FIELD(typevar);+ COPY_NODE_FIELD(coldeflist);++ return newnode;+}++static CreateEnumStmt *+_copyCreateEnumStmt(const CreateEnumStmt *from)+{+ CreateEnumStmt *newnode = makeNode(CreateEnumStmt);++ COPY_NODE_FIELD(typeName);+ COPY_NODE_FIELD(vals);++ return newnode;+}++static CreateRangeStmt *+_copyCreateRangeStmt(const CreateRangeStmt *from)+{+ CreateRangeStmt *newnode = makeNode(CreateRangeStmt);++ COPY_NODE_FIELD(typeName);+ COPY_NODE_FIELD(params);++ return newnode;+}++static AlterEnumStmt *+_copyAlterEnumStmt(const AlterEnumStmt *from)+{+ AlterEnumStmt *newnode = makeNode(AlterEnumStmt);++ COPY_NODE_FIELD(typeName);+ COPY_STRING_FIELD(newVal);+ COPY_STRING_FIELD(newValNeighbor);+ COPY_SCALAR_FIELD(newValIsAfter);+ COPY_SCALAR_FIELD(skipIfExists);++ return newnode;+}++static ViewStmt *+_copyViewStmt(const ViewStmt *from)+{+ ViewStmt *newnode = makeNode(ViewStmt);++ COPY_NODE_FIELD(view);+ COPY_NODE_FIELD(aliases);+ COPY_NODE_FIELD(query);+ COPY_SCALAR_FIELD(replace);+ COPY_NODE_FIELD(options);+ COPY_SCALAR_FIELD(withCheckOption);++ return newnode;+}++static LoadStmt *+_copyLoadStmt(const LoadStmt *from)+{+ LoadStmt *newnode = makeNode(LoadStmt);++ COPY_STRING_FIELD(filename);++ return newnode;+}++static CreateDomainStmt *+_copyCreateDomainStmt(const CreateDomainStmt *from)+{+ CreateDomainStmt *newnode = makeNode(CreateDomainStmt);++ COPY_NODE_FIELD(domainname);+ COPY_NODE_FIELD(typeName);+ COPY_NODE_FIELD(collClause);+ COPY_NODE_FIELD(constraints);++ return newnode;+}++static CreateOpClassStmt *+_copyCreateOpClassStmt(const CreateOpClassStmt *from)+{+ CreateOpClassStmt *newnode = makeNode(CreateOpClassStmt);++ COPY_NODE_FIELD(opclassname);+ COPY_NODE_FIELD(opfamilyname);+ COPY_STRING_FIELD(amname);+ COPY_NODE_FIELD(datatype);+ COPY_NODE_FIELD(items);+ COPY_SCALAR_FIELD(isDefault);++ return newnode;+}++static CreateOpClassItem *+_copyCreateOpClassItem(const CreateOpClassItem *from)+{+ CreateOpClassItem *newnode = makeNode(CreateOpClassItem);++ COPY_SCALAR_FIELD(itemtype);+ COPY_NODE_FIELD(name);+ COPY_NODE_FIELD(args);+ COPY_SCALAR_FIELD(number);+ COPY_NODE_FIELD(order_family);+ COPY_NODE_FIELD(class_args);+ COPY_NODE_FIELD(storedtype);++ return newnode;+}++static CreateOpFamilyStmt *+_copyCreateOpFamilyStmt(const CreateOpFamilyStmt *from)+{+ CreateOpFamilyStmt *newnode = makeNode(CreateOpFamilyStmt);++ COPY_NODE_FIELD(opfamilyname);+ COPY_STRING_FIELD(amname);++ return newnode;+}++static AlterOpFamilyStmt *+_copyAlterOpFamilyStmt(const AlterOpFamilyStmt *from)+{+ AlterOpFamilyStmt *newnode = makeNode(AlterOpFamilyStmt);++ COPY_NODE_FIELD(opfamilyname);+ COPY_STRING_FIELD(amname);+ COPY_SCALAR_FIELD(isDrop);+ COPY_NODE_FIELD(items);++ return newnode;+}++static CreatedbStmt *+_copyCreatedbStmt(const CreatedbStmt *from)+{+ CreatedbStmt *newnode = makeNode(CreatedbStmt);++ COPY_STRING_FIELD(dbname);+ COPY_NODE_FIELD(options);++ return newnode;+}++static AlterDatabaseStmt *+_copyAlterDatabaseStmt(const AlterDatabaseStmt *from)+{+ AlterDatabaseStmt *newnode = makeNode(AlterDatabaseStmt);++ COPY_STRING_FIELD(dbname);+ COPY_NODE_FIELD(options);++ return newnode;+}++static AlterDatabaseSetStmt *+_copyAlterDatabaseSetStmt(const AlterDatabaseSetStmt *from)+{+ AlterDatabaseSetStmt *newnode = makeNode(AlterDatabaseSetStmt);++ COPY_STRING_FIELD(dbname);+ COPY_NODE_FIELD(setstmt);++ return newnode;+}++static DropdbStmt *+_copyDropdbStmt(const DropdbStmt *from)+{+ DropdbStmt *newnode = makeNode(DropdbStmt);++ COPY_STRING_FIELD(dbname);+ COPY_SCALAR_FIELD(missing_ok);++ return newnode;+}++static VacuumStmt *+_copyVacuumStmt(const VacuumStmt *from)+{+ VacuumStmt *newnode = makeNode(VacuumStmt);++ COPY_SCALAR_FIELD(options);+ COPY_NODE_FIELD(relation);+ COPY_NODE_FIELD(va_cols);++ return newnode;+}++static ExplainStmt *+_copyExplainStmt(const ExplainStmt *from)+{+ ExplainStmt *newnode = makeNode(ExplainStmt);++ COPY_NODE_FIELD(query);+ COPY_NODE_FIELD(options);++ return newnode;+}++static CreateTableAsStmt *+_copyCreateTableAsStmt(const CreateTableAsStmt *from)+{+ CreateTableAsStmt *newnode = makeNode(CreateTableAsStmt);++ COPY_NODE_FIELD(query);+ COPY_NODE_FIELD(into);+ COPY_SCALAR_FIELD(relkind);+ COPY_SCALAR_FIELD(is_select_into);+ COPY_SCALAR_FIELD(if_not_exists);++ return newnode;+}++static RefreshMatViewStmt *+_copyRefreshMatViewStmt(const RefreshMatViewStmt *from)+{+ RefreshMatViewStmt *newnode = makeNode(RefreshMatViewStmt);++ COPY_SCALAR_FIELD(concurrent);+ COPY_SCALAR_FIELD(skipData);+ COPY_NODE_FIELD(relation);++ return newnode;+}++static ReplicaIdentityStmt *+_copyReplicaIdentityStmt(const ReplicaIdentityStmt *from)+{+ ReplicaIdentityStmt *newnode = makeNode(ReplicaIdentityStmt);++ COPY_SCALAR_FIELD(identity_type);+ COPY_STRING_FIELD(name);++ return newnode;+}++static AlterSystemStmt *+_copyAlterSystemStmt(const AlterSystemStmt *from)+{+ AlterSystemStmt *newnode = makeNode(AlterSystemStmt);++ COPY_NODE_FIELD(setstmt);++ return newnode;+}++static CreateSeqStmt *+_copyCreateSeqStmt(const CreateSeqStmt *from)+{+ CreateSeqStmt *newnode = makeNode(CreateSeqStmt);++ COPY_NODE_FIELD(sequence);+ COPY_NODE_FIELD(options);+ COPY_SCALAR_FIELD(ownerId);+ COPY_SCALAR_FIELD(if_not_exists);++ return newnode;+}++static AlterSeqStmt *+_copyAlterSeqStmt(const AlterSeqStmt *from)+{+ AlterSeqStmt *newnode = makeNode(AlterSeqStmt);++ COPY_NODE_FIELD(sequence);+ COPY_NODE_FIELD(options);+ COPY_SCALAR_FIELD(missing_ok);++ return newnode;+}++static VariableSetStmt *+_copyVariableSetStmt(const VariableSetStmt *from)+{+ VariableSetStmt *newnode = makeNode(VariableSetStmt);++ COPY_SCALAR_FIELD(kind);+ COPY_STRING_FIELD(name);+ COPY_NODE_FIELD(args);+ COPY_SCALAR_FIELD(is_local);++ return newnode;+}++static VariableShowStmt *+_copyVariableShowStmt(const VariableShowStmt *from)+{+ VariableShowStmt *newnode = makeNode(VariableShowStmt);++ COPY_STRING_FIELD(name);++ return newnode;+}++static DiscardStmt *+_copyDiscardStmt(const DiscardStmt *from)+{+ DiscardStmt *newnode = makeNode(DiscardStmt);++ COPY_SCALAR_FIELD(target);++ return newnode;+}++static CreateTableSpaceStmt *+_copyCreateTableSpaceStmt(const CreateTableSpaceStmt *from)+{+ CreateTableSpaceStmt *newnode = makeNode(CreateTableSpaceStmt);++ COPY_STRING_FIELD(tablespacename);+ COPY_NODE_FIELD(owner);+ COPY_STRING_FIELD(location);+ COPY_NODE_FIELD(options);++ return newnode;+}++static DropTableSpaceStmt *+_copyDropTableSpaceStmt(const DropTableSpaceStmt *from)+{+ DropTableSpaceStmt *newnode = makeNode(DropTableSpaceStmt);++ COPY_STRING_FIELD(tablespacename);+ COPY_SCALAR_FIELD(missing_ok);++ return newnode;+}++static AlterTableSpaceOptionsStmt *+_copyAlterTableSpaceOptionsStmt(const AlterTableSpaceOptionsStmt *from)+{+ AlterTableSpaceOptionsStmt *newnode = makeNode(AlterTableSpaceOptionsStmt);++ COPY_STRING_FIELD(tablespacename);+ COPY_NODE_FIELD(options);+ COPY_SCALAR_FIELD(isReset);++ return newnode;+}++static AlterTableMoveAllStmt *+_copyAlterTableMoveAllStmt(const AlterTableMoveAllStmt *from)+{+ AlterTableMoveAllStmt *newnode = makeNode(AlterTableMoveAllStmt);++ COPY_STRING_FIELD(orig_tablespacename);+ COPY_SCALAR_FIELD(objtype);+ COPY_NODE_FIELD(roles);+ COPY_STRING_FIELD(new_tablespacename);+ COPY_SCALAR_FIELD(nowait);++ return newnode;+}++static CreateExtensionStmt *+_copyCreateExtensionStmt(const CreateExtensionStmt *from)+{+ CreateExtensionStmt *newnode = makeNode(CreateExtensionStmt);++ COPY_STRING_FIELD(extname);+ COPY_SCALAR_FIELD(if_not_exists);+ COPY_NODE_FIELD(options);++ return newnode;+}++static AlterExtensionStmt *+_copyAlterExtensionStmt(const AlterExtensionStmt *from)+{+ AlterExtensionStmt *newnode = makeNode(AlterExtensionStmt);++ COPY_STRING_FIELD(extname);+ COPY_NODE_FIELD(options);++ return newnode;+}++static AlterExtensionContentsStmt *+_copyAlterExtensionContentsStmt(const AlterExtensionContentsStmt *from)+{+ AlterExtensionContentsStmt *newnode = makeNode(AlterExtensionContentsStmt);++ COPY_STRING_FIELD(extname);+ COPY_SCALAR_FIELD(action);+ COPY_SCALAR_FIELD(objtype);+ COPY_NODE_FIELD(objname);+ COPY_NODE_FIELD(objargs);++ return newnode;+}++static CreateFdwStmt *+_copyCreateFdwStmt(const CreateFdwStmt *from)+{+ CreateFdwStmt *newnode = makeNode(CreateFdwStmt);++ COPY_STRING_FIELD(fdwname);+ COPY_NODE_FIELD(func_options);+ COPY_NODE_FIELD(options);++ return newnode;+}++static AlterFdwStmt *+_copyAlterFdwStmt(const AlterFdwStmt *from)+{+ AlterFdwStmt *newnode = makeNode(AlterFdwStmt);++ COPY_STRING_FIELD(fdwname);+ COPY_NODE_FIELD(func_options);+ COPY_NODE_FIELD(options);++ return newnode;+}++static CreateForeignServerStmt *+_copyCreateForeignServerStmt(const CreateForeignServerStmt *from)+{+ CreateForeignServerStmt *newnode = makeNode(CreateForeignServerStmt);++ COPY_STRING_FIELD(servername);+ COPY_STRING_FIELD(servertype);+ COPY_STRING_FIELD(version);+ COPY_STRING_FIELD(fdwname);+ COPY_NODE_FIELD(options);++ return newnode;+}++static AlterForeignServerStmt *+_copyAlterForeignServerStmt(const AlterForeignServerStmt *from)+{+ AlterForeignServerStmt *newnode = makeNode(AlterForeignServerStmt);++ COPY_STRING_FIELD(servername);+ COPY_STRING_FIELD(version);+ COPY_NODE_FIELD(options);+ COPY_SCALAR_FIELD(has_version);++ return newnode;+}++static CreateUserMappingStmt *+_copyCreateUserMappingStmt(const CreateUserMappingStmt *from)+{+ CreateUserMappingStmt *newnode = makeNode(CreateUserMappingStmt);++ COPY_NODE_FIELD(user);+ COPY_STRING_FIELD(servername);+ COPY_NODE_FIELD(options);++ return newnode;+}++static AlterUserMappingStmt *+_copyAlterUserMappingStmt(const AlterUserMappingStmt *from)+{+ AlterUserMappingStmt *newnode = makeNode(AlterUserMappingStmt);++ COPY_NODE_FIELD(user);+ COPY_STRING_FIELD(servername);+ COPY_NODE_FIELD(options);++ return newnode;+}++static DropUserMappingStmt *+_copyDropUserMappingStmt(const DropUserMappingStmt *from)+{+ DropUserMappingStmt *newnode = makeNode(DropUserMappingStmt);++ COPY_NODE_FIELD(user);+ COPY_STRING_FIELD(servername);+ COPY_SCALAR_FIELD(missing_ok);++ return newnode;+}++static CreateForeignTableStmt *+_copyCreateForeignTableStmt(const CreateForeignTableStmt *from)+{+ CreateForeignTableStmt *newnode = makeNode(CreateForeignTableStmt);++ CopyCreateStmtFields((const CreateStmt *) from, (CreateStmt *) newnode);++ COPY_STRING_FIELD(servername);+ COPY_NODE_FIELD(options);++ return newnode;+}++static ImportForeignSchemaStmt *+_copyImportForeignSchemaStmt(const ImportForeignSchemaStmt *from)+{+ ImportForeignSchemaStmt *newnode = makeNode(ImportForeignSchemaStmt);++ COPY_STRING_FIELD(server_name);+ COPY_STRING_FIELD(remote_schema);+ COPY_STRING_FIELD(local_schema);+ COPY_SCALAR_FIELD(list_type);+ COPY_NODE_FIELD(table_list);+ COPY_NODE_FIELD(options);++ return newnode;+}++static CreateTransformStmt *+_copyCreateTransformStmt(const CreateTransformStmt *from)+{+ CreateTransformStmt *newnode = makeNode(CreateTransformStmt);++ COPY_SCALAR_FIELD(replace);+ COPY_NODE_FIELD(type_name);+ COPY_STRING_FIELD(lang);+ COPY_NODE_FIELD(fromsql);+ COPY_NODE_FIELD(tosql);++ return newnode;+}++static CreateTrigStmt *+_copyCreateTrigStmt(const CreateTrigStmt *from)+{+ CreateTrigStmt *newnode = makeNode(CreateTrigStmt);++ COPY_STRING_FIELD(trigname);+ COPY_NODE_FIELD(relation);+ COPY_NODE_FIELD(funcname);+ COPY_NODE_FIELD(args);+ COPY_SCALAR_FIELD(row);+ COPY_SCALAR_FIELD(timing);+ COPY_SCALAR_FIELD(events);+ COPY_NODE_FIELD(columns);+ COPY_NODE_FIELD(whenClause);+ COPY_SCALAR_FIELD(isconstraint);+ COPY_SCALAR_FIELD(deferrable);+ COPY_SCALAR_FIELD(initdeferred);+ COPY_NODE_FIELD(constrrel);++ return newnode;+}++static CreateEventTrigStmt *+_copyCreateEventTrigStmt(const CreateEventTrigStmt *from)+{+ CreateEventTrigStmt *newnode = makeNode(CreateEventTrigStmt);++ COPY_STRING_FIELD(trigname);+ COPY_STRING_FIELD(eventname);+ COPY_NODE_FIELD(whenclause);+ COPY_NODE_FIELD(funcname);++ return newnode;+}++static AlterEventTrigStmt *+_copyAlterEventTrigStmt(const AlterEventTrigStmt *from)+{+ AlterEventTrigStmt *newnode = makeNode(AlterEventTrigStmt);++ COPY_STRING_FIELD(trigname);+ COPY_SCALAR_FIELD(tgenabled);++ return newnode;+}++static CreatePLangStmt *+_copyCreatePLangStmt(const CreatePLangStmt *from)+{+ CreatePLangStmt *newnode = makeNode(CreatePLangStmt);++ COPY_SCALAR_FIELD(replace);+ COPY_STRING_FIELD(plname);+ COPY_NODE_FIELD(plhandler);+ COPY_NODE_FIELD(plinline);+ COPY_NODE_FIELD(plvalidator);+ COPY_SCALAR_FIELD(pltrusted);++ return newnode;+}++static CreateRoleStmt *+_copyCreateRoleStmt(const CreateRoleStmt *from)+{+ CreateRoleStmt *newnode = makeNode(CreateRoleStmt);++ COPY_SCALAR_FIELD(stmt_type);+ COPY_STRING_FIELD(role);+ COPY_NODE_FIELD(options);++ return newnode;+}++static AlterRoleStmt *+_copyAlterRoleStmt(const AlterRoleStmt *from)+{+ AlterRoleStmt *newnode = makeNode(AlterRoleStmt);++ COPY_NODE_FIELD(role);+ COPY_NODE_FIELD(options);+ COPY_SCALAR_FIELD(action);++ return newnode;+}++static AlterRoleSetStmt *+_copyAlterRoleSetStmt(const AlterRoleSetStmt *from)+{+ AlterRoleSetStmt *newnode = makeNode(AlterRoleSetStmt);++ COPY_NODE_FIELD(role);+ COPY_STRING_FIELD(database);+ COPY_NODE_FIELD(setstmt);++ return newnode;+}++static DropRoleStmt *+_copyDropRoleStmt(const DropRoleStmt *from)+{+ DropRoleStmt *newnode = makeNode(DropRoleStmt);++ COPY_NODE_FIELD(roles);+ COPY_SCALAR_FIELD(missing_ok);++ return newnode;+}++static LockStmt *+_copyLockStmt(const LockStmt *from)+{+ LockStmt *newnode = makeNode(LockStmt);++ COPY_NODE_FIELD(relations);+ COPY_SCALAR_FIELD(mode);+ COPY_SCALAR_FIELD(nowait);++ return newnode;+}++static ConstraintsSetStmt *+_copyConstraintsSetStmt(const ConstraintsSetStmt *from)+{+ ConstraintsSetStmt *newnode = makeNode(ConstraintsSetStmt);++ COPY_NODE_FIELD(constraints);+ COPY_SCALAR_FIELD(deferred);++ return newnode;+}++static ReindexStmt *+_copyReindexStmt(const ReindexStmt *from)+{+ ReindexStmt *newnode = makeNode(ReindexStmt);++ COPY_SCALAR_FIELD(kind);+ COPY_NODE_FIELD(relation);+ COPY_STRING_FIELD(name);+ COPY_SCALAR_FIELD(options);++ return newnode;+}++static CreateSchemaStmt *+_copyCreateSchemaStmt(const CreateSchemaStmt *from)+{+ CreateSchemaStmt *newnode = makeNode(CreateSchemaStmt);++ COPY_STRING_FIELD(schemaname);+ COPY_NODE_FIELD(authrole);+ COPY_NODE_FIELD(schemaElts);+ COPY_SCALAR_FIELD(if_not_exists);++ return newnode;+}++static CreateConversionStmt *+_copyCreateConversionStmt(const CreateConversionStmt *from)+{+ CreateConversionStmt *newnode = makeNode(CreateConversionStmt);++ COPY_NODE_FIELD(conversion_name);+ COPY_STRING_FIELD(for_encoding_name);+ COPY_STRING_FIELD(to_encoding_name);+ COPY_NODE_FIELD(func_name);+ COPY_SCALAR_FIELD(def);++ return newnode;+}++static CreateCastStmt *+_copyCreateCastStmt(const CreateCastStmt *from)+{+ CreateCastStmt *newnode = makeNode(CreateCastStmt);++ COPY_NODE_FIELD(sourcetype);+ COPY_NODE_FIELD(targettype);+ COPY_NODE_FIELD(func);+ COPY_SCALAR_FIELD(context);+ COPY_SCALAR_FIELD(inout);++ return newnode;+}++static PrepareStmt *+_copyPrepareStmt(const PrepareStmt *from)+{+ PrepareStmt *newnode = makeNode(PrepareStmt);++ COPY_STRING_FIELD(name);+ COPY_NODE_FIELD(argtypes);+ COPY_NODE_FIELD(query);++ return newnode;+}++static ExecuteStmt *+_copyExecuteStmt(const ExecuteStmt *from)+{+ ExecuteStmt *newnode = makeNode(ExecuteStmt);++ COPY_STRING_FIELD(name);+ COPY_NODE_FIELD(params);++ return newnode;+}++static DeallocateStmt *+_copyDeallocateStmt(const DeallocateStmt *from)+{+ DeallocateStmt *newnode = makeNode(DeallocateStmt);++ COPY_STRING_FIELD(name);++ return newnode;+}++static DropOwnedStmt *+_copyDropOwnedStmt(const DropOwnedStmt *from)+{+ DropOwnedStmt *newnode = makeNode(DropOwnedStmt);++ COPY_NODE_FIELD(roles);+ COPY_SCALAR_FIELD(behavior);++ return newnode;+}++static ReassignOwnedStmt *+_copyReassignOwnedStmt(const ReassignOwnedStmt *from)+{+ ReassignOwnedStmt *newnode = makeNode(ReassignOwnedStmt);++ COPY_NODE_FIELD(roles);+ COPY_NODE_FIELD(newrole);++ return newnode;+}++static AlterTSDictionaryStmt *+_copyAlterTSDictionaryStmt(const AlterTSDictionaryStmt *from)+{+ AlterTSDictionaryStmt *newnode = makeNode(AlterTSDictionaryStmt);++ COPY_NODE_FIELD(dictname);+ COPY_NODE_FIELD(options);++ return newnode;+}++static AlterTSConfigurationStmt *+_copyAlterTSConfigurationStmt(const AlterTSConfigurationStmt *from)+{+ AlterTSConfigurationStmt *newnode = makeNode(AlterTSConfigurationStmt);++ COPY_SCALAR_FIELD(kind);+ COPY_NODE_FIELD(cfgname);+ COPY_NODE_FIELD(tokentype);+ COPY_NODE_FIELD(dicts);+ COPY_SCALAR_FIELD(override);+ COPY_SCALAR_FIELD(replace);+ COPY_SCALAR_FIELD(missing_ok);++ return newnode;+}++static CreatePolicyStmt *+_copyCreatePolicyStmt(const CreatePolicyStmt *from)+{+ CreatePolicyStmt *newnode = makeNode(CreatePolicyStmt);++ COPY_STRING_FIELD(policy_name);+ COPY_NODE_FIELD(table);+ COPY_STRING_FIELD(cmd_name);+ COPY_NODE_FIELD(roles);+ COPY_NODE_FIELD(qual);+ COPY_NODE_FIELD(with_check);++ return newnode;+}++static AlterPolicyStmt *+_copyAlterPolicyStmt(const AlterPolicyStmt *from)+{+ AlterPolicyStmt *newnode = makeNode(AlterPolicyStmt);++ COPY_STRING_FIELD(policy_name);+ COPY_NODE_FIELD(table);+ COPY_NODE_FIELD(roles);+ COPY_NODE_FIELD(qual);+ COPY_NODE_FIELD(with_check);++ return newnode;+}++/* ****************************************************************+ * pg_list.h copy functions+ * ****************************************************************+ */++/*+ * Perform a deep copy of the specified list, using copyObject(). The+ * list MUST be of type T_List; T_IntList and T_OidList nodes don't+ * need deep copies, so they should be copied via list_copy()+ */+#define COPY_NODE_CELL(new, old) \+ (new) = (ListCell *) palloc(sizeof(ListCell)); \+ lfirst(new) = copyObject(lfirst(old));++static List *+_copyList(const List *from)+{+ List *new;+ ListCell *curr_old;+ ListCell *prev_new;++ Assert(list_length(from) >= 1);++ new = makeNode(List);+ new->length = from->length;++ COPY_NODE_CELL(new->head, from->head);+ prev_new = new->head;+ curr_old = lnext(from->head);++ while (curr_old)+ {+ COPY_NODE_CELL(prev_new->next, curr_old);+ prev_new = prev_new->next;+ curr_old = curr_old->next;+ }+ prev_new->next = NULL;+ new->tail = prev_new;++ return new;+}++/* ****************************************************************+ * value.h copy functions+ * ****************************************************************+ */+static Value *+_copyValue(const Value *from)+{+ Value *newnode = makeNode(Value);++ /* See also _copyAConst when changing this code! */++ COPY_SCALAR_FIELD(type);+ switch (from->type)+ {+ case T_Integer:+ COPY_SCALAR_FIELD(val.ival);+ break;+ case T_Float:+ case T_String:+ case T_BitString:+ COPY_STRING_FIELD(val.str);+ break;+ case T_Null:+ /* nothing to do */+ break;+ default:+ elog(ERROR, "unrecognized node type: %d",+ (int) from->type);+ break;+ }+ return newnode;+}++/*+ * copyObject+ *+ * Create a copy of a Node tree or list. This is a "deep" copy: all+ * substructure is copied too, recursively.+ */+void *+copyObject(const void *from)+{+ void *retval;++ if (from == NULL)+ return NULL;++ /* Guard against stack overflow due to overly complex expressions */+ check_stack_depth();++ switch (nodeTag(from))+ {+ /*+ * PLAN NODES+ */+ case T_PlannedStmt:+ retval = _copyPlannedStmt(from);+ break;+ case T_Plan:+ retval = _copyPlan(from);+ break;+ case T_Result:+ retval = _copyResult(from);+ break;+ case T_ModifyTable:+ retval = _copyModifyTable(from);+ break;+ case T_Append:+ retval = _copyAppend(from);+ break;+ case T_MergeAppend:+ retval = _copyMergeAppend(from);+ break;+ case T_RecursiveUnion:+ retval = _copyRecursiveUnion(from);+ break;+ case T_BitmapAnd:+ retval = _copyBitmapAnd(from);+ break;+ case T_BitmapOr:+ retval = _copyBitmapOr(from);+ break;+ case T_Scan:+ retval = _copyScan(from);+ break;+ case T_SeqScan:+ retval = _copySeqScan(from);+ break;+ case T_SampleScan:+ retval = _copySampleScan(from);+ break;+ case T_IndexScan:+ retval = _copyIndexScan(from);+ break;+ case T_IndexOnlyScan:+ retval = _copyIndexOnlyScan(from);+ break;+ case T_BitmapIndexScan:+ retval = _copyBitmapIndexScan(from);+ break;+ case T_BitmapHeapScan:+ retval = _copyBitmapHeapScan(from);+ break;+ case T_TidScan:+ retval = _copyTidScan(from);+ break;+ case T_SubqueryScan:+ retval = _copySubqueryScan(from);+ break;+ case T_FunctionScan:+ retval = _copyFunctionScan(from);+ break;+ case T_ValuesScan:+ retval = _copyValuesScan(from);+ break;+ case T_CteScan:+ retval = _copyCteScan(from);+ break;+ case T_WorkTableScan:+ retval = _copyWorkTableScan(from);+ break;+ case T_ForeignScan:+ retval = _copyForeignScan(from);+ break;+ case T_CustomScan:+ retval = _copyCustomScan(from);+ break;+ case T_Join:+ retval = _copyJoin(from);+ break;+ case T_NestLoop:+ retval = _copyNestLoop(from);+ break;+ case T_MergeJoin:+ retval = _copyMergeJoin(from);+ break;+ case T_HashJoin:+ retval = _copyHashJoin(from);+ break;+ case T_Material:+ retval = _copyMaterial(from);+ break;+ case T_Sort:+ retval = _copySort(from);+ break;+ case T_Group:+ retval = _copyGroup(from);+ break;+ case T_Agg:+ retval = _copyAgg(from);+ break;+ case T_WindowAgg:+ retval = _copyWindowAgg(from);+ break;+ case T_Unique:+ retval = _copyUnique(from);+ break;+ case T_Hash:+ retval = _copyHash(from);+ break;+ case T_SetOp:+ retval = _copySetOp(from);+ break;+ case T_LockRows:+ retval = _copyLockRows(from);+ break;+ case T_Limit:+ retval = _copyLimit(from);+ break;+ case T_NestLoopParam:+ retval = _copyNestLoopParam(from);+ break;+ case T_PlanRowMark:+ retval = _copyPlanRowMark(from);+ break;+ case T_PlanInvalItem:+ retval = _copyPlanInvalItem(from);+ break;++ /*+ * PRIMITIVE NODES+ */+ case T_Alias:+ retval = _copyAlias(from);+ break;+ case T_RangeVar:+ retval = _copyRangeVar(from);+ break;+ case T_IntoClause:+ retval = _copyIntoClause(from);+ break;+ case T_Var:+ retval = _copyVar(from);+ break;+ case T_Const:+ retval = _copyConst(from);+ break;+ case T_Param:+ retval = _copyParam(from);+ break;+ case T_Aggref:+ retval = _copyAggref(from);+ break;+ case T_GroupingFunc:+ retval = _copyGroupingFunc(from);+ break;+ case T_WindowFunc:+ retval = _copyWindowFunc(from);+ break;+ case T_ArrayRef:+ retval = _copyArrayRef(from);+ break;+ case T_FuncExpr:+ retval = _copyFuncExpr(from);+ break;+ case T_NamedArgExpr:+ retval = _copyNamedArgExpr(from);+ break;+ case T_OpExpr:+ retval = _copyOpExpr(from);+ break;+ case T_DistinctExpr:+ retval = _copyDistinctExpr(from);+ break;+ case T_NullIfExpr:+ retval = _copyNullIfExpr(from);+ break;+ case T_ScalarArrayOpExpr:+ retval = _copyScalarArrayOpExpr(from);+ break;+ case T_BoolExpr:+ retval = _copyBoolExpr(from);+ break;+ case T_SubLink:+ retval = _copySubLink(from);+ break;+ case T_SubPlan:+ retval = _copySubPlan(from);+ break;+ case T_AlternativeSubPlan:+ retval = _copyAlternativeSubPlan(from);+ break;+ case T_FieldSelect:+ retval = _copyFieldSelect(from);+ break;+ case T_FieldStore:+ retval = _copyFieldStore(from);+ break;+ case T_RelabelType:+ retval = _copyRelabelType(from);+ break;+ case T_CoerceViaIO:+ retval = _copyCoerceViaIO(from);+ break;+ case T_ArrayCoerceExpr:+ retval = _copyArrayCoerceExpr(from);+ break;+ case T_ConvertRowtypeExpr:+ retval = _copyConvertRowtypeExpr(from);+ break;+ case T_CollateExpr:+ retval = _copyCollateExpr(from);+ break;+ case T_CaseExpr:+ retval = _copyCaseExpr(from);+ break;+ case T_CaseWhen:+ retval = _copyCaseWhen(from);+ break;+ case T_CaseTestExpr:+ retval = _copyCaseTestExpr(from);+ break;+ case T_ArrayExpr:+ retval = _copyArrayExpr(from);+ break;+ case T_RowExpr:+ retval = _copyRowExpr(from);+ break;+ case T_RowCompareExpr:+ retval = _copyRowCompareExpr(from);+ break;+ case T_CoalesceExpr:+ retval = _copyCoalesceExpr(from);+ break;+ case T_MinMaxExpr:+ retval = _copyMinMaxExpr(from);+ break;+ case T_XmlExpr:+ retval = _copyXmlExpr(from);+ break;+ case T_NullTest:+ retval = _copyNullTest(from);+ break;+ case T_BooleanTest:+ retval = _copyBooleanTest(from);+ break;+ case T_CoerceToDomain:+ retval = _copyCoerceToDomain(from);+ break;+ case T_CoerceToDomainValue:+ retval = _copyCoerceToDomainValue(from);+ break;+ case T_SetToDefault:+ retval = _copySetToDefault(from);+ break;+ case T_CurrentOfExpr:+ retval = _copyCurrentOfExpr(from);+ break;+ case T_InferenceElem:+ retval = _copyInferenceElem(from);+ break;+ case T_TargetEntry:+ retval = _copyTargetEntry(from);+ break;+ case T_RangeTblRef:+ retval = _copyRangeTblRef(from);+ break;+ case T_JoinExpr:+ retval = _copyJoinExpr(from);+ break;+ case T_FromExpr:+ retval = _copyFromExpr(from);+ break;+ case T_OnConflictExpr:+ retval = _copyOnConflictExpr(from);+ break;++ /*+ * RELATION NODES+ */+ case T_PathKey:+ retval = _copyPathKey(from);+ break;+ case T_RestrictInfo:+ retval = _copyRestrictInfo(from);+ break;+ case T_PlaceHolderVar:+ retval = _copyPlaceHolderVar(from);+ break;+ case T_SpecialJoinInfo:+ retval = _copySpecialJoinInfo(from);+ break;+ case T_AppendRelInfo:+ retval = _copyAppendRelInfo(from);+ break;+ case T_PlaceHolderInfo:+ retval = _copyPlaceHolderInfo(from);+ break;++ /*+ * VALUE NODES+ */+ case T_Integer:+ case T_Float:+ case T_String:+ case T_BitString:+ case T_Null:+ retval = _copyValue(from);+ break;++ /*+ * LIST NODES+ */+ case T_List:+ retval = _copyList(from);+ break;++ /*+ * Lists of integers and OIDs don't need to be deep-copied, so we+ * perform a shallow copy via list_copy()+ */+ case T_IntList:+ case T_OidList:+ retval = list_copy(from);+ break;++ /*+ * PARSE NODES+ */+ case T_Query:+ retval = _copyQuery(from);+ break;+ case T_InsertStmt:+ retval = _copyInsertStmt(from);+ break;+ case T_DeleteStmt:+ retval = _copyDeleteStmt(from);+ break;+ case T_UpdateStmt:+ retval = _copyUpdateStmt(from);+ break;+ case T_SelectStmt:+ retval = _copySelectStmt(from);+ break;+ case T_SetOperationStmt:+ retval = _copySetOperationStmt(from);+ break;+ case T_AlterTableStmt:+ retval = _copyAlterTableStmt(from);+ break;+ case T_AlterTableCmd:+ retval = _copyAlterTableCmd(from);+ break;+ case T_AlterDomainStmt:+ retval = _copyAlterDomainStmt(from);+ break;+ case T_GrantStmt:+ retval = _copyGrantStmt(from);+ break;+ case T_GrantRoleStmt:+ retval = _copyGrantRoleStmt(from);+ break;+ case T_AlterDefaultPrivilegesStmt:+ retval = _copyAlterDefaultPrivilegesStmt(from);+ break;+ case T_DeclareCursorStmt:+ retval = _copyDeclareCursorStmt(from);+ break;+ case T_ClosePortalStmt:+ retval = _copyClosePortalStmt(from);+ break;+ case T_ClusterStmt:+ retval = _copyClusterStmt(from);+ break;+ case T_CopyStmt:+ retval = _copyCopyStmt(from);+ break;+ case T_CreateStmt:+ retval = _copyCreateStmt(from);+ break;+ case T_TableLikeClause:+ retval = _copyTableLikeClause(from);+ break;+ case T_DefineStmt:+ retval = _copyDefineStmt(from);+ break;+ case T_DropStmt:+ retval = _copyDropStmt(from);+ break;+ case T_TruncateStmt:+ retval = _copyTruncateStmt(from);+ break;+ case T_CommentStmt:+ retval = _copyCommentStmt(from);+ break;+ case T_SecLabelStmt:+ retval = _copySecLabelStmt(from);+ break;+ case T_FetchStmt:+ retval = _copyFetchStmt(from);+ break;+ case T_IndexStmt:+ retval = _copyIndexStmt(from);+ break;+ case T_CreateFunctionStmt:+ retval = _copyCreateFunctionStmt(from);+ break;+ case T_FunctionParameter:+ retval = _copyFunctionParameter(from);+ break;+ case T_AlterFunctionStmt:+ retval = _copyAlterFunctionStmt(from);+ break;+ case T_DoStmt:+ retval = _copyDoStmt(from);+ break;+ case T_RenameStmt:+ retval = _copyRenameStmt(from);+ break;+ case T_AlterObjectSchemaStmt:+ retval = _copyAlterObjectSchemaStmt(from);+ break;+ case T_AlterOwnerStmt:+ retval = _copyAlterOwnerStmt(from);+ break;+ case T_RuleStmt:+ retval = _copyRuleStmt(from);+ break;+ case T_NotifyStmt:+ retval = _copyNotifyStmt(from);+ break;+ case T_ListenStmt:+ retval = _copyListenStmt(from);+ break;+ case T_UnlistenStmt:+ retval = _copyUnlistenStmt(from);+ break;+ case T_TransactionStmt:+ retval = _copyTransactionStmt(from);+ break;+ case T_CompositeTypeStmt:+ retval = _copyCompositeTypeStmt(from);+ break;+ case T_CreateEnumStmt:+ retval = _copyCreateEnumStmt(from);+ break;+ case T_CreateRangeStmt:+ retval = _copyCreateRangeStmt(from);+ break;+ case T_AlterEnumStmt:+ retval = _copyAlterEnumStmt(from);+ break;+ case T_ViewStmt:+ retval = _copyViewStmt(from);+ break;+ case T_LoadStmt:+ retval = _copyLoadStmt(from);+ break;+ case T_CreateDomainStmt:+ retval = _copyCreateDomainStmt(from);+ break;+ case T_CreateOpClassStmt:+ retval = _copyCreateOpClassStmt(from);+ break;+ case T_CreateOpClassItem:+ retval = _copyCreateOpClassItem(from);+ break;+ case T_CreateOpFamilyStmt:+ retval = _copyCreateOpFamilyStmt(from);+ break;+ case T_AlterOpFamilyStmt:+ retval = _copyAlterOpFamilyStmt(from);+ break;+ case T_CreatedbStmt:+ retval = _copyCreatedbStmt(from);+ break;+ case T_AlterDatabaseStmt:+ retval = _copyAlterDatabaseStmt(from);+ break;+ case T_AlterDatabaseSetStmt:+ retval = _copyAlterDatabaseSetStmt(from);+ break;+ case T_DropdbStmt:+ retval = _copyDropdbStmt(from);+ break;+ case T_VacuumStmt:+ retval = _copyVacuumStmt(from);+ break;+ case T_ExplainStmt:+ retval = _copyExplainStmt(from);+ break;+ case T_CreateTableAsStmt:+ retval = _copyCreateTableAsStmt(from);+ break;+ case T_RefreshMatViewStmt:+ retval = _copyRefreshMatViewStmt(from);+ break;+ case T_ReplicaIdentityStmt:+ retval = _copyReplicaIdentityStmt(from);+ break;+ case T_AlterSystemStmt:+ retval = _copyAlterSystemStmt(from);+ break;+ case T_CreateSeqStmt:+ retval = _copyCreateSeqStmt(from);+ break;+ case T_AlterSeqStmt:+ retval = _copyAlterSeqStmt(from);+ break;+ case T_VariableSetStmt:+ retval = _copyVariableSetStmt(from);+ break;+ case T_VariableShowStmt:+ retval = _copyVariableShowStmt(from);+ break;+ case T_DiscardStmt:+ retval = _copyDiscardStmt(from);+ break;+ case T_CreateTableSpaceStmt:+ retval = _copyCreateTableSpaceStmt(from);+ break;+ case T_DropTableSpaceStmt:+ retval = _copyDropTableSpaceStmt(from);+ break;+ case T_AlterTableSpaceOptionsStmt:+ retval = _copyAlterTableSpaceOptionsStmt(from);+ break;+ case T_AlterTableMoveAllStmt:+ retval = _copyAlterTableMoveAllStmt(from);+ break;+ case T_CreateExtensionStmt:+ retval = _copyCreateExtensionStmt(from);+ break;+ case T_AlterExtensionStmt:+ retval = _copyAlterExtensionStmt(from);+ break;+ case T_AlterExtensionContentsStmt:+ retval = _copyAlterExtensionContentsStmt(from);+ break;+ case T_CreateFdwStmt:+ retval = _copyCreateFdwStmt(from);+ break;+ case T_AlterFdwStmt:+ retval = _copyAlterFdwStmt(from);+ break;+ case T_CreateForeignServerStmt:+ retval = _copyCreateForeignServerStmt(from);+ break;+ case T_AlterForeignServerStmt:+ retval = _copyAlterForeignServerStmt(from);+ break;+ case T_CreateUserMappingStmt:+ retval = _copyCreateUserMappingStmt(from);+ break;+ case T_AlterUserMappingStmt:+ retval = _copyAlterUserMappingStmt(from);+ break;+ case T_DropUserMappingStmt:+ retval = _copyDropUserMappingStmt(from);+ break;+ case T_CreateForeignTableStmt:+ retval = _copyCreateForeignTableStmt(from);+ break;+ case T_ImportForeignSchemaStmt:+ retval = _copyImportForeignSchemaStmt(from);+ break;+ case T_CreateTransformStmt:+ retval = _copyCreateTransformStmt(from);+ break;+ case T_CreateTrigStmt:+ retval = _copyCreateTrigStmt(from);+ break;+ case T_CreateEventTrigStmt:+ retval = _copyCreateEventTrigStmt(from);+ break;+ case T_AlterEventTrigStmt:+ retval = _copyAlterEventTrigStmt(from);+ break;+ case T_CreatePLangStmt:+ retval = _copyCreatePLangStmt(from);+ break;+ case T_CreateRoleStmt:+ retval = _copyCreateRoleStmt(from);+ break;+ case T_AlterRoleStmt:+ retval = _copyAlterRoleStmt(from);+ break;+ case T_AlterRoleSetStmt:+ retval = _copyAlterRoleSetStmt(from);+ break;+ case T_DropRoleStmt:+ retval = _copyDropRoleStmt(from);+ break;+ case T_LockStmt:+ retval = _copyLockStmt(from);+ break;+ case T_ConstraintsSetStmt:+ retval = _copyConstraintsSetStmt(from);+ break;+ case T_ReindexStmt:+ retval = _copyReindexStmt(from);+ break;+ case T_CheckPointStmt:+ retval = (void *) makeNode(CheckPointStmt);+ break;+ case T_CreateSchemaStmt:+ retval = _copyCreateSchemaStmt(from);+ break;+ case T_CreateConversionStmt:+ retval = _copyCreateConversionStmt(from);+ break;+ case T_CreateCastStmt:+ retval = _copyCreateCastStmt(from);+ break;+ case T_PrepareStmt:+ retval = _copyPrepareStmt(from);+ break;+ case T_ExecuteStmt:+ retval = _copyExecuteStmt(from);+ break;+ case T_DeallocateStmt:+ retval = _copyDeallocateStmt(from);+ break;+ case T_DropOwnedStmt:+ retval = _copyDropOwnedStmt(from);+ break;+ case T_ReassignOwnedStmt:+ retval = _copyReassignOwnedStmt(from);+ break;+ case T_AlterTSDictionaryStmt:+ retval = _copyAlterTSDictionaryStmt(from);+ break;+ case T_AlterTSConfigurationStmt:+ retval = _copyAlterTSConfigurationStmt(from);+ break;+ case T_CreatePolicyStmt:+ retval = _copyCreatePolicyStmt(from);+ break;+ case T_AlterPolicyStmt:+ retval = _copyAlterPolicyStmt(from);+ break;+ case T_A_Expr:+ retval = _copyAExpr(from);+ break;+ case T_ColumnRef:+ retval = _copyColumnRef(from);+ break;+ case T_ParamRef:+ retval = _copyParamRef(from);+ break;+ case T_A_Const:+ retval = _copyAConst(from);+ break;+ case T_FuncCall:+ retval = _copyFuncCall(from);+ break;+ case T_A_Star:+ retval = _copyAStar(from);+ break;+ case T_A_Indices:+ retval = _copyAIndices(from);+ break;+ case T_A_Indirection:+ retval = _copyA_Indirection(from);+ break;+ case T_A_ArrayExpr:+ retval = _copyA_ArrayExpr(from);+ break;+ case T_ResTarget:+ retval = _copyResTarget(from);+ break;+ case T_MultiAssignRef:+ retval = _copyMultiAssignRef(from);+ break;+ case T_TypeCast:+ retval = _copyTypeCast(from);+ break;+ case T_CollateClause:+ retval = _copyCollateClause(from);+ break;+ case T_SortBy:+ retval = _copySortBy(from);+ break;+ case T_WindowDef:+ retval = _copyWindowDef(from);+ break;+ case T_RangeSubselect:+ retval = _copyRangeSubselect(from);+ break;+ case T_RangeFunction:+ retval = _copyRangeFunction(from);+ break;+ case T_RangeTableSample:+ retval = _copyRangeTableSample(from);+ break;+ case T_TypeName:+ retval = _copyTypeName(from);+ break;+ case T_IndexElem:+ retval = _copyIndexElem(from);+ break;+ case T_ColumnDef:+ retval = _copyColumnDef(from);+ break;+ case T_Constraint:+ retval = _copyConstraint(from);+ break;+ case T_DefElem:+ retval = _copyDefElem(from);+ break;+ case T_LockingClause:+ retval = _copyLockingClause(from);+ break;+ case T_RangeTblEntry:+ retval = _copyRangeTblEntry(from);+ break;+ case T_RangeTblFunction:+ retval = _copyRangeTblFunction(from);+ break;+ case T_TableSampleClause:+ retval = _copyTableSampleClause(from);+ break;+ case T_WithCheckOption:+ retval = _copyWithCheckOption(from);+ break;+ case T_SortGroupClause:+ retval = _copySortGroupClause(from);+ break;+ case T_GroupingSet:+ retval = _copyGroupingSet(from);+ break;+ case T_WindowClause:+ retval = _copyWindowClause(from);+ break;+ case T_RowMarkClause:+ retval = _copyRowMarkClause(from);+ break;+ case T_WithClause:+ retval = _copyWithClause(from);+ break;+ case T_InferClause:+ retval = _copyInferClause(from);+ break;+ case T_OnConflictClause:+ retval = _copyOnConflictClause(from);+ break;+ case T_CommonTableExpr:+ retval = _copyCommonTableExpr(from);+ break;+ case T_FuncWithArgs:+ retval = _copyFuncWithArgs(from);+ break;+ case T_AccessPriv:+ retval = _copyAccessPriv(from);+ break;+ case T_XmlSerialize:+ retval = _copyXmlSerialize(from);+ break;+ case T_RoleSpec:+ retval = _copyRoleSpec(from);+ break;++ default:+ elog(ERROR, "unrecognized node type: %d", (int) nodeTag(from));+ retval = 0; /* keep compiler quiet */+ break;+ }++ return retval;+}
+ foreign/libpg_query/src/postgres/src_backend_nodes_equalfuncs.c view
@@ -0,0 +1,3514 @@+/*--------------------------------------------------------------------+ * Symbols referenced in this file:+ * - equal+ * - _equalAlias+ * - _equalRangeVar+ * - _equalIntoClause+ * - _equalVar+ * - _equalConst+ * - _equalParam+ * - _equalAggref+ * - _equalGroupingFunc+ * - _equalWindowFunc+ * - _equalArrayRef+ * - _equalFuncExpr+ * - _equalNamedArgExpr+ * - _equalOpExpr+ * - _equalDistinctExpr+ * - _equalNullIfExpr+ * - _equalScalarArrayOpExpr+ * - _equalBoolExpr+ * - _equalSubLink+ * - _equalSubPlan+ * - _equalAlternativeSubPlan+ * - _equalFieldSelect+ * - _equalFieldStore+ * - _equalRelabelType+ * - _equalCoerceViaIO+ * - _equalArrayCoerceExpr+ * - _equalConvertRowtypeExpr+ * - _equalCollateExpr+ * - _equalCaseExpr+ * - _equalCaseWhen+ * - _equalCaseTestExpr+ * - _equalArrayExpr+ * - _equalRowExpr+ * - _equalRowCompareExpr+ * - _equalCoalesceExpr+ * - _equalMinMaxExpr+ * - _equalXmlExpr+ * - _equalNullTest+ * - _equalBooleanTest+ * - _equalCoerceToDomain+ * - _equalCoerceToDomainValue+ * - _equalSetToDefault+ * - _equalCurrentOfExpr+ * - _equalInferenceElem+ * - _equalTargetEntry+ * - _equalRangeTblRef+ * - _equalFromExpr+ * - _equalOnConflictExpr+ * - _equalJoinExpr+ * - _equalPathKey+ * - _equalRestrictInfo+ * - _equalPlaceHolderVar+ * - _equalSpecialJoinInfo+ * - _equalAppendRelInfo+ * - _equalPlaceHolderInfo+ * - _equalList+ * - _equalValue+ * - _equalQuery+ * - _equalInsertStmt+ * - _equalDeleteStmt+ * - _equalUpdateStmt+ * - _equalSelectStmt+ * - _equalSetOperationStmt+ * - _equalAlterTableStmt+ * - _equalAlterTableCmd+ * - _equalAlterDomainStmt+ * - _equalGrantStmt+ * - _equalGrantRoleStmt+ * - _equalAlterDefaultPrivilegesStmt+ * - _equalDeclareCursorStmt+ * - _equalClosePortalStmt+ * - _equalClusterStmt+ * - _equalCopyStmt+ * - _equalCreateStmt+ * - _equalTableLikeClause+ * - _equalDefineStmt+ * - _equalDropStmt+ * - _equalTruncateStmt+ * - _equalCommentStmt+ * - _equalSecLabelStmt+ * - _equalFetchStmt+ * - _equalIndexStmt+ * - _equalCreateFunctionStmt+ * - _equalFunctionParameter+ * - _equalAlterFunctionStmt+ * - _equalDoStmt+ * - _equalRenameStmt+ * - _equalAlterObjectSchemaStmt+ * - _equalAlterOwnerStmt+ * - _equalRuleStmt+ * - _equalNotifyStmt+ * - _equalListenStmt+ * - _equalUnlistenStmt+ * - _equalTransactionStmt+ * - _equalCompositeTypeStmt+ * - _equalCreateEnumStmt+ * - _equalCreateRangeStmt+ * - _equalAlterEnumStmt+ * - _equalViewStmt+ * - _equalLoadStmt+ * - _equalCreateDomainStmt+ * - _equalCreateOpClassStmt+ * - _equalCreateOpClassItem+ * - _equalCreateOpFamilyStmt+ * - _equalAlterOpFamilyStmt+ * - _equalCreatedbStmt+ * - _equalAlterDatabaseStmt+ * - _equalAlterDatabaseSetStmt+ * - _equalDropdbStmt+ * - _equalVacuumStmt+ * - _equalExplainStmt+ * - _equalCreateTableAsStmt+ * - _equalRefreshMatViewStmt+ * - _equalReplicaIdentityStmt+ * - _equalAlterSystemStmt+ * - _equalCreateSeqStmt+ * - _equalAlterSeqStmt+ * - _equalVariableSetStmt+ * - _equalVariableShowStmt+ * - _equalDiscardStmt+ * - _equalCreateTableSpaceStmt+ * - _equalDropTableSpaceStmt+ * - _equalAlterTableSpaceOptionsStmt+ * - _equalAlterTableMoveAllStmt+ * - _equalCreateExtensionStmt+ * - _equalAlterExtensionStmt+ * - _equalAlterExtensionContentsStmt+ * - _equalCreateFdwStmt+ * - _equalAlterFdwStmt+ * - _equalCreateForeignServerStmt+ * - _equalAlterForeignServerStmt+ * - _equalCreateUserMappingStmt+ * - _equalAlterUserMappingStmt+ * - _equalDropUserMappingStmt+ * - _equalCreateForeignTableStmt+ * - _equalImportForeignSchemaStmt+ * - _equalCreateTransformStmt+ * - _equalCreateTrigStmt+ * - _equalCreateEventTrigStmt+ * - _equalAlterEventTrigStmt+ * - _equalCreatePLangStmt+ * - _equalCreateRoleStmt+ * - _equalAlterRoleStmt+ * - _equalAlterRoleSetStmt+ * - _equalDropRoleStmt+ * - _equalLockStmt+ * - _equalConstraintsSetStmt+ * - _equalReindexStmt+ * - _equalCreateSchemaStmt+ * - _equalCreateConversionStmt+ * - _equalCreateCastStmt+ * - _equalPrepareStmt+ * - _equalExecuteStmt+ * - _equalDeallocateStmt+ * - _equalDropOwnedStmt+ * - _equalReassignOwnedStmt+ * - _equalAlterTSDictionaryStmt+ * - _equalAlterTSConfigurationStmt+ * - _equalCreatePolicyStmt+ * - _equalAlterPolicyStmt+ * - _equalAExpr+ * - _equalColumnRef+ * - _equalParamRef+ * - _equalAConst+ * - _equalFuncCall+ * - _equalAStar+ * - _equalAIndices+ * - _equalA_Indirection+ * - _equalA_ArrayExpr+ * - _equalResTarget+ * - _equalMultiAssignRef+ * - _equalTypeCast+ * - _equalCollateClause+ * - _equalSortBy+ * - _equalWindowDef+ * - _equalRangeSubselect+ * - _equalRangeFunction+ * - _equalRangeTableSample+ * - _equalTypeName+ * - _equalIndexElem+ * - _equalColumnDef+ * - _equalConstraint+ * - _equalDefElem+ * - _equalLockingClause+ * - _equalRangeTblEntry+ * - _equalRangeTblFunction+ * - _equalTableSampleClause+ * - _equalWithCheckOption+ * - _equalSortGroupClause+ * - _equalGroupingSet+ * - _equalWindowClause+ * - _equalRowMarkClause+ * - _equalWithClause+ * - _equalInferClause+ * - _equalOnConflictClause+ * - _equalCommonTableExpr+ * - _equalFuncWithArgs+ * - _equalAccessPriv+ * - _equalXmlSerialize+ * - _equalRoleSpec+ *--------------------------------------------------------------------+ */++/*-------------------------------------------------------------------------+ *+ * equalfuncs.c+ * Equality functions to compare node trees.+ *+ * NOTE: we currently support comparing all node types found in parse+ * trees. We do not support comparing executor state trees; there+ * is no need for that, and no point in maintaining all the code that+ * would be needed. We also do not support comparing Path trees, mainly+ * because the circular linkages between RelOptInfo and Path nodes can't+ * be handled easily in a simple depth-first traversal.+ *+ * Currently, in fact, equal() doesn't know how to compare Plan trees+ * either. This might need to be fixed someday.+ *+ * NOTE: it is intentional that parse location fields (in nodes that have+ * one) are not compared. This is because we want, for example, a variable+ * "x" to be considered equal() to another reference to "x" in the query.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * IDENTIFICATION+ * src/backend/nodes/equalfuncs.c+ *+ *-------------------------------------------------------------------------+ */++#include "postgres.h"++#include "nodes/relation.h"+#include "utils/datum.h"+++/*+ * Macros to simplify comparison of different kinds of fields. Use these+ * wherever possible to reduce the chance for silly typos. Note that these+ * hard-wire the convention that the local variables in an Equal routine are+ * named 'a' and 'b'.+ */++/* Compare a simple scalar field (int, float, bool, enum, etc) */+#define COMPARE_SCALAR_FIELD(fldname) \+ do { \+ if (a->fldname != b->fldname) \+ return false; \+ } while (0)++/* Compare a field that is a pointer to some kind of Node or Node tree */+#define COMPARE_NODE_FIELD(fldname) \+ do { \+ if (!equal(a->fldname, b->fldname)) \+ return false; \+ } while (0)++/* Compare a field that is a pointer to a Bitmapset */+#define COMPARE_BITMAPSET_FIELD(fldname) \+ do { \+ if (!bms_equal(a->fldname, b->fldname)) \+ return false; \+ } while (0)++/* Compare a field that is a pointer to a C string, or perhaps NULL */+#define COMPARE_STRING_FIELD(fldname) \+ do { \+ if (!equalstr(a->fldname, b->fldname)) \+ return false; \+ } while (0)++/* Macro for comparing string fields that might be NULL */+#define equalstr(a, b) \+ (((a) != NULL && (b) != NULL) ? (strcmp(a, b) == 0) : (a) == (b))++/* Compare a field that is a pointer to a simple palloc'd object of size sz */+#define COMPARE_POINTER_FIELD(fldname, sz) \+ do { \+ if (memcmp(a->fldname, b->fldname, (sz)) != 0) \+ return false; \+ } while (0)++/* Compare a parse location field (this is a no-op, per note above) */+#define COMPARE_LOCATION_FIELD(fldname) \+ ((void) 0)++/* Compare a CoercionForm field (also a no-op, per comment in primnodes.h) */+#define COMPARE_COERCIONFORM_FIELD(fldname) \+ ((void) 0)+++/*+ * Stuff from primnodes.h+ */++static bool+_equalAlias(const Alias *a, const Alias *b)+{+ COMPARE_STRING_FIELD(aliasname);+ COMPARE_NODE_FIELD(colnames);++ return true;+}++static bool+_equalRangeVar(const RangeVar *a, const RangeVar *b)+{+ COMPARE_STRING_FIELD(catalogname);+ COMPARE_STRING_FIELD(schemaname);+ COMPARE_STRING_FIELD(relname);+ COMPARE_SCALAR_FIELD(inhOpt);+ COMPARE_SCALAR_FIELD(relpersistence);+ COMPARE_NODE_FIELD(alias);+ COMPARE_LOCATION_FIELD(location);++ return true;+}++static bool+_equalIntoClause(const IntoClause *a, const IntoClause *b)+{+ COMPARE_NODE_FIELD(rel);+ COMPARE_NODE_FIELD(colNames);+ COMPARE_NODE_FIELD(options);+ COMPARE_SCALAR_FIELD(onCommit);+ COMPARE_STRING_FIELD(tableSpaceName);+ COMPARE_NODE_FIELD(viewQuery);+ COMPARE_SCALAR_FIELD(skipData);++ return true;+}++/*+ * We don't need an _equalExpr because Expr is an abstract supertype which+ * should never actually get instantiated. Also, since it has no common+ * fields except NodeTag, there's no need for a helper routine to factor+ * out comparing the common fields...+ */++static bool+_equalVar(const Var *a, const Var *b)+{+ COMPARE_SCALAR_FIELD(varno);+ COMPARE_SCALAR_FIELD(varattno);+ COMPARE_SCALAR_FIELD(vartype);+ COMPARE_SCALAR_FIELD(vartypmod);+ COMPARE_SCALAR_FIELD(varcollid);+ COMPARE_SCALAR_FIELD(varlevelsup);+ COMPARE_SCALAR_FIELD(varnoold);+ COMPARE_SCALAR_FIELD(varoattno);+ COMPARE_LOCATION_FIELD(location);++ return true;+}++static bool+_equalConst(const Const *a, const Const *b)+{+ COMPARE_SCALAR_FIELD(consttype);+ COMPARE_SCALAR_FIELD(consttypmod);+ COMPARE_SCALAR_FIELD(constcollid);+ COMPARE_SCALAR_FIELD(constlen);+ COMPARE_SCALAR_FIELD(constisnull);+ COMPARE_SCALAR_FIELD(constbyval);+ COMPARE_LOCATION_FIELD(location);++ /*+ * We treat all NULL constants of the same type as equal. Someday this+ * might need to change? But datumIsEqual doesn't work on nulls, so...+ */+ if (a->constisnull)+ return true;+ return datumIsEqual(a->constvalue, b->constvalue,+ a->constbyval, a->constlen);+}++static bool+_equalParam(const Param *a, const Param *b)+{+ COMPARE_SCALAR_FIELD(paramkind);+ COMPARE_SCALAR_FIELD(paramid);+ COMPARE_SCALAR_FIELD(paramtype);+ COMPARE_SCALAR_FIELD(paramtypmod);+ COMPARE_SCALAR_FIELD(paramcollid);+ COMPARE_LOCATION_FIELD(location);++ return true;+}++static bool+_equalAggref(const Aggref *a, const Aggref *b)+{+ COMPARE_SCALAR_FIELD(aggfnoid);+ COMPARE_SCALAR_FIELD(aggtype);+ COMPARE_SCALAR_FIELD(aggcollid);+ COMPARE_SCALAR_FIELD(inputcollid);+ COMPARE_NODE_FIELD(aggdirectargs);+ COMPARE_NODE_FIELD(args);+ COMPARE_NODE_FIELD(aggorder);+ COMPARE_NODE_FIELD(aggdistinct);+ COMPARE_NODE_FIELD(aggfilter);+ COMPARE_SCALAR_FIELD(aggstar);+ COMPARE_SCALAR_FIELD(aggvariadic);+ COMPARE_SCALAR_FIELD(aggkind);+ COMPARE_SCALAR_FIELD(agglevelsup);+ COMPARE_LOCATION_FIELD(location);++ return true;+}++static bool+_equalGroupingFunc(const GroupingFunc *a, const GroupingFunc *b)+{+ COMPARE_NODE_FIELD(args);++ /*+ * We must not compare the refs or cols field+ */++ COMPARE_SCALAR_FIELD(agglevelsup);+ COMPARE_LOCATION_FIELD(location);++ return true;+}++static bool+_equalWindowFunc(const WindowFunc *a, const WindowFunc *b)+{+ COMPARE_SCALAR_FIELD(winfnoid);+ COMPARE_SCALAR_FIELD(wintype);+ COMPARE_SCALAR_FIELD(wincollid);+ COMPARE_SCALAR_FIELD(inputcollid);+ COMPARE_NODE_FIELD(args);+ COMPARE_NODE_FIELD(aggfilter);+ COMPARE_SCALAR_FIELD(winref);+ COMPARE_SCALAR_FIELD(winstar);+ COMPARE_SCALAR_FIELD(winagg);+ COMPARE_LOCATION_FIELD(location);++ return true;+}++static bool+_equalArrayRef(const ArrayRef *a, const ArrayRef *b)+{+ COMPARE_SCALAR_FIELD(refarraytype);+ COMPARE_SCALAR_FIELD(refelemtype);+ COMPARE_SCALAR_FIELD(reftypmod);+ COMPARE_SCALAR_FIELD(refcollid);+ COMPARE_NODE_FIELD(refupperindexpr);+ COMPARE_NODE_FIELD(reflowerindexpr);+ COMPARE_NODE_FIELD(refexpr);+ COMPARE_NODE_FIELD(refassgnexpr);++ return true;+}++static bool+_equalFuncExpr(const FuncExpr *a, const FuncExpr *b)+{+ COMPARE_SCALAR_FIELD(funcid);+ COMPARE_SCALAR_FIELD(funcresulttype);+ COMPARE_SCALAR_FIELD(funcretset);+ COMPARE_SCALAR_FIELD(funcvariadic);+ COMPARE_COERCIONFORM_FIELD(funcformat);+ COMPARE_SCALAR_FIELD(funccollid);+ COMPARE_SCALAR_FIELD(inputcollid);+ COMPARE_NODE_FIELD(args);+ COMPARE_LOCATION_FIELD(location);++ return true;+}++static bool+_equalNamedArgExpr(const NamedArgExpr *a, const NamedArgExpr *b)+{+ COMPARE_NODE_FIELD(arg);+ COMPARE_STRING_FIELD(name);+ COMPARE_SCALAR_FIELD(argnumber);+ COMPARE_LOCATION_FIELD(location);++ return true;+}++static bool+_equalOpExpr(const OpExpr *a, const OpExpr *b)+{+ COMPARE_SCALAR_FIELD(opno);++ /*+ * Special-case opfuncid: it is allowable for it to differ if one node+ * contains zero and the other doesn't. This just means that the one node+ * isn't as far along in the parse/plan pipeline and hasn't had the+ * opfuncid cache filled yet.+ */+ if (a->opfuncid != b->opfuncid &&+ a->opfuncid != 0 &&+ b->opfuncid != 0)+ return false;++ COMPARE_SCALAR_FIELD(opresulttype);+ COMPARE_SCALAR_FIELD(opretset);+ COMPARE_SCALAR_FIELD(opcollid);+ COMPARE_SCALAR_FIELD(inputcollid);+ COMPARE_NODE_FIELD(args);+ COMPARE_LOCATION_FIELD(location);++ return true;+}++static bool+_equalDistinctExpr(const DistinctExpr *a, const DistinctExpr *b)+{+ COMPARE_SCALAR_FIELD(opno);++ /*+ * Special-case opfuncid: it is allowable for it to differ if one node+ * contains zero and the other doesn't. This just means that the one node+ * isn't as far along in the parse/plan pipeline and hasn't had the+ * opfuncid cache filled yet.+ */+ if (a->opfuncid != b->opfuncid &&+ a->opfuncid != 0 &&+ b->opfuncid != 0)+ return false;++ COMPARE_SCALAR_FIELD(opresulttype);+ COMPARE_SCALAR_FIELD(opretset);+ COMPARE_SCALAR_FIELD(opcollid);+ COMPARE_SCALAR_FIELD(inputcollid);+ COMPARE_NODE_FIELD(args);+ COMPARE_LOCATION_FIELD(location);++ return true;+}++static bool+_equalNullIfExpr(const NullIfExpr *a, const NullIfExpr *b)+{+ COMPARE_SCALAR_FIELD(opno);++ /*+ * Special-case opfuncid: it is allowable for it to differ if one node+ * contains zero and the other doesn't. This just means that the one node+ * isn't as far along in the parse/plan pipeline and hasn't had the+ * opfuncid cache filled yet.+ */+ if (a->opfuncid != b->opfuncid &&+ a->opfuncid != 0 &&+ b->opfuncid != 0)+ return false;++ COMPARE_SCALAR_FIELD(opresulttype);+ COMPARE_SCALAR_FIELD(opretset);+ COMPARE_SCALAR_FIELD(opcollid);+ COMPARE_SCALAR_FIELD(inputcollid);+ COMPARE_NODE_FIELD(args);+ COMPARE_LOCATION_FIELD(location);++ return true;+}++static bool+_equalScalarArrayOpExpr(const ScalarArrayOpExpr *a, const ScalarArrayOpExpr *b)+{+ COMPARE_SCALAR_FIELD(opno);++ /*+ * Special-case opfuncid: it is allowable for it to differ if one node+ * contains zero and the other doesn't. This just means that the one node+ * isn't as far along in the parse/plan pipeline and hasn't had the+ * opfuncid cache filled yet.+ */+ if (a->opfuncid != b->opfuncid &&+ a->opfuncid != 0 &&+ b->opfuncid != 0)+ return false;++ COMPARE_SCALAR_FIELD(useOr);+ COMPARE_SCALAR_FIELD(inputcollid);+ COMPARE_NODE_FIELD(args);+ COMPARE_LOCATION_FIELD(location);++ return true;+}++static bool+_equalBoolExpr(const BoolExpr *a, const BoolExpr *b)+{+ COMPARE_SCALAR_FIELD(boolop);+ COMPARE_NODE_FIELD(args);+ COMPARE_LOCATION_FIELD(location);++ return true;+}++static bool+_equalSubLink(const SubLink *a, const SubLink *b)+{+ COMPARE_SCALAR_FIELD(subLinkType);+ COMPARE_SCALAR_FIELD(subLinkId);+ COMPARE_NODE_FIELD(testexpr);+ COMPARE_NODE_FIELD(operName);+ COMPARE_NODE_FIELD(subselect);+ COMPARE_LOCATION_FIELD(location);++ return true;+}++static bool+_equalSubPlan(const SubPlan *a, const SubPlan *b)+{+ COMPARE_SCALAR_FIELD(subLinkType);+ COMPARE_NODE_FIELD(testexpr);+ COMPARE_NODE_FIELD(paramIds);+ COMPARE_SCALAR_FIELD(plan_id);+ COMPARE_STRING_FIELD(plan_name);+ COMPARE_SCALAR_FIELD(firstColType);+ COMPARE_SCALAR_FIELD(firstColTypmod);+ COMPARE_SCALAR_FIELD(firstColCollation);+ COMPARE_SCALAR_FIELD(useHashTable);+ COMPARE_SCALAR_FIELD(unknownEqFalse);+ COMPARE_NODE_FIELD(setParam);+ COMPARE_NODE_FIELD(parParam);+ COMPARE_NODE_FIELD(args);+ COMPARE_SCALAR_FIELD(startup_cost);+ COMPARE_SCALAR_FIELD(per_call_cost);++ return true;+}++static bool+_equalAlternativeSubPlan(const AlternativeSubPlan *a, const AlternativeSubPlan *b)+{+ COMPARE_NODE_FIELD(subplans);++ return true;+}++static bool+_equalFieldSelect(const FieldSelect *a, const FieldSelect *b)+{+ COMPARE_NODE_FIELD(arg);+ COMPARE_SCALAR_FIELD(fieldnum);+ COMPARE_SCALAR_FIELD(resulttype);+ COMPARE_SCALAR_FIELD(resulttypmod);+ COMPARE_SCALAR_FIELD(resultcollid);++ return true;+}++static bool+_equalFieldStore(const FieldStore *a, const FieldStore *b)+{+ COMPARE_NODE_FIELD(arg);+ COMPARE_NODE_FIELD(newvals);+ COMPARE_NODE_FIELD(fieldnums);+ COMPARE_SCALAR_FIELD(resulttype);++ return true;+}++static bool+_equalRelabelType(const RelabelType *a, const RelabelType *b)+{+ COMPARE_NODE_FIELD(arg);+ COMPARE_SCALAR_FIELD(resulttype);+ COMPARE_SCALAR_FIELD(resulttypmod);+ COMPARE_SCALAR_FIELD(resultcollid);+ COMPARE_COERCIONFORM_FIELD(relabelformat);+ COMPARE_LOCATION_FIELD(location);++ return true;+}++static bool+_equalCoerceViaIO(const CoerceViaIO *a, const CoerceViaIO *b)+{+ COMPARE_NODE_FIELD(arg);+ COMPARE_SCALAR_FIELD(resulttype);+ COMPARE_SCALAR_FIELD(resultcollid);+ COMPARE_COERCIONFORM_FIELD(coerceformat);+ COMPARE_LOCATION_FIELD(location);++ return true;+}++static bool+_equalArrayCoerceExpr(const ArrayCoerceExpr *a, const ArrayCoerceExpr *b)+{+ COMPARE_NODE_FIELD(arg);+ COMPARE_SCALAR_FIELD(elemfuncid);+ COMPARE_SCALAR_FIELD(resulttype);+ COMPARE_SCALAR_FIELD(resulttypmod);+ COMPARE_SCALAR_FIELD(resultcollid);+ COMPARE_SCALAR_FIELD(isExplicit);+ COMPARE_COERCIONFORM_FIELD(coerceformat);+ COMPARE_LOCATION_FIELD(location);++ return true;+}++static bool+_equalConvertRowtypeExpr(const ConvertRowtypeExpr *a, const ConvertRowtypeExpr *b)+{+ COMPARE_NODE_FIELD(arg);+ COMPARE_SCALAR_FIELD(resulttype);+ COMPARE_COERCIONFORM_FIELD(convertformat);+ COMPARE_LOCATION_FIELD(location);++ return true;+}++static bool+_equalCollateExpr(const CollateExpr *a, const CollateExpr *b)+{+ COMPARE_NODE_FIELD(arg);+ COMPARE_SCALAR_FIELD(collOid);+ COMPARE_LOCATION_FIELD(location);++ return true;+}++static bool+_equalCaseExpr(const CaseExpr *a, const CaseExpr *b)+{+ COMPARE_SCALAR_FIELD(casetype);+ COMPARE_SCALAR_FIELD(casecollid);+ COMPARE_NODE_FIELD(arg);+ COMPARE_NODE_FIELD(args);+ COMPARE_NODE_FIELD(defresult);+ COMPARE_LOCATION_FIELD(location);++ return true;+}++static bool+_equalCaseWhen(const CaseWhen *a, const CaseWhen *b)+{+ COMPARE_NODE_FIELD(expr);+ COMPARE_NODE_FIELD(result);+ COMPARE_LOCATION_FIELD(location);++ return true;+}++static bool+_equalCaseTestExpr(const CaseTestExpr *a, const CaseTestExpr *b)+{+ COMPARE_SCALAR_FIELD(typeId);+ COMPARE_SCALAR_FIELD(typeMod);+ COMPARE_SCALAR_FIELD(collation);++ return true;+}++static bool+_equalArrayExpr(const ArrayExpr *a, const ArrayExpr *b)+{+ COMPARE_SCALAR_FIELD(array_typeid);+ COMPARE_SCALAR_FIELD(array_collid);+ COMPARE_SCALAR_FIELD(element_typeid);+ COMPARE_NODE_FIELD(elements);+ COMPARE_SCALAR_FIELD(multidims);+ COMPARE_LOCATION_FIELD(location);++ return true;+}++static bool+_equalRowExpr(const RowExpr *a, const RowExpr *b)+{+ COMPARE_NODE_FIELD(args);+ COMPARE_SCALAR_FIELD(row_typeid);+ COMPARE_COERCIONFORM_FIELD(row_format);+ COMPARE_NODE_FIELD(colnames);+ COMPARE_LOCATION_FIELD(location);++ return true;+}++static bool+_equalRowCompareExpr(const RowCompareExpr *a, const RowCompareExpr *b)+{+ COMPARE_SCALAR_FIELD(rctype);+ COMPARE_NODE_FIELD(opnos);+ COMPARE_NODE_FIELD(opfamilies);+ COMPARE_NODE_FIELD(inputcollids);+ COMPARE_NODE_FIELD(largs);+ COMPARE_NODE_FIELD(rargs);++ return true;+}++static bool+_equalCoalesceExpr(const CoalesceExpr *a, const CoalesceExpr *b)+{+ COMPARE_SCALAR_FIELD(coalescetype);+ COMPARE_SCALAR_FIELD(coalescecollid);+ COMPARE_NODE_FIELD(args);+ COMPARE_LOCATION_FIELD(location);++ return true;+}++static bool+_equalMinMaxExpr(const MinMaxExpr *a, const MinMaxExpr *b)+{+ COMPARE_SCALAR_FIELD(minmaxtype);+ COMPARE_SCALAR_FIELD(minmaxcollid);+ COMPARE_SCALAR_FIELD(inputcollid);+ COMPARE_SCALAR_FIELD(op);+ COMPARE_NODE_FIELD(args);+ COMPARE_LOCATION_FIELD(location);++ return true;+}++static bool+_equalXmlExpr(const XmlExpr *a, const XmlExpr *b)+{+ COMPARE_SCALAR_FIELD(op);+ COMPARE_STRING_FIELD(name);+ COMPARE_NODE_FIELD(named_args);+ COMPARE_NODE_FIELD(arg_names);+ COMPARE_NODE_FIELD(args);+ COMPARE_SCALAR_FIELD(xmloption);+ COMPARE_SCALAR_FIELD(type);+ COMPARE_SCALAR_FIELD(typmod);+ COMPARE_LOCATION_FIELD(location);++ return true;+}++static bool+_equalNullTest(const NullTest *a, const NullTest *b)+{+ COMPARE_NODE_FIELD(arg);+ COMPARE_SCALAR_FIELD(nulltesttype);+ COMPARE_SCALAR_FIELD(argisrow);+ COMPARE_LOCATION_FIELD(location);++ return true;+}++static bool+_equalBooleanTest(const BooleanTest *a, const BooleanTest *b)+{+ COMPARE_NODE_FIELD(arg);+ COMPARE_SCALAR_FIELD(booltesttype);+ COMPARE_LOCATION_FIELD(location);++ return true;+}++static bool+_equalCoerceToDomain(const CoerceToDomain *a, const CoerceToDomain *b)+{+ COMPARE_NODE_FIELD(arg);+ COMPARE_SCALAR_FIELD(resulttype);+ COMPARE_SCALAR_FIELD(resulttypmod);+ COMPARE_SCALAR_FIELD(resultcollid);+ COMPARE_COERCIONFORM_FIELD(coercionformat);+ COMPARE_LOCATION_FIELD(location);++ return true;+}++static bool+_equalCoerceToDomainValue(const CoerceToDomainValue *a, const CoerceToDomainValue *b)+{+ COMPARE_SCALAR_FIELD(typeId);+ COMPARE_SCALAR_FIELD(typeMod);+ COMPARE_SCALAR_FIELD(collation);+ COMPARE_LOCATION_FIELD(location);++ return true;+}++static bool+_equalSetToDefault(const SetToDefault *a, const SetToDefault *b)+{+ COMPARE_SCALAR_FIELD(typeId);+ COMPARE_SCALAR_FIELD(typeMod);+ COMPARE_SCALAR_FIELD(collation);+ COMPARE_LOCATION_FIELD(location);++ return true;+}++static bool+_equalCurrentOfExpr(const CurrentOfExpr *a, const CurrentOfExpr *b)+{+ COMPARE_SCALAR_FIELD(cvarno);+ COMPARE_STRING_FIELD(cursor_name);+ COMPARE_SCALAR_FIELD(cursor_param);++ return true;+}++static bool+_equalInferenceElem(const InferenceElem *a, const InferenceElem *b)+{+ COMPARE_NODE_FIELD(expr);+ COMPARE_SCALAR_FIELD(infercollid);+ COMPARE_SCALAR_FIELD(inferopclass);++ return true;+}++static bool+_equalTargetEntry(const TargetEntry *a, const TargetEntry *b)+{+ COMPARE_NODE_FIELD(expr);+ COMPARE_SCALAR_FIELD(resno);+ COMPARE_STRING_FIELD(resname);+ COMPARE_SCALAR_FIELD(ressortgroupref);+ COMPARE_SCALAR_FIELD(resorigtbl);+ COMPARE_SCALAR_FIELD(resorigcol);+ COMPARE_SCALAR_FIELD(resjunk);++ return true;+}++static bool+_equalRangeTblRef(const RangeTblRef *a, const RangeTblRef *b)+{+ COMPARE_SCALAR_FIELD(rtindex);++ return true;+}++static bool+_equalJoinExpr(const JoinExpr *a, const JoinExpr *b)+{+ COMPARE_SCALAR_FIELD(jointype);+ COMPARE_SCALAR_FIELD(isNatural);+ COMPARE_NODE_FIELD(larg);+ COMPARE_NODE_FIELD(rarg);+ COMPARE_NODE_FIELD(usingClause);+ COMPARE_NODE_FIELD(quals);+ COMPARE_NODE_FIELD(alias);+ COMPARE_SCALAR_FIELD(rtindex);++ return true;+}++static bool+_equalFromExpr(const FromExpr *a, const FromExpr *b)+{+ COMPARE_NODE_FIELD(fromlist);+ COMPARE_NODE_FIELD(quals);++ return true;+}++static bool+_equalOnConflictExpr(const OnConflictExpr *a, const OnConflictExpr *b)+{+ COMPARE_SCALAR_FIELD(action);+ COMPARE_NODE_FIELD(arbiterElems);+ COMPARE_NODE_FIELD(arbiterWhere);+ COMPARE_SCALAR_FIELD(constraint);+ COMPARE_NODE_FIELD(onConflictSet);+ COMPARE_NODE_FIELD(onConflictWhere);+ COMPARE_SCALAR_FIELD(exclRelIndex);+ COMPARE_NODE_FIELD(exclRelTlist);++ return true;+}++/*+ * Stuff from relation.h+ */++static bool+_equalPathKey(const PathKey *a, const PathKey *b)+{+ /* We assume pointer equality is sufficient to compare the eclasses */+ COMPARE_SCALAR_FIELD(pk_eclass);+ COMPARE_SCALAR_FIELD(pk_opfamily);+ COMPARE_SCALAR_FIELD(pk_strategy);+ COMPARE_SCALAR_FIELD(pk_nulls_first);++ return true;+}++static bool+_equalRestrictInfo(const RestrictInfo *a, const RestrictInfo *b)+{+ COMPARE_NODE_FIELD(clause);+ COMPARE_SCALAR_FIELD(is_pushed_down);+ COMPARE_SCALAR_FIELD(outerjoin_delayed);+ COMPARE_BITMAPSET_FIELD(required_relids);+ COMPARE_BITMAPSET_FIELD(outer_relids);+ COMPARE_BITMAPSET_FIELD(nullable_relids);++ /*+ * We ignore all the remaining fields, since they may not be set yet, and+ * should be derivable from the clause anyway.+ */++ return true;+}++static bool+_equalPlaceHolderVar(const PlaceHolderVar *a, const PlaceHolderVar *b)+{+ /*+ * We intentionally do not compare phexpr. Two PlaceHolderVars with the+ * same ID and levelsup should be considered equal even if the contained+ * expressions have managed to mutate to different states. This will+ * happen during final plan construction when there are nested PHVs, since+ * the inner PHV will get replaced by a Param in some copies of the outer+ * PHV. Another way in which it can happen is that initplan sublinks+ * could get replaced by differently-numbered Params when sublink folding+ * is done. (The end result of such a situation would be some+ * unreferenced initplans, which is annoying but not really a problem.) On+ * the same reasoning, there is no need to examine phrels.+ *+ * COMPARE_NODE_FIELD(phexpr);+ *+ * COMPARE_BITMAPSET_FIELD(phrels);+ */+ COMPARE_SCALAR_FIELD(phid);+ COMPARE_SCALAR_FIELD(phlevelsup);++ return true;+}++static bool+_equalSpecialJoinInfo(const SpecialJoinInfo *a, const SpecialJoinInfo *b)+{+ COMPARE_BITMAPSET_FIELD(min_lefthand);+ COMPARE_BITMAPSET_FIELD(min_righthand);+ COMPARE_BITMAPSET_FIELD(syn_lefthand);+ COMPARE_BITMAPSET_FIELD(syn_righthand);+ COMPARE_SCALAR_FIELD(jointype);+ COMPARE_SCALAR_FIELD(lhs_strict);+ COMPARE_SCALAR_FIELD(delay_upper_joins);+ COMPARE_SCALAR_FIELD(semi_can_btree);+ COMPARE_SCALAR_FIELD(semi_can_hash);+ COMPARE_NODE_FIELD(semi_operators);+ COMPARE_NODE_FIELD(semi_rhs_exprs);++ return true;+}++static bool+_equalAppendRelInfo(const AppendRelInfo *a, const AppendRelInfo *b)+{+ COMPARE_SCALAR_FIELD(parent_relid);+ COMPARE_SCALAR_FIELD(child_relid);+ COMPARE_SCALAR_FIELD(parent_reltype);+ COMPARE_SCALAR_FIELD(child_reltype);+ COMPARE_NODE_FIELD(translated_vars);+ COMPARE_SCALAR_FIELD(parent_reloid);++ return true;+}++static bool+_equalPlaceHolderInfo(const PlaceHolderInfo *a, const PlaceHolderInfo *b)+{+ COMPARE_SCALAR_FIELD(phid);+ COMPARE_NODE_FIELD(ph_var); /* should be redundant */+ COMPARE_BITMAPSET_FIELD(ph_eval_at);+ COMPARE_BITMAPSET_FIELD(ph_lateral);+ COMPARE_BITMAPSET_FIELD(ph_needed);+ COMPARE_SCALAR_FIELD(ph_width);++ return true;+}+++/*+ * Stuff from parsenodes.h+ */++static bool+_equalQuery(const Query *a, const Query *b)+{+ COMPARE_SCALAR_FIELD(commandType);+ COMPARE_SCALAR_FIELD(querySource);+ /* we intentionally ignore queryId, since it might not be set */+ COMPARE_SCALAR_FIELD(canSetTag);+ COMPARE_NODE_FIELD(utilityStmt);+ COMPARE_SCALAR_FIELD(resultRelation);+ COMPARE_SCALAR_FIELD(hasAggs);+ COMPARE_SCALAR_FIELD(hasWindowFuncs);+ COMPARE_SCALAR_FIELD(hasSubLinks);+ COMPARE_SCALAR_FIELD(hasDistinctOn);+ COMPARE_SCALAR_FIELD(hasRecursive);+ COMPARE_SCALAR_FIELD(hasModifyingCTE);+ COMPARE_SCALAR_FIELD(hasForUpdate);+ COMPARE_SCALAR_FIELD(hasRowSecurity);+ COMPARE_NODE_FIELD(cteList);+ COMPARE_NODE_FIELD(rtable);+ COMPARE_NODE_FIELD(jointree);+ COMPARE_NODE_FIELD(targetList);+ COMPARE_NODE_FIELD(onConflict);+ COMPARE_NODE_FIELD(returningList);+ COMPARE_NODE_FIELD(groupClause);+ COMPARE_NODE_FIELD(groupingSets);+ COMPARE_NODE_FIELD(havingQual);+ COMPARE_NODE_FIELD(windowClause);+ COMPARE_NODE_FIELD(distinctClause);+ COMPARE_NODE_FIELD(sortClause);+ COMPARE_NODE_FIELD(limitOffset);+ COMPARE_NODE_FIELD(limitCount);+ COMPARE_NODE_FIELD(rowMarks);+ COMPARE_NODE_FIELD(setOperations);+ COMPARE_NODE_FIELD(constraintDeps);+ COMPARE_NODE_FIELD(withCheckOptions);++ return true;+}++static bool+_equalInsertStmt(const InsertStmt *a, const InsertStmt *b)+{+ COMPARE_NODE_FIELD(relation);+ COMPARE_NODE_FIELD(cols);+ COMPARE_NODE_FIELD(selectStmt);+ COMPARE_NODE_FIELD(onConflictClause);+ COMPARE_NODE_FIELD(returningList);+ COMPARE_NODE_FIELD(withClause);++ return true;+}++static bool+_equalDeleteStmt(const DeleteStmt *a, const DeleteStmt *b)+{+ COMPARE_NODE_FIELD(relation);+ COMPARE_NODE_FIELD(usingClause);+ COMPARE_NODE_FIELD(whereClause);+ COMPARE_NODE_FIELD(returningList);+ COMPARE_NODE_FIELD(withClause);++ return true;+}++static bool+_equalUpdateStmt(const UpdateStmt *a, const UpdateStmt *b)+{+ COMPARE_NODE_FIELD(relation);+ COMPARE_NODE_FIELD(targetList);+ COMPARE_NODE_FIELD(whereClause);+ COMPARE_NODE_FIELD(fromClause);+ COMPARE_NODE_FIELD(returningList);+ COMPARE_NODE_FIELD(withClause);++ return true;+}++static bool+_equalSelectStmt(const SelectStmt *a, const SelectStmt *b)+{+ COMPARE_NODE_FIELD(distinctClause);+ COMPARE_NODE_FIELD(intoClause);+ COMPARE_NODE_FIELD(targetList);+ COMPARE_NODE_FIELD(fromClause);+ COMPARE_NODE_FIELD(whereClause);+ COMPARE_NODE_FIELD(groupClause);+ COMPARE_NODE_FIELD(havingClause);+ COMPARE_NODE_FIELD(windowClause);+ COMPARE_NODE_FIELD(valuesLists);+ COMPARE_NODE_FIELD(sortClause);+ COMPARE_NODE_FIELD(limitOffset);+ COMPARE_NODE_FIELD(limitCount);+ COMPARE_NODE_FIELD(lockingClause);+ COMPARE_NODE_FIELD(withClause);+ COMPARE_SCALAR_FIELD(op);+ COMPARE_SCALAR_FIELD(all);+ COMPARE_NODE_FIELD(larg);+ COMPARE_NODE_FIELD(rarg);++ return true;+}++static bool+_equalSetOperationStmt(const SetOperationStmt *a, const SetOperationStmt *b)+{+ COMPARE_SCALAR_FIELD(op);+ COMPARE_SCALAR_FIELD(all);+ COMPARE_NODE_FIELD(larg);+ COMPARE_NODE_FIELD(rarg);+ COMPARE_NODE_FIELD(colTypes);+ COMPARE_NODE_FIELD(colTypmods);+ COMPARE_NODE_FIELD(colCollations);+ COMPARE_NODE_FIELD(groupClauses);++ return true;+}++static bool+_equalAlterTableStmt(const AlterTableStmt *a, const AlterTableStmt *b)+{+ COMPARE_NODE_FIELD(relation);+ COMPARE_NODE_FIELD(cmds);+ COMPARE_SCALAR_FIELD(relkind);+ COMPARE_SCALAR_FIELD(missing_ok);++ return true;+}++static bool+_equalAlterTableCmd(const AlterTableCmd *a, const AlterTableCmd *b)+{+ COMPARE_SCALAR_FIELD(subtype);+ COMPARE_STRING_FIELD(name);+ COMPARE_NODE_FIELD(newowner);+ COMPARE_NODE_FIELD(def);+ COMPARE_SCALAR_FIELD(behavior);+ COMPARE_SCALAR_FIELD(missing_ok);++ return true;+}++static bool+_equalAlterDomainStmt(const AlterDomainStmt *a, const AlterDomainStmt *b)+{+ COMPARE_SCALAR_FIELD(subtype);+ COMPARE_NODE_FIELD(typeName);+ COMPARE_STRING_FIELD(name);+ COMPARE_NODE_FIELD(def);+ COMPARE_SCALAR_FIELD(behavior);+ COMPARE_SCALAR_FIELD(missing_ok);++ return true;+}++static bool+_equalGrantStmt(const GrantStmt *a, const GrantStmt *b)+{+ COMPARE_SCALAR_FIELD(is_grant);+ COMPARE_SCALAR_FIELD(targtype);+ COMPARE_SCALAR_FIELD(objtype);+ COMPARE_NODE_FIELD(objects);+ COMPARE_NODE_FIELD(privileges);+ COMPARE_NODE_FIELD(grantees);+ COMPARE_SCALAR_FIELD(grant_option);+ COMPARE_SCALAR_FIELD(behavior);++ return true;+}++static bool+_equalFuncWithArgs(const FuncWithArgs *a, const FuncWithArgs *b)+{+ COMPARE_NODE_FIELD(funcname);+ COMPARE_NODE_FIELD(funcargs);++ return true;+}++static bool+_equalAccessPriv(const AccessPriv *a, const AccessPriv *b)+{+ COMPARE_STRING_FIELD(priv_name);+ COMPARE_NODE_FIELD(cols);++ return true;+}++static bool+_equalGrantRoleStmt(const GrantRoleStmt *a, const GrantRoleStmt *b)+{+ COMPARE_NODE_FIELD(granted_roles);+ COMPARE_NODE_FIELD(grantee_roles);+ COMPARE_SCALAR_FIELD(is_grant);+ COMPARE_SCALAR_FIELD(admin_opt);+ COMPARE_NODE_FIELD(grantor);+ COMPARE_SCALAR_FIELD(behavior);++ return true;+}++static bool+_equalAlterDefaultPrivilegesStmt(const AlterDefaultPrivilegesStmt *a, const AlterDefaultPrivilegesStmt *b)+{+ COMPARE_NODE_FIELD(options);+ COMPARE_NODE_FIELD(action);++ return true;+}++static bool+_equalDeclareCursorStmt(const DeclareCursorStmt *a, const DeclareCursorStmt *b)+{+ COMPARE_STRING_FIELD(portalname);+ COMPARE_SCALAR_FIELD(options);+ COMPARE_NODE_FIELD(query);++ return true;+}++static bool+_equalClosePortalStmt(const ClosePortalStmt *a, const ClosePortalStmt *b)+{+ COMPARE_STRING_FIELD(portalname);++ return true;+}++static bool+_equalClusterStmt(const ClusterStmt *a, const ClusterStmt *b)+{+ COMPARE_NODE_FIELD(relation);+ COMPARE_STRING_FIELD(indexname);+ COMPARE_SCALAR_FIELD(verbose);++ return true;+}++static bool+_equalCopyStmt(const CopyStmt *a, const CopyStmt *b)+{+ COMPARE_NODE_FIELD(relation);+ COMPARE_NODE_FIELD(query);+ COMPARE_NODE_FIELD(attlist);+ COMPARE_SCALAR_FIELD(is_from);+ COMPARE_SCALAR_FIELD(is_program);+ COMPARE_STRING_FIELD(filename);+ COMPARE_NODE_FIELD(options);++ return true;+}++static bool+_equalCreateStmt(const CreateStmt *a, const CreateStmt *b)+{+ COMPARE_NODE_FIELD(relation);+ COMPARE_NODE_FIELD(tableElts);+ COMPARE_NODE_FIELD(inhRelations);+ COMPARE_NODE_FIELD(ofTypename);+ COMPARE_NODE_FIELD(constraints);+ COMPARE_NODE_FIELD(options);+ COMPARE_SCALAR_FIELD(oncommit);+ COMPARE_STRING_FIELD(tablespacename);+ COMPARE_SCALAR_FIELD(if_not_exists);++ return true;+}++static bool+_equalTableLikeClause(const TableLikeClause *a, const TableLikeClause *b)+{+ COMPARE_NODE_FIELD(relation);+ COMPARE_SCALAR_FIELD(options);++ return true;+}++static bool+_equalDefineStmt(const DefineStmt *a, const DefineStmt *b)+{+ COMPARE_SCALAR_FIELD(kind);+ COMPARE_SCALAR_FIELD(oldstyle);+ COMPARE_NODE_FIELD(defnames);+ COMPARE_NODE_FIELD(args);+ COMPARE_NODE_FIELD(definition);++ return true;+}++static bool+_equalDropStmt(const DropStmt *a, const DropStmt *b)+{+ COMPARE_NODE_FIELD(objects);+ COMPARE_NODE_FIELD(arguments);+ COMPARE_SCALAR_FIELD(removeType);+ COMPARE_SCALAR_FIELD(behavior);+ COMPARE_SCALAR_FIELD(missing_ok);+ COMPARE_SCALAR_FIELD(concurrent);++ return true;+}++static bool+_equalTruncateStmt(const TruncateStmt *a, const TruncateStmt *b)+{+ COMPARE_NODE_FIELD(relations);+ COMPARE_SCALAR_FIELD(restart_seqs);+ COMPARE_SCALAR_FIELD(behavior);++ return true;+}++static bool+_equalCommentStmt(const CommentStmt *a, const CommentStmt *b)+{+ COMPARE_SCALAR_FIELD(objtype);+ COMPARE_NODE_FIELD(objname);+ COMPARE_NODE_FIELD(objargs);+ COMPARE_STRING_FIELD(comment);++ return true;+}++static bool+_equalSecLabelStmt(const SecLabelStmt *a, const SecLabelStmt *b)+{+ COMPARE_SCALAR_FIELD(objtype);+ COMPARE_NODE_FIELD(objname);+ COMPARE_NODE_FIELD(objargs);+ COMPARE_STRING_FIELD(provider);+ COMPARE_STRING_FIELD(label);++ return true;+}++static bool+_equalFetchStmt(const FetchStmt *a, const FetchStmt *b)+{+ COMPARE_SCALAR_FIELD(direction);+ COMPARE_SCALAR_FIELD(howMany);+ COMPARE_STRING_FIELD(portalname);+ COMPARE_SCALAR_FIELD(ismove);++ return true;+}++static bool+_equalIndexStmt(const IndexStmt *a, const IndexStmt *b)+{+ COMPARE_STRING_FIELD(idxname);+ COMPARE_NODE_FIELD(relation);+ COMPARE_STRING_FIELD(accessMethod);+ COMPARE_STRING_FIELD(tableSpace);+ COMPARE_NODE_FIELD(indexParams);+ COMPARE_NODE_FIELD(options);+ COMPARE_NODE_FIELD(whereClause);+ COMPARE_NODE_FIELD(excludeOpNames);+ COMPARE_STRING_FIELD(idxcomment);+ COMPARE_SCALAR_FIELD(indexOid);+ COMPARE_SCALAR_FIELD(oldNode);+ COMPARE_SCALAR_FIELD(unique);+ COMPARE_SCALAR_FIELD(primary);+ COMPARE_SCALAR_FIELD(isconstraint);+ COMPARE_SCALAR_FIELD(deferrable);+ COMPARE_SCALAR_FIELD(initdeferred);+ COMPARE_SCALAR_FIELD(transformed);+ COMPARE_SCALAR_FIELD(concurrent);+ COMPARE_SCALAR_FIELD(if_not_exists);++ return true;+}++static bool+_equalCreateFunctionStmt(const CreateFunctionStmt *a, const CreateFunctionStmt *b)+{+ COMPARE_SCALAR_FIELD(replace);+ COMPARE_NODE_FIELD(funcname);+ COMPARE_NODE_FIELD(parameters);+ COMPARE_NODE_FIELD(returnType);+ COMPARE_NODE_FIELD(options);+ COMPARE_NODE_FIELD(withClause);++ return true;+}++static bool+_equalFunctionParameter(const FunctionParameter *a, const FunctionParameter *b)+{+ COMPARE_STRING_FIELD(name);+ COMPARE_NODE_FIELD(argType);+ COMPARE_SCALAR_FIELD(mode);+ COMPARE_NODE_FIELD(defexpr);++ return true;+}++static bool+_equalAlterFunctionStmt(const AlterFunctionStmt *a, const AlterFunctionStmt *b)+{+ COMPARE_NODE_FIELD(func);+ COMPARE_NODE_FIELD(actions);++ return true;+}++static bool+_equalDoStmt(const DoStmt *a, const DoStmt *b)+{+ COMPARE_NODE_FIELD(args);++ return true;+}++static bool+_equalRenameStmt(const RenameStmt *a, const RenameStmt *b)+{+ COMPARE_SCALAR_FIELD(renameType);+ COMPARE_SCALAR_FIELD(relationType);+ COMPARE_NODE_FIELD(relation);+ COMPARE_NODE_FIELD(object);+ COMPARE_NODE_FIELD(objarg);+ COMPARE_STRING_FIELD(subname);+ COMPARE_STRING_FIELD(newname);+ COMPARE_SCALAR_FIELD(behavior);+ COMPARE_SCALAR_FIELD(missing_ok);++ return true;+}++static bool+_equalAlterObjectSchemaStmt(const AlterObjectSchemaStmt *a, const AlterObjectSchemaStmt *b)+{+ COMPARE_SCALAR_FIELD(objectType);+ COMPARE_NODE_FIELD(relation);+ COMPARE_NODE_FIELD(object);+ COMPARE_NODE_FIELD(objarg);+ COMPARE_STRING_FIELD(newschema);+ COMPARE_SCALAR_FIELD(missing_ok);++ return true;+}++static bool+_equalAlterOwnerStmt(const AlterOwnerStmt *a, const AlterOwnerStmt *b)+{+ COMPARE_SCALAR_FIELD(objectType);+ COMPARE_NODE_FIELD(relation);+ COMPARE_NODE_FIELD(object);+ COMPARE_NODE_FIELD(objarg);+ COMPARE_NODE_FIELD(newowner);++ return true;+}++static bool+_equalRuleStmt(const RuleStmt *a, const RuleStmt *b)+{+ COMPARE_NODE_FIELD(relation);+ COMPARE_STRING_FIELD(rulename);+ COMPARE_NODE_FIELD(whereClause);+ COMPARE_SCALAR_FIELD(event);+ COMPARE_SCALAR_FIELD(instead);+ COMPARE_NODE_FIELD(actions);+ COMPARE_SCALAR_FIELD(replace);++ return true;+}++static bool+_equalNotifyStmt(const NotifyStmt *a, const NotifyStmt *b)+{+ COMPARE_STRING_FIELD(conditionname);+ COMPARE_STRING_FIELD(payload);++ return true;+}++static bool+_equalListenStmt(const ListenStmt *a, const ListenStmt *b)+{+ COMPARE_STRING_FIELD(conditionname);++ return true;+}++static bool+_equalUnlistenStmt(const UnlistenStmt *a, const UnlistenStmt *b)+{+ COMPARE_STRING_FIELD(conditionname);++ return true;+}++static bool+_equalTransactionStmt(const TransactionStmt *a, const TransactionStmt *b)+{+ COMPARE_SCALAR_FIELD(kind);+ COMPARE_NODE_FIELD(options);+ COMPARE_STRING_FIELD(gid);++ return true;+}++static bool+_equalCompositeTypeStmt(const CompositeTypeStmt *a, const CompositeTypeStmt *b)+{+ COMPARE_NODE_FIELD(typevar);+ COMPARE_NODE_FIELD(coldeflist);++ return true;+}++static bool+_equalCreateEnumStmt(const CreateEnumStmt *a, const CreateEnumStmt *b)+{+ COMPARE_NODE_FIELD(typeName);+ COMPARE_NODE_FIELD(vals);++ return true;+}++static bool+_equalCreateRangeStmt(const CreateRangeStmt *a, const CreateRangeStmt *b)+{+ COMPARE_NODE_FIELD(typeName);+ COMPARE_NODE_FIELD(params);++ return true;+}++static bool+_equalAlterEnumStmt(const AlterEnumStmt *a, const AlterEnumStmt *b)+{+ COMPARE_NODE_FIELD(typeName);+ COMPARE_STRING_FIELD(newVal);+ COMPARE_STRING_FIELD(newValNeighbor);+ COMPARE_SCALAR_FIELD(newValIsAfter);+ COMPARE_SCALAR_FIELD(skipIfExists);++ return true;+}++static bool+_equalViewStmt(const ViewStmt *a, const ViewStmt *b)+{+ COMPARE_NODE_FIELD(view);+ COMPARE_NODE_FIELD(aliases);+ COMPARE_NODE_FIELD(query);+ COMPARE_SCALAR_FIELD(replace);+ COMPARE_NODE_FIELD(options);+ COMPARE_SCALAR_FIELD(withCheckOption);++ return true;+}++static bool+_equalLoadStmt(const LoadStmt *a, const LoadStmt *b)+{+ COMPARE_STRING_FIELD(filename);++ return true;+}++static bool+_equalCreateDomainStmt(const CreateDomainStmt *a, const CreateDomainStmt *b)+{+ COMPARE_NODE_FIELD(domainname);+ COMPARE_NODE_FIELD(typeName);+ COMPARE_NODE_FIELD(collClause);+ COMPARE_NODE_FIELD(constraints);++ return true;+}++static bool+_equalCreateOpClassStmt(const CreateOpClassStmt *a, const CreateOpClassStmt *b)+{+ COMPARE_NODE_FIELD(opclassname);+ COMPARE_NODE_FIELD(opfamilyname);+ COMPARE_STRING_FIELD(amname);+ COMPARE_NODE_FIELD(datatype);+ COMPARE_NODE_FIELD(items);+ COMPARE_SCALAR_FIELD(isDefault);++ return true;+}++static bool+_equalCreateOpClassItem(const CreateOpClassItem *a, const CreateOpClassItem *b)+{+ COMPARE_SCALAR_FIELD(itemtype);+ COMPARE_NODE_FIELD(name);+ COMPARE_NODE_FIELD(args);+ COMPARE_SCALAR_FIELD(number);+ COMPARE_NODE_FIELD(order_family);+ COMPARE_NODE_FIELD(class_args);+ COMPARE_NODE_FIELD(storedtype);++ return true;+}++static bool+_equalCreateOpFamilyStmt(const CreateOpFamilyStmt *a, const CreateOpFamilyStmt *b)+{+ COMPARE_NODE_FIELD(opfamilyname);+ COMPARE_STRING_FIELD(amname);++ return true;+}++static bool+_equalAlterOpFamilyStmt(const AlterOpFamilyStmt *a, const AlterOpFamilyStmt *b)+{+ COMPARE_NODE_FIELD(opfamilyname);+ COMPARE_STRING_FIELD(amname);+ COMPARE_SCALAR_FIELD(isDrop);+ COMPARE_NODE_FIELD(items);++ return true;+}++static bool+_equalCreatedbStmt(const CreatedbStmt *a, const CreatedbStmt *b)+{+ COMPARE_STRING_FIELD(dbname);+ COMPARE_NODE_FIELD(options);++ return true;+}++static bool+_equalAlterDatabaseStmt(const AlterDatabaseStmt *a, const AlterDatabaseStmt *b)+{+ COMPARE_STRING_FIELD(dbname);+ COMPARE_NODE_FIELD(options);++ return true;+}++static bool+_equalAlterDatabaseSetStmt(const AlterDatabaseSetStmt *a, const AlterDatabaseSetStmt *b)+{+ COMPARE_STRING_FIELD(dbname);+ COMPARE_NODE_FIELD(setstmt);++ return true;+}++static bool+_equalDropdbStmt(const DropdbStmt *a, const DropdbStmt *b)+{+ COMPARE_STRING_FIELD(dbname);+ COMPARE_SCALAR_FIELD(missing_ok);++ return true;+}++static bool+_equalVacuumStmt(const VacuumStmt *a, const VacuumStmt *b)+{+ COMPARE_SCALAR_FIELD(options);+ COMPARE_NODE_FIELD(relation);+ COMPARE_NODE_FIELD(va_cols);++ return true;+}++static bool+_equalExplainStmt(const ExplainStmt *a, const ExplainStmt *b)+{+ COMPARE_NODE_FIELD(query);+ COMPARE_NODE_FIELD(options);++ return true;+}++static bool+_equalCreateTableAsStmt(const CreateTableAsStmt *a, const CreateTableAsStmt *b)+{+ COMPARE_NODE_FIELD(query);+ COMPARE_NODE_FIELD(into);+ COMPARE_SCALAR_FIELD(relkind);+ COMPARE_SCALAR_FIELD(is_select_into);+ COMPARE_SCALAR_FIELD(if_not_exists);++ return true;+}++static bool+_equalRefreshMatViewStmt(const RefreshMatViewStmt *a, const RefreshMatViewStmt *b)+{+ COMPARE_SCALAR_FIELD(concurrent);+ COMPARE_SCALAR_FIELD(skipData);+ COMPARE_NODE_FIELD(relation);++ return true;+}++static bool+_equalReplicaIdentityStmt(const ReplicaIdentityStmt *a, const ReplicaIdentityStmt *b)+{+ COMPARE_SCALAR_FIELD(identity_type);+ COMPARE_STRING_FIELD(name);++ return true;+}++static bool+_equalAlterSystemStmt(const AlterSystemStmt *a, const AlterSystemStmt *b)+{+ COMPARE_NODE_FIELD(setstmt);++ return true;+}+++static bool+_equalCreateSeqStmt(const CreateSeqStmt *a, const CreateSeqStmt *b)+{+ COMPARE_NODE_FIELD(sequence);+ COMPARE_NODE_FIELD(options);+ COMPARE_SCALAR_FIELD(ownerId);+ COMPARE_SCALAR_FIELD(if_not_exists);++ return true;+}++static bool+_equalAlterSeqStmt(const AlterSeqStmt *a, const AlterSeqStmt *b)+{+ COMPARE_NODE_FIELD(sequence);+ COMPARE_NODE_FIELD(options);+ COMPARE_SCALAR_FIELD(missing_ok);++ return true;+}++static bool+_equalVariableSetStmt(const VariableSetStmt *a, const VariableSetStmt *b)+{+ COMPARE_SCALAR_FIELD(kind);+ COMPARE_STRING_FIELD(name);+ COMPARE_NODE_FIELD(args);+ COMPARE_SCALAR_FIELD(is_local);++ return true;+}++static bool+_equalVariableShowStmt(const VariableShowStmt *a, const VariableShowStmt *b)+{+ COMPARE_STRING_FIELD(name);++ return true;+}++static bool+_equalDiscardStmt(const DiscardStmt *a, const DiscardStmt *b)+{+ COMPARE_SCALAR_FIELD(target);++ return true;+}++static bool+_equalCreateTableSpaceStmt(const CreateTableSpaceStmt *a, const CreateTableSpaceStmt *b)+{+ COMPARE_STRING_FIELD(tablespacename);+ COMPARE_NODE_FIELD(owner);+ COMPARE_STRING_FIELD(location);+ COMPARE_NODE_FIELD(options);++ return true;+}++static bool+_equalDropTableSpaceStmt(const DropTableSpaceStmt *a, const DropTableSpaceStmt *b)+{+ COMPARE_STRING_FIELD(tablespacename);+ COMPARE_SCALAR_FIELD(missing_ok);++ return true;+}++static bool+_equalAlterTableSpaceOptionsStmt(const AlterTableSpaceOptionsStmt *a,+ const AlterTableSpaceOptionsStmt *b)+{+ COMPARE_STRING_FIELD(tablespacename);+ COMPARE_NODE_FIELD(options);+ COMPARE_SCALAR_FIELD(isReset);++ return true;+}++static bool+_equalAlterTableMoveAllStmt(const AlterTableMoveAllStmt *a,+ const AlterTableMoveAllStmt *b)+{+ COMPARE_STRING_FIELD(orig_tablespacename);+ COMPARE_SCALAR_FIELD(objtype);+ COMPARE_NODE_FIELD(roles);+ COMPARE_STRING_FIELD(new_tablespacename);+ COMPARE_SCALAR_FIELD(nowait);++ return true;+}++static bool+_equalCreateExtensionStmt(const CreateExtensionStmt *a, const CreateExtensionStmt *b)+{+ COMPARE_STRING_FIELD(extname);+ COMPARE_SCALAR_FIELD(if_not_exists);+ COMPARE_NODE_FIELD(options);++ return true;+}++static bool+_equalAlterExtensionStmt(const AlterExtensionStmt *a, const AlterExtensionStmt *b)+{+ COMPARE_STRING_FIELD(extname);+ COMPARE_NODE_FIELD(options);++ return true;+}++static bool+_equalAlterExtensionContentsStmt(const AlterExtensionContentsStmt *a, const AlterExtensionContentsStmt *b)+{+ COMPARE_STRING_FIELD(extname);+ COMPARE_SCALAR_FIELD(action);+ COMPARE_SCALAR_FIELD(objtype);+ COMPARE_NODE_FIELD(objname);+ COMPARE_NODE_FIELD(objargs);++ return true;+}++static bool+_equalCreateFdwStmt(const CreateFdwStmt *a, const CreateFdwStmt *b)+{+ COMPARE_STRING_FIELD(fdwname);+ COMPARE_NODE_FIELD(func_options);+ COMPARE_NODE_FIELD(options);++ return true;+}++static bool+_equalAlterFdwStmt(const AlterFdwStmt *a, const AlterFdwStmt *b)+{+ COMPARE_STRING_FIELD(fdwname);+ COMPARE_NODE_FIELD(func_options);+ COMPARE_NODE_FIELD(options);++ return true;+}++static bool+_equalCreateForeignServerStmt(const CreateForeignServerStmt *a, const CreateForeignServerStmt *b)+{+ COMPARE_STRING_FIELD(servername);+ COMPARE_STRING_FIELD(servertype);+ COMPARE_STRING_FIELD(version);+ COMPARE_STRING_FIELD(fdwname);+ COMPARE_NODE_FIELD(options);++ return true;+}++static bool+_equalAlterForeignServerStmt(const AlterForeignServerStmt *a, const AlterForeignServerStmt *b)+{+ COMPARE_STRING_FIELD(servername);+ COMPARE_STRING_FIELD(version);+ COMPARE_NODE_FIELD(options);+ COMPARE_SCALAR_FIELD(has_version);++ return true;+}++static bool+_equalCreateUserMappingStmt(const CreateUserMappingStmt *a, const CreateUserMappingStmt *b)+{+ COMPARE_NODE_FIELD(user);+ COMPARE_STRING_FIELD(servername);+ COMPARE_NODE_FIELD(options);++ return true;+}++static bool+_equalAlterUserMappingStmt(const AlterUserMappingStmt *a, const AlterUserMappingStmt *b)+{+ COMPARE_NODE_FIELD(user);+ COMPARE_STRING_FIELD(servername);+ COMPARE_NODE_FIELD(options);++ return true;+}++static bool+_equalDropUserMappingStmt(const DropUserMappingStmt *a, const DropUserMappingStmt *b)+{+ COMPARE_NODE_FIELD(user);+ COMPARE_STRING_FIELD(servername);+ COMPARE_SCALAR_FIELD(missing_ok);++ return true;+}++static bool+_equalCreateForeignTableStmt(const CreateForeignTableStmt *a, const CreateForeignTableStmt *b)+{+ if (!_equalCreateStmt(&a->base, &b->base))+ return false;++ COMPARE_STRING_FIELD(servername);+ COMPARE_NODE_FIELD(options);++ return true;+}++static bool+_equalImportForeignSchemaStmt(const ImportForeignSchemaStmt *a, const ImportForeignSchemaStmt *b)+{+ COMPARE_STRING_FIELD(server_name);+ COMPARE_STRING_FIELD(remote_schema);+ COMPARE_STRING_FIELD(local_schema);+ COMPARE_SCALAR_FIELD(list_type);+ COMPARE_NODE_FIELD(table_list);+ COMPARE_NODE_FIELD(options);++ return true;+}++static bool+_equalCreateTransformStmt(const CreateTransformStmt *a, const CreateTransformStmt *b)+{+ COMPARE_SCALAR_FIELD(replace);+ COMPARE_NODE_FIELD(type_name);+ COMPARE_STRING_FIELD(lang);+ COMPARE_NODE_FIELD(fromsql);+ COMPARE_NODE_FIELD(tosql);++ return true;+}++static bool+_equalCreateTrigStmt(const CreateTrigStmt *a, const CreateTrigStmt *b)+{+ COMPARE_STRING_FIELD(trigname);+ COMPARE_NODE_FIELD(relation);+ COMPARE_NODE_FIELD(funcname);+ COMPARE_NODE_FIELD(args);+ COMPARE_SCALAR_FIELD(row);+ COMPARE_SCALAR_FIELD(timing);+ COMPARE_SCALAR_FIELD(events);+ COMPARE_NODE_FIELD(columns);+ COMPARE_NODE_FIELD(whenClause);+ COMPARE_SCALAR_FIELD(isconstraint);+ COMPARE_SCALAR_FIELD(deferrable);+ COMPARE_SCALAR_FIELD(initdeferred);+ COMPARE_NODE_FIELD(constrrel);++ return true;+}++static bool+_equalCreateEventTrigStmt(const CreateEventTrigStmt *a, const CreateEventTrigStmt *b)+{+ COMPARE_STRING_FIELD(trigname);+ COMPARE_STRING_FIELD(eventname);+ COMPARE_NODE_FIELD(whenclause);+ COMPARE_NODE_FIELD(funcname);++ return true;+}++static bool+_equalAlterEventTrigStmt(const AlterEventTrigStmt *a, const AlterEventTrigStmt *b)+{+ COMPARE_STRING_FIELD(trigname);+ COMPARE_SCALAR_FIELD(tgenabled);++ return true;+}++static bool+_equalCreatePLangStmt(const CreatePLangStmt *a, const CreatePLangStmt *b)+{+ COMPARE_SCALAR_FIELD(replace);+ COMPARE_STRING_FIELD(plname);+ COMPARE_NODE_FIELD(plhandler);+ COMPARE_NODE_FIELD(plinline);+ COMPARE_NODE_FIELD(plvalidator);+ COMPARE_SCALAR_FIELD(pltrusted);++ return true;+}++static bool+_equalCreateRoleStmt(const CreateRoleStmt *a, const CreateRoleStmt *b)+{+ COMPARE_SCALAR_FIELD(stmt_type);+ COMPARE_STRING_FIELD(role);+ COMPARE_NODE_FIELD(options);++ return true;+}++static bool+_equalAlterRoleStmt(const AlterRoleStmt *a, const AlterRoleStmt *b)+{+ COMPARE_NODE_FIELD(role);+ COMPARE_NODE_FIELD(options);+ COMPARE_SCALAR_FIELD(action);++ return true;+}++static bool+_equalAlterRoleSetStmt(const AlterRoleSetStmt *a, const AlterRoleSetStmt *b)+{+ COMPARE_NODE_FIELD(role);+ COMPARE_STRING_FIELD(database);+ COMPARE_NODE_FIELD(setstmt);++ return true;+}++static bool+_equalDropRoleStmt(const DropRoleStmt *a, const DropRoleStmt *b)+{+ COMPARE_NODE_FIELD(roles);+ COMPARE_SCALAR_FIELD(missing_ok);++ return true;+}++static bool+_equalLockStmt(const LockStmt *a, const LockStmt *b)+{+ COMPARE_NODE_FIELD(relations);+ COMPARE_SCALAR_FIELD(mode);+ COMPARE_SCALAR_FIELD(nowait);++ return true;+}++static bool+_equalConstraintsSetStmt(const ConstraintsSetStmt *a, const ConstraintsSetStmt *b)+{+ COMPARE_NODE_FIELD(constraints);+ COMPARE_SCALAR_FIELD(deferred);++ return true;+}++static bool+_equalReindexStmt(const ReindexStmt *a, const ReindexStmt *b)+{+ COMPARE_SCALAR_FIELD(kind);+ COMPARE_NODE_FIELD(relation);+ COMPARE_STRING_FIELD(name);+ COMPARE_SCALAR_FIELD(options);++ return true;+}++static bool+_equalCreateSchemaStmt(const CreateSchemaStmt *a, const CreateSchemaStmt *b)+{+ COMPARE_STRING_FIELD(schemaname);+ COMPARE_NODE_FIELD(authrole);+ COMPARE_NODE_FIELD(schemaElts);+ COMPARE_SCALAR_FIELD(if_not_exists);++ return true;+}++static bool+_equalCreateConversionStmt(const CreateConversionStmt *a, const CreateConversionStmt *b)+{+ COMPARE_NODE_FIELD(conversion_name);+ COMPARE_STRING_FIELD(for_encoding_name);+ COMPARE_STRING_FIELD(to_encoding_name);+ COMPARE_NODE_FIELD(func_name);+ COMPARE_SCALAR_FIELD(def);++ return true;+}++static bool+_equalCreateCastStmt(const CreateCastStmt *a, const CreateCastStmt *b)+{+ COMPARE_NODE_FIELD(sourcetype);+ COMPARE_NODE_FIELD(targettype);+ COMPARE_NODE_FIELD(func);+ COMPARE_SCALAR_FIELD(context);+ COMPARE_SCALAR_FIELD(inout);++ return true;+}++static bool+_equalPrepareStmt(const PrepareStmt *a, const PrepareStmt *b)+{+ COMPARE_STRING_FIELD(name);+ COMPARE_NODE_FIELD(argtypes);+ COMPARE_NODE_FIELD(query);++ return true;+}++static bool+_equalExecuteStmt(const ExecuteStmt *a, const ExecuteStmt *b)+{+ COMPARE_STRING_FIELD(name);+ COMPARE_NODE_FIELD(params);++ return true;+}++static bool+_equalDeallocateStmt(const DeallocateStmt *a, const DeallocateStmt *b)+{+ COMPARE_STRING_FIELD(name);++ return true;+}++static bool+_equalDropOwnedStmt(const DropOwnedStmt *a, const DropOwnedStmt *b)+{+ COMPARE_NODE_FIELD(roles);+ COMPARE_SCALAR_FIELD(behavior);++ return true;+}++static bool+_equalReassignOwnedStmt(const ReassignOwnedStmt *a, const ReassignOwnedStmt *b)+{+ COMPARE_NODE_FIELD(roles);+ COMPARE_NODE_FIELD(newrole);++ return true;+}++static bool+_equalAlterTSDictionaryStmt(const AlterTSDictionaryStmt *a, const AlterTSDictionaryStmt *b)+{+ COMPARE_NODE_FIELD(dictname);+ COMPARE_NODE_FIELD(options);++ return true;+}++static bool+_equalAlterTSConfigurationStmt(const AlterTSConfigurationStmt *a,+ const AlterTSConfigurationStmt *b)+{+ COMPARE_SCALAR_FIELD(kind);+ COMPARE_NODE_FIELD(cfgname);+ COMPARE_NODE_FIELD(tokentype);+ COMPARE_NODE_FIELD(dicts);+ COMPARE_SCALAR_FIELD(override);+ COMPARE_SCALAR_FIELD(replace);+ COMPARE_SCALAR_FIELD(missing_ok);++ return true;+}++static bool+_equalCreatePolicyStmt(const CreatePolicyStmt *a, const CreatePolicyStmt *b)+{+ COMPARE_STRING_FIELD(policy_name);+ COMPARE_NODE_FIELD(table);+ COMPARE_STRING_FIELD(cmd_name);+ COMPARE_NODE_FIELD(roles);+ COMPARE_NODE_FIELD(qual);+ COMPARE_NODE_FIELD(with_check);++ return true;+}++static bool+_equalAlterPolicyStmt(const AlterPolicyStmt *a, const AlterPolicyStmt *b)+{+ COMPARE_STRING_FIELD(policy_name);+ COMPARE_NODE_FIELD(table);+ COMPARE_NODE_FIELD(roles);+ COMPARE_NODE_FIELD(qual);+ COMPARE_NODE_FIELD(with_check);++ return true;+}++static bool+_equalAExpr(const A_Expr *a, const A_Expr *b)+{+ COMPARE_SCALAR_FIELD(kind);+ COMPARE_NODE_FIELD(name);+ COMPARE_NODE_FIELD(lexpr);+ COMPARE_NODE_FIELD(rexpr);+ COMPARE_LOCATION_FIELD(location);++ return true;+}++static bool+_equalColumnRef(const ColumnRef *a, const ColumnRef *b)+{+ COMPARE_NODE_FIELD(fields);+ COMPARE_LOCATION_FIELD(location);++ return true;+}++static bool+_equalParamRef(const ParamRef *a, const ParamRef *b)+{+ COMPARE_SCALAR_FIELD(number);+ COMPARE_LOCATION_FIELD(location);++ return true;+}++static bool+_equalAConst(const A_Const *a, const A_Const *b)+{+ if (!equal(&a->val, &b->val)) /* hack for in-line Value field */+ return false;+ COMPARE_LOCATION_FIELD(location);++ return true;+}++static bool+_equalFuncCall(const FuncCall *a, const FuncCall *b)+{+ COMPARE_NODE_FIELD(funcname);+ COMPARE_NODE_FIELD(args);+ COMPARE_NODE_FIELD(agg_order);+ COMPARE_NODE_FIELD(agg_filter);+ COMPARE_SCALAR_FIELD(agg_within_group);+ COMPARE_SCALAR_FIELD(agg_star);+ COMPARE_SCALAR_FIELD(agg_distinct);+ COMPARE_SCALAR_FIELD(func_variadic);+ COMPARE_NODE_FIELD(over);+ COMPARE_LOCATION_FIELD(location);++ return true;+}++static bool+_equalAStar(const A_Star *a, const A_Star *b)+{+ return true;+}++static bool+_equalAIndices(const A_Indices *a, const A_Indices *b)+{+ COMPARE_NODE_FIELD(lidx);+ COMPARE_NODE_FIELD(uidx);++ return true;+}++static bool+_equalA_Indirection(const A_Indirection *a, const A_Indirection *b)+{+ COMPARE_NODE_FIELD(arg);+ COMPARE_NODE_FIELD(indirection);++ return true;+}++static bool+_equalA_ArrayExpr(const A_ArrayExpr *a, const A_ArrayExpr *b)+{+ COMPARE_NODE_FIELD(elements);+ COMPARE_LOCATION_FIELD(location);++ return true;+}++static bool+_equalResTarget(const ResTarget *a, const ResTarget *b)+{+ COMPARE_STRING_FIELD(name);+ COMPARE_NODE_FIELD(indirection);+ COMPARE_NODE_FIELD(val);+ COMPARE_LOCATION_FIELD(location);++ return true;+}++static bool+_equalMultiAssignRef(const MultiAssignRef *a, const MultiAssignRef *b)+{+ COMPARE_NODE_FIELD(source);+ COMPARE_SCALAR_FIELD(colno);+ COMPARE_SCALAR_FIELD(ncolumns);++ return true;+}++static bool+_equalTypeName(const TypeName *a, const TypeName *b)+{+ COMPARE_NODE_FIELD(names);+ COMPARE_SCALAR_FIELD(typeOid);+ COMPARE_SCALAR_FIELD(setof);+ COMPARE_SCALAR_FIELD(pct_type);+ COMPARE_NODE_FIELD(typmods);+ COMPARE_SCALAR_FIELD(typemod);+ COMPARE_NODE_FIELD(arrayBounds);+ COMPARE_LOCATION_FIELD(location);++ return true;+}++static bool+_equalTypeCast(const TypeCast *a, const TypeCast *b)+{+ COMPARE_NODE_FIELD(arg);+ COMPARE_NODE_FIELD(typeName);+ COMPARE_LOCATION_FIELD(location);++ return true;+}++static bool+_equalCollateClause(const CollateClause *a, const CollateClause *b)+{+ COMPARE_NODE_FIELD(arg);+ COMPARE_NODE_FIELD(collname);+ COMPARE_LOCATION_FIELD(location);++ return true;+}++static bool+_equalSortBy(const SortBy *a, const SortBy *b)+{+ COMPARE_NODE_FIELD(node);+ COMPARE_SCALAR_FIELD(sortby_dir);+ COMPARE_SCALAR_FIELD(sortby_nulls);+ COMPARE_NODE_FIELD(useOp);+ COMPARE_LOCATION_FIELD(location);++ return true;+}++static bool+_equalWindowDef(const WindowDef *a, const WindowDef *b)+{+ COMPARE_STRING_FIELD(name);+ COMPARE_STRING_FIELD(refname);+ COMPARE_NODE_FIELD(partitionClause);+ COMPARE_NODE_FIELD(orderClause);+ COMPARE_SCALAR_FIELD(frameOptions);+ COMPARE_NODE_FIELD(startOffset);+ COMPARE_NODE_FIELD(endOffset);+ COMPARE_LOCATION_FIELD(location);++ return true;+}++static bool+_equalRangeSubselect(const RangeSubselect *a, const RangeSubselect *b)+{+ COMPARE_SCALAR_FIELD(lateral);+ COMPARE_NODE_FIELD(subquery);+ COMPARE_NODE_FIELD(alias);++ return true;+}++static bool+_equalRangeFunction(const RangeFunction *a, const RangeFunction *b)+{+ COMPARE_SCALAR_FIELD(lateral);+ COMPARE_SCALAR_FIELD(ordinality);+ COMPARE_SCALAR_FIELD(is_rowsfrom);+ COMPARE_NODE_FIELD(functions);+ COMPARE_NODE_FIELD(alias);+ COMPARE_NODE_FIELD(coldeflist);++ return true;+}++static bool+_equalRangeTableSample(const RangeTableSample *a, const RangeTableSample *b)+{+ COMPARE_NODE_FIELD(relation);+ COMPARE_NODE_FIELD(method);+ COMPARE_NODE_FIELD(args);+ COMPARE_NODE_FIELD(repeatable);+ COMPARE_LOCATION_FIELD(location);++ return true;+}++static bool+_equalIndexElem(const IndexElem *a, const IndexElem *b)+{+ COMPARE_STRING_FIELD(name);+ COMPARE_NODE_FIELD(expr);+ COMPARE_STRING_FIELD(indexcolname);+ COMPARE_NODE_FIELD(collation);+ COMPARE_NODE_FIELD(opclass);+ COMPARE_SCALAR_FIELD(ordering);+ COMPARE_SCALAR_FIELD(nulls_ordering);++ return true;+}++static bool+_equalColumnDef(const ColumnDef *a, const ColumnDef *b)+{+ COMPARE_STRING_FIELD(colname);+ COMPARE_NODE_FIELD(typeName);+ COMPARE_SCALAR_FIELD(inhcount);+ COMPARE_SCALAR_FIELD(is_local);+ COMPARE_SCALAR_FIELD(is_not_null);+ COMPARE_SCALAR_FIELD(is_from_type);+ COMPARE_SCALAR_FIELD(storage);+ COMPARE_NODE_FIELD(raw_default);+ COMPARE_NODE_FIELD(cooked_default);+ COMPARE_NODE_FIELD(collClause);+ COMPARE_SCALAR_FIELD(collOid);+ COMPARE_NODE_FIELD(constraints);+ COMPARE_NODE_FIELD(fdwoptions);+ COMPARE_LOCATION_FIELD(location);++ return true;+}++static bool+_equalConstraint(const Constraint *a, const Constraint *b)+{+ COMPARE_SCALAR_FIELD(contype);+ COMPARE_STRING_FIELD(conname);+ COMPARE_SCALAR_FIELD(deferrable);+ COMPARE_SCALAR_FIELD(initdeferred);+ COMPARE_LOCATION_FIELD(location);+ COMPARE_SCALAR_FIELD(is_no_inherit);+ COMPARE_NODE_FIELD(raw_expr);+ COMPARE_STRING_FIELD(cooked_expr);+ COMPARE_NODE_FIELD(keys);+ COMPARE_NODE_FIELD(exclusions);+ COMPARE_NODE_FIELD(options);+ COMPARE_STRING_FIELD(indexname);+ COMPARE_STRING_FIELD(indexspace);+ COMPARE_STRING_FIELD(access_method);+ COMPARE_NODE_FIELD(where_clause);+ COMPARE_NODE_FIELD(pktable);+ COMPARE_NODE_FIELD(fk_attrs);+ COMPARE_NODE_FIELD(pk_attrs);+ COMPARE_SCALAR_FIELD(fk_matchtype);+ COMPARE_SCALAR_FIELD(fk_upd_action);+ COMPARE_SCALAR_FIELD(fk_del_action);+ COMPARE_NODE_FIELD(old_conpfeqop);+ COMPARE_SCALAR_FIELD(old_pktable_oid);+ COMPARE_SCALAR_FIELD(skip_validation);+ COMPARE_SCALAR_FIELD(initially_valid);++ return true;+}++static bool+_equalDefElem(const DefElem *a, const DefElem *b)+{+ COMPARE_STRING_FIELD(defnamespace);+ COMPARE_STRING_FIELD(defname);+ COMPARE_NODE_FIELD(arg);+ COMPARE_SCALAR_FIELD(defaction);++ return true;+}++static bool+_equalLockingClause(const LockingClause *a, const LockingClause *b)+{+ COMPARE_NODE_FIELD(lockedRels);+ COMPARE_SCALAR_FIELD(strength);+ COMPARE_SCALAR_FIELD(waitPolicy);++ return true;+}++static bool+_equalRangeTblEntry(const RangeTblEntry *a, const RangeTblEntry *b)+{+ COMPARE_SCALAR_FIELD(rtekind);+ COMPARE_SCALAR_FIELD(relid);+ COMPARE_SCALAR_FIELD(relkind);+ COMPARE_NODE_FIELD(tablesample);+ COMPARE_NODE_FIELD(subquery);+ COMPARE_SCALAR_FIELD(security_barrier);+ COMPARE_SCALAR_FIELD(jointype);+ COMPARE_NODE_FIELD(joinaliasvars);+ COMPARE_NODE_FIELD(functions);+ COMPARE_SCALAR_FIELD(funcordinality);+ COMPARE_NODE_FIELD(values_lists);+ COMPARE_NODE_FIELD(values_collations);+ COMPARE_STRING_FIELD(ctename);+ COMPARE_SCALAR_FIELD(ctelevelsup);+ COMPARE_SCALAR_FIELD(self_reference);+ COMPARE_NODE_FIELD(ctecoltypes);+ COMPARE_NODE_FIELD(ctecoltypmods);+ COMPARE_NODE_FIELD(ctecolcollations);+ COMPARE_NODE_FIELD(alias);+ COMPARE_NODE_FIELD(eref);+ COMPARE_SCALAR_FIELD(lateral);+ COMPARE_SCALAR_FIELD(inh);+ COMPARE_SCALAR_FIELD(inFromCl);+ COMPARE_SCALAR_FIELD(requiredPerms);+ COMPARE_SCALAR_FIELD(checkAsUser);+ COMPARE_BITMAPSET_FIELD(selectedCols);+ COMPARE_BITMAPSET_FIELD(insertedCols);+ COMPARE_BITMAPSET_FIELD(updatedCols);+ COMPARE_NODE_FIELD(securityQuals);++ return true;+}++static bool+_equalRangeTblFunction(const RangeTblFunction *a, const RangeTblFunction *b)+{+ COMPARE_NODE_FIELD(funcexpr);+ COMPARE_SCALAR_FIELD(funccolcount);+ COMPARE_NODE_FIELD(funccolnames);+ COMPARE_NODE_FIELD(funccoltypes);+ COMPARE_NODE_FIELD(funccoltypmods);+ COMPARE_NODE_FIELD(funccolcollations);+ COMPARE_BITMAPSET_FIELD(funcparams);++ return true;+}++static bool+_equalTableSampleClause(const TableSampleClause *a, const TableSampleClause *b)+{+ COMPARE_SCALAR_FIELD(tsmhandler);+ COMPARE_NODE_FIELD(args);+ COMPARE_NODE_FIELD(repeatable);++ return true;+}++static bool+_equalWithCheckOption(const WithCheckOption *a, const WithCheckOption *b)+{+ COMPARE_SCALAR_FIELD(kind);+ COMPARE_STRING_FIELD(relname);+ COMPARE_STRING_FIELD(polname);+ COMPARE_NODE_FIELD(qual);+ COMPARE_SCALAR_FIELD(cascaded);++ return true;+}++static bool+_equalSortGroupClause(const SortGroupClause *a, const SortGroupClause *b)+{+ COMPARE_SCALAR_FIELD(tleSortGroupRef);+ COMPARE_SCALAR_FIELD(eqop);+ COMPARE_SCALAR_FIELD(sortop);+ COMPARE_SCALAR_FIELD(nulls_first);+ COMPARE_SCALAR_FIELD(hashable);++ return true;+}++static bool+_equalGroupingSet(const GroupingSet *a, const GroupingSet *b)+{+ COMPARE_SCALAR_FIELD(kind);+ COMPARE_NODE_FIELD(content);+ COMPARE_LOCATION_FIELD(location);++ return true;+}++static bool+_equalWindowClause(const WindowClause *a, const WindowClause *b)+{+ COMPARE_STRING_FIELD(name);+ COMPARE_STRING_FIELD(refname);+ COMPARE_NODE_FIELD(partitionClause);+ COMPARE_NODE_FIELD(orderClause);+ COMPARE_SCALAR_FIELD(frameOptions);+ COMPARE_NODE_FIELD(startOffset);+ COMPARE_NODE_FIELD(endOffset);+ COMPARE_SCALAR_FIELD(winref);+ COMPARE_SCALAR_FIELD(copiedOrder);++ return true;+}++static bool+_equalRowMarkClause(const RowMarkClause *a, const RowMarkClause *b)+{+ COMPARE_SCALAR_FIELD(rti);+ COMPARE_SCALAR_FIELD(strength);+ COMPARE_SCALAR_FIELD(waitPolicy);+ COMPARE_SCALAR_FIELD(pushedDown);++ return true;+}++static bool+_equalWithClause(const WithClause *a, const WithClause *b)+{+ COMPARE_NODE_FIELD(ctes);+ COMPARE_SCALAR_FIELD(recursive);+ COMPARE_LOCATION_FIELD(location);++ return true;+}++static bool+_equalInferClause(const InferClause *a, const InferClause *b)+{+ COMPARE_NODE_FIELD(indexElems);+ COMPARE_NODE_FIELD(whereClause);+ COMPARE_STRING_FIELD(conname);+ COMPARE_LOCATION_FIELD(location);++ return true;+}++static bool+_equalOnConflictClause(const OnConflictClause *a, const OnConflictClause *b)+{+ COMPARE_SCALAR_FIELD(action);+ COMPARE_NODE_FIELD(infer);+ COMPARE_NODE_FIELD(targetList);+ COMPARE_NODE_FIELD(whereClause);+ COMPARE_LOCATION_FIELD(location);++ return true;+}++static bool+_equalCommonTableExpr(const CommonTableExpr *a, const CommonTableExpr *b)+{+ COMPARE_STRING_FIELD(ctename);+ COMPARE_NODE_FIELD(aliascolnames);+ COMPARE_NODE_FIELD(ctequery);+ COMPARE_LOCATION_FIELD(location);+ COMPARE_SCALAR_FIELD(cterecursive);+ COMPARE_SCALAR_FIELD(cterefcount);+ COMPARE_NODE_FIELD(ctecolnames);+ COMPARE_NODE_FIELD(ctecoltypes);+ COMPARE_NODE_FIELD(ctecoltypmods);+ COMPARE_NODE_FIELD(ctecolcollations);++ return true;+}++static bool+_equalXmlSerialize(const XmlSerialize *a, const XmlSerialize *b)+{+ COMPARE_SCALAR_FIELD(xmloption);+ COMPARE_NODE_FIELD(expr);+ COMPARE_NODE_FIELD(typeName);+ COMPARE_LOCATION_FIELD(location);++ return true;+}++static bool+_equalRoleSpec(const RoleSpec *a, const RoleSpec *b)+{+ COMPARE_SCALAR_FIELD(roletype);+ COMPARE_STRING_FIELD(rolename);+ COMPARE_LOCATION_FIELD(location);++ return true;+}++/*+ * Stuff from pg_list.h+ */++static bool+_equalList(const List *a, const List *b)+{+ const ListCell *item_a;+ const ListCell *item_b;++ /*+ * Try to reject by simple scalar checks before grovelling through all the+ * list elements...+ */+ COMPARE_SCALAR_FIELD(type);+ COMPARE_SCALAR_FIELD(length);++ /*+ * We place the switch outside the loop for the sake of efficiency; this+ * may not be worth doing...+ */+ switch (a->type)+ {+ case T_List:+ forboth(item_a, a, item_b, b)+ {+ if (!equal(lfirst(item_a), lfirst(item_b)))+ return false;+ }+ break;+ case T_IntList:+ forboth(item_a, a, item_b, b)+ {+ if (lfirst_int(item_a) != lfirst_int(item_b))+ return false;+ }+ break;+ case T_OidList:+ forboth(item_a, a, item_b, b)+ {+ if (lfirst_oid(item_a) != lfirst_oid(item_b))+ return false;+ }+ break;+ default:+ elog(ERROR, "unrecognized list node type: %d",+ (int) a->type);+ return false; /* keep compiler quiet */+ }++ /*+ * If we got here, we should have run out of elements of both lists+ */+ Assert(item_a == NULL);+ Assert(item_b == NULL);++ return true;+}++/*+ * Stuff from value.h+ */++static bool+_equalValue(const Value *a, const Value *b)+{+ COMPARE_SCALAR_FIELD(type);++ switch (a->type)+ {+ case T_Integer:+ COMPARE_SCALAR_FIELD(val.ival);+ break;+ case T_Float:+ case T_String:+ case T_BitString:+ COMPARE_STRING_FIELD(val.str);+ break;+ case T_Null:+ /* nothing to do */+ break;+ default:+ elog(ERROR, "unrecognized node type: %d", (int) a->type);+ break;+ }++ return true;+}++/*+ * equal+ * returns whether two nodes are equal+ */+bool+equal(const void *a, const void *b)+{+ bool retval;++ if (a == b)+ return true;++ /*+ * note that a!=b, so only one of them can be NULL+ */+ if (a == NULL || b == NULL)+ return false;++ /*+ * are they the same type of nodes?+ */+ if (nodeTag(a) != nodeTag(b))+ return false;++ switch (nodeTag(a))+ {+ /*+ * PRIMITIVE NODES+ */+ case T_Alias:+ retval = _equalAlias(a, b);+ break;+ case T_RangeVar:+ retval = _equalRangeVar(a, b);+ break;+ case T_IntoClause:+ retval = _equalIntoClause(a, b);+ break;+ case T_Var:+ retval = _equalVar(a, b);+ break;+ case T_Const:+ retval = _equalConst(a, b);+ break;+ case T_Param:+ retval = _equalParam(a, b);+ break;+ case T_Aggref:+ retval = _equalAggref(a, b);+ break;+ case T_GroupingFunc:+ retval = _equalGroupingFunc(a, b);+ break;+ case T_WindowFunc:+ retval = _equalWindowFunc(a, b);+ break;+ case T_ArrayRef:+ retval = _equalArrayRef(a, b);+ break;+ case T_FuncExpr:+ retval = _equalFuncExpr(a, b);+ break;+ case T_NamedArgExpr:+ retval = _equalNamedArgExpr(a, b);+ break;+ case T_OpExpr:+ retval = _equalOpExpr(a, b);+ break;+ case T_DistinctExpr:+ retval = _equalDistinctExpr(a, b);+ break;+ case T_NullIfExpr:+ retval = _equalNullIfExpr(a, b);+ break;+ case T_ScalarArrayOpExpr:+ retval = _equalScalarArrayOpExpr(a, b);+ break;+ case T_BoolExpr:+ retval = _equalBoolExpr(a, b);+ break;+ case T_SubLink:+ retval = _equalSubLink(a, b);+ break;+ case T_SubPlan:+ retval = _equalSubPlan(a, b);+ break;+ case T_AlternativeSubPlan:+ retval = _equalAlternativeSubPlan(a, b);+ break;+ case T_FieldSelect:+ retval = _equalFieldSelect(a, b);+ break;+ case T_FieldStore:+ retval = _equalFieldStore(a, b);+ break;+ case T_RelabelType:+ retval = _equalRelabelType(a, b);+ break;+ case T_CoerceViaIO:+ retval = _equalCoerceViaIO(a, b);+ break;+ case T_ArrayCoerceExpr:+ retval = _equalArrayCoerceExpr(a, b);+ break;+ case T_ConvertRowtypeExpr:+ retval = _equalConvertRowtypeExpr(a, b);+ break;+ case T_CollateExpr:+ retval = _equalCollateExpr(a, b);+ break;+ case T_CaseExpr:+ retval = _equalCaseExpr(a, b);+ break;+ case T_CaseWhen:+ retval = _equalCaseWhen(a, b);+ break;+ case T_CaseTestExpr:+ retval = _equalCaseTestExpr(a, b);+ break;+ case T_ArrayExpr:+ retval = _equalArrayExpr(a, b);+ break;+ case T_RowExpr:+ retval = _equalRowExpr(a, b);+ break;+ case T_RowCompareExpr:+ retval = _equalRowCompareExpr(a, b);+ break;+ case T_CoalesceExpr:+ retval = _equalCoalesceExpr(a, b);+ break;+ case T_MinMaxExpr:+ retval = _equalMinMaxExpr(a, b);+ break;+ case T_XmlExpr:+ retval = _equalXmlExpr(a, b);+ break;+ case T_NullTest:+ retval = _equalNullTest(a, b);+ break;+ case T_BooleanTest:+ retval = _equalBooleanTest(a, b);+ break;+ case T_CoerceToDomain:+ retval = _equalCoerceToDomain(a, b);+ break;+ case T_CoerceToDomainValue:+ retval = _equalCoerceToDomainValue(a, b);+ break;+ case T_SetToDefault:+ retval = _equalSetToDefault(a, b);+ break;+ case T_CurrentOfExpr:+ retval = _equalCurrentOfExpr(a, b);+ break;+ case T_InferenceElem:+ retval = _equalInferenceElem(a, b);+ break;+ case T_TargetEntry:+ retval = _equalTargetEntry(a, b);+ break;+ case T_RangeTblRef:+ retval = _equalRangeTblRef(a, b);+ break;+ case T_FromExpr:+ retval = _equalFromExpr(a, b);+ break;+ case T_OnConflictExpr:+ retval = _equalOnConflictExpr(a, b);+ break;+ case T_JoinExpr:+ retval = _equalJoinExpr(a, b);+ break;++ /*+ * RELATION NODES+ */+ case T_PathKey:+ retval = _equalPathKey(a, b);+ break;+ case T_RestrictInfo:+ retval = _equalRestrictInfo(a, b);+ break;+ case T_PlaceHolderVar:+ retval = _equalPlaceHolderVar(a, b);+ break;+ case T_SpecialJoinInfo:+ retval = _equalSpecialJoinInfo(a, b);+ break;+ case T_AppendRelInfo:+ retval = _equalAppendRelInfo(a, b);+ break;+ case T_PlaceHolderInfo:+ retval = _equalPlaceHolderInfo(a, b);+ break;++ case T_List:+ case T_IntList:+ case T_OidList:+ retval = _equalList(a, b);+ break;++ case T_Integer:+ case T_Float:+ case T_String:+ case T_BitString:+ case T_Null:+ retval = _equalValue(a, b);+ break;++ /*+ * PARSE NODES+ */+ case T_Query:+ retval = _equalQuery(a, b);+ break;+ case T_InsertStmt:+ retval = _equalInsertStmt(a, b);+ break;+ case T_DeleteStmt:+ retval = _equalDeleteStmt(a, b);+ break;+ case T_UpdateStmt:+ retval = _equalUpdateStmt(a, b);+ break;+ case T_SelectStmt:+ retval = _equalSelectStmt(a, b);+ break;+ case T_SetOperationStmt:+ retval = _equalSetOperationStmt(a, b);+ break;+ case T_AlterTableStmt:+ retval = _equalAlterTableStmt(a, b);+ break;+ case T_AlterTableCmd:+ retval = _equalAlterTableCmd(a, b);+ break;+ case T_AlterDomainStmt:+ retval = _equalAlterDomainStmt(a, b);+ break;+ case T_GrantStmt:+ retval = _equalGrantStmt(a, b);+ break;+ case T_GrantRoleStmt:+ retval = _equalGrantRoleStmt(a, b);+ break;+ case T_AlterDefaultPrivilegesStmt:+ retval = _equalAlterDefaultPrivilegesStmt(a, b);+ break;+ case T_DeclareCursorStmt:+ retval = _equalDeclareCursorStmt(a, b);+ break;+ case T_ClosePortalStmt:+ retval = _equalClosePortalStmt(a, b);+ break;+ case T_ClusterStmt:+ retval = _equalClusterStmt(a, b);+ break;+ case T_CopyStmt:+ retval = _equalCopyStmt(a, b);+ break;+ case T_CreateStmt:+ retval = _equalCreateStmt(a, b);+ break;+ case T_TableLikeClause:+ retval = _equalTableLikeClause(a, b);+ break;+ case T_DefineStmt:+ retval = _equalDefineStmt(a, b);+ break;+ case T_DropStmt:+ retval = _equalDropStmt(a, b);+ break;+ case T_TruncateStmt:+ retval = _equalTruncateStmt(a, b);+ break;+ case T_CommentStmt:+ retval = _equalCommentStmt(a, b);+ break;+ case T_SecLabelStmt:+ retval = _equalSecLabelStmt(a, b);+ break;+ case T_FetchStmt:+ retval = _equalFetchStmt(a, b);+ break;+ case T_IndexStmt:+ retval = _equalIndexStmt(a, b);+ break;+ case T_CreateFunctionStmt:+ retval = _equalCreateFunctionStmt(a, b);+ break;+ case T_FunctionParameter:+ retval = _equalFunctionParameter(a, b);+ break;+ case T_AlterFunctionStmt:+ retval = _equalAlterFunctionStmt(a, b);+ break;+ case T_DoStmt:+ retval = _equalDoStmt(a, b);+ break;+ case T_RenameStmt:+ retval = _equalRenameStmt(a, b);+ break;+ case T_AlterObjectSchemaStmt:+ retval = _equalAlterObjectSchemaStmt(a, b);+ break;+ case T_AlterOwnerStmt:+ retval = _equalAlterOwnerStmt(a, b);+ break;+ case T_RuleStmt:+ retval = _equalRuleStmt(a, b);+ break;+ case T_NotifyStmt:+ retval = _equalNotifyStmt(a, b);+ break;+ case T_ListenStmt:+ retval = _equalListenStmt(a, b);+ break;+ case T_UnlistenStmt:+ retval = _equalUnlistenStmt(a, b);+ break;+ case T_TransactionStmt:+ retval = _equalTransactionStmt(a, b);+ break;+ case T_CompositeTypeStmt:+ retval = _equalCompositeTypeStmt(a, b);+ break;+ case T_CreateEnumStmt:+ retval = _equalCreateEnumStmt(a, b);+ break;+ case T_CreateRangeStmt:+ retval = _equalCreateRangeStmt(a, b);+ break;+ case T_AlterEnumStmt:+ retval = _equalAlterEnumStmt(a, b);+ break;+ case T_ViewStmt:+ retval = _equalViewStmt(a, b);+ break;+ case T_LoadStmt:+ retval = _equalLoadStmt(a, b);+ break;+ case T_CreateDomainStmt:+ retval = _equalCreateDomainStmt(a, b);+ break;+ case T_CreateOpClassStmt:+ retval = _equalCreateOpClassStmt(a, b);+ break;+ case T_CreateOpClassItem:+ retval = _equalCreateOpClassItem(a, b);+ break;+ case T_CreateOpFamilyStmt:+ retval = _equalCreateOpFamilyStmt(a, b);+ break;+ case T_AlterOpFamilyStmt:+ retval = _equalAlterOpFamilyStmt(a, b);+ break;+ case T_CreatedbStmt:+ retval = _equalCreatedbStmt(a, b);+ break;+ case T_AlterDatabaseStmt:+ retval = _equalAlterDatabaseStmt(a, b);+ break;+ case T_AlterDatabaseSetStmt:+ retval = _equalAlterDatabaseSetStmt(a, b);+ break;+ case T_DropdbStmt:+ retval = _equalDropdbStmt(a, b);+ break;+ case T_VacuumStmt:+ retval = _equalVacuumStmt(a, b);+ break;+ case T_ExplainStmt:+ retval = _equalExplainStmt(a, b);+ break;+ case T_CreateTableAsStmt:+ retval = _equalCreateTableAsStmt(a, b);+ break;+ case T_RefreshMatViewStmt:+ retval = _equalRefreshMatViewStmt(a, b);+ break;+ case T_ReplicaIdentityStmt:+ retval = _equalReplicaIdentityStmt(a, b);+ break;+ case T_AlterSystemStmt:+ retval = _equalAlterSystemStmt(a, b);+ break;+ case T_CreateSeqStmt:+ retval = _equalCreateSeqStmt(a, b);+ break;+ case T_AlterSeqStmt:+ retval = _equalAlterSeqStmt(a, b);+ break;+ case T_VariableSetStmt:+ retval = _equalVariableSetStmt(a, b);+ break;+ case T_VariableShowStmt:+ retval = _equalVariableShowStmt(a, b);+ break;+ case T_DiscardStmt:+ retval = _equalDiscardStmt(a, b);+ break;+ case T_CreateTableSpaceStmt:+ retval = _equalCreateTableSpaceStmt(a, b);+ break;+ case T_DropTableSpaceStmt:+ retval = _equalDropTableSpaceStmt(a, b);+ break;+ case T_AlterTableSpaceOptionsStmt:+ retval = _equalAlterTableSpaceOptionsStmt(a, b);+ break;+ case T_AlterTableMoveAllStmt:+ retval = _equalAlterTableMoveAllStmt(a, b);+ break;+ case T_CreateExtensionStmt:+ retval = _equalCreateExtensionStmt(a, b);+ break;+ case T_AlterExtensionStmt:+ retval = _equalAlterExtensionStmt(a, b);+ break;+ case T_AlterExtensionContentsStmt:+ retval = _equalAlterExtensionContentsStmt(a, b);+ break;+ case T_CreateFdwStmt:+ retval = _equalCreateFdwStmt(a, b);+ break;+ case T_AlterFdwStmt:+ retval = _equalAlterFdwStmt(a, b);+ break;+ case T_CreateForeignServerStmt:+ retval = _equalCreateForeignServerStmt(a, b);+ break;+ case T_AlterForeignServerStmt:+ retval = _equalAlterForeignServerStmt(a, b);+ break;+ case T_CreateUserMappingStmt:+ retval = _equalCreateUserMappingStmt(a, b);+ break;+ case T_AlterUserMappingStmt:+ retval = _equalAlterUserMappingStmt(a, b);+ break;+ case T_DropUserMappingStmt:+ retval = _equalDropUserMappingStmt(a, b);+ break;+ case T_CreateForeignTableStmt:+ retval = _equalCreateForeignTableStmt(a, b);+ break;+ case T_ImportForeignSchemaStmt:+ retval = _equalImportForeignSchemaStmt(a, b);+ break;+ case T_CreateTransformStmt:+ retval = _equalCreateTransformStmt(a, b);+ break;+ case T_CreateTrigStmt:+ retval = _equalCreateTrigStmt(a, b);+ break;+ case T_CreateEventTrigStmt:+ retval = _equalCreateEventTrigStmt(a, b);+ break;+ case T_AlterEventTrigStmt:+ retval = _equalAlterEventTrigStmt(a, b);+ break;+ case T_CreatePLangStmt:+ retval = _equalCreatePLangStmt(a, b);+ break;+ case T_CreateRoleStmt:+ retval = _equalCreateRoleStmt(a, b);+ break;+ case T_AlterRoleStmt:+ retval = _equalAlterRoleStmt(a, b);+ break;+ case T_AlterRoleSetStmt:+ retval = _equalAlterRoleSetStmt(a, b);+ break;+ case T_DropRoleStmt:+ retval = _equalDropRoleStmt(a, b);+ break;+ case T_LockStmt:+ retval = _equalLockStmt(a, b);+ break;+ case T_ConstraintsSetStmt:+ retval = _equalConstraintsSetStmt(a, b);+ break;+ case T_ReindexStmt:+ retval = _equalReindexStmt(a, b);+ break;+ case T_CheckPointStmt:+ retval = true;+ break;+ case T_CreateSchemaStmt:+ retval = _equalCreateSchemaStmt(a, b);+ break;+ case T_CreateConversionStmt:+ retval = _equalCreateConversionStmt(a, b);+ break;+ case T_CreateCastStmt:+ retval = _equalCreateCastStmt(a, b);+ break;+ case T_PrepareStmt:+ retval = _equalPrepareStmt(a, b);+ break;+ case T_ExecuteStmt:+ retval = _equalExecuteStmt(a, b);+ break;+ case T_DeallocateStmt:+ retval = _equalDeallocateStmt(a, b);+ break;+ case T_DropOwnedStmt:+ retval = _equalDropOwnedStmt(a, b);+ break;+ case T_ReassignOwnedStmt:+ retval = _equalReassignOwnedStmt(a, b);+ break;+ case T_AlterTSDictionaryStmt:+ retval = _equalAlterTSDictionaryStmt(a, b);+ break;+ case T_AlterTSConfigurationStmt:+ retval = _equalAlterTSConfigurationStmt(a, b);+ break;+ case T_CreatePolicyStmt:+ retval = _equalCreatePolicyStmt(a, b);+ break;+ case T_AlterPolicyStmt:+ retval = _equalAlterPolicyStmt(a, b);+ break;+ case T_A_Expr:+ retval = _equalAExpr(a, b);+ break;+ case T_ColumnRef:+ retval = _equalColumnRef(a, b);+ break;+ case T_ParamRef:+ retval = _equalParamRef(a, b);+ break;+ case T_A_Const:+ retval = _equalAConst(a, b);+ break;+ case T_FuncCall:+ retval = _equalFuncCall(a, b);+ break;+ case T_A_Star:+ retval = _equalAStar(a, b);+ break;+ case T_A_Indices:+ retval = _equalAIndices(a, b);+ break;+ case T_A_Indirection:+ retval = _equalA_Indirection(a, b);+ break;+ case T_A_ArrayExpr:+ retval = _equalA_ArrayExpr(a, b);+ break;+ case T_ResTarget:+ retval = _equalResTarget(a, b);+ break;+ case T_MultiAssignRef:+ retval = _equalMultiAssignRef(a, b);+ break;+ case T_TypeCast:+ retval = _equalTypeCast(a, b);+ break;+ case T_CollateClause:+ retval = _equalCollateClause(a, b);+ break;+ case T_SortBy:+ retval = _equalSortBy(a, b);+ break;+ case T_WindowDef:+ retval = _equalWindowDef(a, b);+ break;+ case T_RangeSubselect:+ retval = _equalRangeSubselect(a, b);+ break;+ case T_RangeFunction:+ retval = _equalRangeFunction(a, b);+ break;+ case T_RangeTableSample:+ retval = _equalRangeTableSample(a, b);+ break;+ case T_TypeName:+ retval = _equalTypeName(a, b);+ break;+ case T_IndexElem:+ retval = _equalIndexElem(a, b);+ break;+ case T_ColumnDef:+ retval = _equalColumnDef(a, b);+ break;+ case T_Constraint:+ retval = _equalConstraint(a, b);+ break;+ case T_DefElem:+ retval = _equalDefElem(a, b);+ break;+ case T_LockingClause:+ retval = _equalLockingClause(a, b);+ break;+ case T_RangeTblEntry:+ retval = _equalRangeTblEntry(a, b);+ break;+ case T_RangeTblFunction:+ retval = _equalRangeTblFunction(a, b);+ break;+ case T_TableSampleClause:+ retval = _equalTableSampleClause(a, b);+ break;+ case T_WithCheckOption:+ retval = _equalWithCheckOption(a, b);+ break;+ case T_SortGroupClause:+ retval = _equalSortGroupClause(a, b);+ break;+ case T_GroupingSet:+ retval = _equalGroupingSet(a, b);+ break;+ case T_WindowClause:+ retval = _equalWindowClause(a, b);+ break;+ case T_RowMarkClause:+ retval = _equalRowMarkClause(a, b);+ break;+ case T_WithClause:+ retval = _equalWithClause(a, b);+ break;+ case T_InferClause:+ retval = _equalInferClause(a, b);+ break;+ case T_OnConflictClause:+ retval = _equalOnConflictClause(a, b);+ break;+ case T_CommonTableExpr:+ retval = _equalCommonTableExpr(a, b);+ break;+ case T_FuncWithArgs:+ retval = _equalFuncWithArgs(a, b);+ break;+ case T_AccessPriv:+ retval = _equalAccessPriv(a, b);+ break;+ case T_XmlSerialize:+ retval = _equalXmlSerialize(a, b);+ break;+ case T_RoleSpec:+ retval = _equalRoleSpec(a, b);+ break;++ default:+ elog(ERROR, "unrecognized node type: %d",+ (int) nodeTag(a));+ retval = false; /* keep compiler quiet */+ break;+ }++ return retval;+}
+ foreign/libpg_query/src/postgres/src_backend_nodes_list.c view
@@ -0,0 +1,738 @@+/*--------------------------------------------------------------------+ * Symbols referenced in this file:+ * - lappend+ * - new_list+ * - new_tail_cell+ * - lcons+ * - new_head_cell+ * - list_concat+ * - list_nth+ * - list_nth_cell+ * - list_delete_cell+ * - list_free+ * - list_free_private+ * - list_copy+ * - list_copy_tail+ * - list_truncate+ *--------------------------------------------------------------------+ */++/*-------------------------------------------------------------------------+ *+ * list.c+ * implementation for PostgreSQL generic linked list package+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ *+ * IDENTIFICATION+ * src/backend/nodes/list.c+ *+ *-------------------------------------------------------------------------+ */+#include "postgres.h"++/* see pg_list.h */+#define PG_LIST_INCLUDE_DEFINITIONS++#include "nodes/pg_list.h"+++/*+ * Routines to simplify writing assertions about the type of a list; a+ * NIL list is considered to be an empty list of any type.+ */+#define IsPointerList(l) ((l) == NIL || IsA((l), List))+#define IsIntegerList(l) ((l) == NIL || IsA((l), IntList))+#define IsOidList(l) ((l) == NIL || IsA((l), OidList))++#ifdef USE_ASSERT_CHECKING+/*+ * Check that the specified List is valid (so far as we can tell).+ */+static void+check_list_invariants(const List *list)+{+ if (list == NIL)+ return;++ Assert(list->length > 0);+ Assert(list->head != NULL);+ Assert(list->tail != NULL);++ Assert(list->type == T_List ||+ list->type == T_IntList ||+ list->type == T_OidList);++ if (list->length == 1)+ Assert(list->head == list->tail);+ if (list->length == 2)+ Assert(list->head->next == list->tail);+ Assert(list->tail->next == NULL);+}+#else+#define check_list_invariants(l)+#endif /* USE_ASSERT_CHECKING */++/*+ * Return a freshly allocated List. Since empty non-NIL lists are+ * invalid, new_list() also allocates the head cell of the new list:+ * the caller should be sure to fill in that cell's data.+ */+static List *+new_list(NodeTag type)+{+ List *new_list;+ ListCell *new_head;++ new_head = (ListCell *) palloc(sizeof(*new_head));+ new_head->next = NULL;+ /* new_head->data is left undefined! */++ new_list = (List *) palloc(sizeof(*new_list));+ new_list->type = type;+ new_list->length = 1;+ new_list->head = new_head;+ new_list->tail = new_head;++ return new_list;+}++/*+ * Allocate a new cell and make it the head of the specified+ * list. Assumes the list it is passed is non-NIL.+ *+ * The data in the new head cell is undefined; the caller should be+ * sure to fill it in+ */+static void+new_head_cell(List *list)+{+ ListCell *new_head;++ new_head = (ListCell *) palloc(sizeof(*new_head));+ new_head->next = list->head;++ list->head = new_head;+ list->length++;+}++/*+ * Allocate a new cell and make it the tail of the specified+ * list. Assumes the list it is passed is non-NIL.+ *+ * The data in the new tail cell is undefined; the caller should be+ * sure to fill it in+ */+static void+new_tail_cell(List *list)+{+ ListCell *new_tail;++ new_tail = (ListCell *) palloc(sizeof(*new_tail));+ new_tail->next = NULL;++ list->tail->next = new_tail;+ list->tail = new_tail;+ list->length++;+}++/*+ * Append a pointer to the list. A pointer to the modified list is+ * returned. Note that this function may or may not destructively+ * modify the list; callers should always use this function's return+ * value, rather than continuing to use the pointer passed as the+ * first argument.+ */+List *+lappend(List *list, void *datum)+{+ Assert(IsPointerList(list));++ if (list == NIL)+ list = new_list(T_List);+ else+ new_tail_cell(list);++ lfirst(list->tail) = datum;+ check_list_invariants(list);+ return list;+}++/*+ * Append an integer to the specified list. See lappend()+ */+++/*+ * Append an OID to the specified list. See lappend()+ */+++/*+ * Add a new cell to the list, in the position after 'prev_cell'. The+ * data in the cell is left undefined, and must be filled in by the+ * caller. 'list' is assumed to be non-NIL, and 'prev_cell' is assumed+ * to be non-NULL and a member of 'list'.+ */+++/*+ * Add a new cell to the specified list (which must be non-NIL);+ * it will be placed after the list cell 'prev' (which must be+ * non-NULL and a member of 'list'). The data placed in the new cell+ * is 'datum'. The newly-constructed cell is returned.+ */+++++++/*+ * Prepend a new element to the list. A pointer to the modified list+ * is returned. Note that this function may or may not destructively+ * modify the list; callers should always use this function's return+ * value, rather than continuing to use the pointer passed as the+ * second argument.+ *+ * Caution: before Postgres 8.0, the original List was unmodified and+ * could be considered to retain its separate identity. This is no longer+ * the case.+ */+List *+lcons(void *datum, List *list)+{+ Assert(IsPointerList(list));++ if (list == NIL)+ list = new_list(T_List);+ else+ new_head_cell(list);++ lfirst(list->head) = datum;+ check_list_invariants(list);+ return list;+}++/*+ * Prepend an integer to the list. See lcons()+ */+++/*+ * Prepend an OID to the list. See lcons()+ */+++/*+ * Concatenate list2 to the end of list1, and return list1. list1 is+ * destructively changed. Callers should be sure to use the return+ * value as the new pointer to the concatenated list: the 'list1'+ * input pointer may or may not be the same as the returned pointer.+ *+ * The nodes in list2 are merely appended to the end of list1 in-place+ * (i.e. they aren't copied; the two lists will share some of the same+ * storage). Therefore, invoking list_free() on list2 will also+ * invalidate a portion of list1.+ */+List *+list_concat(List *list1, List *list2)+{+ if (list1 == NIL)+ return list2;+ if (list2 == NIL)+ return list1;+ if (list1 == list2)+ elog(ERROR, "cannot list_concat() a list to itself");++ Assert(list1->type == list2->type);++ list1->length += list2->length;+ list1->tail->next = list2->head;+ list1->tail = list2->tail;++ check_list_invariants(list1);+ return list1;+}++/*+ * Truncate 'list' to contain no more than 'new_size' elements. This+ * modifies the list in-place! Despite this, callers should use the+ * pointer returned by this function to refer to the newly truncated+ * list -- it may or may not be the same as the pointer that was+ * passed.+ *+ * Note that any cells removed by list_truncate() are NOT pfree'd.+ */+List *+list_truncate(List *list, int new_size)+{+ ListCell *cell;+ int n;++ if (new_size <= 0)+ return NIL; /* truncate to zero length */++ /* If asked to effectively extend the list, do nothing */+ if (new_size >= list_length(list))+ return list;++ n = 1;+ foreach(cell, list)+ {+ if (n == new_size)+ {+ cell->next = NULL;+ list->tail = cell;+ list->length = new_size;+ check_list_invariants(list);+ return list;+ }+ n++;+ }++ /* keep the compiler quiet; never reached */+ Assert(false);+ return list;+}++/*+ * Locate the n'th cell (counting from 0) of the list. It is an assertion+ * failure if there is no such cell.+ */+ListCell *+list_nth_cell(const List *list, int n)+{+ ListCell *match;++ Assert(list != NIL);+ Assert(n >= 0);+ Assert(n < list->length);+ check_list_invariants(list);++ /* Does the caller actually mean to fetch the tail? */+ if (n == list->length - 1)+ return list->tail;++ for (match = list->head; n-- > 0; match = match->next)+ ;++ return match;+}++/*+ * Return the data value contained in the n'th element of the+ * specified list. (List elements begin at 0.)+ */+void *+list_nth(const List *list, int n)+{+ Assert(IsPointerList(list));+ return lfirst(list_nth_cell(list, n));+}++/*+ * Return the integer value contained in the n'th element of the+ * specified list.+ */+++/*+ * Return the OID value contained in the n'th element of the specified+ * list.+ */+++/*+ * Return true iff 'datum' is a member of the list. Equality is+ * determined via equal(), so callers should ensure that they pass a+ * Node as 'datum'.+ */+++/*+ * Return true iff 'datum' is a member of the list. Equality is+ * determined by using simple pointer comparison.+ */+++/*+ * Return true iff the integer 'datum' is a member of the list.+ */+++/*+ * Return true iff the OID 'datum' is a member of the list.+ */+++/*+ * Delete 'cell' from 'list'; 'prev' is the previous element to 'cell'+ * in 'list', if any (i.e. prev == NULL iff list->head == cell)+ *+ * The cell is pfree'd, as is the List header if this was the last member.+ */+List *+list_delete_cell(List *list, ListCell *cell, ListCell *prev)+{+ check_list_invariants(list);+ Assert(prev != NULL ? lnext(prev) == cell : list_head(list) == cell);++ /*+ * If we're about to delete the last node from the list, free the whole+ * list instead and return NIL, which is the only valid representation of+ * a zero-length list.+ */+ if (list->length == 1)+ {+ list_free(list);+ return NIL;+ }++ /*+ * Otherwise, adjust the necessary list links, deallocate the particular+ * node we have just removed, and return the list we were given.+ */+ list->length--;++ if (prev)+ prev->next = cell->next;+ else+ list->head = cell->next;++ if (list->tail == cell)+ list->tail = prev;++ pfree(cell);+ return list;+}++/*+ * Delete the first cell in list that matches datum, if any.+ * Equality is determined via equal().+ */+++/* As above, but use simple pointer equality */+++/* As above, but for integers */+++/* As above, but for OIDs */+++/*+ * Delete the first element of the list.+ *+ * This is useful to replace the Lisp-y code "list = lnext(list);" in cases+ * where the intent is to alter the list rather than just traverse it.+ * Beware that the removed cell is freed, whereas the lnext() coding leaves+ * the original list head intact if there's another pointer to it.+ */+++/*+ * Generate the union of two lists. This is calculated by copying+ * list1 via list_copy(), then adding to it all the members of list2+ * that aren't already in list1.+ *+ * Whether an element is already a member of the list is determined+ * via equal().+ *+ * The returned list is newly-allocated, although the content of the+ * cells is the same (i.e. any pointed-to objects are not copied).+ *+ * NB: this function will NOT remove any duplicates that are present+ * in list1 (so it only performs a "union" if list1 is known unique to+ * start with). Also, if you are about to write "x = list_union(x, y)"+ * you probably want to use list_concat_unique() instead to avoid wasting+ * the list cells of the old x list.+ *+ * This function could probably be implemented a lot faster if it is a+ * performance bottleneck.+ */+++/*+ * This variant of list_union() determines duplicates via simple+ * pointer comparison.+ */+++/*+ * This variant of list_union() operates upon lists of integers.+ */+++/*+ * This variant of list_union() operates upon lists of OIDs.+ */+++/*+ * Return a list that contains all the cells that are in both list1 and+ * list2. The returned list is freshly allocated via palloc(), but the+ * cells themselves point to the same objects as the cells of the+ * input lists.+ *+ * Duplicate entries in list1 will not be suppressed, so it's only a true+ * "intersection" if list1 is known unique beforehand.+ *+ * This variant works on lists of pointers, and determines list+ * membership via equal(). Note that the list1 member will be pointed+ * to in the result.+ */+++/*+ * As list_intersection but operates on lists of integers.+ */+++/*+ * Return a list that contains all the cells in list1 that are not in+ * list2. The returned list is freshly allocated via palloc(), but the+ * cells themselves point to the same objects as the cells of the+ * input lists.+ *+ * This variant works on lists of pointers, and determines list+ * membership via equal()+ */+++/*+ * This variant of list_difference() determines list membership via+ * simple pointer equality.+ */+++/*+ * This variant of list_difference() operates upon lists of integers.+ */+++/*+ * This variant of list_difference() operates upon lists of OIDs.+ */+++/*+ * Append datum to list, but only if it isn't already in the list.+ *+ * Whether an element is already a member of the list is determined+ * via equal().+ */+++/*+ * This variant of list_append_unique() determines list membership via+ * simple pointer equality.+ */+++/*+ * This variant of list_append_unique() operates upon lists of integers.+ */+++/*+ * This variant of list_append_unique() operates upon lists of OIDs.+ */+++/*+ * Append to list1 each member of list2 that isn't already in list1.+ *+ * Whether an element is already a member of the list is determined+ * via equal().+ *+ * This is almost the same functionality as list_union(), but list1 is+ * modified in-place rather than being copied. Note also that list2's cells+ * are not inserted in list1, so the analogy to list_concat() isn't perfect.+ */+++/*+ * This variant of list_concat_unique() determines list membership via+ * simple pointer equality.+ */+++/*+ * This variant of list_concat_unique() operates upon lists of integers.+ */+++/*+ * This variant of list_concat_unique() operates upon lists of OIDs.+ */+++/*+ * Free all storage in a list, and optionally the pointed-to elements+ */+static void+list_free_private(List *list, bool deep)+{+ ListCell *cell;++ check_list_invariants(list);++ cell = list_head(list);+ while (cell != NULL)+ {+ ListCell *tmp = cell;++ cell = lnext(cell);+ if (deep)+ pfree(lfirst(tmp));+ pfree(tmp);+ }++ if (list)+ pfree(list);+}++/*+ * Free all the cells of the list, as well as the list itself. Any+ * objects that are pointed-to by the cells of the list are NOT+ * free'd.+ *+ * On return, the argument to this function has been freed, so the+ * caller would be wise to set it to NIL for safety's sake.+ */+void+list_free(List *list)+{+ list_free_private(list, false);+}++/*+ * Free all the cells of the list, the list itself, and all the+ * objects pointed-to by the cells of the list (each element in the+ * list must contain a pointer to a palloc()'d region of memory!)+ *+ * On return, the argument to this function has been freed, so the+ * caller would be wise to set it to NIL for safety's sake.+ */+++/*+ * Return a shallow copy of the specified list.+ */+List *+list_copy(const List *oldlist)+{+ List *newlist;+ ListCell *newlist_prev;+ ListCell *oldlist_cur;++ if (oldlist == NIL)+ return NIL;++ newlist = new_list(oldlist->type);+ newlist->length = oldlist->length;++ /*+ * Copy over the data in the first cell; new_list() has already allocated+ * the head cell itself+ */+ newlist->head->data = oldlist->head->data;++ newlist_prev = newlist->head;+ oldlist_cur = oldlist->head->next;+ while (oldlist_cur)+ {+ ListCell *newlist_cur;++ newlist_cur = (ListCell *) palloc(sizeof(*newlist_cur));+ newlist_cur->data = oldlist_cur->data;+ newlist_prev->next = newlist_cur;++ newlist_prev = newlist_cur;+ oldlist_cur = oldlist_cur->next;+ }++ newlist_prev->next = NULL;+ newlist->tail = newlist_prev;++ check_list_invariants(newlist);+ return newlist;+}++/*+ * Return a shallow copy of the specified list, without the first N elements.+ */+List *+list_copy_tail(const List *oldlist, int nskip)+{+ List *newlist;+ ListCell *newlist_prev;+ ListCell *oldlist_cur;++ if (nskip < 0)+ nskip = 0; /* would it be better to elog? */++ if (oldlist == NIL || nskip >= oldlist->length)+ return NIL;++ newlist = new_list(oldlist->type);+ newlist->length = oldlist->length - nskip;++ /*+ * Skip over the unwanted elements.+ */+ oldlist_cur = oldlist->head;+ while (nskip-- > 0)+ oldlist_cur = oldlist_cur->next;++ /*+ * Copy over the data in the first remaining cell; new_list() has already+ * allocated the head cell itself+ */+ newlist->head->data = oldlist_cur->data;++ newlist_prev = newlist->head;+ oldlist_cur = oldlist_cur->next;+ while (oldlist_cur)+ {+ ListCell *newlist_cur;++ newlist_cur = (ListCell *) palloc(sizeof(*newlist_cur));+ newlist_cur->data = oldlist_cur->data;+ newlist_prev->next = newlist_cur;++ newlist_prev = newlist_cur;+ oldlist_cur = oldlist_cur->next;+ }++ newlist_prev->next = NULL;+ newlist->tail = newlist_prev;++ check_list_invariants(newlist);+ return newlist;+}++/*+ * Temporary compatibility functions+ *+ * In order to avoid warnings for these function definitions, we need+ * to include a prototype here as well as in pg_list.h. That's because+ * we don't enable list API compatibility in list.c, so we+ * don't see the prototypes for these functions.+ */++/*+ * Given a list, return its length. This is merely defined for the+ * sake of backward compatibility: we can't afford to define a macro+ * called "length", so it must be a function. New code should use the+ * list_length() macro in order to avoid the overhead of a function+ * call.+ */+int length(const List *list);++
+ foreign/libpg_query/src/postgres/src_backend_nodes_makefuncs.c view
@@ -0,0 +1,331 @@+/*--------------------------------------------------------------------+ * Symbols referenced in this file:+ * - makeDefElemExtended+ * - makeDefElem+ * - makeTypeNameFromNameList+ * - makeAlias+ * - makeGroupingSet+ * - makeTypeName+ * - makeFuncCall+ * - makeSimpleA_Expr+ * - makeA_Expr+ * - makeRangeVar+ * - makeBoolExpr+ *--------------------------------------------------------------------+ */++/*-------------------------------------------------------------------------+ *+ * makefuncs.c+ * creator functions for primitive nodes. The functions here are for+ * the most frequently created nodes.+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ *+ * IDENTIFICATION+ * src/backend/nodes/makefuncs.c+ *+ *-------------------------------------------------------------------------+ */+#include "postgres.h"++#include "catalog/pg_class.h"+#include "catalog/pg_type.h"+#include "fmgr.h"+#include "nodes/makefuncs.h"+#include "nodes/nodeFuncs.h"+#include "utils/lsyscache.h"+++/*+ * makeA_Expr -+ * makes an A_Expr node+ */+A_Expr *+makeA_Expr(A_Expr_Kind kind, List *name,+ Node *lexpr, Node *rexpr, int location)+{+ A_Expr *a = makeNode(A_Expr);++ a->kind = kind;+ a->name = name;+ a->lexpr = lexpr;+ a->rexpr = rexpr;+ a->location = location;+ return a;+}++/*+ * makeSimpleA_Expr -+ * As above, given a simple (unqualified) operator name+ */+A_Expr *+makeSimpleA_Expr(A_Expr_Kind kind, char *name,+ Node *lexpr, Node *rexpr, int location)+{+ A_Expr *a = makeNode(A_Expr);++ a->kind = kind;+ a->name = list_make1(makeString((char *) name));+ a->lexpr = lexpr;+ a->rexpr = rexpr;+ a->location = location;+ return a;+}++/*+ * makeVar -+ * creates a Var node+ */+++/*+ * makeVarFromTargetEntry -+ * convenience function to create a same-level Var node from a+ * TargetEntry+ */+++/*+ * makeWholeRowVar -+ * creates a Var node representing a whole row of the specified RTE+ *+ * A whole-row reference is a Var with varno set to the correct range+ * table entry, and varattno == 0 to signal that it references the whole+ * tuple. (Use of zero here is unclean, since it could easily be confused+ * with error cases, but it's not worth changing now.) The vartype indicates+ * a rowtype; either a named composite type, or RECORD. This function+ * encapsulates the logic for determining the correct rowtype OID to use.+ *+ * If allowScalar is true, then for the case where the RTE is a single function+ * returning a non-composite result type, we produce a normal Var referencing+ * the function's result directly, instead of the single-column composite+ * value that the whole-row notation might otherwise suggest.+ */+++/*+ * makeTargetEntry -+ * creates a TargetEntry node+ */+++/*+ * flatCopyTargetEntry -+ * duplicate a TargetEntry, but don't copy substructure+ *+ * This is commonly used when we just want to modify the resno or substitute+ * a new expression.+ */+++/*+ * makeFromExpr -+ * creates a FromExpr node+ */+++/*+ * makeConst -+ * creates a Const node+ */+++/*+ * makeNullConst -+ * creates a Const node representing a NULL of the specified type/typmod+ *+ * This is a convenience routine that just saves a lookup of the type's+ * storage properties.+ */+++/*+ * makeBoolConst -+ * creates a Const node representing a boolean value (can be NULL too)+ */+++/*+ * makeBoolExpr -+ * creates a BoolExpr node+ */+Expr *+makeBoolExpr(BoolExprType boolop, List *args, int location)+{+ BoolExpr *b = makeNode(BoolExpr);++ b->boolop = boolop;+ b->args = args;+ b->location = location;++ return (Expr *) b;+}++/*+ * makeAlias -+ * creates an Alias node+ *+ * NOTE: the given name is copied, but the colnames list (if any) isn't.+ */+Alias *+makeAlias(const char *aliasname, List *colnames)+{+ Alias *a = makeNode(Alias);++ a->aliasname = pstrdup(aliasname);+ a->colnames = colnames;++ return a;+}++/*+ * makeRelabelType -+ * creates a RelabelType node+ */+++/*+ * makeRangeVar -+ * creates a RangeVar node (rather oversimplified case)+ */+RangeVar *+makeRangeVar(char *schemaname, char *relname, int location)+{+ RangeVar *r = makeNode(RangeVar);++ r->catalogname = NULL;+ r->schemaname = schemaname;+ r->relname = relname;+ r->inhOpt = INH_DEFAULT;+ r->relpersistence = RELPERSISTENCE_PERMANENT;+ r->alias = NULL;+ r->location = location;++ return r;+}++/*+ * makeTypeName -+ * build a TypeName node for an unqualified name.+ *+ * typmod is defaulted, but can be changed later by caller.+ */+TypeName *+makeTypeName(char *typnam)+{+ return makeTypeNameFromNameList(list_make1(makeString(typnam)));+}++/*+ * makeTypeNameFromNameList -+ * build a TypeName node for a String list representing a qualified name.+ *+ * typmod is defaulted, but can be changed later by caller.+ */+TypeName *+makeTypeNameFromNameList(List *names)+{+ TypeName *n = makeNode(TypeName);++ n->names = names;+ n->typmods = NIL;+ n->typemod = -1;+ n->location = -1;+ return n;+}++/*+ * makeTypeNameFromOid -+ * build a TypeName node to represent a type already known by OID/typmod.+ */+++/*+ * makeFuncExpr -+ * build an expression tree representing a function call.+ *+ * The argument expressions must have been transformed already.+ */+++/*+ * makeDefElem -+ * build a DefElem node+ *+ * This is sufficient for the "typical" case with an unqualified option name+ * and no special action.+ */+DefElem *+makeDefElem(char *name, Node *arg)+{+ DefElem *res = makeNode(DefElem);++ res->defnamespace = NULL;+ res->defname = name;+ res->arg = arg;+ res->defaction = DEFELEM_UNSPEC;+ res->location = -1;++ return res;+}++/*+ * makeDefElemExtended -+ * build a DefElem node with all fields available to be specified+ */+DefElem *+makeDefElemExtended(char *nameSpace, char *name, Node *arg,+ DefElemAction defaction, int location)+{+ DefElem *res = makeNode(DefElem);++ res->defnamespace = nameSpace;+ res->defname = name;+ res->arg = arg;+ res->defaction = defaction;+ res->location = location;++ return res;+}++/*+ * makeFuncCall -+ *+ * Initialize a FuncCall struct with the information every caller must+ * supply. Any non-default parameters have to be inserted by the caller.+ */+FuncCall *+makeFuncCall(List *name, List *args, int location)+{+ FuncCall *n = makeNode(FuncCall);++ n->funcname = name;+ n->args = args;+ n->agg_order = NIL;+ n->agg_filter = NULL;+ n->agg_within_group = false;+ n->agg_star = false;+ n->agg_distinct = false;+ n->func_variadic = false;+ n->over = NULL;+ n->location = location;+ return n;+}++/*+ * makeGroupingSet+ *+ */+GroupingSet *+makeGroupingSet(GroupingSetKind kind, List *content, int location)+{+ GroupingSet *n = makeNode(GroupingSet);++ n->kind = kind;+ n->content = content;+ n->location = location;+ return n;+}
+ foreign/libpg_query/src/postgres/src_backend_nodes_nodeFuncs.c view
@@ -0,0 +1,1214 @@+/*--------------------------------------------------------------------+ * Symbols referenced in this file:+ * - exprLocation+ * - leftmostLoc+ * - raw_expression_tree_walker+ *--------------------------------------------------------------------+ */++/*-------------------------------------------------------------------------+ *+ * nodeFuncs.c+ * Various general-purpose manipulations of Node trees+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ *+ * IDENTIFICATION+ * src/backend/nodes/nodeFuncs.c+ *+ *-------------------------------------------------------------------------+ */+#include "postgres.h"++#include "catalog/pg_collation.h"+#include "catalog/pg_type.h"+#include "miscadmin.h"+#include "nodes/makefuncs.h"+#include "nodes/nodeFuncs.h"+#include "nodes/relation.h"+#include "utils/builtins.h"+#include "utils/lsyscache.h"+++static bool expression_returns_set_walker(Node *node, void *context);+static int leftmostLoc(int loc1, int loc2);+++/*+ * exprType -+ * returns the Oid of the type of the expression's result.+ */+++/*+ * exprTypmod -+ * returns the type-specific modifier of the expression's result type,+ * if it can be determined. In many cases, it can't and we return -1.+ */+++/*+ * exprIsLengthCoercion+ * Detect whether an expression tree is an application of a datatype's+ * typmod-coercion function. Optionally extract the result's typmod.+ *+ * If coercedTypmod is not NULL, the typmod is stored there if the expression+ * is a length-coercion function, else -1 is stored there.+ *+ * Note that a combined type-and-length coercion will be treated as a+ * length coercion by this routine.+ */+++/*+ * relabel_to_typmod+ * Add a RelabelType node that changes just the typmod of the expression.+ *+ * This is primarily intended to be used during planning. Therefore, it+ * strips any existing RelabelType nodes to maintain the planner's invariant+ * that there are not adjacent RelabelTypes.+ */+++/*+ * strip_implicit_coercions: remove implicit coercions at top level of tree+ *+ * This doesn't modify or copy the input expression tree, just return a+ * pointer to a suitable place within it.+ *+ * Note: there isn't any useful thing we can do with a RowExpr here, so+ * just return it unchanged, even if it's marked as an implicit coercion.+ */+++/*+ * expression_returns_set+ * Test whether an expression returns a set result.+ *+ * Because we use expression_tree_walker(), this can also be applied to+ * whole targetlists; it'll produce TRUE if any one of the tlist items+ * returns a set.+ */++++++/*+ * exprCollation -+ * returns the Oid of the collation of the expression's result.+ *+ * Note: expression nodes that can invoke functions generally have an+ * "inputcollid" field, which is what the function should use as collation.+ * That is the resolved common collation of the node's inputs. It is often+ * but not always the same as the result collation; in particular, if the+ * function produces a non-collatable result type from collatable inputs+ * or vice versa, the two are different.+ */+++/*+ * exprInputCollation -+ * returns the Oid of the collation a function should use, if available.+ *+ * Result is InvalidOid if the node type doesn't store this information.+ */+++/*+ * exprSetCollation -+ * Assign collation information to an expression tree node.+ *+ * Note: since this is only used during parse analysis, we don't need to+ * worry about subplans or PlaceHolderVars.+ */+#ifdef USE_ASSERT_CHECKING+#endif /* USE_ASSERT_CHECKING */++/*+ * exprSetInputCollation -+ * Assign input-collation information to an expression tree node.+ *+ * This is a no-op for node types that don't store their input collation.+ * Note we omit RowCompareExpr, which needs special treatment since it+ * contains multiple input collation OIDs.+ */++++/*+ * exprLocation -+ * returns the parse location of an expression tree, for error reports+ *+ * -1 is returned if the location can't be determined.+ *+ * For expressions larger than a single token, the intent here is to+ * return the location of the expression's leftmost token, not necessarily+ * the topmost Node's location field. For example, an OpExpr's location+ * field will point at the operator name, but if it is not a prefix operator+ * then we should return the location of the left-hand operand instead.+ * The reason is that we want to reference the entire expression not just+ * that operator, and pointing to its start seems to be the most natural way.+ *+ * The location is not perfect --- for example, since the grammar doesn't+ * explicitly represent parentheses in the parsetree, given something that+ * had been written "(a + b) * c" we are going to point at "a" not "(".+ * But it should be plenty good enough for error reporting purposes.+ *+ * You might think that this code is overly general, for instance why check+ * the operands of a FuncExpr node, when the function name can be expected+ * to be to the left of them? There are a couple of reasons. The grammar+ * sometimes builds expressions that aren't quite what the user wrote;+ * for instance x IS NOT BETWEEN ... becomes a NOT-expression whose keyword+ * pointer is to the right of its leftmost argument. Also, nodes that were+ * inserted implicitly by parse analysis (such as FuncExprs for implicit+ * coercions) will have location -1, and so we can have odd combinations of+ * known and unknown locations in a tree.+ */+int+exprLocation(const Node *expr)+{+ int loc;++ if (expr == NULL)+ return -1;+ switch (nodeTag(expr))+ {+ case T_RangeVar:+ loc = ((const RangeVar *) expr)->location;+ break;+ case T_Var:+ loc = ((const Var *) expr)->location;+ break;+ case T_Const:+ loc = ((const Const *) expr)->location;+ break;+ case T_Param:+ loc = ((const Param *) expr)->location;+ break;+ case T_Aggref:+ /* function name should always be the first thing */+ loc = ((const Aggref *) expr)->location;+ break;+ case T_GroupingFunc:+ loc = ((const GroupingFunc *) expr)->location;+ break;+ case T_WindowFunc:+ /* function name should always be the first thing */+ loc = ((const WindowFunc *) expr)->location;+ break;+ case T_ArrayRef:+ /* just use array argument's location */+ loc = exprLocation((Node *) ((const ArrayRef *) expr)->refexpr);+ break;+ case T_FuncExpr:+ {+ const FuncExpr *fexpr = (const FuncExpr *) expr;++ /* consider both function name and leftmost arg */+ loc = leftmostLoc(fexpr->location,+ exprLocation((Node *) fexpr->args));+ }+ break;+ case T_NamedArgExpr:+ {+ const NamedArgExpr *na = (const NamedArgExpr *) expr;++ /* consider both argument name and value */+ loc = leftmostLoc(na->location,+ exprLocation((Node *) na->arg));+ }+ break;+ case T_OpExpr:+ case T_DistinctExpr: /* struct-equivalent to OpExpr */+ case T_NullIfExpr: /* struct-equivalent to OpExpr */+ {+ const OpExpr *opexpr = (const OpExpr *) expr;++ /* consider both operator name and leftmost arg */+ loc = leftmostLoc(opexpr->location,+ exprLocation((Node *) opexpr->args));+ }+ break;+ case T_ScalarArrayOpExpr:+ {+ const ScalarArrayOpExpr *saopexpr = (const ScalarArrayOpExpr *) expr;++ /* consider both operator name and leftmost arg */+ loc = leftmostLoc(saopexpr->location,+ exprLocation((Node *) saopexpr->args));+ }+ break;+ case T_BoolExpr:+ {+ const BoolExpr *bexpr = (const BoolExpr *) expr;++ /*+ * Same as above, to handle either NOT or AND/OR. We can't+ * special-case NOT because of the way that it's used for+ * things like IS NOT BETWEEN.+ */+ loc = leftmostLoc(bexpr->location,+ exprLocation((Node *) bexpr->args));+ }+ break;+ case T_SubLink:+ {+ const SubLink *sublink = (const SubLink *) expr;++ /* check the testexpr, if any, and the operator/keyword */+ loc = leftmostLoc(exprLocation(sublink->testexpr),+ sublink->location);+ }+ break;+ case T_FieldSelect:+ /* just use argument's location */+ loc = exprLocation((Node *) ((const FieldSelect *) expr)->arg);+ break;+ case T_FieldStore:+ /* just use argument's location */+ loc = exprLocation((Node *) ((const FieldStore *) expr)->arg);+ break;+ case T_RelabelType:+ {+ const RelabelType *rexpr = (const RelabelType *) expr;++ /* Much as above */+ loc = leftmostLoc(rexpr->location,+ exprLocation((Node *) rexpr->arg));+ }+ break;+ case T_CoerceViaIO:+ {+ const CoerceViaIO *cexpr = (const CoerceViaIO *) expr;++ /* Much as above */+ loc = leftmostLoc(cexpr->location,+ exprLocation((Node *) cexpr->arg));+ }+ break;+ case T_ArrayCoerceExpr:+ {+ const ArrayCoerceExpr *cexpr = (const ArrayCoerceExpr *) expr;++ /* Much as above */+ loc = leftmostLoc(cexpr->location,+ exprLocation((Node *) cexpr->arg));+ }+ break;+ case T_ConvertRowtypeExpr:+ {+ const ConvertRowtypeExpr *cexpr = (const ConvertRowtypeExpr *) expr;++ /* Much as above */+ loc = leftmostLoc(cexpr->location,+ exprLocation((Node *) cexpr->arg));+ }+ break;+ case T_CollateExpr:+ /* just use argument's location */+ loc = exprLocation((Node *) ((const CollateExpr *) expr)->arg);+ break;+ case T_CaseExpr:+ /* CASE keyword should always be the first thing */+ loc = ((const CaseExpr *) expr)->location;+ break;+ case T_CaseWhen:+ /* WHEN keyword should always be the first thing */+ loc = ((const CaseWhen *) expr)->location;+ break;+ case T_ArrayExpr:+ /* the location points at ARRAY or [, which must be leftmost */+ loc = ((const ArrayExpr *) expr)->location;+ break;+ case T_RowExpr:+ /* the location points at ROW or (, which must be leftmost */+ loc = ((const RowExpr *) expr)->location;+ break;+ case T_RowCompareExpr:+ /* just use leftmost argument's location */+ loc = exprLocation((Node *) ((const RowCompareExpr *) expr)->largs);+ break;+ case T_CoalesceExpr:+ /* COALESCE keyword should always be the first thing */+ loc = ((const CoalesceExpr *) expr)->location;+ break;+ case T_MinMaxExpr:+ /* GREATEST/LEAST keyword should always be the first thing */+ loc = ((const MinMaxExpr *) expr)->location;+ break;+ case T_XmlExpr:+ {+ const XmlExpr *xexpr = (const XmlExpr *) expr;++ /* consider both function name and leftmost arg */+ loc = leftmostLoc(xexpr->location,+ exprLocation((Node *) xexpr->args));+ }+ break;+ case T_NullTest:+ {+ const NullTest *nexpr = (const NullTest *) expr;++ /* Much as above */+ loc = leftmostLoc(nexpr->location,+ exprLocation((Node *) nexpr->arg));+ }+ break;+ case T_BooleanTest:+ {+ const BooleanTest *bexpr = (const BooleanTest *) expr;++ /* Much as above */+ loc = leftmostLoc(bexpr->location,+ exprLocation((Node *) bexpr->arg));+ }+ break;+ case T_CoerceToDomain:+ {+ const CoerceToDomain *cexpr = (const CoerceToDomain *) expr;++ /* Much as above */+ loc = leftmostLoc(cexpr->location,+ exprLocation((Node *) cexpr->arg));+ }+ break;+ case T_CoerceToDomainValue:+ loc = ((const CoerceToDomainValue *) expr)->location;+ break;+ case T_SetToDefault:+ loc = ((const SetToDefault *) expr)->location;+ break;+ case T_TargetEntry:+ /* just use argument's location */+ loc = exprLocation((Node *) ((const TargetEntry *) expr)->expr);+ break;+ case T_IntoClause:+ /* use the contained RangeVar's location --- close enough */+ loc = exprLocation((Node *) ((const IntoClause *) expr)->rel);+ break;+ case T_List:+ {+ /* report location of first list member that has a location */+ ListCell *lc;++ loc = -1; /* just to suppress compiler warning */+ foreach(lc, (const List *) expr)+ {+ loc = exprLocation((Node *) lfirst(lc));+ if (loc >= 0)+ break;+ }+ }+ break;+ case T_A_Expr:+ {+ const A_Expr *aexpr = (const A_Expr *) expr;++ /* use leftmost of operator or left operand (if any) */+ /* we assume right operand can't be to left of operator */+ loc = leftmostLoc(aexpr->location,+ exprLocation(aexpr->lexpr));+ }+ break;+ case T_ColumnRef:+ loc = ((const ColumnRef *) expr)->location;+ break;+ case T_ParamRef:+ loc = ((const ParamRef *) expr)->location;+ break;+ case T_A_Const:+ loc = ((const A_Const *) expr)->location;+ break;+ case T_FuncCall:+ {+ const FuncCall *fc = (const FuncCall *) expr;++ /* consider both function name and leftmost arg */+ /* (we assume any ORDER BY nodes must be to right of name) */+ loc = leftmostLoc(fc->location,+ exprLocation((Node *) fc->args));+ }+ break;+ case T_A_ArrayExpr:+ /* the location points at ARRAY or [, which must be leftmost */+ loc = ((const A_ArrayExpr *) expr)->location;+ break;+ case T_ResTarget:+ /* we need not examine the contained expression (if any) */+ loc = ((const ResTarget *) expr)->location;+ break;+ case T_MultiAssignRef:+ loc = exprLocation(((const MultiAssignRef *) expr)->source);+ break;+ case T_TypeCast:+ {+ const TypeCast *tc = (const TypeCast *) expr;++ /*+ * This could represent CAST(), ::, or TypeName 'literal', so+ * any of the components might be leftmost.+ */+ loc = exprLocation(tc->arg);+ loc = leftmostLoc(loc, tc->typeName->location);+ loc = leftmostLoc(loc, tc->location);+ }+ break;+ case T_CollateClause:+ /* just use argument's location */+ loc = exprLocation(((const CollateClause *) expr)->arg);+ break;+ case T_SortBy:+ /* just use argument's location (ignore operator, if any) */+ loc = exprLocation(((const SortBy *) expr)->node);+ break;+ case T_WindowDef:+ loc = ((const WindowDef *) expr)->location;+ break;+ case T_RangeTableSample:+ loc = ((const RangeTableSample *) expr)->location;+ break;+ case T_TypeName:+ loc = ((const TypeName *) expr)->location;+ break;+ case T_ColumnDef:+ loc = ((const ColumnDef *) expr)->location;+ break;+ case T_Constraint:+ loc = ((const Constraint *) expr)->location;+ break;+ case T_FunctionParameter:+ /* just use typename's location */+ loc = exprLocation((Node *) ((const FunctionParameter *) expr)->argType);+ break;+ case T_XmlSerialize:+ /* XMLSERIALIZE keyword should always be the first thing */+ loc = ((const XmlSerialize *) expr)->location;+ break;+ case T_GroupingSet:+ loc = ((const GroupingSet *) expr)->location;+ break;+ case T_WithClause:+ loc = ((const WithClause *) expr)->location;+ break;+ case T_InferClause:+ loc = ((const InferClause *) expr)->location;+ break;+ case T_OnConflictClause:+ loc = ((const OnConflictClause *) expr)->location;+ break;+ case T_CommonTableExpr:+ loc = ((const CommonTableExpr *) expr)->location;+ break;+ case T_PlaceHolderVar:+ /* just use argument's location */+ loc = exprLocation((Node *) ((const PlaceHolderVar *) expr)->phexpr);+ break;+ case T_InferenceElem:+ /* just use nested expr's location */+ loc = exprLocation((Node *) ((const InferenceElem *) expr)->expr);+ break;+ default:+ /* for any other node type it's just unknown... */+ loc = -1;+ break;+ }+ return loc;+}++/*+ * leftmostLoc - support for exprLocation+ *+ * Take the minimum of two parse location values, but ignore unknowns+ */+static int+leftmostLoc(int loc1, int loc2)+{+ if (loc1 < 0)+ return loc2;+ else if (loc2 < 0)+ return loc1;+ else+ return Min(loc1, loc2);+}+++/*+ * Standard expression-tree walking support+ *+ * We used to have near-duplicate code in many different routines that+ * understood how to recurse through an expression node tree. That was+ * a pain to maintain, and we frequently had bugs due to some particular+ * routine neglecting to support a particular node type. In most cases,+ * these routines only actually care about certain node types, and don't+ * care about other types except insofar as they have to recurse through+ * non-primitive node types. Therefore, we now provide generic tree-walking+ * logic to consolidate the redundant "boilerplate" code. There are+ * two versions: expression_tree_walker() and expression_tree_mutator().+ */++/*+ * expression_tree_walker() is designed to support routines that traverse+ * a tree in a read-only fashion (although it will also work for routines+ * that modify nodes in-place but never add/delete/replace nodes).+ * A walker routine should look like this:+ *+ * bool my_walker (Node *node, my_struct *context)+ * {+ * if (node == NULL)+ * return false;+ * // check for nodes that special work is required for, eg:+ * if (IsA(node, Var))+ * {+ * ... do special actions for Var nodes+ * }+ * else if (IsA(node, ...))+ * {+ * ... do special actions for other node types+ * }+ * // for any node type not specially processed, do:+ * return expression_tree_walker(node, my_walker, (void *) context);+ * }+ *+ * The "context" argument points to a struct that holds whatever context+ * information the walker routine needs --- it can be used to return data+ * gathered by the walker, too. This argument is not touched by+ * expression_tree_walker, but it is passed down to recursive sub-invocations+ * of my_walker. The tree walk is started from a setup routine that+ * fills in the appropriate context struct, calls my_walker with the top-level+ * node of the tree, and then examines the results.+ *+ * The walker routine should return "false" to continue the tree walk, or+ * "true" to abort the walk and immediately return "true" to the top-level+ * caller. This can be used to short-circuit the traversal if the walker+ * has found what it came for. "false" is returned to the top-level caller+ * iff no invocation of the walker returned "true".+ *+ * The node types handled by expression_tree_walker include all those+ * normally found in target lists and qualifier clauses during the planning+ * stage. In particular, it handles List nodes since a cnf-ified qual clause+ * will have List structure at the top level, and it handles TargetEntry nodes+ * so that a scan of a target list can be handled without additional code.+ * Also, RangeTblRef, FromExpr, JoinExpr, and SetOperationStmt nodes are+ * handled, so that query jointrees and setOperation trees can be processed+ * without additional code.+ *+ * expression_tree_walker will handle SubLink nodes by recursing normally+ * into the "testexpr" subtree (which is an expression belonging to the outer+ * plan). It will also call the walker on the sub-Query node; however, when+ * expression_tree_walker itself is called on a Query node, it does nothing+ * and returns "false". The net effect is that unless the walker does+ * something special at a Query node, sub-selects will not be visited during+ * an expression tree walk. This is exactly the behavior wanted in many cases+ * --- and for those walkers that do want to recurse into sub-selects, special+ * behavior is typically needed anyway at the entry to a sub-select (such as+ * incrementing a depth counter). A walker that wants to examine sub-selects+ * should include code along the lines of:+ *+ * if (IsA(node, Query))+ * {+ * adjust context for subquery;+ * result = query_tree_walker((Query *) node, my_walker, context,+ * 0); // adjust flags as needed+ * restore context if needed;+ * return result;+ * }+ *+ * query_tree_walker is a convenience routine (see below) that calls the+ * walker on all the expression subtrees of the given Query node.+ *+ * expression_tree_walker will handle SubPlan nodes by recursing normally+ * into the "testexpr" and the "args" list (which are expressions belonging to+ * the outer plan). It will not touch the completed subplan, however. Since+ * there is no link to the original Query, it is not possible to recurse into+ * subselects of an already-planned expression tree. This is OK for current+ * uses, but may need to be revisited in future.+ */++++/*+ * query_tree_walker --- initiate a walk of a Query's expressions+ *+ * This routine exists just to reduce the number of places that need to know+ * where all the expression subtrees of a Query are. Note it can be used+ * for starting a walk at top level of a Query regardless of whether the+ * walker intends to descend into subqueries. It is also useful for+ * descending into subqueries within a walker.+ *+ * Some callers want to suppress visitation of certain items in the sub-Query,+ * typically because they need to process them specially, or don't actually+ * want to recurse into subqueries. This is supported by the flags argument,+ * which is the bitwise OR of flag values to suppress visitation of+ * indicated items. (More flag bits may be added as needed.)+ */+++/*+ * range_table_walker is just the part of query_tree_walker that scans+ * a query's rangetable. This is split out since it can be useful on+ * its own.+ */++++/*+ * expression_tree_mutator() is designed to support routines that make a+ * modified copy of an expression tree, with some nodes being added,+ * removed, or replaced by new subtrees. The original tree is (normally)+ * not changed. Each recursion level is responsible for returning a copy of+ * (or appropriately modified substitute for) the subtree it is handed.+ * A mutator routine should look like this:+ *+ * Node * my_mutator (Node *node, my_struct *context)+ * {+ * if (node == NULL)+ * return NULL;+ * // check for nodes that special work is required for, eg:+ * if (IsA(node, Var))+ * {+ * ... create and return modified copy of Var node+ * }+ * else if (IsA(node, ...))+ * {+ * ... do special transformations of other node types+ * }+ * // for any node type not specially processed, do:+ * return expression_tree_mutator(node, my_mutator, (void *) context);+ * }+ *+ * The "context" argument points to a struct that holds whatever context+ * information the mutator routine needs --- it can be used to return extra+ * data gathered by the mutator, too. This argument is not touched by+ * expression_tree_mutator, but it is passed down to recursive sub-invocations+ * of my_mutator. The tree walk is started from a setup routine that+ * fills in the appropriate context struct, calls my_mutator with the+ * top-level node of the tree, and does any required post-processing.+ *+ * Each level of recursion must return an appropriately modified Node.+ * If expression_tree_mutator() is called, it will make an exact copy+ * of the given Node, but invoke my_mutator() to copy the sub-node(s)+ * of that Node. In this way, my_mutator() has full control over the+ * copying process but need not directly deal with expression trees+ * that it has no interest in.+ *+ * Just as for expression_tree_walker, the node types handled by+ * expression_tree_mutator include all those normally found in target lists+ * and qualifier clauses during the planning stage.+ *+ * expression_tree_mutator will handle SubLink nodes by recursing normally+ * into the "testexpr" subtree (which is an expression belonging to the outer+ * plan). It will also call the mutator on the sub-Query node; however, when+ * expression_tree_mutator itself is called on a Query node, it does nothing+ * and returns the unmodified Query node. The net effect is that unless the+ * mutator does something special at a Query node, sub-selects will not be+ * visited or modified; the original sub-select will be linked to by the new+ * SubLink node. Mutators that want to descend into sub-selects will usually+ * do so by recognizing Query nodes and calling query_tree_mutator (below).+ *+ * expression_tree_mutator will handle a SubPlan node by recursing into the+ * "testexpr" and the "args" list (which belong to the outer plan), but it+ * will simply copy the link to the inner plan, since that's typically what+ * expression tree mutators want. A mutator that wants to modify the subplan+ * can force appropriate behavior by recognizing SubPlan expression nodes+ * and doing the right thing.+ */++#define FLATCOPY(newnode, node, nodetype) \+ ( (newnode) = (nodetype *) palloc(sizeof(nodetype)), \+ memcpy((newnode), (node), sizeof(nodetype)) )+#define CHECKFLATCOPY(newnode, node, nodetype) \+ ( AssertMacro(IsA((node), nodetype)), \+ (newnode) = (nodetype *) palloc(sizeof(nodetype)), \+ memcpy((newnode), (node), sizeof(nodetype)) )+#define MUTATE(newfield, oldfield, fieldtype) \+ ( (newfield) = (fieldtype) mutator((Node *) (oldfield), context) )+++/*+ * query_tree_mutator --- initiate modification of a Query's expressions+ *+ * This routine exists just to reduce the number of places that need to know+ * where all the expression subtrees of a Query are. Note it can be used+ * for starting a walk at top level of a Query regardless of whether the+ * mutator intends to descend into subqueries. It is also useful for+ * descending into subqueries within a mutator.+ *+ * Some callers want to suppress mutating of certain items in the Query,+ * typically because they need to process them specially, or don't actually+ * want to recurse into subqueries. This is supported by the flags argument,+ * which is the bitwise OR of flag values to suppress mutating of+ * indicated items. (More flag bits may be added as needed.)+ *+ * Normally the Query node itself is copied, but some callers want it to be+ * modified in-place; they must pass QTW_DONT_COPY_QUERY in flags. All+ * modified substructure is safely copied in any case.+ */+++/*+ * range_table_mutator is just the part of query_tree_mutator that processes+ * a query's rangetable. This is split out since it can be useful on+ * its own.+ */+++/*+ * query_or_expression_tree_walker --- hybrid form+ *+ * This routine will invoke query_tree_walker if called on a Query node,+ * else will invoke the walker directly. This is a useful way of starting+ * the recursion when the walker's normal change of state is not appropriate+ * for the outermost Query node.+ */+++/*+ * query_or_expression_tree_mutator --- hybrid form+ *+ * This routine will invoke query_tree_mutator if called on a Query node,+ * else will invoke the mutator directly. This is a useful way of starting+ * the recursion when the mutator's normal change of state is not appropriate+ * for the outermost Query node.+ */++++/*+ * raw_expression_tree_walker --- walk raw parse trees+ *+ * This has exactly the same API as expression_tree_walker, but instead of+ * walking post-analysis parse trees, it knows how to walk the node types+ * found in raw grammar output. (There is not currently any need for a+ * combined walker, so we keep them separate in the name of efficiency.)+ * Unlike expression_tree_walker, there is no special rule about query+ * boundaries: we descend to everything that's possibly interesting.+ *+ * Currently, the node type coverage extends to SelectStmt and everything+ * that could appear under it, but not other statement types.+ */+bool+raw_expression_tree_walker(Node *node,+ bool (*walker) (),+ void *context)+{+ ListCell *temp;++ /*+ * The walker has already visited the current node, and so we need only+ * recurse into any sub-nodes it has.+ */+ if (node == NULL)+ return false;++ /* Guard against stack overflow due to overly complex expressions */+ check_stack_depth();++ switch (nodeTag(node))+ {+ case T_SetToDefault:+ case T_CurrentOfExpr:+ case T_Integer:+ case T_Float:+ case T_String:+ case T_BitString:+ case T_Null:+ case T_ParamRef:+ case T_A_Const:+ case T_A_Star:+ /* primitive node types with no subnodes */+ break;+ case T_Alias:+ /* we assume the colnames list isn't interesting */+ break;+ case T_RangeVar:+ return walker(((RangeVar *) node)->alias, context);+ case T_GroupingFunc:+ return walker(((GroupingFunc *) node)->args, context);+ case T_SubLink:+ {+ SubLink *sublink = (SubLink *) node;++ if (walker(sublink->testexpr, context))+ return true;+ /* we assume the operName is not interesting */+ if (walker(sublink->subselect, context))+ return true;+ }+ break;+ case T_CaseExpr:+ {+ CaseExpr *caseexpr = (CaseExpr *) node;++ if (walker(caseexpr->arg, context))+ return true;+ /* we assume walker doesn't care about CaseWhens, either */+ foreach(temp, caseexpr->args)+ {+ CaseWhen *when = (CaseWhen *) lfirst(temp);++ Assert(IsA(when, CaseWhen));+ if (walker(when->expr, context))+ return true;+ if (walker(when->result, context))+ return true;+ }+ if (walker(caseexpr->defresult, context))+ return true;+ }+ break;+ case T_RowExpr:+ /* Assume colnames isn't interesting */+ return walker(((RowExpr *) node)->args, context);+ case T_CoalesceExpr:+ return walker(((CoalesceExpr *) node)->args, context);+ case T_MinMaxExpr:+ return walker(((MinMaxExpr *) node)->args, context);+ case T_XmlExpr:+ {+ XmlExpr *xexpr = (XmlExpr *) node;++ if (walker(xexpr->named_args, context))+ return true;+ /* we assume walker doesn't care about arg_names */+ if (walker(xexpr->args, context))+ return true;+ }+ break;+ case T_NullTest:+ return walker(((NullTest *) node)->arg, context);+ case T_BooleanTest:+ return walker(((BooleanTest *) node)->arg, context);+ case T_JoinExpr:+ {+ JoinExpr *join = (JoinExpr *) node;++ if (walker(join->larg, context))+ return true;+ if (walker(join->rarg, context))+ return true;+ if (walker(join->quals, context))+ return true;+ if (walker(join->alias, context))+ return true;+ /* using list is deemed uninteresting */+ }+ break;+ case T_IntoClause:+ {+ IntoClause *into = (IntoClause *) node;++ if (walker(into->rel, context))+ return true;+ /* colNames, options are deemed uninteresting */+ /* viewQuery should be null in raw parsetree, but check it */+ if (walker(into->viewQuery, context))+ return true;+ }+ break;+ case T_List:+ foreach(temp, (List *) node)+ {+ if (walker((Node *) lfirst(temp), context))+ return true;+ }+ break;+ case T_InsertStmt:+ {+ InsertStmt *stmt = (InsertStmt *) node;++ if (walker(stmt->relation, context))+ return true;+ if (walker(stmt->cols, context))+ return true;+ if (walker(stmt->selectStmt, context))+ return true;+ if (walker(stmt->onConflictClause, context))+ return true;+ if (walker(stmt->returningList, context))+ return true;+ if (walker(stmt->withClause, context))+ return true;+ }+ break;+ case T_DeleteStmt:+ {+ DeleteStmt *stmt = (DeleteStmt *) node;++ if (walker(stmt->relation, context))+ return true;+ if (walker(stmt->usingClause, context))+ return true;+ if (walker(stmt->whereClause, context))+ return true;+ if (walker(stmt->returningList, context))+ return true;+ if (walker(stmt->withClause, context))+ return true;+ }+ break;+ case T_UpdateStmt:+ {+ UpdateStmt *stmt = (UpdateStmt *) node;++ if (walker(stmt->relation, context))+ return true;+ if (walker(stmt->targetList, context))+ return true;+ if (walker(stmt->whereClause, context))+ return true;+ if (walker(stmt->fromClause, context))+ return true;+ if (walker(stmt->returningList, context))+ return true;+ if (walker(stmt->withClause, context))+ return true;+ }+ break;+ case T_SelectStmt:+ {+ SelectStmt *stmt = (SelectStmt *) node;++ if (walker(stmt->distinctClause, context))+ return true;+ if (walker(stmt->intoClause, context))+ return true;+ if (walker(stmt->targetList, context))+ return true;+ if (walker(stmt->fromClause, context))+ return true;+ if (walker(stmt->whereClause, context))+ return true;+ if (walker(stmt->groupClause, context))+ return true;+ if (walker(stmt->havingClause, context))+ return true;+ if (walker(stmt->windowClause, context))+ return true;+ if (walker(stmt->valuesLists, context))+ return true;+ if (walker(stmt->sortClause, context))+ return true;+ if (walker(stmt->limitOffset, context))+ return true;+ if (walker(stmt->limitCount, context))+ return true;+ if (walker(stmt->lockingClause, context))+ return true;+ if (walker(stmt->withClause, context))+ return true;+ if (walker(stmt->larg, context))+ return true;+ if (walker(stmt->rarg, context))+ return true;+ }+ break;+ case T_A_Expr:+ {+ A_Expr *expr = (A_Expr *) node;++ if (walker(expr->lexpr, context))+ return true;+ if (walker(expr->rexpr, context))+ return true;+ /* operator name is deemed uninteresting */+ }+ break;+ case T_BoolExpr:+ {+ BoolExpr *expr = (BoolExpr *) node;++ if (walker(expr->args, context))+ return true;+ }+ break;+ case T_ColumnRef:+ /* we assume the fields contain nothing interesting */+ break;+ case T_FuncCall:+ {+ FuncCall *fcall = (FuncCall *) node;++ if (walker(fcall->args, context))+ return true;+ if (walker(fcall->agg_order, context))+ return true;+ if (walker(fcall->agg_filter, context))+ return true;+ if (walker(fcall->over, context))+ return true;+ /* function name is deemed uninteresting */+ }+ break;+ case T_NamedArgExpr:+ return walker(((NamedArgExpr *) node)->arg, context);+ case T_A_Indices:+ {+ A_Indices *indices = (A_Indices *) node;++ if (walker(indices->lidx, context))+ return true;+ if (walker(indices->uidx, context))+ return true;+ }+ break;+ case T_A_Indirection:+ {+ A_Indirection *indir = (A_Indirection *) node;++ if (walker(indir->arg, context))+ return true;+ if (walker(indir->indirection, context))+ return true;+ }+ break;+ case T_A_ArrayExpr:+ return walker(((A_ArrayExpr *) node)->elements, context);+ case T_ResTarget:+ {+ ResTarget *rt = (ResTarget *) node;++ if (walker(rt->indirection, context))+ return true;+ if (walker(rt->val, context))+ return true;+ }+ break;+ case T_MultiAssignRef:+ return walker(((MultiAssignRef *) node)->source, context);+ case T_TypeCast:+ {+ TypeCast *tc = (TypeCast *) node;++ if (walker(tc->arg, context))+ return true;+ if (walker(tc->typeName, context))+ return true;+ }+ break;+ case T_CollateClause:+ return walker(((CollateClause *) node)->arg, context);+ case T_SortBy:+ return walker(((SortBy *) node)->node, context);+ case T_WindowDef:+ {+ WindowDef *wd = (WindowDef *) node;++ if (walker(wd->partitionClause, context))+ return true;+ if (walker(wd->orderClause, context))+ return true;+ if (walker(wd->startOffset, context))+ return true;+ if (walker(wd->endOffset, context))+ return true;+ }+ break;+ case T_RangeSubselect:+ {+ RangeSubselect *rs = (RangeSubselect *) node;++ if (walker(rs->subquery, context))+ return true;+ if (walker(rs->alias, context))+ return true;+ }+ break;+ case T_RangeFunction:+ {+ RangeFunction *rf = (RangeFunction *) node;++ if (walker(rf->functions, context))+ return true;+ if (walker(rf->alias, context))+ return true;+ if (walker(rf->coldeflist, context))+ return true;+ }+ break;+ case T_RangeTableSample:+ {+ RangeTableSample *rts = (RangeTableSample *) node;++ if (walker(rts->relation, context))+ return true;+ /* method name is deemed uninteresting */+ if (walker(rts->args, context))+ return true;+ if (walker(rts->repeatable, context))+ return true;+ }+ break;+ case T_TypeName:+ {+ TypeName *tn = (TypeName *) node;++ if (walker(tn->typmods, context))+ return true;+ if (walker(tn->arrayBounds, context))+ return true;+ /* type name itself is deemed uninteresting */+ }+ break;+ case T_ColumnDef:+ {+ ColumnDef *coldef = (ColumnDef *) node;++ if (walker(coldef->typeName, context))+ return true;+ if (walker(coldef->raw_default, context))+ return true;+ if (walker(coldef->collClause, context))+ return true;+ /* for now, constraints are ignored */+ }+ break;+ case T_GroupingSet:+ return walker(((GroupingSet *) node)->content, context);+ case T_LockingClause:+ return walker(((LockingClause *) node)->lockedRels, context);+ case T_XmlSerialize:+ {+ XmlSerialize *xs = (XmlSerialize *) node;++ if (walker(xs->expr, context))+ return true;+ if (walker(xs->typeName, context))+ return true;+ }+ break;+ case T_WithClause:+ return walker(((WithClause *) node)->ctes, context);+ case T_InferClause:+ {+ InferClause *stmt = (InferClause *) node;++ if (walker(stmt->indexElems, context))+ return true;+ if (walker(stmt->whereClause, context))+ return true;+ }+ break;+ case T_OnConflictClause:+ {+ OnConflictClause *stmt = (OnConflictClause *) node;++ if (walker(stmt->infer, context))+ return true;+ if (walker(stmt->targetList, context))+ return true;+ if (walker(stmt->whereClause, context))+ return true;+ }+ break;+ case T_CommonTableExpr:+ return walker(((CommonTableExpr *) node)->ctequery, context);+ default:+ elog(ERROR, "unrecognized node type: %d",+ (int) nodeTag(node));+ break;+ }+ return false;+}
+ foreign/libpg_query/src/postgres/src_backend_nodes_value.c view
@@ -0,0 +1,75 @@+/*--------------------------------------------------------------------+ * Symbols referenced in this file:+ * - makeInteger+ * - makeString+ * - makeFloat+ *--------------------------------------------------------------------+ */++/*-------------------------------------------------------------------------+ *+ * value.c+ * implementation of Value nodes+ *+ *+ * Copyright (c) 2003-2015, PostgreSQL Global Development Group+ *+ *+ * IDENTIFICATION+ * src/backend/nodes/value.c+ *+ *-------------------------------------------------------------------------+ */+#include "postgres.h"++#include "nodes/parsenodes.h"++/*+ * makeInteger+ */+Value *+makeInteger(long i)+{+ Value *v = makeNode(Value);++ v->type = T_Integer;+ v->val.ival = i;+ return v;+}++/*+ * makeFloat+ *+ * Caller is responsible for passing a palloc'd string.+ */+Value *+makeFloat(char *numericStr)+{+ Value *v = makeNode(Value);++ v->type = T_Float;+ v->val.str = numericStr;+ return v;+}++/*+ * makeString+ *+ * Caller is responsible for passing a palloc'd string.+ */+Value *+makeString(char *str)+{+ Value *v = makeNode(Value);++ v->type = T_String;+ v->val.str = str;+ return v;+}++/*+ * makeBitString+ *+ * Caller is responsible for passing a palloc'd string.+ */+
+ foreign/libpg_query/src/postgres/src_backend_parser_gram.c view
file too large to diff
+ foreign/libpg_query/src/postgres/src_backend_parser_keywords.c view
@@ -0,0 +1,34 @@+/*--------------------------------------------------------------------+ * Symbols referenced in this file:+ * - ScanKeywords+ * - NumScanKeywords+ *--------------------------------------------------------------------+ */++/*-------------------------------------------------------------------------+ *+ * keywords.c+ * lexical token lookup for key words in PostgreSQL+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ *+ * IDENTIFICATION+ * src/backend/parser/keywords.c+ *+ *-------------------------------------------------------------------------+ */+#include "postgres.h"++#include "parser/gramparse.h"++#define PG_KEYWORD(a,b,c) {a,b,c},+++const ScanKeyword ScanKeywords[] = {+#include "parser/kwlist.h"+};++const int NumScanKeywords = lengthof(ScanKeywords);
+ foreign/libpg_query/src/postgres/src_backend_parser_kwlookup.c view
@@ -0,0 +1,95 @@+/*--------------------------------------------------------------------+ * Symbols referenced in this file:+ * - ScanKeywordLookup+ *--------------------------------------------------------------------+ */++/*-------------------------------------------------------------------------+ *+ * kwlookup.c+ * lexical token lookup for key words in PostgreSQL+ *+ * NB - this file is also used by ECPG and several frontend programs in+ * src/bin/ including pg_dump and psql+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ *+ * IDENTIFICATION+ * src/backend/parser/kwlookup.c+ *+ *-------------------------------------------------------------------------+ */++/* use c.h so this can be built as either frontend or backend */+#include "c.h"++#include <ctype.h>++#include "parser/keywords.h"++/*+ * ScanKeywordLookup - see if a given word is a keyword+ *+ * Returns a pointer to the ScanKeyword table entry, or NULL if no match.+ *+ * The match is done case-insensitively. Note that we deliberately use a+ * dumbed-down case conversion that will only translate 'A'-'Z' into 'a'-'z',+ * even if we are in a locale where tolower() would produce more or different+ * translations. This is to conform to the SQL99 spec, which says that+ * keywords are to be matched in this way even though non-keyword identifiers+ * receive a different case-normalization mapping.+ */+const ScanKeyword *+ScanKeywordLookup(const char *text,+ const ScanKeyword *keywords,+ int num_keywords)+{+ int len,+ i;+ char word[NAMEDATALEN];+ const ScanKeyword *low;+ const ScanKeyword *high;++ len = strlen(text);+ /* We assume all keywords are shorter than NAMEDATALEN. */+ if (len >= NAMEDATALEN)+ return NULL;++ /*+ * Apply an ASCII-only downcasing. We must not use tolower() since it may+ * produce the wrong translation in some locales (eg, Turkish).+ */+ for (i = 0; i < len; i++)+ {+ char ch = text[i];++ if (ch >= 'A' && ch <= 'Z')+ ch += 'a' - 'A';+ word[i] = ch;+ }+ word[len] = '\0';++ /*+ * Now do a binary search using plain strcmp() comparison.+ */+ low = keywords;+ high = keywords + (num_keywords - 1);+ while (low <= high)+ {+ const ScanKeyword *middle;+ int difference;++ middle = low + (high - low) / 2;+ difference = strcmp(middle->name, word);+ if (difference == 0)+ return middle;+ else if (difference < 0)+ low = middle + 1;+ else+ high = middle - 1;+ }++ return NULL;+}
+ foreign/libpg_query/src/postgres/src_backend_parser_parse_expr.c view
@@ -0,0 +1,300 @@+/*--------------------------------------------------------------------+ * Symbols referenced in this file:+ * - operator_precedence_warning+ *--------------------------------------------------------------------+ */++/*-------------------------------------------------------------------------+ *+ * parse_expr.c+ * handle expressions in parser+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ *+ * IDENTIFICATION+ * src/backend/parser/parse_expr.c+ *+ *-------------------------------------------------------------------------+ */++#include "postgres.h"++#include "catalog/pg_type.h"+#include "commands/dbcommands.h"+#include "miscadmin.h"+#include "nodes/makefuncs.h"+#include "nodes/nodeFuncs.h"+#include "optimizer/tlist.h"+#include "optimizer/var.h"+#include "parser/analyze.h"+#include "parser/parse_clause.h"+#include "parser/parse_coerce.h"+#include "parser/parse_collate.h"+#include "parser/parse_expr.h"+#include "parser/parse_func.h"+#include "parser/parse_oper.h"+#include "parser/parse_relation.h"+#include "parser/parse_target.h"+#include "parser/parse_type.h"+#include "parser/parse_agg.h"+#include "utils/builtins.h"+#include "utils/lsyscache.h"+#include "utils/xml.h"+++/* GUC parameters */+__thread bool operator_precedence_warning = false;++++/*+ * Node-type groups for operator precedence warnings+ * We use zero for everything not otherwise classified+ */+#define PREC_GROUP_POSTFIX_IS 1 /* postfix IS tests (NullTest, etc) */+#define PREC_GROUP_INFIX_IS 2 /* infix IS (IS DISTINCT FROM, etc) */+#define PREC_GROUP_LESS 3 /* < > */+#define PREC_GROUP_EQUAL 4 /* = */+#define PREC_GROUP_LESS_EQUAL 5 /* <= >= <> */+#define PREC_GROUP_LIKE 6 /* LIKE ILIKE SIMILAR */+#define PREC_GROUP_BETWEEN 7 /* BETWEEN */+#define PREC_GROUP_IN 8 /* IN */+#define PREC_GROUP_NOT_LIKE 9 /* NOT LIKE/ILIKE/SIMILAR */+#define PREC_GROUP_NOT_BETWEEN 10 /* NOT BETWEEN */+#define PREC_GROUP_NOT_IN 11 /* NOT IN */+#define PREC_GROUP_POSTFIX_OP 12 /* generic postfix operators */+#define PREC_GROUP_INFIX_OP 13 /* generic infix operators */+#define PREC_GROUP_PREFIX_OP 14 /* generic prefix operators */++/*+ * Map precedence groupings to old precedence ordering+ *+ * Old precedence order:+ * 1. NOT+ * 2. =+ * 3. < >+ * 4. LIKE ILIKE SIMILAR+ * 5. BETWEEN+ * 6. IN+ * 7. generic postfix Op+ * 8. generic Op, including <= => <>+ * 9. generic prefix Op+ * 10. IS tests (NullTest, BooleanTest, etc)+ *+ * NOT BETWEEN etc map to BETWEEN etc when considered as being on the left,+ * but to NOT when considered as being on the right, because of the buggy+ * precedence handling of those productions in the old grammar.+ */++++static Node *transformExprRecurse(ParseState *pstate, Node *expr);+static Node *transformParamRef(ParseState *pstate, ParamRef *pref);+static Node *transformAExprOp(ParseState *pstate, A_Expr *a);+static Node *transformAExprOpAny(ParseState *pstate, A_Expr *a);+static Node *transformAExprOpAll(ParseState *pstate, A_Expr *a);+static Node *transformAExprDistinct(ParseState *pstate, A_Expr *a);+static Node *transformAExprNullIf(ParseState *pstate, A_Expr *a);+static Node *transformAExprOf(ParseState *pstate, A_Expr *a);+static Node *transformAExprIn(ParseState *pstate, A_Expr *a);+static Node *transformAExprBetween(ParseState *pstate, A_Expr *a);+static Node *transformBoolExpr(ParseState *pstate, BoolExpr *a);+static Node *transformFuncCall(ParseState *pstate, FuncCall *fn);+static Node *transformMultiAssignRef(ParseState *pstate, MultiAssignRef *maref);+static Node *transformCaseExpr(ParseState *pstate, CaseExpr *c);+static Node *transformSubLink(ParseState *pstate, SubLink *sublink);+static Node *transformArrayExpr(ParseState *pstate, A_ArrayExpr *a,+ Oid array_type, Oid element_type, int32 typmod);+static Node *transformRowExpr(ParseState *pstate, RowExpr *r);+static Node *transformCoalesceExpr(ParseState *pstate, CoalesceExpr *c);+static Node *transformMinMaxExpr(ParseState *pstate, MinMaxExpr *m);+static Node *transformXmlExpr(ParseState *pstate, XmlExpr *x);+static Node *transformXmlSerialize(ParseState *pstate, XmlSerialize *xs);+static Node *transformBooleanTest(ParseState *pstate, BooleanTest *b);+static Node *transformCurrentOfExpr(ParseState *pstate, CurrentOfExpr *cexpr);+static Node *transformColumnRef(ParseState *pstate, ColumnRef *cref);+static Node *transformWholeRowRef(ParseState *pstate, RangeTblEntry *rte,+ int location);+static Node *transformIndirection(ParseState *pstate, Node *basenode,+ List *indirection);+static Node *transformTypeCast(ParseState *pstate, TypeCast *tc);+static Node *transformCollateClause(ParseState *pstate, CollateClause *c);+static Node *make_row_comparison_op(ParseState *pstate, List *opname,+ List *largs, List *rargs, int location);+static Node *make_row_distinct_op(ParseState *pstate, List *opname,+ RowExpr *lrow, RowExpr *rrow, int location);+static Expr *make_distinct_op(ParseState *pstate, List *opname,+ Node *ltree, Node *rtree, int location);+static int operator_precedence_group(Node *node, const char **nodename);+static void emit_precedence_warnings(ParseState *pstate,+ int opgroup, const char *opname,+ Node *lchild, Node *rchild,+ int location);+++/*+ * transformExpr -+ * Analyze and transform expressions. Type checking and type casting is+ * done here. This processing converts the raw grammar output into+ * expression trees with fully determined semantics.+ */+++++/*+ * helper routine for delivering "column does not exist" error message+ *+ * (Usually we don't have to work this hard, but the general case of field+ * selection from an arbitrary node needs it.)+ */+++++/*+ * Transform a ColumnRef.+ *+ * If you find yourself changing this code, see also ExpandColumnRefStar.+ */+++++/* Test whether an a_expr is a plain NULL constant or not */+++++++++++++/*+ * Checking an expression for match to a list of type names. Will result+ * in a boolean constant node.+ */+++++++++++++++++/*+ * transformArrayExpr+ *+ * If the caller specifies the target type, the resulting array will+ * be of exactly that type. Otherwise we try to infer a common type+ * for the elements using select_common_type().+ */+++++++++++++++++/*+ * Construct a whole-row reference to represent the notation "relation.*".+ */+++/*+ * Handle an explicit CAST construct.+ *+ * Transform the argument, look up the type name, and apply any necessary+ * coercion function(s).+ */+++/*+ * Handle an explicit COLLATE clause.+ *+ * Transform the argument, and look up the collation name.+ */+++/*+ * Transform a "row compare-op row" construct+ *+ * The inputs are lists of already-transformed expressions.+ * As with coerce_type, pstate may be NULL if no special unknown-Param+ * processing is wanted.+ *+ * The output may be a single OpExpr, an AND or OR combination of OpExprs,+ * or a RowCompareExpr. In all cases it is guaranteed to return boolean.+ * The AND, OR, and RowCompareExpr cases further imply things about the+ * behavior of the operators (ie, they behave as =, <>, or < <= > >=).+ */+++/*+ * Transform a "row IS DISTINCT FROM row" construct+ *+ * The input RowExprs are already transformed+ */+++/*+ * make the node for an IS DISTINCT FROM operator+ */+++/*+ * Identify node's group for operator precedence warnings+ *+ * For items in nonzero groups, also return a suitable node name into *nodename+ *+ * Note: group zero is used for nodes that are higher or lower precedence+ * than everything that changed precedence; we need never issue warnings+ * related to such nodes.+ */+++/*+ * helper routine for delivering 9.4-to-9.5 operator precedence warnings+ *+ * opgroup/opname/location represent some parent node+ * lchild, rchild are its left and right children (either could be NULL)+ *+ * This should be called before transforming the child nodes, since if a+ * precedence-driven parsing change has occurred in a query that used to work,+ * it's quite possible that we'll get a semantic failure while analyzing the+ * child expression. We want to produce the warning before that happens.+ * In any case, operator_precedence_group() expects untransformed input.+ */+++/*+ * Produce a string identifying an expression by kind.+ *+ * Note: when practical, use a simple SQL keyword for the result. If that+ * doesn't work well, check call sites to see whether custom error message+ * strings are required.+ */+
+ foreign/libpg_query/src/postgres/src_backend_parser_parser.c view
@@ -0,0 +1,203 @@+/*--------------------------------------------------------------------+ * Symbols referenced in this file:+ * - raw_parser+ * - base_yylex+ * - raw_parser+ *--------------------------------------------------------------------+ */++/*-------------------------------------------------------------------------+ *+ * parser.c+ * Main entry point/driver for PostgreSQL grammar+ *+ * Note that the grammar is not allowed to perform any table access+ * (since we need to be able to do basic parsing even while inside an+ * aborted transaction). Therefore, the data structures returned by+ * the grammar are "raw" parsetrees that still need to be analyzed by+ * analyze.c and related files.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * IDENTIFICATION+ * src/backend/parser/parser.c+ *+ *-------------------------------------------------------------------------+ */++#include "postgres.h"++#include "parser/gramparse.h"+#include "parser/parser.h"+++/*+ * raw_parser+ * Given a query in string form, do lexical and grammatical analysis.+ *+ * Returns a list of raw (un-analyzed) parse trees.+ */+List *+raw_parser(const char *str)+{+ core_yyscan_t yyscanner;+ base_yy_extra_type yyextra;+ int yyresult;++ /* initialize the flex scanner */+ yyscanner = scanner_init(str, &yyextra.core_yy_extra,+ ScanKeywords, NumScanKeywords);++ /* base_yylex() only needs this much initialization */+ yyextra.have_lookahead = false;++ /* initialize the bison parser */+ parser_init(&yyextra);++ /* Parse! */+ yyresult = base_yyparse(yyscanner);++ /* Clean up (release memory) */+ scanner_finish(yyscanner);++ if (yyresult) /* error */+ return NIL;++ return yyextra.parsetree;+}+++/*+ * Intermediate filter between parser and core lexer (core_yylex in scan.l).+ *+ * This filter is needed because in some cases the standard SQL grammar+ * requires more than one token lookahead. We reduce these cases to one-token+ * lookahead by replacing tokens here, in order to keep the grammar LALR(1).+ *+ * Using a filter is simpler than trying to recognize multiword tokens+ * directly in scan.l, because we'd have to allow for comments between the+ * words. Furthermore it's not clear how to do that without re-introducing+ * scanner backtrack, which would cost more performance than this filter+ * layer does.+ *+ * The filter also provides a convenient place to translate between+ * the core_YYSTYPE and YYSTYPE representations (which are really the+ * same thing anyway, but notationally they're different).+ */+int+base_yylex(YYSTYPE *lvalp, YYLTYPE *llocp, core_yyscan_t yyscanner)+{+ base_yy_extra_type *yyextra = pg_yyget_extra(yyscanner);+ int cur_token;+ int next_token;+ int cur_token_length;+ YYLTYPE cur_yylloc;++ /* Get next token --- we might already have it */+ if (yyextra->have_lookahead)+ {+ cur_token = yyextra->lookahead_token;+ lvalp->core_yystype = yyextra->lookahead_yylval;+ *llocp = yyextra->lookahead_yylloc;+ *(yyextra->lookahead_end) = yyextra->lookahead_hold_char;+ yyextra->have_lookahead = false;+ }+ else+ cur_token = core_yylex(&(lvalp->core_yystype), llocp, yyscanner);++ /*+ * If this token isn't one that requires lookahead, just return it. If it+ * does, determine the token length. (We could get that via strlen(), but+ * since we have such a small set of possibilities, hardwiring seems+ * feasible and more efficient.)+ */+ switch (cur_token)+ {+ case NOT:+ cur_token_length = 3;+ break;+ case NULLS_P:+ cur_token_length = 5;+ break;+ case WITH:+ cur_token_length = 4;+ break;+ default:+ return cur_token;+ }++ /*+ * Identify end+1 of current token. core_yylex() has temporarily stored a+ * '\0' here, and will undo that when we call it again. We need to redo+ * it to fully revert the lookahead call for error reporting purposes.+ */+ yyextra->lookahead_end = yyextra->core_yy_extra.scanbuf ++ *llocp + cur_token_length;+ Assert(*(yyextra->lookahead_end) == '\0');++ /*+ * Save and restore *llocp around the call. It might look like we could+ * avoid this by just passing &lookahead_yylloc to core_yylex(), but that+ * does not work because flex actually holds onto the last-passed pointer+ * internally, and will use that for error reporting. We need any error+ * reports to point to the current token, not the next one.+ */+ cur_yylloc = *llocp;++ /* Get next token, saving outputs into lookahead variables */+ next_token = core_yylex(&(yyextra->lookahead_yylval), llocp, yyscanner);+ yyextra->lookahead_token = next_token;+ yyextra->lookahead_yylloc = *llocp;++ *llocp = cur_yylloc;++ /* Now revert the un-truncation of the current token */+ yyextra->lookahead_hold_char = *(yyextra->lookahead_end);+ *(yyextra->lookahead_end) = '\0';++ yyextra->have_lookahead = true;++ /* Replace cur_token if needed, based on lookahead */+ switch (cur_token)+ {+ case NOT:+ /* Replace NOT by NOT_LA if it's followed by BETWEEN, IN, etc */+ switch (next_token)+ {+ case BETWEEN:+ case IN_P:+ case LIKE:+ case ILIKE:+ case SIMILAR:+ cur_token = NOT_LA;+ break;+ }+ break;++ case NULLS_P:+ /* Replace NULLS_P by NULLS_LA if it's followed by FIRST or LAST */+ switch (next_token)+ {+ case FIRST_P:+ case LAST_P:+ cur_token = NULLS_LA;+ break;+ }+ break;++ case WITH:+ /* Replace WITH by WITH_LA if it's followed by TIME or ORDINALITY */+ switch (next_token)+ {+ case TIME:+ case ORDINALITY:+ cur_token = WITH_LA;+ break;+ }+ break;+ }++ return cur_token;+}
+ foreign/libpg_query/src/postgres/src_backend_parser_scansup.c view
@@ -0,0 +1,150 @@+/*--------------------------------------------------------------------+ * Symbols referenced in this file:+ * - truncate_identifier+ * - downcase_truncate_identifier+ * - scanner_isspace+ *--------------------------------------------------------------------+ */++/*-------------------------------------------------------------------------+ *+ * scansup.c+ * support routines for the lex/flex scanner, used by both the normal+ * backend as well as the bootstrap backend+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ *+ * IDENTIFICATION+ * src/backend/parser/scansup.c+ *+ *-------------------------------------------------------------------------+ */+#include "postgres.h"++#include <ctype.h>++#include "parser/scansup.h"+#include "mb/pg_wchar.h"+++/* ----------------+ * scanstr+ *+ * if the string passed in has escaped codes, map the escape codes to actual+ * chars+ *+ * the string returned is palloc'd and should eventually be pfree'd by the+ * caller!+ * ----------------+ */+++++/*+ * downcase_truncate_identifier() --- do appropriate downcasing and+ * truncation of an unquoted identifier. Optionally warn of truncation.+ *+ * Returns a palloc'd string containing the adjusted identifier.+ *+ * Note: in some usages the passed string is not null-terminated.+ *+ * Note: the API of this function is designed to allow for downcasing+ * transformations that increase the string length, but we don't yet+ * support that. If you want to implement it, you'll need to fix+ * SplitIdentifierString() in utils/adt/varlena.c.+ */+char *+downcase_truncate_identifier(const char *ident, int len, bool warn)+{+ char *result;+ int i;+ bool enc_is_single_byte;++ result = palloc(len + 1);+ enc_is_single_byte = pg_database_encoding_max_length() == 1;++ /*+ * SQL99 specifies Unicode-aware case normalization, which we don't yet+ * have the infrastructure for. Instead we use tolower() to provide a+ * locale-aware translation. However, there are some locales where this+ * is not right either (eg, Turkish may do strange things with 'i' and+ * 'I'). Our current compromise is to use tolower() for characters with+ * the high bit set, as long as they aren't part of a multi-byte+ * character, and use an ASCII-only downcasing for 7-bit characters.+ */+ for (i = 0; i < len; i++)+ {+ unsigned char ch = (unsigned char) ident[i];++ if (ch >= 'A' && ch <= 'Z')+ ch += 'a' - 'A';+ else if (enc_is_single_byte && IS_HIGHBIT_SET(ch) && isupper(ch))+ ch = tolower(ch);+ result[i] = (char) ch;+ }+ result[i] = '\0';++ if (i >= NAMEDATALEN)+ truncate_identifier(result, i, warn);++ return result;+}++/*+ * truncate_identifier() --- truncate an identifier to NAMEDATALEN-1 bytes.+ *+ * The given string is modified in-place, if necessary. A warning is+ * issued if requested.+ *+ * We require the caller to pass in the string length since this saves a+ * strlen() call in some common usages.+ */+void+truncate_identifier(char *ident, int len, bool warn)+{+ if (len >= NAMEDATALEN)+ {+ len = pg_mbcliplen(ident, len, NAMEDATALEN - 1);+ if (warn)+ {+ /*+ * We avoid using %.*s here because it can misbehave if the data+ * is not valid in what libc thinks is the prevailing encoding.+ */+ char buf[NAMEDATALEN];++ memcpy(buf, ident, len);+ buf[len] = '\0';+ ereport(NOTICE,+ (errcode(ERRCODE_NAME_TOO_LONG),+ errmsg("identifier \"%s\" will be truncated to \"%s\"",+ ident, buf)));+ }+ ident[len] = '\0';+ }+}++/*+ * scanner_isspace() --- return TRUE if flex scanner considers char whitespace+ *+ * This should be used instead of the potentially locale-dependent isspace()+ * function when it's important to match the lexer's behavior.+ *+ * In principle we might need similar functions for isalnum etc, but for the+ * moment only isspace seems needed.+ */+bool+scanner_isspace(char ch)+{+ /* This must match scan.l's list of {space} characters */+ if (ch == ' ' ||+ ch == '\t' ||+ ch == '\n' ||+ ch == '\r' ||+ ch == '\f')+ return true;+ return false;+}
+ foreign/libpg_query/src/postgres/src_backend_postmaster_postmaster.c view
@@ -0,0 +1,2081 @@+/*--------------------------------------------------------------------+ * Symbols referenced in this file:+ * - ClientAuthInProgress+ *--------------------------------------------------------------------+ */++/*-------------------------------------------------------------------------+ *+ * postmaster.c+ * This program acts as a clearing house for requests to the+ * POSTGRES system. Frontend programs send a startup message+ * to the Postmaster and the postmaster uses the info in the+ * message to setup a backend process.+ *+ * The postmaster also manages system-wide operations such as+ * startup and shutdown. The postmaster itself doesn't do those+ * operations, mind you --- it just forks off a subprocess to do them+ * at the right times. It also takes care of resetting the system+ * if a backend crashes.+ *+ * The postmaster process creates the shared memory and semaphore+ * pools during startup, but as a rule does not touch them itself.+ * In particular, it is not a member of the PGPROC array of backends+ * and so it cannot participate in lock-manager operations. Keeping+ * the postmaster away from shared memory operations makes it simpler+ * and more reliable. The postmaster is almost always able to recover+ * from crashes of individual backends by resetting shared memory;+ * if it did much with shared memory then it would be prone to crashing+ * along with the backends.+ *+ * When a request message is received, we now fork() immediately.+ * The child process performs authentication of the request, and+ * then becomes a backend if successful. This allows the auth code+ * to be written in a simple single-threaded style (as opposed to the+ * crufty "poor man's multitasking" code that used to be needed).+ * More importantly, it ensures that blockages in non-multithreaded+ * libraries like SSL or PAM cannot cause denial of service to other+ * clients.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ *+ * IDENTIFICATION+ * src/backend/postmaster/postmaster.c+ *+ * NOTES+ *+ * Initialization:+ * The Postmaster sets up shared memory data structures+ * for the backends.+ *+ * Synchronization:+ * The Postmaster shares memory with the backends but should avoid+ * touching shared memory, so as not to become stuck if a crashing+ * backend screws up locks or shared memory. Likewise, the Postmaster+ * should never block on messages from frontend clients.+ *+ * Garbage Collection:+ * The Postmaster cleans up after backends if they have an emergency+ * exit and/or core dump.+ *+ * Error Reporting:+ * Use write_stderr() only for reporting "interactive" errors+ * (essentially, bogus arguments on the command line). Once the+ * postmaster is launched, use ereport().+ *+ *-------------------------------------------------------------------------+ */++#include "postgres.h"++#include <unistd.h>+#include <signal.h>+#include <time.h>+#include <sys/wait.h>+#include <ctype.h>+#include <sys/stat.h>+#include <sys/socket.h>+#include <fcntl.h>+#include <sys/param.h>+#include <netinet/in.h>+#include <arpa/inet.h>+#include <netdb.h>+#include <limits.h>++#ifdef HAVE_SYS_SELECT_H+#include <sys/select.h>+#endif++#ifdef USE_BONJOUR+#include <dns_sd.h>+#endif++#ifdef HAVE_PTHREAD_IS_THREADED_NP+#include <pthread.h>+#endif++#include "access/transam.h"+#include "access/xlog.h"+#include "bootstrap/bootstrap.h"+#include "catalog/pg_control.h"+#include "lib/ilist.h"+#include "libpq/auth.h"+#include "libpq/ip.h"+#include "libpq/libpq.h"+#include "libpq/pqsignal.h"+#include "miscadmin.h"+#include "pg_getopt.h"+#include "pgstat.h"+#include "postmaster/autovacuum.h"+#include "postmaster/bgworker_internals.h"+#include "postmaster/fork_process.h"+#include "postmaster/pgarch.h"+#include "postmaster/postmaster.h"+#include "postmaster/syslogger.h"+#include "replication/walsender.h"+#include "storage/fd.h"+#include "storage/ipc.h"+#include "storage/pg_shmem.h"+#include "storage/pmsignal.h"+#include "storage/proc.h"+#include "tcop/tcopprot.h"+#include "utils/builtins.h"+#include "utils/datetime.h"+#include "utils/dynamic_loader.h"+#include "utils/memutils.h"+#include "utils/ps_status.h"+#include "utils/timeout.h"++#ifdef EXEC_BACKEND+#include "storage/spin.h"+#endif+++/*+ * Possible types of a backend. Beyond being the possible bkend_type values in+ * struct bkend, these are OR-able request flag bits for SignalSomeChildren()+ * and CountChildren().+ */+#define BACKEND_TYPE_NORMAL 0x0001 /* normal backend */+#define BACKEND_TYPE_AUTOVAC 0x0002 /* autovacuum worker process */+#define BACKEND_TYPE_WALSND 0x0004 /* walsender process */+#define BACKEND_TYPE_BGWORKER 0x0008 /* bgworker process */+#define BACKEND_TYPE_ALL 0x000F /* OR of all the above */++#define BACKEND_TYPE_WORKER (BACKEND_TYPE_AUTOVAC | BACKEND_TYPE_BGWORKER)++/*+ * List of active backends (or child processes anyway; we don't actually+ * know whether a given child has become a backend or is still in the+ * authorization phase). This is used mainly to keep track of how many+ * children we have and send them appropriate signals when necessary.+ *+ * "Special" children such as the startup, bgwriter and autovacuum launcher+ * tasks are not in this list. Autovacuum worker and walsender are in it.+ * Also, "dead_end" children are in it: these are children launched just for+ * the purpose of sending a friendly rejection message to a would-be client.+ * We must track them because they are attached to shared memory, but we know+ * they will never become live backends. dead_end children are not assigned a+ * PMChildSlot.+ *+ * Background workers are in this list, too.+ */+typedef struct bkend+{+ pid_t pid; /* process id of backend */+ long cancel_key; /* cancel key for cancels for this backend */+ int child_slot; /* PMChildSlot for this backend, if any */++ /*+ * Flavor of backend or auxiliary process. Note that BACKEND_TYPE_WALSND+ * backends initially announce themselves as BACKEND_TYPE_NORMAL, so if+ * bkend_type is normal, you should check for a recent transition.+ */+ int bkend_type;+ bool dead_end; /* is it going to send an error and quit? */+ bool bgworker_notify; /* gets bgworker start/stop notifications */+ dlist_node elem; /* list link in BackendList */+} Backend;++++#ifdef EXEC_BACKEND+static Backend *ShmemBackendArray;+#endif++++++/* The socket number we are listening for connections on */+++/* The directory names for Unix socket(s) */+++/* The TCP listen address(es) */+++/*+ * ReservedBackends is the number of backends reserved for superuser use.+ * This number is taken out of the pool size given by MaxBackends so+ * number of backend slots available to non-superusers is+ * (MaxBackends - ReservedBackends). Note what this really means is+ * "if there are <= ReservedBackends connections available, only superusers+ * can make new connections" --- pre-existing superuser connections don't+ * count against the limit.+ */+++/* The socket(s) we're listening to. */+#define MAXLISTEN 64+++/*+ * Set by the -o option+ */+++/*+ * These globals control the behavior of the postmaster in case some+ * backend dumps core. Normally, it kills all peers of the dead backend+ * and reinitializes shared memory. By specifying -s or -n, we can have+ * the postmaster stop (rather than kill) peers and not reinitialize+ * shared data structures. (Reinit is currently dead code, though.)+ */++++/* still more option variables */++++++ /* for ps display and logging */++++++++/* PIDs of special child processes; 0 when not running */+++++++++++/* Startup process's status */+typedef enum+{+ STARTUP_NOT_RUNNING,+ STARTUP_RUNNING,+ STARTUP_SIGNALED, /* we sent it a SIGQUIT or SIGKILL */+ STARTUP_CRASHED+} StartupStatusEnum;++++/* Startup/shutdown state */+#define NoShutdown 0+#define SmartShutdown 1+#define FastShutdown 2+#define ImmediateShutdown 3++++ /* T if recovering from backend crash */++/*+ * We use a simple state machine to control startup, shutdown, and+ * crash recovery (which is rather like shutdown followed by startup).+ *+ * After doing all the postmaster initialization work, we enter PM_STARTUP+ * state and the startup process is launched. The startup process begins by+ * reading the control file and other preliminary initialization steps.+ * In a normal startup, or after crash recovery, the startup process exits+ * with exit code 0 and we switch to PM_RUN state. However, archive recovery+ * is handled specially since it takes much longer and we would like to support+ * hot standby during archive recovery.+ *+ * When the startup process is ready to start archive recovery, it signals the+ * postmaster, and we switch to PM_RECOVERY state. The background writer and+ * checkpointer are launched, while the startup process continues applying WAL.+ * If Hot Standby is enabled, then, after reaching a consistent point in WAL+ * redo, startup process signals us again, and we switch to PM_HOT_STANDBY+ * state and begin accepting connections to perform read-only queries. When+ * archive recovery is finished, the startup process exits with exit code 0+ * and we switch to PM_RUN state.+ *+ * Normal child backends can only be launched when we are in PM_RUN or+ * PM_HOT_STANDBY state. (We also allow launch of normal+ * child backends in PM_WAIT_BACKUP state, but only for superusers.)+ * In other states we handle connection requests by launching "dead_end"+ * child processes, which will simply send the client an error message and+ * quit. (We track these in the BackendList so that we can know when they+ * are all gone; this is important because they're still connected to shared+ * memory, and would interfere with an attempt to destroy the shmem segment,+ * possibly leading to SHMALL failure when we try to make a new one.)+ * In PM_WAIT_DEAD_END state we are waiting for all the dead_end children+ * to drain out of the system, and therefore stop accepting connection+ * requests at all until the last existing child has quit (which hopefully+ * will not be very long).+ *+ * Notice that this state variable does not distinguish *why* we entered+ * states later than PM_RUN --- Shutdown and FatalError must be consulted+ * to find that out. FatalError is never true in PM_RECOVERY_* or PM_RUN+ * states, nor in PM_SHUTDOWN states (because we don't enter those states+ * when trying to recover from a crash). It can be true in PM_STARTUP state,+ * because we don't clear it until we've successfully started WAL redo.+ */+typedef enum+{+ PM_INIT, /* postmaster starting */+ PM_STARTUP, /* waiting for startup subprocess */+ PM_RECOVERY, /* in archive recovery mode */+ PM_HOT_STANDBY, /* in hot standby mode */+ PM_RUN, /* normal "database is alive" state */+ PM_WAIT_BACKUP, /* waiting for online backup mode to end */+ PM_WAIT_READONLY, /* waiting for read only backends to exit */+ PM_WAIT_BACKENDS, /* waiting for live backends to exit */+ PM_SHUTDOWN, /* waiting for checkpointer to do shutdown+ * ckpt */+ PM_SHUTDOWN_2, /* waiting for archiver and walsenders to+ * finish */+ PM_WAIT_DEAD_END, /* waiting for dead_end children to exit */+ PM_NO_CHILDREN /* all important children have exited */+} PMState;++++/* Start time of SIGKILL timeout during immediate shutdown or child crash */+/* Zero means timeout is not running */++/* Length of said timeout */+#define SIGKILL_CHILDREN_AFTER_SECS 5++ /* T if we've reached PM_RUN */++__thread bool ClientAuthInProgress = false;+ /* T during new-client+ * authentication */++ /* stderr redirected for syslogger? */++/* received START_AUTOVAC_LAUNCHER signal */+++/* the launcher needs to be signalled to communicate some condition */+++/* set when there's a worker that needs to be started up */++++/*+ * State for assigning random salts and cancel keys.+ * Also, the global MyCancelKey passes the cancel key assigned to a given+ * backend from the postmaster to that backend (via fork).+ */++++#ifdef USE_BONJOUR+static DNSServiceRef bonjour_sdref = NULL;+#endif++/*+ * postmaster.c - function prototypes+ */+static void CloseServerPorts(int status, Datum arg);+static void unlink_external_pid_file(int status, Datum arg);+static void getInstallationPaths(const char *argv0);+static void checkDataDir(void);+static Port *ConnCreate(int serverFd);+static void ConnFree(Port *port);+static void reset_shared(int port);+static void SIGHUP_handler(SIGNAL_ARGS);+static void pmdie(SIGNAL_ARGS);+static void reaper(SIGNAL_ARGS);+static void sigusr1_handler(SIGNAL_ARGS);+static void startup_die(SIGNAL_ARGS);+static void dummy_handler(SIGNAL_ARGS);+static void StartupPacketTimeoutHandler(void);+static void CleanupBackend(int pid, int exitstatus);+static bool CleanupBackgroundWorker(int pid, int exitstatus);+static void HandleChildCrash(int pid, int exitstatus, const char *procname);+static void LogChildExit(int lev, const char *procname,+ int pid, int exitstatus);+static void PostmasterStateMachine(void);+static void BackendInitialize(Port *port);+static void BackendRun(Port *port) pg_attribute_noreturn();+static void ExitPostmaster(int status) pg_attribute_noreturn();+static int ServerLoop(void);+static int BackendStartup(Port *port);+static int ProcessStartupPacket(Port *port, bool SSLdone);+static void processCancelRequest(Port *port, void *pkt);+static int initMasks(fd_set *rmask);+static void report_fork_failure_to_client(Port *port, int errnum);+static CAC_state canAcceptConnections(void);+static long PostmasterRandom(void);+static void RandomSalt(char *md5Salt);+static void signal_child(pid_t pid, int signal);+static bool SignalSomeChildren(int signal, int targets);+static void TerminateChildren(int signal);++#define SignalChildren(sig) SignalSomeChildren(sig, BACKEND_TYPE_ALL)++static int CountChildren(int target);+static void maybe_start_bgworker(void);+static bool CreateOptsFile(int argc, char *argv[], char *fullprogname);+static pid_t StartChildProcess(AuxProcType type);+static void StartAutovacuumWorker(void);+static void InitPostmasterDeathWatchHandle(void);++/*+ * Archiver is allowed to start up at the current postmaster state?+ *+ * If WAL archiving is enabled always, we are allowed to start archiver+ * even during recovery.+ */+#define PgArchStartupAllowed() \+ ((XLogArchivingActive() && pmState == PM_RUN) || \+ (XLogArchivingAlways() && \+ (pmState == PM_RECOVERY || pmState == PM_HOT_STANDBY)))++#ifdef EXEC_BACKEND++#ifdef WIN32+#define WNOHANG 0 /* ignored, so any integer value will do */++static pid_t waitpid(pid_t pid, int *exitstatus, int options);+static void WINAPI pgwin32_deadchild_callback(PVOID lpParameter, BOOLEAN TimerOrWaitFired);++static HANDLE win32ChildQueue;++typedef struct+{+ HANDLE waitHandle;+ HANDLE procHandle;+ DWORD procId;+} win32_deadchild_waitinfo;+#endif /* WIN32 */++static pid_t backend_forkexec(Port *port);+static pid_t internal_forkexec(int argc, char *argv[], Port *port);++/* Type for a socket that can be inherited to a client process */+#ifdef WIN32+typedef struct+{+ SOCKET origsocket; /* Original socket value, or PGINVALID_SOCKET+ * if not a socket */+ WSAPROTOCOL_INFO wsainfo;+} InheritableSocket;+#else+typedef int InheritableSocket;+#endif++/*+ * Structure contains all variables passed to exec:ed backends+ */+typedef struct+{+ Port port;+ InheritableSocket portsocket;+ char DataDir[MAXPGPATH];+ pgsocket ListenSocket[MAXLISTEN];+ long MyCancelKey;+ int MyPMChildSlot;+#ifndef WIN32+ unsigned long UsedShmemSegID;+#else+ HANDLE UsedShmemSegID;+#endif+ void *UsedShmemSegAddr;+ slock_t *ShmemLock;+ VariableCache ShmemVariableCache;+ Backend *ShmemBackendArray;+#ifndef HAVE_SPINLOCKS+ PGSemaphore SpinlockSemaArray;+#endif+ LWLockPadded *MainLWLockArray;+ slock_t *ProcStructLock;+ PROC_HDR *ProcGlobal;+ PGPROC *AuxiliaryProcs;+ PGPROC *PreparedXactProcs;+ PMSignalData *PMSignalState;+ InheritableSocket pgStatSock;+ pid_t PostmasterPid;+ TimestampTz PgStartTime;+ TimestampTz PgReloadTime;+ pg_time_t first_syslogger_file_time;+ bool redirection_done;+ bool IsBinaryUpgrade;+ int max_safe_fds;+ int MaxBackends;+#ifdef WIN32+ HANDLE PostmasterHandle;+ HANDLE initial_signal_pipe;+ HANDLE syslogPipe[2];+#else+ int postmaster_alive_fds[2];+ int syslogPipe[2];+#endif+ char my_exec_path[MAXPGPATH];+ char pkglib_path[MAXPGPATH];+ char ExtraOptions[MAXPGPATH];+} BackendParameters;++static void read_backend_variables(char *id, Port *port);+static void restore_backend_variables(BackendParameters *param, Port *port);++#ifndef WIN32+static bool save_backend_variables(BackendParameters *param, Port *port);+#else+static bool save_backend_variables(BackendParameters *param, Port *port,+ HANDLE childProcess, pid_t childPid);+#endif++static void ShmemBackendArrayAdd(Backend *bn);+static void ShmemBackendArrayRemove(Backend *bn);+#endif /* EXEC_BACKEND */++#define StartupDataBase() StartChildProcess(StartupProcess)+#define StartBackgroundWriter() StartChildProcess(BgWriterProcess)+#define StartCheckpointer() StartChildProcess(CheckpointerProcess)+#define StartWalWriter() StartChildProcess(WalWriterProcess)+#define StartWalReceiver() StartChildProcess(WalReceiverProcess)++/* Macros to check exit status of a child process */+#define EXIT_STATUS_0(st) ((st) == 0)+#define EXIT_STATUS_1(st) (WIFEXITED(st) && WEXITSTATUS(st) == 1)+#define EXIT_STATUS_3(st) (WIFEXITED(st) && WEXITSTATUS(st) == 3)++#ifndef WIN32+/*+ * File descriptors for pipe used to monitor if postmaster is alive.+ * First is POSTMASTER_FD_WATCH, second is POSTMASTER_FD_OWN.+ */++#else+/* Process handle of postmaster used for the same purpose on Windows */+HANDLE PostmasterHandle;+#endif++/*+ * Postmaster main entry point+ */+#ifdef SIGXFSZ+#endif+#ifdef HAVE_INT_OPTRESET+#endif+#ifdef USE_SSL+#endif+#ifdef USE_BONJOUR+#endif+#ifdef HAVE_UNIX_SOCKETS+#endif+#ifdef WIN32+#endif+#ifdef EXEC_BACKEND+#endif+#ifdef HAVE_PTHREAD_IS_THREADED_NP+#endif+++/*+ * on_proc_exit callback to close server's listen sockets+ */+++/*+ * on_proc_exit callback to delete external_pid_file+ */++++/*+ * Compute and check the directory paths to files that are part of the+ * installation (as deduced from the postgres executable's own location)+ */+#ifdef EXEC_BACKEND+#endif+++/*+ * Validate the proposed data directory+ */+#if !defined(WIN32) && !defined(__CYGWIN__)+#endif+#if !defined(WIN32) && !defined(__CYGWIN__)+#endif++/*+ * Determine how long should we let ServerLoop sleep.+ *+ * In normal conditions we wait at most one minute, to ensure that the other+ * background tasks handled by ServerLoop get done even when no requests are+ * arriving. However, if there are background workers waiting to be started,+ * we don't actually sleep so that they are quickly serviced. Other exception+ * cases are as shown in the code.+ */+++/*+ * Main idle loop of postmaster+ *+ * NB: Needs to be called with signals blocked+ */+#ifdef HAVE_PTHREAD_IS_THREADED_NP+#endif++/*+ * Initialise the masks for select() for the ports we are listening on.+ * Return the number of sockets to listen on.+ */++++/*+ * Read a client's startup packet and do something according to it.+ *+ * Returns STATUS_OK or STATUS_ERROR, or might call ereport(FATAL) and+ * not return at all.+ *+ * (Note that ereport(FATAL) stuff is sent to the client, so only use it+ * if that's what you want. Return STATUS_ERROR if you don't want to+ * send anything to the client, which would typically be appropriate+ * if we detect a communications failure.)+ */+#ifdef USE_SSL+#else+#endif+#ifdef USE_SSL+#endif+++/*+ * The client has sent a cancel request packet, not a normal+ * start-a-new-connection packet. Perform the necessary processing.+ * Nothing is sent back to the client.+ */+#ifndef EXEC_BACKEND+#else+#endif+#ifndef EXEC_BACKEND+#else+#endif++/*+ * canAcceptConnections --- check to see if database state allows connections.+ */++++/*+ * ConnCreate -- create a local connection data structure+ *+ * Returns NULL on failure, other than out-of-memory which is fatal.+ */+#ifndef EXEC_BACKEND+#if defined(ENABLE_GSS) || defined(ENABLE_SSPI)+#endif+#endif+++/*+ * ConnFree -- free a local connection data structure+ */+#ifdef USE_SSL+#endif+++/*+ * ClosePostmasterPorts -- close all the postmaster's open sockets+ *+ * This is called during child process startup to release file descriptors+ * that are not needed by that child process. The postmaster still has+ * them open, of course.+ *+ * Note: we pass am_syslogger as a boolean because we don't want to set+ * the global variable yet when this is called.+ */+#ifndef WIN32+#endif+#ifndef WIN32+#else+#endif+#ifdef USE_BONJOUR+#endif+++/*+ * reset_shared -- reset shared memory and semaphores+ */++++/*+ * SIGHUP -- reread config files, and tell children to do same+ */+#ifdef EXEC_BACKEND+#endif+++/*+ * pmdie -- signal handler for processing various postmaster signals.+ */+++/*+ * Reaper -- signal handler to cleanup after a child process dies.+ */+++/*+ * Scan the bgworkers list and see if the given PID (which has just stopped+ * or crashed) is in it. Handle its shutdown if so, and return true. If not a+ * bgworker, return false.+ *+ * This is heavily based on CleanupBackend. One important difference is that+ * we don't know yet that the dying process is a bgworker, so we must be silent+ * until we're sure it is.+ */+#ifdef WIN32+#endif+#ifdef EXEC_BACKEND+#endif++/*+ * CleanupBackend -- cleanup after terminated backend.+ *+ * Remove all local state associated with backend.+ *+ * If you change this, see also CleanupBackgroundWorker.+ */+#ifdef WIN32+#endif+#ifdef EXEC_BACKEND+#endif++/*+ * HandleChildCrash -- cleanup after failed backend, bgwriter, checkpointer,+ * walwriter, autovacuum, or background worker.+ *+ * The objectives here are to clean up our local state about the child+ * process, and to signal all other remaining children to quickdie.+ */+#ifdef EXEC_BACKEND+#endif+#ifdef EXEC_BACKEND+#endif++/*+ * Log the death of a child process.+ */+#if defined(WIN32)+#else+#endif++/*+ * Advance the postmaster's state machine and take actions as appropriate+ *+ * This is common code for pmdie(), reaper() and sigusr1_handler(), which+ * receive the signals that might mean we need to change state.+ */++++/*+ * Send a signal to a postmaster child process+ *+ * On systems that have setsid(), each child process sets itself up as a+ * process group leader. For signals that are generally interpreted in the+ * appropriate fashion, we signal the entire process group not just the+ * direct child process. This allows us to, for example, SIGQUIT a blocked+ * archive_recovery script, or SIGINT a script being run by a backend via+ * system().+ *+ * There is a race condition for recently-forked children: they might not+ * have executed setsid() yet. So we signal the child directly as well as+ * the group. We assume such a child will handle the signal before trying+ * to spawn any grandchild processes. We also assume that signaling the+ * child twice will not cause any problems.+ */+#ifdef HAVE_SETSID+#endif++/*+ * Send a signal to the targeted children (but NOT special children;+ * dead_end children are never signaled, either).+ */+++/*+ * Send a termination signal to children. This considers all of our children+ * processes, except syslogger and dead_end backends.+ */+++/*+ * BackendStartup -- start backend process+ *+ * returns: STATUS_ERROR if the fork failed, STATUS_OK otherwise.+ *+ * Note: if you change this code, also consider StartAutovacuumWorker.+ */+#ifdef EXEC_BACKEND+#else /* !EXEC_BACKEND */+#endif /* EXEC_BACKEND */+#ifdef EXEC_BACKEND+#endif++/*+ * Try to report backend fork() failure to client before we close the+ * connection. Since we do not care to risk blocking the postmaster on+ * this connection, we set the connection to non-blocking and try only once.+ *+ * This is grungy special-purpose code; we cannot use backend libpq since+ * it's not up and running.+ */++++/*+ * BackendInitialize -- initialize an interactive (postmaster-child)+ * backend process, and collect the client's startup packet.+ *+ * returns: nothing. Will not return at all if there's any failure.+ *+ * Note: this code does not depend on having any access to shared memory.+ * In the EXEC_BACKEND case, we are physically attached to shared memory+ * but have not yet set up most of our local pointers to shmem structures.+ */++++/*+ * BackendRun -- set up the backend's argument list and invoke PostgresMain()+ *+ * returns:+ * Shouldn't return at all.+ * If PostgresMain() fails, return status.+ */++++#ifdef EXEC_BACKEND++/*+ * postmaster_forkexec -- fork and exec a postmaster subprocess+ *+ * The caller must have set up the argv array already, except for argv[2]+ * which will be filled with the name of the temp variable file.+ *+ * Returns the child process PID, or -1 on fork failure (a suitable error+ * message has been logged on failure).+ *+ * All uses of this routine will dispatch to SubPostmasterMain in the+ * child process.+ */+pid_t+postmaster_forkexec(int argc, char *argv[])+{+ Port port;++ /* This entry point passes dummy values for the Port variables */+ memset(&port, 0, sizeof(port));+ return internal_forkexec(argc, argv, &port);+}++/*+ * backend_forkexec -- fork/exec off a backend process+ *+ * Some operating systems (WIN32) don't have fork() so we have to simulate+ * it by storing parameters that need to be passed to the child and+ * then create a new child process.+ *+ * returns the pid of the fork/exec'd process, or -1 on failure+ */+static pid_t+backend_forkexec(Port *port)+{+ char *av[4];+ int ac = 0;++ av[ac++] = "postgres";+ av[ac++] = "--forkbackend";+ av[ac++] = NULL; /* filled in by internal_forkexec */++ av[ac] = NULL;+ Assert(ac < lengthof(av));++ return internal_forkexec(ac, av, port);+}++#ifndef WIN32++/*+ * internal_forkexec non-win32 implementation+ *+ * - writes out backend variables to the parameter file+ * - fork():s, and then exec():s the child process+ */+static pid_t+internal_forkexec(int argc, char *argv[], Port *port)+{+ static unsigned long tmpBackendFileNum = 0;+ pid_t pid;+ char tmpfilename[MAXPGPATH];+ BackendParameters param;+ FILE *fp;++ if (!save_backend_variables(¶m, port))+ return -1; /* log made by save_backend_variables */++ /* Calculate name for temp file */+ snprintf(tmpfilename, MAXPGPATH, "%s/%s.backend_var.%d.%lu",+ PG_TEMP_FILES_DIR, PG_TEMP_FILE_PREFIX,+ MyProcPid, ++tmpBackendFileNum);++ /* Open file */+ fp = AllocateFile(tmpfilename, PG_BINARY_W);+ if (!fp)+ {+ /*+ * As in OpenTemporaryFileInTablespace, try to make the temp-file+ * directory+ */+ mkdir(PG_TEMP_FILES_DIR, S_IRWXU);++ fp = AllocateFile(tmpfilename, PG_BINARY_W);+ if (!fp)+ {+ ereport(LOG,+ (errcode_for_file_access(),+ errmsg("could not create file \"%s\": %m",+ tmpfilename)));+ return -1;+ }+ }++ if (fwrite(¶m, sizeof(param), 1, fp) != 1)+ {+ ereport(LOG,+ (errcode_for_file_access(),+ errmsg("could not write to file \"%s\": %m", tmpfilename)));+ FreeFile(fp);+ return -1;+ }++ /* Release file */+ if (FreeFile(fp))+ {+ ereport(LOG,+ (errcode_for_file_access(),+ errmsg("could not write to file \"%s\": %m", tmpfilename)));+ return -1;+ }++ /* Make sure caller set up argv properly */+ Assert(argc >= 3);+ Assert(argv[argc] == NULL);+ Assert(strncmp(argv[1], "--fork", 6) == 0);+ Assert(argv[2] == NULL);++ /* Insert temp file name after --fork argument */+ argv[2] = tmpfilename;++ /* Fire off execv in child */+ if ((pid = fork_process()) == 0)+ {+ if (execv(postgres_exec_path, argv) < 0)+ {+ ereport(LOG,+ (errmsg("could not execute server process \"%s\": %m",+ postgres_exec_path)));+ /* We're already in the child process here, can't return */+ exit(1);+ }+ }++ return pid; /* Parent returns pid, or -1 on fork failure */+}+#else /* WIN32 */++/*+ * internal_forkexec win32 implementation+ *+ * - starts backend using CreateProcess(), in suspended state+ * - writes out backend variables to the parameter file+ * - during this, duplicates handles and sockets required for+ * inheritance into the new process+ * - resumes execution of the new process once the backend parameter+ * file is complete.+ */+static pid_t+internal_forkexec(int argc, char *argv[], Port *port)+{+ STARTUPINFO si;+ PROCESS_INFORMATION pi;+ int i;+ int j;+ char cmdLine[MAXPGPATH * 2];+ HANDLE paramHandle;+ BackendParameters *param;+ SECURITY_ATTRIBUTES sa;+ char paramHandleStr[32];+ win32_deadchild_waitinfo *childinfo;++ /* Make sure caller set up argv properly */+ Assert(argc >= 3);+ Assert(argv[argc] == NULL);+ Assert(strncmp(argv[1], "--fork", 6) == 0);+ Assert(argv[2] == NULL);++ /* Set up shared memory for parameter passing */+ ZeroMemory(&sa, sizeof(sa));+ sa.nLength = sizeof(sa);+ sa.bInheritHandle = TRUE;+ paramHandle = CreateFileMapping(INVALID_HANDLE_VALUE,+ &sa,+ PAGE_READWRITE,+ 0,+ sizeof(BackendParameters),+ NULL);+ if (paramHandle == INVALID_HANDLE_VALUE)+ {+ elog(LOG, "could not create backend parameter file mapping: error code %lu",+ GetLastError());+ return -1;+ }++ param = MapViewOfFile(paramHandle, FILE_MAP_WRITE, 0, 0, sizeof(BackendParameters));+ if (!param)+ {+ elog(LOG, "could not map backend parameter memory: error code %lu",+ GetLastError());+ CloseHandle(paramHandle);+ return -1;+ }++ /* Insert temp file name after --fork argument */+#ifdef _WIN64+ sprintf(paramHandleStr, "%llu", (LONG_PTR) paramHandle);+#else+ sprintf(paramHandleStr, "%lu", (DWORD) paramHandle);+#endif+ argv[2] = paramHandleStr;++ /* Format the cmd line */+ cmdLine[sizeof(cmdLine) - 1] = '\0';+ cmdLine[sizeof(cmdLine) - 2] = '\0';+ snprintf(cmdLine, sizeof(cmdLine) - 1, "\"%s\"", postgres_exec_path);+ i = 0;+ while (argv[++i] != NULL)+ {+ j = strlen(cmdLine);+ snprintf(cmdLine + j, sizeof(cmdLine) - 1 - j, " \"%s\"", argv[i]);+ }+ if (cmdLine[sizeof(cmdLine) - 2] != '\0')+ {+ elog(LOG, "subprocess command line too long");+ return -1;+ }++ memset(&pi, 0, sizeof(pi));+ memset(&si, 0, sizeof(si));+ si.cb = sizeof(si);++ /*+ * Create the subprocess in a suspended state. This will be resumed later,+ * once we have written out the parameter file.+ */+ if (!CreateProcess(NULL, cmdLine, NULL, NULL, TRUE, CREATE_SUSPENDED,+ NULL, NULL, &si, &pi))+ {+ elog(LOG, "CreateProcess call failed: %m (error code %lu)",+ GetLastError());+ return -1;+ }++ if (!save_backend_variables(param, port, pi.hProcess, pi.dwProcessId))+ {+ /*+ * log made by save_backend_variables, but we have to clean up the+ * mess with the half-started process+ */+ if (!TerminateProcess(pi.hProcess, 255))+ ereport(LOG,+ (errmsg_internal("could not terminate unstarted process: error code %lu",+ GetLastError())));+ CloseHandle(pi.hProcess);+ CloseHandle(pi.hThread);+ return -1; /* log made by save_backend_variables */+ }++ /* Drop the parameter shared memory that is now inherited to the backend */+ if (!UnmapViewOfFile(param))+ elog(LOG, "could not unmap view of backend parameter file: error code %lu",+ GetLastError());+ if (!CloseHandle(paramHandle))+ elog(LOG, "could not close handle to backend parameter file: error code %lu",+ GetLastError());++ /*+ * Reserve the memory region used by our main shared memory segment before+ * we resume the child process.+ */+ if (!pgwin32_ReserveSharedMemoryRegion(pi.hProcess))+ {+ /*+ * Failed to reserve the memory, so terminate the newly created+ * process and give up.+ */+ if (!TerminateProcess(pi.hProcess, 255))+ ereport(LOG,+ (errmsg_internal("could not terminate process that failed to reserve memory: error code %lu",+ GetLastError())));+ CloseHandle(pi.hProcess);+ CloseHandle(pi.hThread);+ return -1; /* logging done made by+ * pgwin32_ReserveSharedMemoryRegion() */+ }++ /*+ * Now that the backend variables are written out, we start the child+ * thread so it can start initializing while we set up the rest of the+ * parent state.+ */+ if (ResumeThread(pi.hThread) == -1)+ {+ if (!TerminateProcess(pi.hProcess, 255))+ {+ ereport(LOG,+ (errmsg_internal("could not terminate unstartable process: error code %lu",+ GetLastError())));+ CloseHandle(pi.hProcess);+ CloseHandle(pi.hThread);+ return -1;+ }+ CloseHandle(pi.hProcess);+ CloseHandle(pi.hThread);+ ereport(LOG,+ (errmsg_internal("could not resume thread of unstarted process: error code %lu",+ GetLastError())));+ return -1;+ }++ /*+ * Queue a waiter for to signal when this child dies. The wait will be+ * handled automatically by an operating system thread pool.+ *+ * Note: use malloc instead of palloc, since it needs to be thread-safe.+ * Struct will be free():d from the callback function that runs on a+ * different thread.+ */+ childinfo = malloc(sizeof(win32_deadchild_waitinfo));+ if (!childinfo)+ ereport(FATAL,+ (errcode(ERRCODE_OUT_OF_MEMORY),+ errmsg("out of memory")));++ childinfo->procHandle = pi.hProcess;+ childinfo->procId = pi.dwProcessId;++ if (!RegisterWaitForSingleObject(&childinfo->waitHandle,+ pi.hProcess,+ pgwin32_deadchild_callback,+ childinfo,+ INFINITE,+ WT_EXECUTEONLYONCE | WT_EXECUTEINWAITTHREAD))+ ereport(FATAL,+ (errmsg_internal("could not register process for wait: error code %lu",+ GetLastError())));++ /* Don't close pi.hProcess here - the wait thread needs access to it */++ CloseHandle(pi.hThread);++ return pi.dwProcessId;+}+#endif /* WIN32 */+++/*+ * SubPostmasterMain -- Get the fork/exec'd process into a state equivalent+ * to what it would be if we'd simply forked on Unix, and then+ * dispatch to the appropriate place.+ *+ * The first two command line arguments are expected to be "--forkFOO"+ * (where FOO indicates which postmaster child we are to become), and+ * the name of a variables file that we can read to load data that would+ * have been inherited by fork() on Unix. Remaining arguments go to the+ * subprocess FooMain() routine.+ */+void+SubPostmasterMain(int argc, char *argv[])+{+ Port port;++ /* In EXEC_BACKEND case we will not have inherited these settings */+ IsPostmasterEnvironment = true;+ whereToSendOutput = DestNone;++ /* Setup as postmaster child */+ InitPostmasterChild();++ /* Setup essential subsystems (to ensure elog() behaves sanely) */+ InitializeGUCOptions();++ /* Read in the variables file */+ memset(&port, 0, sizeof(Port));+ read_backend_variables(argv[2], &port);++ /*+ * Set reference point for stack-depth checking+ */+ set_stack_base();++ /*+ * Set up memory area for GSS information. Mirrors the code in ConnCreate+ * for the non-exec case.+ */+#if defined(ENABLE_GSS) || defined(ENABLE_SSPI)+ port.gss = (pg_gssinfo *) calloc(1, sizeof(pg_gssinfo));+ if (!port.gss)+ ereport(FATAL,+ (errcode(ERRCODE_OUT_OF_MEMORY),+ errmsg("out of memory")));+#endif++ /* Check we got appropriate args */+ if (argc < 3)+ elog(FATAL, "invalid subpostmaster invocation");++ /*+ * If appropriate, physically re-attach to shared memory segment. We want+ * to do this before going any further to ensure that we can attach at the+ * same address the postmaster used. On the other hand, if we choose not+ * to re-attach, we may have other cleanup to do.+ */+ if (strcmp(argv[1], "--forkbackend") == 0 ||+ strcmp(argv[1], "--forkavlauncher") == 0 ||+ strcmp(argv[1], "--forkavworker") == 0 ||+ strcmp(argv[1], "--forkboot") == 0 ||+ strncmp(argv[1], "--forkbgworker=", 15) == 0)+ PGSharedMemoryReAttach();+ else+ PGSharedMemoryNoReAttach();++ /* autovacuum needs this set before calling InitProcess */+ if (strcmp(argv[1], "--forkavlauncher") == 0)+ AutovacuumLauncherIAm();+ if (strcmp(argv[1], "--forkavworker") == 0)+ AutovacuumWorkerIAm();++ /*+ * Start our win32 signal implementation. This has to be done after we+ * read the backend variables, because we need to pick up the signal pipe+ * from the parent process.+ */+#ifdef WIN32+ pgwin32_signal_initialize();+#endif++ /* In EXEC_BACKEND case we will not have inherited these settings */+ pqinitmask();+ PG_SETMASK(&BlockSig);++ /* Read in remaining GUC variables */+ read_nondefault_variables();++ /*+ * Reload any libraries that were preloaded by the postmaster. Since we+ * exec'd this process, those libraries didn't come along with us; but we+ * should load them into all child processes to be consistent with the+ * non-EXEC_BACKEND behavior.+ */+ process_shared_preload_libraries();++ /* Run backend or appropriate child */+ if (strcmp(argv[1], "--forkbackend") == 0)+ {+ Assert(argc == 3); /* shouldn't be any more args */++ /* Close the postmaster's sockets */+ ClosePostmasterPorts(false);++ /*+ * Need to reinitialize the SSL library in the backend, since the+ * context structures contain function pointers and cannot be passed+ * through the parameter file.+ *+ * XXX should we do this in all child processes? For the moment it's+ * enough to do it in backend children.+ */+#ifdef USE_SSL+ if (EnableSSL)+ secure_initialize();+#endif++ /*+ * Perform additional initialization and collect startup packet.+ *+ * We want to do this before InitProcess() for a couple of reasons: 1.+ * so that we aren't eating up a PGPROC slot while waiting on the+ * client. 2. so that if InitProcess() fails due to being out of+ * PGPROC slots, we have already initialized libpq and are able to+ * report the error to the client.+ */+ BackendInitialize(&port);++ /* Restore basic shared memory pointers */+ InitShmemAccess(UsedShmemSegAddr);++ /* Need a PGPROC to run CreateSharedMemoryAndSemaphores */+ InitProcess();++ /*+ * Attach process to shared data structures. If testing EXEC_BACKEND+ * on Linux, you must run this as root before starting the postmaster:+ *+ * echo 0 >/proc/sys/kernel/randomize_va_space+ *+ * This prevents a randomized stack base address that causes child+ * shared memory to be at a different address than the parent, making+ * it impossible to attached to shared memory. Return the value to+ * '1' when finished.+ */+ CreateSharedMemoryAndSemaphores(false, 0);++ /* And run the backend */+ BackendRun(&port); /* does not return */+ }+ if (strcmp(argv[1], "--forkboot") == 0)+ {+ /* Close the postmaster's sockets */+ ClosePostmasterPorts(false);++ /* Restore basic shared memory pointers */+ InitShmemAccess(UsedShmemSegAddr);++ /* Need a PGPROC to run CreateSharedMemoryAndSemaphores */+ InitAuxiliaryProcess();++ /* Attach process to shared data structures */+ CreateSharedMemoryAndSemaphores(false, 0);++ AuxiliaryProcessMain(argc - 2, argv + 2); /* does not return */+ }+ if (strcmp(argv[1], "--forkavlauncher") == 0)+ {+ /* Close the postmaster's sockets */+ ClosePostmasterPorts(false);++ /* Restore basic shared memory pointers */+ InitShmemAccess(UsedShmemSegAddr);++ /* Need a PGPROC to run CreateSharedMemoryAndSemaphores */+ InitProcess();++ /* Attach process to shared data structures */+ CreateSharedMemoryAndSemaphores(false, 0);++ AutoVacLauncherMain(argc - 2, argv + 2); /* does not return */+ }+ if (strcmp(argv[1], "--forkavworker") == 0)+ {+ /* Close the postmaster's sockets */+ ClosePostmasterPorts(false);++ /* Restore basic shared memory pointers */+ InitShmemAccess(UsedShmemSegAddr);++ /* Need a PGPROC to run CreateSharedMemoryAndSemaphores */+ InitProcess();++ /* Attach process to shared data structures */+ CreateSharedMemoryAndSemaphores(false, 0);++ AutoVacWorkerMain(argc - 2, argv + 2); /* does not return */+ }+ if (strncmp(argv[1], "--forkbgworker=", 15) == 0)+ {+ int shmem_slot;++ /* do this as early as possible; in particular, before InitProcess() */+ IsBackgroundWorker = true;++ InitPostmasterChild();++ /* Close the postmaster's sockets */+ ClosePostmasterPorts(false);++ /* Restore basic shared memory pointers */+ InitShmemAccess(UsedShmemSegAddr);++ /* Need a PGPROC to run CreateSharedMemoryAndSemaphores */+ InitProcess();++ /* Attach process to shared data structures */+ CreateSharedMemoryAndSemaphores(false, 0);++ shmem_slot = atoi(argv[1] + 15);+ MyBgworkerEntry = BackgroundWorkerEntry(shmem_slot);+ StartBackgroundWorker();+ }+ if (strcmp(argv[1], "--forkarch") == 0)+ {+ /* Close the postmaster's sockets */+ ClosePostmasterPorts(false);++ /* Do not want to attach to shared memory */++ PgArchiverMain(argc, argv); /* does not return */+ }+ if (strcmp(argv[1], "--forkcol") == 0)+ {+ /* Close the postmaster's sockets */+ ClosePostmasterPorts(false);++ /* Do not want to attach to shared memory */++ PgstatCollectorMain(argc, argv); /* does not return */+ }+ if (strcmp(argv[1], "--forklog") == 0)+ {+ /* Close the postmaster's sockets */+ ClosePostmasterPorts(true);++ /* Do not want to attach to shared memory */++ SysLoggerMain(argc, argv); /* does not return */+ }++ abort(); /* shouldn't get here */+}+#endif /* EXEC_BACKEND */+++/*+ * ExitPostmaster -- cleanup+ *+ * Do NOT call exit() directly --- always go through here!+ */+#ifdef HAVE_PTHREAD_IS_THREADED_NP+#endif++/*+ * sigusr1_handler - handle signal conditions from child processes+ */+++/*+ * SIGTERM or SIGQUIT while processing startup packet.+ * Clean up and exit(1).+ *+ * XXX: possible future improvement: try to send a message indicating+ * why we are disconnecting. Problem is to be sure we don't block while+ * doing so, nor mess up SSL initialization. In practice, if the client+ * has wedged here, it probably couldn't do anything with the message anyway.+ */+++/*+ * Dummy signal handler+ *+ * We use this for signals that we don't actually use in the postmaster,+ * but we do use in backends. If we were to SIG_IGN such signals in the+ * postmaster, then a newly started backend might drop a signal that arrives+ * before it's able to reconfigure its signal processing. (See notes in+ * tcop/postgres.c.)+ */+++/*+ * Timeout while processing startup packet.+ * As for startup_die(), we clean up and exit(1).+ */++++/*+ * RandomSalt+ */+++/*+ * PostmasterRandom+ */+++/*+ * Count up number of child processes of specified types (dead_end chidren+ * are always excluded).+ */++++/*+ * StartChildProcess -- start an auxiliary process for the postmaster+ *+ * xlop determines what kind of child will be started. All child types+ * initially go to AuxiliaryProcessMain, which will handle common setup.+ *+ * Return value of StartChildProcess is subprocess' PID, or 0 if failed+ * to start subprocess.+ */+#ifdef EXEC_BACKEND+#endif+#ifdef EXEC_BACKEND+#else /* !EXEC_BACKEND */+#endif /* EXEC_BACKEND */++/*+ * StartAutovacuumWorker+ * Start an autovac worker process.+ *+ * This function is here because it enters the resulting PID into the+ * postmaster's private backends list.+ *+ * NB -- this code very roughly matches BackendStartup.+ */+#ifdef EXEC_BACKEND+#endif++/*+ * Create the opts file+ */+#define OPTS_FILE "postmaster.opts"+++/*+ * MaxLivePostmasterChildren+ *+ * This reports the number of entries needed in per-child-process arrays+ * (the PMChildFlags array, and if EXEC_BACKEND the ShmemBackendArray).+ * These arrays include regular backends, autovac workers, walsenders+ * and background workers, but not special children nor dead_end children.+ * This allows the arrays to have a fixed maximum size, to wit the same+ * too-many-children limit enforced by canAcceptConnections(). The exact value+ * isn't too critical as long as it's more than MaxBackends.+ */+++/*+ * Connect background worker to a database.+ */+++/*+ * Connect background worker to a database using OIDs.+ */+++/*+ * Block/unblock signals in a background worker+ */+++++#ifdef EXEC_BACKEND+static pid_t+bgworker_forkexec(int shmem_slot)+{+ char *av[10];+ int ac = 0;+ char forkav[MAXPGPATH];++ snprintf(forkav, MAXPGPATH, "--forkbgworker=%d", shmem_slot);++ av[ac++] = "postgres";+ av[ac++] = forkav;+ av[ac++] = NULL; /* filled in by postmaster_forkexec */+ av[ac] = NULL;++ Assert(ac < lengthof(av));++ return postmaster_forkexec(ac, av);+}+#endif++/*+ * Start a new bgworker.+ * Starting time conditions must have been checked already.+ *+ * This code is heavily based on autovacuum.c, q.v.+ */+#ifdef EXEC_BACKEND+#else+#endif+#ifndef EXEC_BACKEND+#endif++/*+ * Does the current postmaster state require starting a worker with the+ * specified start_time?+ */+++/*+ * Allocate the Backend struct for a connected background worker, but don't+ * add it to the list of backends just yet.+ *+ * Some info from the Backend is copied into the passed rw.+ */+++/*+ * If the time is right, start one background worker.+ *+ * As a side effect, the bgworker control variables are set or reset whenever+ * there are more workers to start after this one, and whenever the overall+ * system state requires it.+ */+#ifdef EXEC_BACKEND+#endif++/*+ * When a backend asks to be notified about worker state changes, we+ * set a flag in its backend entry. The background worker machinery needs+ * to know when such backends exit.+ */+++#ifdef EXEC_BACKEND++/*+ * The following need to be available to the save/restore_backend_variables+ * functions. They are marked NON_EXEC_STATIC in their home modules.+ */+extern slock_t *ShmemLock;+extern slock_t *ProcStructLock;+extern PGPROC *AuxiliaryProcs;+extern PMSignalData *PMSignalState;+extern pgsocket pgStatSock;+extern pg_time_t first_syslogger_file_time;++#ifndef WIN32+#define write_inheritable_socket(dest, src, childpid) ((*(dest) = (src)), true)+#define read_inheritable_socket(dest, src) (*(dest) = *(src))+#else+static bool write_duplicated_handle(HANDLE *dest, HANDLE src, HANDLE child);+static bool write_inheritable_socket(InheritableSocket *dest, SOCKET src,+ pid_t childPid);+static void read_inheritable_socket(SOCKET *dest, InheritableSocket *src);+#endif+++/* Save critical backend variables into the BackendParameters struct */+#ifndef WIN32+static bool+save_backend_variables(BackendParameters *param, Port *port)+#else+static bool+save_backend_variables(BackendParameters *param, Port *port,+ HANDLE childProcess, pid_t childPid)+#endif+{+ memcpy(¶m->port, port, sizeof(Port));+ if (!write_inheritable_socket(¶m->portsocket, port->sock, childPid))+ return false;++ strlcpy(param->DataDir, DataDir, MAXPGPATH);++ memcpy(¶m->ListenSocket, &ListenSocket, sizeof(ListenSocket));++ param->MyCancelKey = MyCancelKey;+ param->MyPMChildSlot = MyPMChildSlot;++ param->UsedShmemSegID = UsedShmemSegID;+ param->UsedShmemSegAddr = UsedShmemSegAddr;++ param->ShmemLock = ShmemLock;+ param->ShmemVariableCache = ShmemVariableCache;+ param->ShmemBackendArray = ShmemBackendArray;++#ifndef HAVE_SPINLOCKS+ param->SpinlockSemaArray = SpinlockSemaArray;+#endif+ param->MainLWLockArray = MainLWLockArray;+ param->ProcStructLock = ProcStructLock;+ param->ProcGlobal = ProcGlobal;+ param->AuxiliaryProcs = AuxiliaryProcs;+ param->PreparedXactProcs = PreparedXactProcs;+ param->PMSignalState = PMSignalState;+ if (!write_inheritable_socket(¶m->pgStatSock, pgStatSock, childPid))+ return false;++ param->PostmasterPid = PostmasterPid;+ param->PgStartTime = PgStartTime;+ param->PgReloadTime = PgReloadTime;+ param->first_syslogger_file_time = first_syslogger_file_time;++ param->redirection_done = redirection_done;+ param->IsBinaryUpgrade = IsBinaryUpgrade;+ param->max_safe_fds = max_safe_fds;++ param->MaxBackends = MaxBackends;++#ifdef WIN32+ param->PostmasterHandle = PostmasterHandle;+ if (!write_duplicated_handle(¶m->initial_signal_pipe,+ pgwin32_create_signal_listener(childPid),+ childProcess))+ return false;+#else+ memcpy(¶m->postmaster_alive_fds, &postmaster_alive_fds,+ sizeof(postmaster_alive_fds));+#endif++ memcpy(¶m->syslogPipe, &syslogPipe, sizeof(syslogPipe));++ strlcpy(param->my_exec_path, my_exec_path, MAXPGPATH);++ strlcpy(param->pkglib_path, pkglib_path, MAXPGPATH);++ strlcpy(param->ExtraOptions, ExtraOptions, MAXPGPATH);++ return true;+}+++#ifdef WIN32+/*+ * Duplicate a handle for usage in a child process, and write the child+ * process instance of the handle to the parameter file.+ */+static bool+write_duplicated_handle(HANDLE *dest, HANDLE src, HANDLE childProcess)+{+ HANDLE hChild = INVALID_HANDLE_VALUE;++ if (!DuplicateHandle(GetCurrentProcess(),+ src,+ childProcess,+ &hChild,+ 0,+ TRUE,+ DUPLICATE_CLOSE_SOURCE | DUPLICATE_SAME_ACCESS))+ {+ ereport(LOG,+ (errmsg_internal("could not duplicate handle to be written to backend parameter file: error code %lu",+ GetLastError())));+ return false;+ }++ *dest = hChild;+ return true;+}++/*+ * Duplicate a socket for usage in a child process, and write the resulting+ * structure to the parameter file.+ * This is required because a number of LSPs (Layered Service Providers) very+ * common on Windows (antivirus, firewalls, download managers etc) break+ * straight socket inheritance.+ */+static bool+write_inheritable_socket(InheritableSocket *dest, SOCKET src, pid_t childpid)+{+ dest->origsocket = src;+ if (src != 0 && src != PGINVALID_SOCKET)+ {+ /* Actual socket */+ if (WSADuplicateSocket(src, childpid, &dest->wsainfo) != 0)+ {+ ereport(LOG,+ (errmsg("could not duplicate socket %d for use in backend: error code %d",+ (int) src, WSAGetLastError())));+ return false;+ }+ }+ return true;+}++/*+ * Read a duplicate socket structure back, and get the socket descriptor.+ */+static void+read_inheritable_socket(SOCKET *dest, InheritableSocket *src)+{+ SOCKET s;++ if (src->origsocket == PGINVALID_SOCKET || src->origsocket == 0)+ {+ /* Not a real socket! */+ *dest = src->origsocket;+ }+ else+ {+ /* Actual socket, so create from structure */+ s = WSASocket(FROM_PROTOCOL_INFO,+ FROM_PROTOCOL_INFO,+ FROM_PROTOCOL_INFO,+ &src->wsainfo,+ 0,+ 0);+ if (s == INVALID_SOCKET)+ {+ write_stderr("could not create inherited socket: error code %d\n",+ WSAGetLastError());+ exit(1);+ }+ *dest = s;++ /*+ * To make sure we don't get two references to the same socket, close+ * the original one. (This would happen when inheritance actually+ * works..+ */+ closesocket(src->origsocket);+ }+}+#endif++static void+read_backend_variables(char *id, Port *port)+{+ BackendParameters param;++#ifndef WIN32+ /* Non-win32 implementation reads from file */+ FILE *fp;++ /* Open file */+ fp = AllocateFile(id, PG_BINARY_R);+ if (!fp)+ {+ write_stderr("could not open backend variables file \"%s\": %s\n",+ id, strerror(errno));+ exit(1);+ }++ if (fread(¶m, sizeof(param), 1, fp) != 1)+ {+ write_stderr("could not read from backend variables file \"%s\": %s\n",+ id, strerror(errno));+ exit(1);+ }++ /* Release file */+ FreeFile(fp);+ if (unlink(id) != 0)+ {+ write_stderr("could not remove file \"%s\": %s\n",+ id, strerror(errno));+ exit(1);+ }+#else+ /* Win32 version uses mapped file */+ HANDLE paramHandle;+ BackendParameters *paramp;++#ifdef _WIN64+ paramHandle = (HANDLE) _atoi64(id);+#else+ paramHandle = (HANDLE) atol(id);+#endif+ paramp = MapViewOfFile(paramHandle, FILE_MAP_READ, 0, 0, 0);+ if (!paramp)+ {+ write_stderr("could not map view of backend variables: error code %lu\n",+ GetLastError());+ exit(1);+ }++ memcpy(¶m, paramp, sizeof(BackendParameters));++ if (!UnmapViewOfFile(paramp))+ {+ write_stderr("could not unmap view of backend variables: error code %lu\n",+ GetLastError());+ exit(1);+ }++ if (!CloseHandle(paramHandle))+ {+ write_stderr("could not close handle to backend parameter variables: error code %lu\n",+ GetLastError());+ exit(1);+ }+#endif++ restore_backend_variables(¶m, port);+}++/* Restore critical backend variables from the BackendParameters struct */+static void+restore_backend_variables(BackendParameters *param, Port *port)+{+ memcpy(port, ¶m->port, sizeof(Port));+ read_inheritable_socket(&port->sock, ¶m->portsocket);++ SetDataDir(param->DataDir);++ memcpy(&ListenSocket, ¶m->ListenSocket, sizeof(ListenSocket));++ MyCancelKey = param->MyCancelKey;+ MyPMChildSlot = param->MyPMChildSlot;++ UsedShmemSegID = param->UsedShmemSegID;+ UsedShmemSegAddr = param->UsedShmemSegAddr;++ ShmemLock = param->ShmemLock;+ ShmemVariableCache = param->ShmemVariableCache;+ ShmemBackendArray = param->ShmemBackendArray;++#ifndef HAVE_SPINLOCKS+ SpinlockSemaArray = param->SpinlockSemaArray;+#endif+ MainLWLockArray = param->MainLWLockArray;+ ProcStructLock = param->ProcStructLock;+ ProcGlobal = param->ProcGlobal;+ AuxiliaryProcs = param->AuxiliaryProcs;+ PreparedXactProcs = param->PreparedXactProcs;+ PMSignalState = param->PMSignalState;+ read_inheritable_socket(&pgStatSock, ¶m->pgStatSock);++ PostmasterPid = param->PostmasterPid;+ PgStartTime = param->PgStartTime;+ PgReloadTime = param->PgReloadTime;+ first_syslogger_file_time = param->first_syslogger_file_time;++ redirection_done = param->redirection_done;+ IsBinaryUpgrade = param->IsBinaryUpgrade;+ max_safe_fds = param->max_safe_fds;++ MaxBackends = param->MaxBackends;++#ifdef WIN32+ PostmasterHandle = param->PostmasterHandle;+ pgwin32_initial_signal_pipe = param->initial_signal_pipe;+#else+ memcpy(&postmaster_alive_fds, ¶m->postmaster_alive_fds,+ sizeof(postmaster_alive_fds));+#endif++ memcpy(&syslogPipe, ¶m->syslogPipe, sizeof(syslogPipe));++ strlcpy(my_exec_path, param->my_exec_path, MAXPGPATH);++ strlcpy(pkglib_path, param->pkglib_path, MAXPGPATH);++ strlcpy(ExtraOptions, param->ExtraOptions, MAXPGPATH);+}+++Size+ShmemBackendArraySize(void)+{+ return mul_size(MaxLivePostmasterChildren(), sizeof(Backend));+}++void+ShmemBackendArrayAllocation(void)+{+ Size size = ShmemBackendArraySize();++ ShmemBackendArray = (Backend *) ShmemAlloc(size);+ /* Mark all slots as empty */+ memset(ShmemBackendArray, 0, size);+}++static void+ShmemBackendArrayAdd(Backend *bn)+{+ /* The array slot corresponding to my PMChildSlot should be free */+ int i = bn->child_slot - 1;++ Assert(ShmemBackendArray[i].pid == 0);+ ShmemBackendArray[i] = *bn;+}++static void+ShmemBackendArrayRemove(Backend *bn)+{+ int i = bn->child_slot - 1;++ Assert(ShmemBackendArray[i].pid == bn->pid);+ /* Mark the slot as empty */+ ShmemBackendArray[i].pid = 0;+}+#endif /* EXEC_BACKEND */+++#ifdef WIN32++/*+ * Subset implementation of waitpid() for Windows. We assume pid is -1+ * (that is, check all child processes) and options is WNOHANG (don't wait).+ */+static pid_t+waitpid(pid_t pid, int *exitstatus, int options)+{+ DWORD dwd;+ ULONG_PTR key;+ OVERLAPPED *ovl;++ /*+ * Check if there are any dead children. If there are, return the pid of+ * the first one that died.+ */+ if (GetQueuedCompletionStatus(win32ChildQueue, &dwd, &key, &ovl, 0))+ {+ *exitstatus = (int) key;+ return dwd;+ }++ return -1;+}++/*+ * Note! Code below executes on a thread pool! All operations must+ * be thread safe! Note that elog() and friends must *not* be used.+ */+static void WINAPI+pgwin32_deadchild_callback(PVOID lpParameter, BOOLEAN TimerOrWaitFired)+{+ win32_deadchild_waitinfo *childinfo = (win32_deadchild_waitinfo *) lpParameter;+ DWORD exitcode;++ if (TimerOrWaitFired)+ return; /* timeout. Should never happen, since we use+ * INFINITE as timeout value. */++ /*+ * Remove handle from wait - required even though it's set to wait only+ * once+ */+ UnregisterWaitEx(childinfo->waitHandle, NULL);++ if (!GetExitCodeProcess(childinfo->procHandle, &exitcode))+ {+ /*+ * Should never happen. Inform user and set a fixed exitcode.+ */+ write_stderr("could not read exit code for process\n");+ exitcode = 255;+ }++ if (!PostQueuedCompletionStatus(win32ChildQueue, childinfo->procId, (ULONG_PTR) exitcode, NULL))+ write_stderr("could not post child completion status\n");++ /*+ * Handle is per-process, so we close it here instead of in the+ * originating thread+ */+ CloseHandle(childinfo->procHandle);++ /*+ * Free struct that was allocated before the call to+ * RegisterWaitForSingleObject()+ */+ free(childinfo);++ /* Queue SIGCHLD signal */+ pg_queue_signal(SIGCHLD);+}+#endif /* WIN32 */++/*+ * Initialize one and only handle for monitoring postmaster death.+ *+ * Called once in the postmaster, so that child processes can subsequently+ * monitor if their parent is dead.+ */+#ifndef WIN32+#else+#endif /* WIN32 */
+ foreign/libpg_query/src/postgres/src_backend_storage_ipc_ipc.c view
@@ -0,0 +1,187 @@+/*--------------------------------------------------------------------+ * Symbols referenced in this file:+ * - proc_exit_inprogress+ * - proc_exit+ *--------------------------------------------------------------------+ */++/*-------------------------------------------------------------------------+ *+ * ipc.c+ * POSTGRES inter-process communication definitions.+ *+ * This file is misnamed, as it no longer has much of anything directly+ * to do with IPC. The functionality here is concerned with managing+ * exit-time cleanup for either a postmaster or a backend.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ *+ * IDENTIFICATION+ * src/backend/storage/ipc/ipc.c+ *+ *-------------------------------------------------------------------------+ */+#include "postgres.h"++#include <signal.h>+#include <unistd.h>+#include <sys/stat.h>++#include "miscadmin.h"+#ifdef PROFILE_PID_DIR+#include "postmaster/autovacuum.h"+#endif+#include "storage/dsm.h"+#include "storage/ipc.h"+#include "tcop/tcopprot.h"+++/*+ * This flag is set during proc_exit() to change ereport()'s behavior,+ * so that an ereport() from an on_proc_exit routine cannot get us out+ * of the exit procedure. We do NOT want to go back to the idle loop...+ */+__thread bool proc_exit_inprogress = false;+++/*+ * This flag tracks whether we've called atexit() in the current process+ * (or in the parent postmaster).+ */+++/* local functions */+static void proc_exit_prepare(int code);+++/* ----------------------------------------------------------------+ * exit() handling stuff+ *+ * These functions are in generally the same spirit as atexit(),+ * but provide some additional features we need --- in particular,+ * we want to register callbacks to invoke when we are disconnecting+ * from a broken shared-memory context but not exiting the postmaster.+ *+ * Callback functions can take zero, one, or two args: the first passed+ * arg is the integer exitcode, the second is the Datum supplied when+ * the callback was registered.+ * ----------------------------------------------------------------+ */++#define MAX_ON_EXITS 20++struct ONEXIT+{+ pg_on_exit_callback function;+ Datum arg;+};+++++++++++/* ----------------------------------------------------------------+ * proc_exit+ *+ * this function calls all the callbacks registered+ * for it (to free resources) and then calls exit.+ *+ * This should be the only function to call exit().+ * -cim 2/6/90+ *+ * Unfortunately, we can't really guarantee that add-on code+ * obeys the rule of not calling exit() directly. So, while+ * this is the preferred way out of the system, we also register+ * an atexit callback that will make sure cleanup happens.+ * ----------------------------------------------------------------+ */+void proc_exit(int code) { printf("Terminating process due to FATAL error\n"); exit(1); }+++/*+ * Code shared between proc_exit and the atexit handler. Note that in+ * normal exit through proc_exit, this will actually be called twice ...+ * but the second call will have nothing to do.+ */+++/* ------------------+ * Run all of the on_shmem_exit routines --- but don't actually exit.+ * This is used by the postmaster to re-initialize shared memory and+ * semaphores after a backend dies horribly. As with proc_exit(), we+ * remove each callback from the list before calling it, to avoid+ * infinite loop in case of error.+ * ------------------+ */+++/* ----------------------------------------------------------------+ * atexit_callback+ *+ * Backstop to ensure that direct calls of exit() don't mess us up.+ *+ * Somebody who was being really uncooperative could call _exit(),+ * but for that case we have a "dead man switch" that will make the+ * postmaster treat it as a crash --- see pmsignal.c.+ * ----------------------------------------------------------------+ */+++/* ----------------------------------------------------------------+ * on_proc_exit+ *+ * this function adds a callback function to the list of+ * functions invoked by proc_exit(). -cim 2/6/90+ * ----------------------------------------------------------------+ */+++/* ----------------------------------------------------------------+ * before_shmem_exit+ *+ * Register early callback to perform user-level cleanup,+ * e.g. transaction abort, before we begin shutting down+ * low-level subsystems.+ * ----------------------------------------------------------------+ */+++/* ----------------------------------------------------------------+ * on_shmem_exit+ *+ * Register ordinary callback to perform low-level shutdown+ * (e.g. releasing our PGPROC); run after before_shmem_exit+ * callbacks and before on_proc_exit callbacks.+ * ----------------------------------------------------------------+ */+++/* ----------------------------------------------------------------+ * cancel_before_shmem_exit+ *+ * this function removes a previously-registed before_shmem_exit+ * callback. For simplicity, only the latest entry can be+ * removed. (We could work harder but there is no need for+ * current uses.)+ * ----------------------------------------------------------------+ */+++/* ----------------------------------------------------------------+ * on_exit_reset+ *+ * this function clears all on_proc_exit() and on_shmem_exit()+ * registered functions. This is used just after forking a backend,+ * so that the backend doesn't believe it should call the postmaster's+ * on-exit routines when it exits...+ * ----------------------------------------------------------------+ */+
+ foreign/libpg_query/src/postgres/src_backend_tcop_postgres.c view
@@ -0,0 +1,753 @@+/*--------------------------------------------------------------------+ * Symbols referenced in this file:+ * - whereToSendOutput+ * - debug_query_string+ * - ProcessInterrupts+ * - check_stack_depth+ * - stack_is_too_deep+ * - stack_base_ptr+ * - max_stack_depth_bytes+ * - max_stack_depth+ *--------------------------------------------------------------------+ */++/*-------------------------------------------------------------------------+ *+ * postgres.c+ * POSTGRES C Backend Interface+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ *+ * IDENTIFICATION+ * src/backend/tcop/postgres.c+ *+ * NOTES+ * this is the "main" module of the postgres backend and+ * hence the main module of the "traffic cop".+ *+ *-------------------------------------------------------------------------+ */++#include "postgres.h"++#include <fcntl.h>+#include <limits.h>+#include <signal.h>+#include <unistd.h>+#include <sys/socket.h>+#ifdef HAVE_SYS_SELECT_H+#include <sys/select.h>+#endif+#ifdef HAVE_SYS_RESOURCE_H+#include <sys/time.h>+#include <sys/resource.h>+#endif++#ifndef HAVE_GETRUSAGE+#include "rusagestub.h"+#endif++#include "access/parallel.h"+#include "access/printtup.h"+#include "access/xact.h"+#include "catalog/pg_type.h"+#include "commands/async.h"+#include "commands/prepare.h"+#include "libpq/libpq.h"+#include "libpq/pqformat.h"+#include "libpq/pqsignal.h"+#include "miscadmin.h"+#include "nodes/print.h"+#include "optimizer/planner.h"+#include "pgstat.h"+#include "pg_trace.h"+#include "parser/analyze.h"+#include "parser/parser.h"+#include "pg_getopt.h"+#include "postmaster/autovacuum.h"+#include "postmaster/postmaster.h"+#include "replication/slot.h"+#include "replication/walsender.h"+#include "rewrite/rewriteHandler.h"+#include "storage/bufmgr.h"+#include "storage/ipc.h"+#include "storage/proc.h"+#include "storage/procsignal.h"+#include "storage/sinval.h"+#include "tcop/fastpath.h"+#include "tcop/pquery.h"+#include "tcop/tcopprot.h"+#include "tcop/utility.h"+#include "utils/lsyscache.h"+#include "utils/memutils.h"+#include "utils/ps_status.h"+#include "utils/snapmgr.h"+#include "utils/timeout.h"+#include "utils/timestamp.h"+#include "mb/pg_wchar.h"+++/* ----------------+ * global variables+ * ----------------+ */+__thread const char *debug_query_string;+ /* client-supplied query string */++/* Note: whereToSendOutput is initialized for the bootstrap/standalone case */+__thread CommandDest whereToSendOutput = DestDebug;+++/* flag for logging end of session */+++++/* GUC variable for maximum stack depth (measured in kilobytes) */+__thread int max_stack_depth = 100;+++/* wait N seconds to allow attach from a debugger */+++++/* ----------------+ * private variables+ * ----------------+ */++/* max_stack_depth converted to bytes for speed of checking */+static long max_stack_depth_bytes = 100 * 1024L;++/*+ * Stack base pointer -- initialized by PostmasterMain and inherited by+ * subprocesses. This is not static because old versions of PL/Java modify+ * it directly. Newer versions use set_stack_base(), but we want to stay+ * binary-compatible for the time being.+ */+__thread char *stack_base_ptr = NULL;+++/*+ * On IA64 we also have to remember the register stack base.+ */+#if defined(__ia64__) || defined(__ia64)+char *register_stack_base_ptr = NULL;+#endif++/*+ * Flag to mark SIGHUP. Whenever the main loop comes around it+ * will reread the configuration file. (Better than doing the+ * reading in the signal handler, ey?)+ */+++/*+ * Flag to keep track of whether we have started a transaction.+ * For extended query protocol this has to be remembered across messages.+ */+++/*+ * Flag to indicate that we are doing the outer loop's read-from-client,+ * as opposed to any random read from client that might happen within+ * commands like COPY FROM STDIN.+ */+++/*+ * Flags to implement skip-till-Sync-after-error behavior for messages of+ * the extended query protocol.+ */++++/*+ * If an unnamed prepared statement exists, it's stored here.+ * We keep it separate from the hashtable kept by commands/prepare.c+ * in order to reduce overhead for short-lived queries.+ */+++/* assorted command-line switches */+ /* -D switch */++ /* -E switch */++/*+ * people who want to use EOF should #define DONTUSENEWLINE in+ * tcop/tcopdebug.h+ */+#ifndef TCOP_DONTUSENEWLINE+ /* Use newlines query delimiters (the default) */+#else+static int UseNewLine = 0; /* Use EOF as query delimiters */+#endif /* TCOP_DONTUSENEWLINE */++/* whether or not, and why, we were canceled by conflict with recovery */+++++/* ----------------------------------------------------------------+ * decls for routines only used in this file+ * ----------------------------------------------------------------+ */+static int InteractiveBackend(StringInfo inBuf);+static int interactive_getc(void);+static int SocketBackend(StringInfo inBuf);+static int ReadCommand(StringInfo inBuf);+static void forbidden_in_wal_sender(char firstchar);+static List *pg_rewrite_query(Query *query);+static bool check_log_statement(List *stmt_list);+static int errdetail_execute(List *raw_parsetree_list);+static int errdetail_params(ParamListInfo params);+static int errdetail_abort(void);+static int errdetail_recovery_conflict(void);+static void start_xact_command(void);+static void finish_xact_command(void);+static bool IsTransactionExitStmt(Node *parsetree);+static bool IsTransactionExitStmtList(List *parseTrees);+static bool IsTransactionStmtList(List *parseTrees);+static void drop_unnamed_stmt(void);+static void SigHupHandler(SIGNAL_ARGS);+static void log_disconnections(int code, Datum arg);+++/* ----------------------------------------------------------------+ * routines to obtain user input+ * ----------------------------------------------------------------+ */++/* ----------------+ * InteractiveBackend() is called for user interactive connections+ *+ * the string entered by the user is placed in its parameter inBuf,+ * and we act like a Q message was received.+ *+ * EOF is returned if end-of-file input is seen; time to shut down.+ * ----------------+ */++++/*+ * interactive_getc -- collect one character from stdin+ *+ * Even though we are not reading from a "client" process, we still want to+ * respond to signals, particularly SIGTERM/SIGQUIT.+ */+++/* ----------------+ * SocketBackend() Is called for frontend-backend connections+ *+ * Returns the message type code, and loads message body data into inBuf.+ *+ * EOF is returned if the connection is lost.+ * ----------------+ */+++/* ----------------+ * ReadCommand reads a command from either the frontend or+ * standard input, places it in inBuf, and returns the+ * message type code (first byte of the message).+ * EOF is returned if end of file.+ * ----------------+ */+++/*+ * ProcessClientReadInterrupt() - Process interrupts specific to client reads+ *+ * This is called just after low-level reads. That might be after the read+ * finished successfully, or it was interrupted via interrupt.+ *+ * Must preserve errno!+ */+++/*+ * ProcessClientWriteInterrupt() - Process interrupts specific to client writes+ *+ * This is called just after low-level writes. That might be after the read+ * finished successfully, or it was interrupted via interrupt. 'blocked' tells+ * us whether the+ *+ * Must preserve errno!+ */+++/*+ * Do raw parsing (only).+ *+ * A list of parsetrees is returned, since there might be multiple+ * commands in the given string.+ *+ * NOTE: for interactive queries, it is important to keep this routine+ * separate from the analysis & rewrite stages. Analysis and rewriting+ * cannot be done in an aborted transaction, since they require access to+ * database tables. So, we rely on the raw parser to determine whether+ * we've seen a COMMIT or ABORT command; when we are in abort state, other+ * commands are not processed any further than the raw parse stage.+ */+#ifdef COPY_PARSE_PLAN_TREES+#endif++/*+ * Given a raw parsetree (gram.y output), and optionally information about+ * types of parameter symbols ($n), perform parse analysis and rule rewriting.+ *+ * A list of Query nodes is returned, since either the analyzer or the+ * rewriter might expand one query to several.+ *+ * NOTE: for reasons mentioned above, this must be separate from raw parsing.+ */+++/*+ * Do parse analysis and rewriting. This is the same as pg_analyze_and_rewrite+ * except that external-parameter resolution is determined by parser callback+ * hooks instead of a fixed list of parameter datatypes.+ */+++/*+ * Perform rewriting of a query produced by parse analysis.+ *+ * Note: query must just have come from the parser, because we do not do+ * AcquireRewriteLocks() on it.+ */+#ifdef COPY_PARSE_PLAN_TREES+#endif+++/*+ * Generate a plan for a single already-rewritten query.+ * This is a thin wrapper around planner() and takes the same parameters.+ */+#ifdef COPY_PARSE_PLAN_TREES+#ifdef NOT_USED+#endif+#endif++/*+ * Generate plans for a list of already-rewritten queries.+ *+ * Normal optimizable statements generate PlannedStmt entries in the result+ * list. Utility statements are simply represented by their statement nodes.+ */++++/*+ * exec_simple_query+ *+ * Execute a "simple Query" protocol message.+ */+++/*+ * exec_parse_message+ *+ * Execute a "Parse" protocol message.+ */+++/*+ * exec_bind_message+ *+ * Process a "Bind" message to create a portal from a prepared statement+ */+++/*+ * exec_execute_message+ *+ * Process an "Execute" message for a portal+ */+++/*+ * check_log_statement+ * Determine whether command should be logged because of log_statement+ *+ * stmt_list can be either raw grammar output or a list of planned+ * statements+ */+++/*+ * check_log_duration+ * Determine whether current command's duration should be logged+ *+ * Returns:+ * 0 if no logging is needed+ * 1 if just the duration should be logged+ * 2 if duration and query details should be logged+ *+ * If logging is needed, the duration in msec is formatted into msec_str[],+ * which must be a 32-byte buffer.+ *+ * was_logged should be TRUE if caller already logged query details (this+ * essentially prevents 2 from being returned).+ */+++/*+ * errdetail_execute+ *+ * Add an errdetail() line showing the query referenced by an EXECUTE, if any.+ * The argument is the raw parsetree list.+ */+++/*+ * errdetail_params+ *+ * Add an errdetail() line showing bind-parameter data, if available.+ */+++/*+ * errdetail_abort+ *+ * Add an errdetail() line showing abort reason, if any.+ */+++/*+ * errdetail_recovery_conflict+ *+ * Add an errdetail() line showing conflict source.+ */+++/*+ * exec_describe_statement_message+ *+ * Process a "Describe" message for a prepared statement+ */+++/*+ * exec_describe_portal_message+ *+ * Process a "Describe" message for a portal+ */++++/*+ * Convenience routines for starting/committing a single command.+ */+++#ifdef MEMORY_CONTEXT_CHECKING+#endif+#ifdef SHOW_MEMORY_STATS+#endif+++/*+ * Convenience routines for checking whether a statement is one of the+ * ones that we allow in transaction-aborted state.+ */++/* Test a bare parsetree */+++/* Test a list that might contain Query nodes or bare parsetrees */+++/* Test a list that might contain Query nodes or bare parsetrees */+++/* Release any existing unnamed prepared statement */++++/* --------------------------------+ * signal handler routines used in PostgresMain()+ * --------------------------------+ */++/*+ * quickdie() occurs when signalled SIGQUIT by the postmaster.+ *+ * Some backend has bought the farm,+ * so we need to stop what we're doing and exit.+ */+++/*+ * Shutdown signal from postmaster: abort transaction and exit+ * at soonest convenient time+ */+++/*+ * Query-cancel signal from postmaster: abort current transaction+ * at soonest convenient time+ */+++/* signal handler for floating point exception */+++/* SIGHUP: set flag to re-read config file at next convenient time */+++/*+ * RecoveryConflictInterrupt: out-of-line portion of recovery conflict+ * handling following receipt of SIGUSR1. Designed to be similar to die()+ * and StatementCancelHandler(). Called only by a normal user backend+ * that begins a transaction during recovery.+ */+++/*+ * ProcessInterrupts: out-of-line portion of CHECK_FOR_INTERRUPTS() macro+ *+ * If an interrupt condition is pending, and it's safe to service it,+ * then clear the flag and accept the interrupt. Called only when+ * InterruptPending is true.+ */+void ProcessInterrupts(void) {}++++/*+ * IA64-specific code to fetch the AR.BSP register for stack depth checks.+ *+ * We currently support gcc, icc, and HP-UX inline assembly here.+ */+#if defined(__ia64__) || defined(__ia64)++#if defined(__hpux) && !defined(__GNUC__) && !defined __INTEL_COMPILER+#include <ia64/sys/inline.h>+#define ia64_get_bsp() ((char *) (_Asm_mov_from_ar(_AREG_BSP, _NO_FENCE)))+#else++#ifdef __INTEL_COMPILER+#include <asm/ia64regs.h>+#endif++static __inline__ char *+ia64_get_bsp(void)+{+ char *ret;++#ifndef __INTEL_COMPILER+ /* the ;; is a "stop", seems to be required before fetching BSP */+ __asm__ __volatile__(+ ";;\n"+ " mov %0=ar.bsp \n"+ : "=r"(ret));+#else+ ret = (char *) __getReg(_IA64_REG_AR_BSP);+#endif+ return ret;+}+#endif+#endif /* IA64 */+++/*+ * set_stack_base: set up reference point for stack depth checking+ *+ * Returns the old reference point, if any.+ */+#if defined(__ia64__) || defined(__ia64)+#else+#endif+#if defined(__ia64__) || defined(__ia64)+#endif++/*+ * restore_stack_base: restore reference point for stack depth checking+ *+ * This can be used after set_stack_base() to restore the old value. This+ * is currently only used in PL/Java. When PL/Java calls a backend function+ * from different thread, the thread's stack is at a different location than+ * the main thread's stack, so it sets the base pointer before the call, and+ * restores it afterwards.+ */+#if defined(__ia64__) || defined(__ia64)+#else+#endif++/*+ * check_stack_depth/stack_is_too_deep: check for excessively deep recursion+ *+ * This should be called someplace in any recursive routine that might possibly+ * recurse deep enough to overflow the stack. Most Unixen treat stack+ * overflow as an unrecoverable SIGSEGV, so we want to error out ourselves+ * before hitting the hardware limit.+ *+ * check_stack_depth() just throws an error summarily. stack_is_too_deep()+ * can be used by code that wants to handle the error condition itself.+ */+void+check_stack_depth(void)+{+ if (stack_is_too_deep())+ {+ ereport(ERROR,+ (errcode(ERRCODE_STATEMENT_TOO_COMPLEX),+ errmsg("stack depth limit exceeded"),+ errhint("Increase the configuration parameter \"max_stack_depth\" (currently %dkB), "+ "after ensuring the platform's stack depth limit is adequate.",+ max_stack_depth)));+ }+}++bool+stack_is_too_deep(void)+{+ char stack_top_loc;+ long stack_depth;++ /*+ * Compute distance from reference point to my local variables+ */+ stack_depth = (long) (stack_base_ptr - &stack_top_loc);++ /*+ * Take abs value, since stacks grow up on some machines, down on others+ */+ if (stack_depth < 0)+ stack_depth = -stack_depth;++ /*+ * Trouble?+ *+ * The test on stack_base_ptr prevents us from erroring out if called+ * during process setup or in a non-backend process. Logically it should+ * be done first, but putting it here avoids wasting cycles during normal+ * cases.+ */+ if (stack_depth > max_stack_depth_bytes &&+ stack_base_ptr != NULL)+ return true;++ /*+ * On IA64 there is a separate "register" stack that requires its own+ * independent check. For this, we have to measure the change in the+ * "BSP" pointer from PostgresMain to here. Logic is just as above,+ * except that we know IA64's register stack grows up.+ *+ * Note we assume that the same max_stack_depth applies to both stacks.+ */+#if defined(__ia64__) || defined(__ia64)+ stack_depth = (long) (ia64_get_bsp() - register_stack_base_ptr);++ if (stack_depth > max_stack_depth_bytes &&+ register_stack_base_ptr != NULL)+ return true;+#endif /* IA64 */++ return false;+}++/* GUC check hook for max_stack_depth */+++/* GUC assign hook for max_stack_depth */++++/*+ * set_debug_options --- apply "-d N" command line option+ *+ * -d is not quite the same as setting log_min_messages because it enables+ * other output options.+ */++++++++++/* ----------------------------------------------------------------+ * process_postgres_switches+ * Parse command line arguments for PostgresMain+ *+ * This is called twice, once for the "secure" options coming from the+ * postmaster or command line, and once for the "insecure" options coming+ * from the client's startup packet. The latter have the same syntax but+ * may be restricted in what they can do.+ *+ * argv[0] is ignored in either case (it's assumed to be the program name).+ *+ * ctx is PGC_POSTMASTER for secure options, PGC_BACKEND for insecure options+ * coming from the client, or PGC_SU_BACKEND for insecure options coming from+ * a superuser client.+ *+ * If a database name is present in the command line arguments, it's+ * returned into *dbname (this is allowed only if *dbname is initially NULL).+ * ----------------------------------------------------------------+ */+#ifdef HAVE_INT_OPTERR+#endif+#ifdef HAVE_INT_OPTRESET+#endif+++/* ----------------------------------------------------------------+ * PostgresMain+ * postgres main loop -- all backends, interactive or otherwise start here+ *+ * argc/argv are the command line arguments to be used. (When being forked+ * by the postmaster, these are not the original argv array of the process.)+ * dbname is the name of the database to connect to, or NULL if the database+ * name should be extracted from the command line arguments or defaulted.+ * username is the PostgreSQL user name to be used for the session.+ * ----------------------------------------------------------------+ */+#ifdef EXEC_BACKEND+#else+#endif++/*+ * Throw an error if we're a WAL sender process.+ *+ * This is used to forbid anything else than simple query protocol messages+ * in a WAL sender process. 'firstchar' specifies what kind of a forbidden+ * message was received, and is used to construct the error message.+ */++++/*+ * Obtain platform stack depth limit (in bytes)+ *+ * Return -1 if unknown+ */+#if defined(HAVE_GETRLIMIT) && defined(RLIMIT_STACK)+#else /* no getrlimit */+#if defined(WIN32) || defined(__CYGWIN__)+#else /* not windows ... give up */+#endif+#endif++++++++#if defined(HAVE_GETRUSAGE)+#endif /* HAVE_GETRUSAGE */++/*+ * on_proc_exit handler to log end of session+ */+
+ foreign/libpg_query/src/postgres/src_backend_utils_adt_datum.c view
@@ -0,0 +1,247 @@+/*--------------------------------------------------------------------+ * Symbols referenced in this file:+ * - datumCopy+ * - datumGetSize+ * - datumIsEqual+ *--------------------------------------------------------------------+ */++/*-------------------------------------------------------------------------+ *+ * datum.c+ * POSTGRES Datum (abstract data type) manipulation routines.+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ *+ * IDENTIFICATION+ * src/backend/utils/adt/datum.c+ *+ *-------------------------------------------------------------------------+ */++/*+ * In the implementation of these routines we assume the following:+ *+ * A) if a type is "byVal" then all the information is stored in the+ * Datum itself (i.e. no pointers involved!). In this case the+ * length of the type is always greater than zero and not more than+ * "sizeof(Datum)"+ *+ * B) if a type is not "byVal" and it has a fixed length (typlen > 0),+ * then the "Datum" always contains a pointer to a stream of bytes.+ * The number of significant bytes are always equal to the typlen.+ *+ * C) if a type is not "byVal" and has typlen == -1,+ * then the "Datum" always points to a "struct varlena".+ * This varlena structure has information about the actual length of this+ * particular instance of the type and about its value.+ *+ * D) if a type is not "byVal" and has typlen == -2,+ * then the "Datum" always points to a null-terminated C string.+ *+ * Note that we do not treat "toasted" datums specially; therefore what+ * will be copied or compared is the compressed data or toast reference.+ * An exception is made for datumCopy() of an expanded object, however,+ * because most callers expect to get a simple contiguous (and pfree'able)+ * result from datumCopy(). See also datumTransfer().+ */++#include "postgres.h"++#include "utils/datum.h"+#include "utils/expandeddatum.h"+++/*-------------------------------------------------------------------------+ * datumGetSize+ *+ * Find the "real" size of a datum, given the datum value,+ * whether it is a "by value", and the declared type length.+ * (For TOAST pointer datums, this is the size of the pointer datum.)+ *+ * This is essentially an out-of-line version of the att_addlength_datum()+ * macro in access/tupmacs.h. We do a tad more error checking though.+ *-------------------------------------------------------------------------+ */+Size+datumGetSize(Datum value, bool typByVal, int typLen)+{+ Size size;++ if (typByVal)+ {+ /* Pass-by-value types are always fixed-length */+ Assert(typLen > 0 && typLen <= sizeof(Datum));+ size = (Size) typLen;+ }+ else+ {+ if (typLen > 0)+ {+ /* Fixed-length pass-by-ref type */+ size = (Size) typLen;+ }+ else if (typLen == -1)+ {+ /* It is a varlena datatype */+ struct varlena *s = (struct varlena *) DatumGetPointer(value);++ if (!PointerIsValid(s))+ ereport(ERROR,+ (errcode(ERRCODE_DATA_EXCEPTION),+ errmsg("invalid Datum pointer")));++ size = (Size) VARSIZE_ANY(s);+ }+ else if (typLen == -2)+ {+ /* It is a cstring datatype */+ char *s = (char *) DatumGetPointer(value);++ if (!PointerIsValid(s))+ ereport(ERROR,+ (errcode(ERRCODE_DATA_EXCEPTION),+ errmsg("invalid Datum pointer")));++ size = (Size) (strlen(s) + 1);+ }+ else+ {+ elog(ERROR, "invalid typLen: %d", typLen);+ size = 0; /* keep compiler quiet */+ }+ }++ return size;+}++/*-------------------------------------------------------------------------+ * datumCopy+ *+ * Make a copy of a non-NULL datum.+ *+ * If the datatype is pass-by-reference, memory is obtained with palloc().+ *+ * If the value is a reference to an expanded object, we flatten into memory+ * obtained with palloc(). We need to copy because one of the main uses of+ * this function is to copy a datum out of a transient memory context that's+ * about to be destroyed, and the expanded object is probably in a child+ * context that will also go away. Moreover, many callers assume that the+ * result is a single pfree-able chunk.+ *-------------------------------------------------------------------------+ */+Datum+datumCopy(Datum value, bool typByVal, int typLen)+{+ Datum res;++ if (typByVal)+ res = value;+ else if (typLen == -1)+ {+ /* It is a varlena datatype */+ struct varlena *vl = (struct varlena *) DatumGetPointer(value);++ if (VARATT_IS_EXTERNAL_EXPANDED(vl))+ {+ /* Flatten into the caller's memory context */+ ExpandedObjectHeader *eoh = DatumGetEOHP(value);+ Size resultsize;+ char *resultptr;++ resultsize = EOH_get_flat_size(eoh);+ resultptr = (char *) palloc(resultsize);+ EOH_flatten_into(eoh, (void *) resultptr, resultsize);+ res = PointerGetDatum(resultptr);+ }+ else+ {+ /* Otherwise, just copy the varlena datum verbatim */+ Size realSize;+ char *resultptr;++ realSize = (Size) VARSIZE_ANY(vl);+ resultptr = (char *) palloc(realSize);+ memcpy(resultptr, vl, realSize);+ res = PointerGetDatum(resultptr);+ }+ }+ else+ {+ /* Pass by reference, but not varlena, so not toasted */+ Size realSize;+ char *resultptr;++ realSize = datumGetSize(value, typByVal, typLen);++ resultptr = (char *) palloc(realSize);+ memcpy(resultptr, DatumGetPointer(value), realSize);+ res = PointerGetDatum(resultptr);+ }+ return res;+}++/*-------------------------------------------------------------------------+ * datumTransfer+ *+ * Transfer a non-NULL datum into the current memory context.+ *+ * This is equivalent to datumCopy() except when the datum is a read-write+ * pointer to an expanded object. In that case we merely reparent the object+ * into the current context, and return its standard R/W pointer (in case the+ * given one is a transient pointer of shorter lifespan).+ *-------------------------------------------------------------------------+ */+++/*-------------------------------------------------------------------------+ * datumIsEqual+ *+ * Return true if two datums are equal, false otherwise+ *+ * NOTE: XXX!+ * We just compare the bytes of the two values, one by one.+ * This routine will return false if there are 2 different+ * representations of the same value (something along the lines+ * of say the representation of zero in one's complement arithmetic).+ * Also, it will probably not give the answer you want if either+ * datum has been "toasted".+ *-------------------------------------------------------------------------+ */+bool+datumIsEqual(Datum value1, Datum value2, bool typByVal, int typLen)+{+ bool res;++ if (typByVal)+ {+ /*+ * just compare the two datums. NOTE: just comparing "len" bytes will+ * not do the work, because we do not know how these bytes are aligned+ * inside the "Datum". We assume instead that any given datatype is+ * consistent about how it fills extraneous bits in the Datum.+ */+ res = (value1 == value2);+ }+ else+ {+ Size size1,+ size2;+ char *s1,+ *s2;++ /*+ * Compare the bytes pointed by the pointers stored in the datums.+ */+ size1 = datumGetSize(value1, typByVal, typLen);+ size2 = datumGetSize(value2, typByVal, typLen);+ if (size1 != size2)+ return false;+ s1 = (char *) DatumGetPointer(value1);+ s2 = (char *) DatumGetPointer(value2);+ res = (memcmp(s1, s2, size1) == 0);+ }+ return res;+}
+ foreign/libpg_query/src/postgres/src_backend_utils_adt_expandeddatum.c view
@@ -0,0 +1,100 @@+/*--------------------------------------------------------------------+ * Symbols referenced in this file:+ * - DatumGetEOHP+ * - EOH_get_flat_size+ * - EOH_flatten_into+ *--------------------------------------------------------------------+ */++/*-------------------------------------------------------------------------+ *+ * expandeddatum.c+ * Support functions for "expanded" value representations.+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ *+ * IDENTIFICATION+ * src/backend/utils/adt/expandeddatum.c+ *+ *-------------------------------------------------------------------------+ */+#include "postgres.h"++#include "utils/expandeddatum.h"+#include "utils/memutils.h"++/*+ * DatumGetEOHP+ *+ * Given a Datum that is an expanded-object reference, extract the pointer.+ *+ * This is a bit tedious since the pointer may not be properly aligned;+ * compare VARATT_EXTERNAL_GET_POINTER().+ */+ExpandedObjectHeader *+DatumGetEOHP(Datum d)+{+ varattrib_1b_e *datum = (varattrib_1b_e *) DatumGetPointer(d);+ varatt_expanded ptr;++ Assert(VARATT_IS_EXTERNAL_EXPANDED(datum));+ memcpy(&ptr, VARDATA_EXTERNAL(datum), sizeof(ptr));+ Assert(VARATT_IS_EXPANDED_HEADER(ptr.eohptr));+ return ptr.eohptr;+}++/*+ * EOH_init_header+ *+ * Initialize the common header of an expanded object.+ *+ * The main thing this encapsulates is initializing the TOAST pointers.+ */+++/*+ * EOH_get_flat_size+ * EOH_flatten_into+ *+ * Convenience functions for invoking the "methods" of an expanded object.+ */++Size+EOH_get_flat_size(ExpandedObjectHeader *eohptr)+{+ return (*eohptr->eoh_methods->get_flat_size) (eohptr);+}++void+EOH_flatten_into(ExpandedObjectHeader *eohptr,+ void *result, Size allocated_size)+{+ (*eohptr->eoh_methods->flatten_into) (eohptr, result, allocated_size);+}++/*+ * Does the Datum represent a writable expanded object?+ */+++/*+ * If the Datum represents a R/W expanded object, change it to R/O.+ * Otherwise return the original Datum.+ */+++/*+ * Transfer ownership of an expanded object to a new parent memory context.+ * The object must be referenced by a R/W pointer, and what we return is+ * always its "standard" R/W pointer, which is certain to have the same+ * lifespan as the object itself. (The passed-in pointer might not, and+ * in any case wouldn't provide a unique identifier if it's not that one.)+ */+++/*+ * Delete an expanded object (must be referenced by a R/W pointer).+ */+
+ foreign/libpg_query/src/postgres/src_backend_utils_adt_format_type.c view
@@ -0,0 +1,119 @@+/*--------------------------------------------------------------------+ * Symbols referenced in this file:+ * - format_type_be+ *--------------------------------------------------------------------+ */++/*-------------------------------------------------------------------------+ *+ * format_type.c+ * Display type names "nicely".+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * IDENTIFICATION+ * src/backend/utils/adt/format_type.c+ *+ *-------------------------------------------------------------------------+ */++#include "postgres.h"++#include <ctype.h>++#include "access/htup_details.h"+#include "catalog/namespace.h"+#include "catalog/pg_type.h"+#include "utils/builtins.h"+#include "utils/lsyscache.h"+#include "utils/numeric.h"+#include "utils/syscache.h"+#include "mb/pg_wchar.h"++#define MAX_INT32_LEN 11++static char *format_type_internal(Oid type_oid, int32 typemod,+ bool typemod_given, bool allow_invalid,+ bool force_qualify);+static char *printTypmod(const char *typname, int32 typmod, Oid typmodout);+++/*+ * SQL function: format_type(type_oid, typemod)+ *+ * `type_oid' is from pg_type.oid, `typemod' is from+ * pg_attribute.atttypmod. This function will get the type name and+ * format it and the modifier to canonical SQL format, if the type is+ * a standard type. Otherwise you just get pg_type.typname back,+ * double quoted if it contains funny characters or matches a keyword.+ *+ * If typemod is NULL then we are formatting a type name in a context where+ * no typemod is available, eg a function argument or result type. This+ * yields a slightly different result from specifying typemod = -1 in some+ * cases. Given typemod = -1 we feel compelled to produce an output that+ * the parser will interpret as having typemod -1, so that pg_dump will+ * produce CREATE TABLE commands that recreate the original state. But+ * given NULL typemod, we assume that the parser's interpretation of+ * typemod doesn't matter, and so we are willing to output a slightly+ * "prettier" representation of the same type. For example, type = bpchar+ * and typemod = NULL gets you "character", whereas typemod = -1 gets you+ * "bpchar" --- the former will be interpreted as character(1) by the+ * parser, which does not yield typemod -1.+ *+ * XXX encoding a meaning in typemod = NULL is ugly; it'd have been+ * cleaner to make two functions of one and two arguments respectively.+ * Not worth changing it now, however.+ */+++/*+ * This version is for use within the backend in error messages, etc.+ * One difference is that it will fail for an invalid type.+ *+ * The result is always a palloc'd string.+ */+char * format_type_be(Oid type_oid) { return pstrdup("-"); }+++/*+ * This version returns a name which is always qualified.+ */+++/*+ * This version allows a nondefault typemod to be specified.+ */++++++/*+ * Add typmod decoration to the basic type name+ */++++/*+ * type_maximum_size --- determine maximum width of a variable-width column+ *+ * If the max width is indeterminate, return -1. In particular, we return+ * -1 for any type not known to this routine. We assume the caller has+ * already determined that the type is a variable-width type, so it's not+ * necessary to look up the type's pg_type tuple here.+ *+ * This may appear unrelated to format_type(), but in fact the two routines+ * share knowledge of the encoding of typmod for different types, so it's+ * convenient to keep them together. (XXX now that most of this knowledge+ * has been pushed out of format_type into the typmodout functions, it's+ * interesting to wonder if it's worth trying to factor this code too...)+ */++++/*+ * oidvectortypes - converts a vector of type OIDs to "typname" list+ */+
+ foreign/libpg_query/src/postgres/src_backend_utils_adt_ruleutils.c view
@@ -0,0 +1,1502 @@+/*--------------------------------------------------------------------+ * Symbols referenced in this file:+ * - quote_identifier+ * - quote_all_identifiers+ *--------------------------------------------------------------------+ */++/*-------------------------------------------------------------------------+ *+ * ruleutils.c+ * Functions to convert stored expressions/querytrees back to+ * source text+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ *+ * IDENTIFICATION+ * src/backend/utils/adt/ruleutils.c+ *+ *-------------------------------------------------------------------------+ */+#include "postgres.h"++#include <ctype.h>+#include <unistd.h>+#include <fcntl.h>++#include "access/htup_details.h"+#include "access/sysattr.h"+#include "catalog/dependency.h"+#include "catalog/indexing.h"+#include "catalog/pg_aggregate.h"+#include "catalog/pg_authid.h"+#include "catalog/pg_collation.h"+#include "catalog/pg_constraint.h"+#include "catalog/pg_depend.h"+#include "catalog/pg_language.h"+#include "catalog/pg_opclass.h"+#include "catalog/pg_operator.h"+#include "catalog/pg_proc.h"+#include "catalog/pg_trigger.h"+#include "catalog/pg_type.h"+#include "commands/defrem.h"+#include "commands/tablespace.h"+#include "executor/spi.h"+#include "funcapi.h"+#include "mb/pg_wchar.h"+#include "miscadmin.h"+#include "nodes/makefuncs.h"+#include "nodes/nodeFuncs.h"+#include "optimizer/tlist.h"+#include "parser/keywords.h"+#include "parser/parse_node.h"+#include "parser/parse_agg.h"+#include "parser/parse_func.h"+#include "parser/parse_oper.h"+#include "parser/parser.h"+#include "parser/parsetree.h"+#include "rewrite/rewriteHandler.h"+#include "rewrite/rewriteManip.h"+#include "rewrite/rewriteSupport.h"+#include "utils/array.h"+#include "utils/builtins.h"+#include "utils/fmgroids.h"+#include "utils/hsearch.h"+#include "utils/lsyscache.h"+#include "utils/rel.h"+#include "utils/ruleutils.h"+#include "utils/snapmgr.h"+#include "utils/syscache.h"+#include "utils/tqual.h"+#include "utils/typcache.h"+#include "utils/xml.h"+++/* ----------+ * Pretty formatting constants+ * ----------+ */++/* Indent counts */+#define PRETTYINDENT_STD 8+#define PRETTYINDENT_JOIN 4+#define PRETTYINDENT_VAR 4++#define PRETTYINDENT_LIMIT 40 /* wrap limit */++/* Pretty flags */+#define PRETTYFLAG_PAREN 1+#define PRETTYFLAG_INDENT 2++/* Default line length for pretty-print wrapping: 0 means wrap always */+#define WRAP_COLUMN_DEFAULT 0++/* macro to test if pretty action needed */+#define PRETTY_PAREN(context) ((context)->prettyFlags & PRETTYFLAG_PAREN)+#define PRETTY_INDENT(context) ((context)->prettyFlags & PRETTYFLAG_INDENT)+++/* ----------+ * Local data types+ * ----------+ */++/* Context info needed for invoking a recursive querytree display routine */+typedef struct+{+ StringInfo buf; /* output buffer to append to */+ List *namespaces; /* List of deparse_namespace nodes */+ List *windowClause; /* Current query level's WINDOW clause */+ List *windowTList; /* targetlist for resolving WINDOW clause */+ int prettyFlags; /* enabling of pretty-print functions */+ int wrapColumn; /* max line length, or -1 for no limit */+ int indentLevel; /* current indent level for prettyprint */+ bool varprefix; /* TRUE to print prefixes on Vars */+ ParseExprKind special_exprkind; /* set only for exprkinds needing+ * special handling */+} deparse_context;++/*+ * Each level of query context around a subtree needs a level of Var namespace.+ * A Var having varlevelsup=N refers to the N'th item (counting from 0) in+ * the current context's namespaces list.+ *+ * The rangetable is the list of actual RTEs from the query tree, and the+ * cte list is the list of actual CTEs.+ *+ * rtable_names holds the alias name to be used for each RTE (either a C+ * string, or NULL for nameless RTEs such as unnamed joins).+ * rtable_columns holds the column alias names to be used for each RTE.+ *+ * In some cases we need to make names of merged JOIN USING columns unique+ * across the whole query, not only per-RTE. If so, unique_using is TRUE+ * and using_names is a list of C strings representing names already assigned+ * to USING columns.+ *+ * When deparsing plan trees, there is always just a single item in the+ * deparse_namespace list (since a plan tree never contains Vars with+ * varlevelsup > 0). We store the PlanState node that is the immediate+ * parent of the expression to be deparsed, as well as a list of that+ * PlanState's ancestors. In addition, we store its outer and inner subplan+ * state nodes, as well as their plan nodes' targetlists, and the index tlist+ * if the current plan node might contain INDEX_VAR Vars. (These fields could+ * be derived on-the-fly from the current PlanState, but it seems notationally+ * clearer to set them up as separate fields.)+ */+typedef struct+{+ List *rtable; /* List of RangeTblEntry nodes */+ List *rtable_names; /* Parallel list of names for RTEs */+ List *rtable_columns; /* Parallel list of deparse_columns structs */+ List *ctes; /* List of CommonTableExpr nodes */+ /* Workspace for column alias assignment: */+ bool unique_using; /* Are we making USING names globally unique */+ List *using_names; /* List of assigned names for USING columns */+ /* Remaining fields are used only when deparsing a Plan tree: */+ PlanState *planstate; /* immediate parent of current expression */+ List *ancestors; /* ancestors of planstate */+ PlanState *outer_planstate; /* outer subplan state, or NULL if none */+ PlanState *inner_planstate; /* inner subplan state, or NULL if none */+ List *outer_tlist; /* referent for OUTER_VAR Vars */+ List *inner_tlist; /* referent for INNER_VAR Vars */+ List *index_tlist; /* referent for INDEX_VAR Vars */+} deparse_namespace;++/*+ * Per-relation data about column alias names.+ *+ * Selecting aliases is unreasonably complicated because of the need to dump+ * rules/views whose underlying tables may have had columns added, deleted, or+ * renamed since the query was parsed. We must nonetheless print the rule/view+ * in a form that can be reloaded and will produce the same results as before.+ *+ * For each RTE used in the query, we must assign column aliases that are+ * unique within that RTE. SQL does not require this of the original query,+ * but due to factors such as *-expansion we need to be able to uniquely+ * reference every column in a decompiled query. As long as we qualify all+ * column references, per-RTE uniqueness is sufficient for that.+ *+ * However, we can't ensure per-column name uniqueness for unnamed join RTEs,+ * since they just inherit column names from their input RTEs, and we can't+ * rename the columns at the join level. Most of the time this isn't an issue+ * because we don't need to reference the join's output columns as such; we+ * can reference the input columns instead. That approach can fail for merged+ * JOIN USING columns, however, so when we have one of those in an unnamed+ * join, we have to make that column's alias globally unique across the whole+ * query to ensure it can be referenced unambiguously.+ *+ * Another problem is that a JOIN USING clause requires the columns to be+ * merged to have the same aliases in both input RTEs, and that no other+ * columns in those RTEs or their children conflict with the USING names.+ * To handle that, we do USING-column alias assignment in a recursive+ * traversal of the query's jointree. When descending through a JOIN with+ * USING, we preassign the USING column names to the child columns, overriding+ * other rules for column alias assignment. We also mark each RTE with a list+ * of all USING column names selected for joins containing that RTE, so that+ * when we assign other columns' aliases later, we can avoid conflicts.+ *+ * Another problem is that if a JOIN's input tables have had columns added or+ * deleted since the query was parsed, we must generate a column alias list+ * for the join that matches the current set of input columns --- otherwise, a+ * change in the number of columns in the left input would throw off matching+ * of aliases to columns of the right input. Thus, positions in the printable+ * column alias list are not necessarily one-for-one with varattnos of the+ * JOIN, so we need a separate new_colnames[] array for printing purposes.+ */+typedef struct+{+ /*+ * colnames is an array containing column aliases to use for columns that+ * existed when the query was parsed. Dropped columns have NULL entries.+ * This array can be directly indexed by varattno to get a Var's name.+ *+ * Non-NULL entries are guaranteed unique within the RTE, *except* when+ * this is for an unnamed JOIN RTE. In that case we merely copy up names+ * from the two input RTEs.+ *+ * During the recursive descent in set_using_names(), forcible assignment+ * of a child RTE's column name is represented by pre-setting that element+ * of the child's colnames array. So at that stage, NULL entries in this+ * array just mean that no name has been preassigned, not necessarily that+ * the column is dropped.+ */+ int num_cols; /* length of colnames[] array */+ char **colnames; /* array of C strings and NULLs */++ /*+ * new_colnames is an array containing column aliases to use for columns+ * that would exist if the query was re-parsed against the current+ * definitions of its base tables. This is what to print as the column+ * alias list for the RTE. This array does not include dropped columns,+ * but it will include columns added since original parsing. Indexes in+ * it therefore have little to do with current varattno values. As above,+ * entries are unique unless this is for an unnamed JOIN RTE. (In such an+ * RTE, we never actually print this array, but we must compute it anyway+ * for possible use in computing column names of upper joins.) The+ * parallel array is_new_col marks which of these columns are new since+ * original parsing. Entries with is_new_col false must match the+ * non-NULL colnames entries one-for-one.+ */+ int num_new_cols; /* length of new_colnames[] array */+ char **new_colnames; /* array of C strings */+ bool *is_new_col; /* array of bool flags */++ /* This flag tells whether we should actually print a column alias list */+ bool printaliases;++ /* This list has all names used as USING names in joins above this RTE */+ List *parentUsing; /* names assigned to parent merged columns */++ /*+ * If this struct is for a JOIN RTE, we fill these fields during the+ * set_using_names() pass to describe its relationship to its child RTEs.+ *+ * leftattnos and rightattnos are arrays with one entry per existing+ * output column of the join (hence, indexable by join varattno). For a+ * simple reference to a column of the left child, leftattnos[i] is the+ * child RTE's attno and rightattnos[i] is zero; and conversely for a+ * column of the right child. But for merged columns produced by JOIN+ * USING/NATURAL JOIN, both leftattnos[i] and rightattnos[i] are nonzero.+ * Also, if the column has been dropped, both are zero.+ *+ * If it's a JOIN USING, usingNames holds the alias names selected for the+ * merged columns (these might be different from the original USING list,+ * if we had to modify names to achieve uniqueness).+ */+ int leftrti; /* rangetable index of left child */+ int rightrti; /* rangetable index of right child */+ int *leftattnos; /* left-child varattnos of join cols, or 0 */+ int *rightattnos; /* right-child varattnos of join cols, or 0 */+ List *usingNames; /* names assigned to merged columns */+} deparse_columns;++/* This macro is analogous to rt_fetch(), but for deparse_columns structs */+#define deparse_columns_fetch(rangetable_index, dpns) \+ ((deparse_columns *) list_nth((dpns)->rtable_columns, (rangetable_index)-1))++/*+ * Entry in set_rtable_names' hash table+ */+typedef struct+{+ char name[NAMEDATALEN]; /* Hash key --- must be first */+ int counter; /* Largest addition used so far for name */+} NameHashEntry;+++/* ----------+ * Global data+ * ----------+ */++++++/* GUC parameters */+__thread bool quote_all_identifiers = false;++++/* ----------+ * Local functions+ *+ * Most of these functions used to use fixed-size buffers to build their+ * results. Now, they take an (already initialized) StringInfo object+ * as a parameter, and append their text output to its contents.+ * ----------+ */+static char *deparse_expression_pretty(Node *expr, List *dpcontext,+ bool forceprefix, bool showimplicit,+ int prettyFlags, int startIndent);+static char *pg_get_viewdef_worker(Oid viewoid,+ int prettyFlags, int wrapColumn);+static char *pg_get_triggerdef_worker(Oid trigid, bool pretty);+static void decompile_column_index_array(Datum column_index_array, Oid relId,+ StringInfo buf);+static char *pg_get_ruledef_worker(Oid ruleoid, int prettyFlags);+static char *pg_get_indexdef_worker(Oid indexrelid, int colno,+ const Oid *excludeOps,+ bool attrsOnly, bool showTblSpc,+ int prettyFlags);+static char *pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,+ int prettyFlags);+static text *pg_get_expr_worker(text *expr, Oid relid, const char *relname,+ int prettyFlags);+static int print_function_arguments(StringInfo buf, HeapTuple proctup,+ bool print_table_args, bool print_defaults);+static void print_function_rettype(StringInfo buf, HeapTuple proctup);+static void print_function_trftypes(StringInfo buf, HeapTuple proctup);+static void set_rtable_names(deparse_namespace *dpns, List *parent_namespaces,+ Bitmapset *rels_used);+static void set_deparse_for_query(deparse_namespace *dpns, Query *query,+ List *parent_namespaces);+static void set_simple_column_names(deparse_namespace *dpns);+static bool has_dangerous_join_using(deparse_namespace *dpns, Node *jtnode);+static void set_using_names(deparse_namespace *dpns, Node *jtnode,+ List *parentUsing);+static void set_relation_column_names(deparse_namespace *dpns,+ RangeTblEntry *rte,+ deparse_columns *colinfo);+static void set_join_column_names(deparse_namespace *dpns, RangeTblEntry *rte,+ deparse_columns *colinfo);+static bool colname_is_unique(char *colname, deparse_namespace *dpns,+ deparse_columns *colinfo);+static char *make_colname_unique(char *colname, deparse_namespace *dpns,+ deparse_columns *colinfo);+static void expand_colnames_array_to(deparse_columns *colinfo, int n);+static void identify_join_columns(JoinExpr *j, RangeTblEntry *jrte,+ deparse_columns *colinfo);+static void flatten_join_using_qual(Node *qual,+ List **leftvars, List **rightvars);+static char *get_rtable_name(int rtindex, deparse_context *context);+static void set_deparse_planstate(deparse_namespace *dpns, PlanState *ps);+static void push_child_plan(deparse_namespace *dpns, PlanState *ps,+ deparse_namespace *save_dpns);+static void pop_child_plan(deparse_namespace *dpns,+ deparse_namespace *save_dpns);+static void push_ancestor_plan(deparse_namespace *dpns, ListCell *ancestor_cell,+ deparse_namespace *save_dpns);+static void pop_ancestor_plan(deparse_namespace *dpns,+ deparse_namespace *save_dpns);+static void make_ruledef(StringInfo buf, HeapTuple ruletup, TupleDesc rulettc,+ int prettyFlags);+static void make_viewdef(StringInfo buf, HeapTuple ruletup, TupleDesc rulettc,+ int prettyFlags, int wrapColumn);+static void get_query_def(Query *query, StringInfo buf, List *parentnamespace,+ TupleDesc resultDesc,+ int prettyFlags, int wrapColumn, int startIndent);+static void get_values_def(List *values_lists, deparse_context *context);+static void get_with_clause(Query *query, deparse_context *context);+static void get_select_query_def(Query *query, deparse_context *context,+ TupleDesc resultDesc);+static void get_insert_query_def(Query *query, deparse_context *context);+static void get_update_query_def(Query *query, deparse_context *context);+static void get_update_query_targetlist_def(Query *query, List *targetList,+ deparse_context *context,+ RangeTblEntry *rte);+static void get_delete_query_def(Query *query, deparse_context *context);+static void get_utility_query_def(Query *query, deparse_context *context);+static void get_basic_select_query(Query *query, deparse_context *context,+ TupleDesc resultDesc);+static void get_target_list(List *targetList, deparse_context *context,+ TupleDesc resultDesc);+static void get_setop_query(Node *setOp, Query *query,+ deparse_context *context,+ TupleDesc resultDesc);+static Node *get_rule_sortgroupclause(Index ref, List *tlist,+ bool force_colno,+ deparse_context *context);+static void get_rule_groupingset(GroupingSet *gset, List *targetlist,+ bool omit_parens, deparse_context *context);+static void get_rule_orderby(List *orderList, List *targetList,+ bool force_colno, deparse_context *context);+static void get_rule_windowclause(Query *query, deparse_context *context);+static void get_rule_windowspec(WindowClause *wc, List *targetList,+ deparse_context *context);+static char *get_variable(Var *var, int levelsup, bool istoplevel,+ deparse_context *context);+static Node *find_param_referent(Param *param, deparse_context *context,+ deparse_namespace **dpns_p, ListCell **ancestor_cell_p);+static void get_parameter(Param *param, deparse_context *context);+static const char *get_simple_binary_op_name(OpExpr *expr);+static bool isSimpleNode(Node *node, Node *parentNode, int prettyFlags);+static void appendContextKeyword(deparse_context *context, const char *str,+ int indentBefore, int indentAfter, int indentPlus);+static void removeStringInfoSpaces(StringInfo str);+static void get_rule_expr(Node *node, deparse_context *context,+ bool showimplicit);+static void get_rule_expr_toplevel(Node *node, deparse_context *context,+ bool showimplicit);+static void get_oper_expr(OpExpr *expr, deparse_context *context);+static void get_func_expr(FuncExpr *expr, deparse_context *context,+ bool showimplicit);+static void get_agg_expr(Aggref *aggref, deparse_context *context);+static void get_windowfunc_expr(WindowFunc *wfunc, deparse_context *context);+static void get_coercion_expr(Node *arg, deparse_context *context,+ Oid resulttype, int32 resulttypmod,+ Node *parentNode);+static void get_const_expr(Const *constval, deparse_context *context,+ int showtype);+static void get_const_collation(Const *constval, deparse_context *context);+static void simple_quote_literal(StringInfo buf, const char *val);+static void get_sublink_expr(SubLink *sublink, deparse_context *context);+static void get_from_clause(Query *query, const char *prefix,+ deparse_context *context);+static void get_from_clause_item(Node *jtnode, Query *query,+ deparse_context *context);+static void get_column_alias_list(deparse_columns *colinfo,+ deparse_context *context);+static void get_from_clause_coldeflist(RangeTblFunction *rtfunc,+ deparse_columns *colinfo,+ deparse_context *context);+static void get_tablesample_def(TableSampleClause *tablesample,+ deparse_context *context);+static void get_opclass_name(Oid opclass, Oid actual_datatype,+ StringInfo buf);+static Node *processIndirection(Node *node, deparse_context *context,+ bool printit);+static void printSubscripts(ArrayRef *aref, deparse_context *context);+static char *get_relation_name(Oid relid);+static char *generate_relation_name(Oid relid, List *namespaces);+static char *generate_qualified_relation_name(Oid relid);+static char *generate_function_name(Oid funcid, int nargs,+ List *argnames, Oid *argtypes,+ bool has_variadic, bool *use_variadic_p,+ ParseExprKind special_exprkind);+static char *generate_operator_name(Oid operid, Oid arg1, Oid arg2);+static text *string_to_text(char *str);+static char *flatten_reloptions(Oid relid);++#define only_marker(rte) ((rte)->inh ? "" : "ONLY ")+++/* ----------+ * get_ruledef - Do it all and return a text+ * that could be used as a statement+ * to recreate the rule+ * ----------+ */++++++++++/* ----------+ * get_viewdef - Mainly the same thing, but we+ * only return the SELECT part of a view+ * ----------+ */+++++++++++++/*+ * Common code for by-OID and by-name variants of pg_get_viewdef+ */+++/* ----------+ * get_triggerdef - Get the definition of a trigger+ * ----------+ */+++++++/* ----------+ * get_indexdef - Get the definition of an index+ *+ * In the extended version, there is a colno argument as well as pretty bool.+ * if colno == 0, we want a complete index definition.+ * if colno > 0, we only want the Nth index key's variable or expression.+ *+ * Note that the SQL-function versions of this omit any info about the+ * index tablespace; this is intentional because pg_dump wants it that way.+ * However pg_get_indexdef_string() includes index tablespace if not default.+ * ----------+ */+++++/* Internal version that returns a palloc'd C string; no pretty-printing */+++/* Internal version that just reports the column definitions */+++/*+ * Internal workhorse to decompile an index definition.+ *+ * This is now used for exclusion constraints as well: if excludeOps is not+ * NULL then it points to an array of exclusion operator OIDs.+ */++++/*+ * pg_get_constraintdef+ *+ * Returns the definition for the constraint, ie, everything that needs to+ * appear after "ALTER TABLE ... ADD CONSTRAINT <constraintname>".+ */+++++/*+ * Internal version that returns a full ALTER TABLE ... ADD CONSTRAINT command+ */+++/*+ * As of 9.4, we now use an MVCC snapshot for this.+ */++++/*+ * Convert an int16[] Datum into a comma-separated list of column names+ * for the indicated relation; append the list to buf.+ */++++/* ----------+ * get_expr - Decompile an expression tree+ *+ * Input: an expression tree in nodeToString form, and a relation OID+ *+ * Output: reverse-listed expression+ *+ * Currently, the expression can only refer to a single relation, namely+ * the one specified by the second parameter. This is sufficient for+ * partial indexes, column default expressions, etc. We also support+ * Var-free expressions, for which the OID can be InvalidOid.+ * ----------+ */++++++++/* ----------+ * get_userbyid - Get a user name by roleid and+ * fallback to 'unknown (OID=n)'+ * ----------+ */++++/*+ * pg_get_serial_sequence+ * Get the name of the sequence used by a serial column,+ * formatted suitably for passing to setval, nextval or currval.+ * First parameter is not treated as double-quoted, second parameter+ * is --- see documentation for reason.+ */++++/*+ * pg_get_functiondef+ * Returns the complete "CREATE OR REPLACE FUNCTION ..." statement for+ * the specified function.+ *+ * Note: if you change the output format of this function, be careful not+ * to break psql's rules (in \ef and \sf) for identifying the start of the+ * function body. To wit: the function body starts on a line that begins+ * with "AS ", and no preceding line will look like that.+ */+++/*+ * pg_get_function_arguments+ * Get a nicely-formatted list of arguments for a function.+ * This is everything that would go between the parentheses in+ * CREATE FUNCTION.+ */+++/*+ * pg_get_function_identity_arguments+ * Get a formatted list of arguments for a function.+ * This is everything that would go between the parentheses in+ * ALTER FUNCTION, etc. In particular, don't print defaults.+ */+++/*+ * pg_get_function_result+ * Get a nicely-formatted version of the result type of a function.+ * This is what would appear after RETURNS in CREATE FUNCTION.+ */+++/*+ * Guts of pg_get_function_result: append the function's return type+ * to the specified buffer.+ */+++/*+ * Common code for pg_get_function_arguments and pg_get_function_result:+ * append the desired subset of arguments to buf. We print only TABLE+ * arguments when print_table_args is true, and all the others when it's false.+ * We print argument defaults only if print_defaults is true.+ * Function return value is the number of arguments printed.+ */+++++/*+ * Append used transformated types to specified buffer+ */+++/*+ * Get textual representation of a function argument's default value. The+ * second argument of this function is the argument number among all arguments+ * (i.e. proallargtypes, *not* proargtypes), starting with 1, because that's+ * how information_schema.sql uses it.+ */++++/*+ * deparse_expression - General utility for deparsing expressions+ *+ * calls deparse_expression_pretty with all prettyPrinting disabled+ */+++/* ----------+ * deparse_expression_pretty - General utility for deparsing expressions+ *+ * expr is the node tree to be deparsed. It must be a transformed expression+ * tree (ie, not the raw output of gram.y).+ *+ * dpcontext is a list of deparse_namespace nodes representing the context+ * for interpreting Vars in the node tree. It can be NIL if no Vars are+ * expected.+ *+ * forceprefix is TRUE to force all Vars to be prefixed with their table names.+ *+ * showimplicit is TRUE to force all implicit casts to be shown explicitly.+ *+ * Tries to pretty up the output according to prettyFlags and startIndent.+ *+ * The result is a palloc'd string.+ * ----------+ */+++/* ----------+ * deparse_context_for - Build deparse context for a single relation+ *+ * Given the reference name (alias) and OID of a relation, build deparsing+ * context for an expression referencing only that relation (as varno 1,+ * varlevelsup 0). This is sufficient for many uses of deparse_expression.+ * ----------+ */+++/*+ * deparse_context_for_plan_rtable - Build deparse context for a plan's rtable+ *+ * When deparsing an expression in a Plan tree, we use the plan's rangetable+ * to resolve names of simple Vars. The initialization of column names for+ * this is rather expensive if the rangetable is large, and it'll be the same+ * for every expression in the Plan tree; so we do it just once and re-use+ * the result of this function for each expression. (Note that the result+ * is not usable until set_deparse_context_planstate() is applied to it.)+ *+ * In addition to the plan's rangetable list, pass the per-RTE alias names+ * assigned by a previous call to select_rtable_names_for_explain.+ */+++/*+ * set_deparse_context_planstate - Specify Plan node containing expression+ *+ * When deparsing an expression in a Plan tree, we might have to resolve+ * OUTER_VAR, INNER_VAR, or INDEX_VAR references. To do this, the caller must+ * provide the parent PlanState node. Then OUTER_VAR and INNER_VAR references+ * can be resolved by drilling down into the left and right child plans.+ * Similarly, INDEX_VAR references can be resolved by reference to the+ * indextlist given in a parent IndexOnlyScan node, or to the scan tlist in+ * ForeignScan and CustomScan nodes. (Note that we don't currently support+ * deparsing of indexquals in regular IndexScan or BitmapIndexScan nodes;+ * for those, we can only deparse the indexqualorig fields, which won't+ * contain INDEX_VAR Vars.)+ *+ * Note: planstate really ought to be declared as "PlanState *", but we use+ * "Node *" to avoid having to include execnodes.h in ruleutils.h.+ *+ * The ancestors list is a list of the PlanState's parent PlanStates, the+ * most-closely-nested first. This is needed to resolve PARAM_EXEC Params.+ * Note we assume that all the PlanStates share the same rtable.+ *+ * Once this function has been called, deparse_expression() can be called on+ * subsidiary expression(s) of the specified PlanState node. To deparse+ * expressions of a different Plan node in the same Plan tree, re-call this+ * function to identify the new parent Plan node.+ *+ * The result is the same List passed in; this is a notational convenience.+ */+++/*+ * select_rtable_names_for_explain - Select RTE aliases for EXPLAIN+ *+ * Determine the relation aliases we'll use during an EXPLAIN operation.+ * This is just a frontend to set_rtable_names. We have to expose the aliases+ * to EXPLAIN because EXPLAIN needs to know the right alias names to print.+ */+++/*+ * set_rtable_names: select RTE aliases to be used in printing a query+ *+ * We fill in dpns->rtable_names with a list of names that is one-for-one with+ * the already-filled dpns->rtable list. Each RTE name is unique among those+ * in the new namespace plus any ancestor namespaces listed in+ * parent_namespaces.+ *+ * If rels_used isn't NULL, only RTE indexes listed in it are given aliases.+ *+ * Note that this function is only concerned with relation names, not column+ * names.+ */+++/*+ * set_deparse_for_query: set up deparse_namespace for deparsing a Query tree+ *+ * For convenience, this is defined to initialize the deparse_namespace struct+ * from scratch.+ */+++/*+ * set_simple_column_names: fill in column aliases for non-query situations+ *+ * This handles EXPLAIN and cases where we only have relation RTEs. Without+ * a join tree, we can't do anything smart about join RTEs, but we don't+ * need to (note that EXPLAIN should never see join alias Vars anyway).+ * If we do hit a join RTE we'll just process it like a non-table base RTE.+ */+++/*+ * has_dangerous_join_using: search jointree for unnamed JOIN USING+ *+ * Merged columns of a JOIN USING may act differently from either of the input+ * columns, either because they are merged with COALESCE (in a FULL JOIN) or+ * because an implicit coercion of the underlying input column is required.+ * In such a case the column must be referenced as a column of the JOIN not as+ * a column of either input. And this is problematic if the join is unnamed+ * (alias-less): we cannot qualify the column's name with an RTE name, since+ * there is none. (Forcibly assigning an alias to the join is not a solution,+ * since that will prevent legal references to tables below the join.)+ * To ensure that every column in the query is unambiguously referenceable,+ * we must assign such merged columns names that are globally unique across+ * the whole query, aliasing other columns out of the way as necessary.+ *+ * Because the ensuing re-aliasing is fairly damaging to the readability of+ * the query, we don't do this unless we have to. So, we must pre-scan+ * the join tree to see if we have to, before starting set_using_names().+ */+++/*+ * set_using_names: select column aliases to be used for merged USING columns+ *+ * We do this during a recursive descent of the query jointree.+ * dpns->unique_using must already be set to determine the global strategy.+ *+ * Column alias info is saved in the dpns->rtable_columns list, which is+ * assumed to be filled with pre-zeroed deparse_columns structs.+ *+ * parentUsing is a list of all USING aliases assigned in parent joins of+ * the current jointree node. (The passed-in list must not be modified.)+ */+++/*+ * set_relation_column_names: select column aliases for a non-join RTE+ *+ * Column alias info is saved in *colinfo, which is assumed to be pre-zeroed.+ * If any colnames entries are already filled in, those override local+ * choices.+ */+++/*+ * set_join_column_names: select column aliases for a join RTE+ *+ * Column alias info is saved in *colinfo, which is assumed to be pre-zeroed.+ * If any colnames entries are already filled in, those override local+ * choices. Also, names for USING columns were already chosen by+ * set_using_names(). We further expect that column alias selection has been+ * completed for both input RTEs.+ */+#ifdef USE_ASSERT_CHECKING+#endif++/*+ * colname_is_unique: is colname distinct from already-chosen column names?+ *+ * dpns is query-wide info, colinfo is for the column's RTE+ */+++/*+ * make_colname_unique: modify colname if necessary to make it unique+ *+ * dpns is query-wide info, colinfo is for the column's RTE+ */+++/*+ * expand_colnames_array_to: make colinfo->colnames at least n items long+ *+ * Any added array entries are initialized to zero.+ */+++/*+ * identify_join_columns: figure out where columns of a join come from+ *+ * Fills the join-specific fields of the colinfo struct, except for+ * usingNames which is filled later.+ */+++/*+ * flatten_join_using_qual: extract Vars being joined from a JOIN/USING qual+ *+ * We assume that transformJoinUsingClause won't have produced anything except+ * AND nodes, equality operator nodes, and possibly implicit coercions, and+ * that the AND node inputs match left-to-right with the original USING list.+ *+ * Caller must initialize the result lists to NIL.+ */+++/*+ * get_rtable_name: convenience function to get a previously assigned RTE alias+ *+ * The RTE must belong to the topmost namespace level in "context".+ */+++/*+ * set_deparse_planstate: set up deparse_namespace to parse subexpressions+ * of a given PlanState node+ *+ * This sets the planstate, outer_planstate, inner_planstate, outer_tlist,+ * inner_tlist, and index_tlist fields. Caller is responsible for adjusting+ * the ancestors list if necessary. Note that the rtable and ctes fields do+ * not need to change when shifting attention to different plan nodes in a+ * single plan tree.+ */+++/*+ * push_child_plan: temporarily transfer deparsing attention to a child plan+ *+ * When expanding an OUTER_VAR or INNER_VAR reference, we must adjust the+ * deparse context in case the referenced expression itself uses+ * OUTER_VAR/INNER_VAR. We modify the top stack entry in-place to avoid+ * affecting levelsup issues (although in a Plan tree there really shouldn't+ * be any).+ *+ * Caller must provide a local deparse_namespace variable to save the+ * previous state for pop_child_plan.+ */+++/*+ * pop_child_plan: undo the effects of push_child_plan+ */+++/*+ * push_ancestor_plan: temporarily transfer deparsing attention to an+ * ancestor plan+ *+ * When expanding a Param reference, we must adjust the deparse context+ * to match the plan node that contains the expression being printed;+ * otherwise we'd fail if that expression itself contains a Param or+ * OUTER_VAR/INNER_VAR/INDEX_VAR variable.+ *+ * The target ancestor is conveniently identified by the ListCell holding it+ * in dpns->ancestors.+ *+ * Caller must provide a local deparse_namespace variable to save the+ * previous state for pop_ancestor_plan.+ */+++/*+ * pop_ancestor_plan: undo the effects of push_ancestor_plan+ */++++/* ----------+ * make_ruledef - reconstruct the CREATE RULE command+ * for a given pg_rewrite tuple+ * ----------+ */++++/* ----------+ * make_viewdef - reconstruct the SELECT part of a+ * view rewrite rule+ * ----------+ */++++/* ----------+ * get_query_def - Parse back one query parsetree+ *+ * If resultDesc is not NULL, then it is the output tuple descriptor for+ * the view represented by a SELECT query.+ * ----------+ */+++/* ----------+ * get_values_def - Parse back a VALUES list+ * ----------+ */+++/* ----------+ * get_with_clause - Parse back a WITH clause+ * ----------+ */+++/* ----------+ * get_select_query_def - Parse back a SELECT parsetree+ * ----------+ */+++/*+ * Detect whether query looks like SELECT ... FROM VALUES();+ * if so, return the VALUES RTE. Otherwise return NULL.+ */+++++/* ----------+ * get_target_list - Parse back a SELECT target list+ *+ * This is also used for RETURNING lists in INSERT/UPDATE/DELETE.+ * ----------+ */+++++/*+ * Display a sort/group clause.+ *+ * Also returns the expression tree, so caller need not find it again.+ */+++/*+ * Display a GroupingSet+ */+++/*+ * Display an ORDER BY list.+ */+++/*+ * Display a WINDOW clause.+ *+ * Note that the windowClause list might contain only anonymous window+ * specifications, in which case we should print nothing here.+ */+++/*+ * Display a window definition+ */+++/* ----------+ * get_insert_query_def - Parse back an INSERT parsetree+ * ----------+ */++++/* ----------+ * get_update_query_def - Parse back an UPDATE parsetree+ * ----------+ */++++/* ----------+ * get_update_query_targetlist_def - Parse back an UPDATE targetlist+ * ----------+ */++++/* ----------+ * get_delete_query_def - Parse back a DELETE parsetree+ * ----------+ */++++/* ----------+ * get_utility_query_def - Parse back a UTILITY parsetree+ * ----------+ */++++/*+ * Display a Var appropriately.+ *+ * In some cases (currently only when recursing into an unnamed join)+ * the Var's varlevelsup has to be interpreted with respect to a context+ * above the current one; levelsup indicates the offset.+ *+ * If istoplevel is TRUE, the Var is at the top level of a SELECT's+ * targetlist, which means we need special treatment of whole-row Vars.+ * Instead of the normal "tab.*", we'll print "tab.*::typename", which is a+ * dirty hack to prevent "tab.*" from being expanded into multiple columns.+ * (The parser will strip the useless coercion, so no inefficiency is added in+ * dump and reload.) We used to print just "tab" in such cases, but that is+ * ambiguous and will yield the wrong result if "tab" is also a plain column+ * name in the query.+ *+ * Returns the attname of the Var, or NULL if the Var has no attname (because+ * it is a whole-row Var or a subplan output reference).+ */++++/*+ * Get the name of a field of an expression of composite type. The+ * expression is usually a Var, but we handle other cases too.+ *+ * levelsup is an extra offset to interpret the Var's varlevelsup correctly.+ *+ * This is fairly straightforward when the expression has a named composite+ * type; we need only look up the type in the catalogs. However, the type+ * could also be RECORD. Since no actual table or view column is allowed to+ * have type RECORD, a Var of type RECORD must refer to a JOIN or FUNCTION RTE+ * or to a subquery output. We drill down to find the ultimate defining+ * expression and attempt to infer the field name from it. We ereport if we+ * can't determine the name.+ *+ * Similarly, a PARAM of type RECORD has to refer to some expression of+ * a determinable composite type.+ */+++/*+ * Try to find the referenced expression for a PARAM_EXEC Param that might+ * reference a parameter supplied by an upper NestLoop or SubPlan plan node.+ *+ * If successful, return the expression and set *dpns_p and *ancestor_cell_p+ * appropriately for calling push_ancestor_plan(). If no referent can be+ * found, return NULL.+ */+++/*+ * Display a Param appropriately.+ */+++/*+ * get_simple_binary_op_name+ *+ * helper function for isSimpleNode+ * will return single char binary operator name, or NULL if it's not+ */++++/*+ * isSimpleNode - check if given node is simple (doesn't need parenthesizing)+ *+ * true : simple in the context of parent node's type+ * false : not simple+ */++++/*+ * appendContextKeyword - append a keyword to buffer+ *+ * If prettyPrint is enabled, perform a line break, and adjust indentation.+ * Otherwise, just append the keyword.+ */+++/*+ * removeStringInfoSpaces - delete trailing spaces from a buffer.+ *+ * Possibly this should move to stringinfo.c at some point.+ */++++/*+ * get_rule_expr_paren - deparse expr using get_rule_expr,+ * embracing the string with parentheses if necessary for prettyPrint.+ *+ * Never embrace if prettyFlags=0, because it's done in the calling node.+ *+ * Any node that does *not* embrace its argument node by sql syntax (with+ * parentheses, non-operator keywords like CASE/WHEN/ON, or comma etc) should+ * use get_rule_expr_paren instead of get_rule_expr so parentheses can be+ * added.+ */++++/* ----------+ * get_rule_expr - Parse back an expression+ *+ * Note: showimplicit determines whether we display any implicit cast that+ * is present at the top of the expression tree. It is a passed argument,+ * not a field of the context struct, because we change the value as we+ * recurse down into the expression. In general we suppress implicit casts+ * when the result type is known with certainty (eg, the arguments of an+ * OR must be boolean). We display implicit casts for arguments of functions+ * and operators, since this is needed to be certain that the same function+ * or operator will be chosen when the expression is re-parsed.+ * ----------+ */+++/*+ * get_rule_expr_toplevel - Parse back a toplevel expression+ *+ * Same as get_rule_expr(), except that if the expr is just a Var, we pass+ * istoplevel = true not false to get_variable(). This causes whole-row Vars+ * to get printed with decoration that will prevent expansion of "*".+ * We need to use this in contexts such as ROW() and VALUES(), where the+ * parser would expand "foo.*" appearing at top level. (In principle we'd+ * use this in get_target_list() too, but that has additional worries about+ * whether to print AS, so it needs to invoke get_variable() directly anyway.)+ */++++/*+ * get_oper_expr - Parse back an OpExpr node+ */+++/*+ * get_func_expr - Parse back a FuncExpr node+ */+++/*+ * get_agg_expr - Parse back an Aggref node+ */+++/*+ * get_windowfunc_expr - Parse back a WindowFunc node+ */+++/* ----------+ * get_coercion_expr+ *+ * Make a string representation of a value coerced to a specific type+ * ----------+ */+++/* ----------+ * get_const_expr+ *+ * Make a string representation of a Const+ *+ * showtype can be -1 to never show "::typename" decoration, or +1 to always+ * show it, or 0 to show it only if the constant wouldn't be assumed to be+ * the right type by default.+ *+ * If the Const's collation isn't default for its type, show that too.+ * We mustn't do this when showtype is -1 (since that means the caller will+ * print "::typename", and we can't put a COLLATE clause in between). It's+ * caller's responsibility that collation isn't missed in such cases.+ * ----------+ */+++/*+ * helper for get_const_expr: append COLLATE if needed+ */+++/*+ * simple_quote_literal - Format a string as a SQL literal, append to buf+ */++++/* ----------+ * get_sublink_expr - Parse back a sublink+ * ----------+ */++++/* ----------+ * get_from_clause - Parse back a FROM clause+ *+ * "prefix" is the keyword that denotes the start of the list of FROM+ * elements. It is FROM when used to parse back SELECT and UPDATE, but+ * is USING when parsing back DELETE.+ * ----------+ */+++++/*+ * get_column_alias_list - print column alias list for an RTE+ *+ * Caller must already have printed the relation's alias name.+ */+++/*+ * get_from_clause_coldeflist - reproduce FROM clause coldeflist+ *+ * When printing a top-level coldeflist (which is syntactically also the+ * relation's column alias list), use column names from colinfo. But when+ * printing a coldeflist embedded inside ROWS FROM(), we prefer to use the+ * original coldeflist's names, which are available in rtfunc->funccolnames.+ * Pass NULL for colinfo to select the latter behavior.+ *+ * The coldeflist is appended immediately (no space) to buf. Caller is+ * responsible for ensuring that an alias or AS is present before it.+ */+++/*+ * get_tablesample_def - print a TableSampleClause+ */+++/*+ * get_opclass_name - fetch name of an index operator class+ *+ * The opclass name is appended (after a space) to buf.+ *+ * Output is suppressed if the opclass is the default for the given+ * actual_datatype. (If you don't want this behavior, just pass+ * InvalidOid for actual_datatype.)+ */+++/*+ * processIndirection - take care of array and subfield assignment+ *+ * We strip any top-level FieldStore or assignment ArrayRef nodes that+ * appear in the input, and return the subexpression that's to be assigned.+ * If printit is true, we also print out the appropriate decoration for the+ * base column name (that the caller just printed).+ */+++++/*+ * quote_identifier - Quote an identifier only if needed+ *+ * When quotes are needed, we palloc the required space; slightly+ * space-wasteful but well worth it for notational simplicity.+ */+const char *+quote_identifier(const char *ident)+{+ /*+ * Can avoid quoting if ident starts with a lowercase letter or underscore+ * and contains only lowercase letters, digits, and underscores, *and* is+ * not any SQL keyword. Otherwise, supply quotes.+ */+ int nquotes = 0;+ bool safe;+ const char *ptr;+ char *result;+ char *optr;++ /*+ * would like to use <ctype.h> macros here, but they might yield unwanted+ * locale-specific results...+ */+ safe = ((ident[0] >= 'a' && ident[0] <= 'z') || ident[0] == '_');++ for (ptr = ident; *ptr; ptr++)+ {+ char ch = *ptr;++ if ((ch >= 'a' && ch <= 'z') ||+ (ch >= '0' && ch <= '9') ||+ (ch == '_'))+ {+ /* okay */+ }+ else+ {+ safe = false;+ if (ch == '"')+ nquotes++;+ }+ }++ if (quote_all_identifiers)+ safe = false;++ if (safe)+ {+ /*+ * Check for keyword. We quote keywords except for unreserved ones.+ * (In some cases we could avoid quoting a col_name or type_func_name+ * keyword, but it seems much harder than it's worth to tell that.)+ *+ * Note: ScanKeywordLookup() does case-insensitive comparison, but+ * that's fine, since we already know we have all-lower-case.+ */+ const ScanKeyword *keyword = ScanKeywordLookup(ident,+ ScanKeywords,+ NumScanKeywords);++ if (keyword != NULL && keyword->category != UNRESERVED_KEYWORD)+ safe = false;+ }++ if (safe)+ return ident; /* no change needed */++ result = (char *) palloc(strlen(ident) + nquotes + 2 + 1);++ optr = result;+ *optr++ = '"';+ for (ptr = ident; *ptr; ptr++)+ {+ char ch = *ptr;++ if (ch == '"')+ *optr++ = '"';+ *optr++ = ch;+ }+ *optr++ = '"';+ *optr = '\0';++ return result;+}++/*+ * quote_qualified_identifier - Quote a possibly-qualified identifier+ *+ * Return a name of the form qualifier.ident, or just ident if qualifier+ * is NULL, quoting each component if necessary. The result is palloc'd.+ */+++/*+ * get_relation_name+ * Get the unqualified name of a relation specified by OID+ *+ * This differs from the underlying get_rel_name() function in that it will+ * throw error instead of silently returning NULL if the OID is bad.+ */+++/*+ * generate_relation_name+ * Compute the name to display for a relation specified by OID+ *+ * The result includes all necessary quoting and schema-prefixing.+ *+ * If namespaces isn't NIL, it must be a list of deparse_namespace nodes.+ * We will forcibly qualify the relation name if it equals any CTE name+ * visible in the namespace list.+ */+++/*+ * generate_qualified_relation_name+ * Compute the name to display for a relation specified by OID+ *+ * As above, but unconditionally schema-qualify the name.+ */+++/*+ * generate_function_name+ * Compute the name to display for a function specified by OID,+ * given that it is being called with the specified actual arg names and+ * types. (Those matter because of ambiguous-function resolution rules.)+ *+ * If we're dealing with a potentially variadic function (in practice, this+ * means a FuncExpr or Aggref, not some other way of calling a function), then+ * has_variadic must specify whether variadic arguments have been merged,+ * and *use_variadic_p will be set to indicate whether to print VARIADIC in+ * the output. For non-FuncExpr cases, has_variadic should be FALSE and+ * use_variadic_p can be NULL.+ *+ * The result includes all necessary quoting and schema-prefixing.+ */+++/*+ * generate_operator_name+ * Compute the name to display for an operator specified by OID,+ * given that it is being called with the specified actual arg types.+ * (Arg types matter because of ambiguous-operator resolution rules.+ * Pass InvalidOid for unused arg of a unary operator.)+ *+ * The result includes all necessary quoting and schema-prefixing,+ * plus the OPERATOR() decoration needed to use a qualified operator name+ * in an expression.+ */+++/*+ * generate_collation_name+ * Compute the name to display for a collation specified by OID+ *+ * The result includes all necessary quoting and schema-prefixing.+ */+++/*+ * Given a C string, produce a TEXT datum.+ *+ * We assume that the input was palloc'd and may be freed.+ */+++/*+ * Generate a C string representing a relation's reloptions, or NULL if none.+ */+
+ foreign/libpg_query/src/postgres/src_backend_utils_error_assert.c view
@@ -0,0 +1,61 @@+/*--------------------------------------------------------------------+ * Symbols referenced in this file:+ * - ExceptionalCondition+ *--------------------------------------------------------------------+ */++/*-------------------------------------------------------------------------+ *+ * assert.c+ * Assert code.+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ *+ * IDENTIFICATION+ * src/backend/utils/error/assert.c+ *+ * NOTE+ * This should eventually work with elog()+ *+ *-------------------------------------------------------------------------+ */+#include "postgres.h"++#include <unistd.h>++/*+ * ExceptionalCondition - Handles the failure of an Assert()+ */+void+ExceptionalCondition(const char *conditionName,+ const char *errorType,+ const char *fileName,+ int lineNumber)+{+ if (!PointerIsValid(conditionName)+ || !PointerIsValid(fileName)+ || !PointerIsValid(errorType))+ write_stderr("TRAP: ExceptionalCondition: bad arguments\n");+ else+ {+ write_stderr("TRAP: %s(\"%s\", File: \"%s\", Line: %d)\n",+ errorType, conditionName,+ fileName, lineNumber);+ }++ /* Usually this shouldn't be needed, but make sure the msg went out */+ fflush(stderr);++#ifdef SLEEP_ON_ASSERT++ /*+ * It would be nice to use pg_usleep() here, but only does 2000 sec or 33+ * minutes, which seems too short.+ */+ sleep(1000000);+#endif++ abort();+}
+ foreign/libpg_query/src/postgres/src_backend_utils_error_elog.c view
@@ -0,0 +1,2021 @@+/*--------------------------------------------------------------------+ * Symbols referenced in this file:+ * - elog_start+ * - write_stderr+ * - err_gettext+ * - errstart+ * - PG_exception_stack+ * - in_error_recursion_trouble+ * - error_context_stack+ * - is_log_level_output+ * - recursion_depth+ * - errfinish+ * - pg_re_throw+ * - EmitErrorReport+ * - emit_log_hook+ * - send_message_to_server_log+ * - send_message_to_frontend+ * - errmsg_internal+ * - errcode+ * - errmsg+ * - errdetail+ * - expand_fmt_string+ * - useful_strerror+ * - get_errno_symbol+ * - errordata_stack_depth+ * - errordata+ * - elog_finish+ * - errposition+ * - errhint+ * - internalerrposition+ * - internalerrquery+ * - geterrposition+ * - getinternalerrposition+ * - set_errcontext_domain+ * - errcontext_msg+ * - CopyErrorData+ * - FlushErrorState+ *--------------------------------------------------------------------+ */++/*-------------------------------------------------------------------------+ *+ * elog.c+ * error logging and reporting+ *+ * Because of the extremely high rate at which log messages can be generated,+ * we need to be mindful of the performance cost of obtaining any information+ * that may be logged. Also, it's important to keep in mind that this code may+ * get called from within an aborted transaction, in which case operations+ * such as syscache lookups are unsafe.+ *+ * Some notes about recursion and errors during error processing:+ *+ * We need to be robust about recursive-error scenarios --- for example,+ * if we run out of memory, it's important to be able to report that fact.+ * There are a number of considerations that go into this.+ *+ * First, distinguish between re-entrant use and actual recursion. It+ * is possible for an error or warning message to be emitted while the+ * parameters for an error message are being computed. In this case+ * errstart has been called for the outer message, and some field values+ * may have already been saved, but we are not actually recursing. We handle+ * this by providing a (small) stack of ErrorData records. The inner message+ * can be computed and sent without disturbing the state of the outer message.+ * (If the inner message is actually an error, this isn't very interesting+ * because control won't come back to the outer message generator ... but+ * if the inner message is only debug or log data, this is critical.)+ *+ * Second, actual recursion will occur if an error is reported by one of+ * the elog.c routines or something they call. By far the most probable+ * scenario of this sort is "out of memory"; and it's also the nastiest+ * to handle because we'd likely also run out of memory while trying to+ * report this error! Our escape hatch for this case is to reset the+ * ErrorContext to empty before trying to process the inner error. Since+ * ErrorContext is guaranteed to have at least 8K of space in it (see mcxt.c),+ * we should be able to process an "out of memory" message successfully.+ * Since we lose the prior error state due to the reset, we won't be able+ * to return to processing the original error, but we wouldn't have anyway.+ * (NOTE: the escape hatch is not used for recursive situations where the+ * inner message is of less than ERROR severity; in that case we just+ * try to process it and return normally. Usually this will work, but if+ * it ends up in infinite recursion, we will PANIC due to error stack+ * overflow.)+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ *+ * IDENTIFICATION+ * src/backend/utils/error/elog.c+ *+ *-------------------------------------------------------------------------+ */+#include "postgres.h"++#include <fcntl.h>+#include <time.h>+#include <unistd.h>+#include <signal.h>+#include <ctype.h>+#ifdef HAVE_SYSLOG+#include <syslog.h>+#endif++#include "access/transam.h"+#include "access/xact.h"+#include "libpq/libpq.h"+#include "libpq/pqformat.h"+#include "mb/pg_wchar.h"+#include "miscadmin.h"+#include "postmaster/postmaster.h"+#include "postmaster/syslogger.h"+#include "storage/ipc.h"+#include "storage/proc.h"+#include "tcop/tcopprot.h"+#include "utils/guc.h"+#include "utils/memutils.h"+#include "utils/ps_status.h"+++#undef _+#define _(x) err_gettext(x)++static const char *err_gettext(const char *str) pg_attribute_format_arg(1);+static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str);++/* Global variables */+__thread ErrorContextCallback *error_context_stack = NULL;+++__thread sigjmp_buf *PG_exception_stack = NULL;+++extern bool redirection_done;++/*+ * Hook for intercepting messages before they are sent to the server log.+ * Note that the hook will not get called for messages that are suppressed+ * by log_min_messages. Also note that logging hooks implemented in preload+ * libraries will miss any log messages that are generated before the+ * library is loaded.+ */+__thread emit_log_hook_type emit_log_hook = NULL;+++/* GUC parameters */++ /* format for extra log line info */++++#ifdef HAVE_SYSLOG++/*+ * Max string length to send to syslog(). Note that this doesn't count the+ * sequence-number prefix we add, and of course it doesn't count the prefix+ * added by syslog itself. Solaris and sysklogd truncate the final message+ * at 1024 bytes, so this value leaves 124 bytes for those prefixes. (Most+ * other syslog implementations seem to have limits of 2KB or so.)+ */+#ifndef PG_SYSLOG_LIMIT+#define PG_SYSLOG_LIMIT 900+#endif++++++static void write_syslog(int level, const char *line);+#endif++static void write_console(const char *line, int len);++#ifdef WIN32+extern char *event_source;+static void write_eventlog(int level, const char *line, int len);+#endif++/* We provide a small stack of ErrorData records for re-entrant cases */+#define ERRORDATA_STACK_SIZE 5++static ErrorData errordata[ERRORDATA_STACK_SIZE];++static int errordata_stack_depth = -1; /* index of topmost active frame */++static int recursion_depth = 0; /* to detect actual recursion */++/* buffers for formatted timestamps that might be used by both+ * log_line_prefix and csv logs.+ */++#define FORMATTED_TS_LEN 128+++++/* Macro for checking errordata_stack_depth is reasonable */+#define CHECK_STACK_DEPTH() \+ do { \+ if (errordata_stack_depth < 0) \+ { \+ errordata_stack_depth = -1; \+ ereport(ERROR, (errmsg_internal("errstart was not called"))); \+ } \+ } while (0)+++static const char *process_log_prefix_padding(const char *p, int *padding);+static void log_line_prefix(StringInfo buf, ErrorData *edata);+static void send_message_to_server_log(ErrorData *edata);+static void send_message_to_frontend(ErrorData *edata);+static char *expand_fmt_string(const char *fmt, ErrorData *edata);+static const char *useful_strerror(int errnum);+static const char *get_errno_symbol(int errnum);+static const char *error_severity(int elevel);+static void append_with_tabs(StringInfo buf, const char *str);+static bool is_log_level_output(int elevel, int log_min_level);+static void write_pipe_chunks(char *data, int len, int dest);+static void write_csvlog(ErrorData *edata);+static void setup_formatted_log_time(void);+static void setup_formatted_start_time(void);+++/*+ * in_error_recursion_trouble --- are we at risk of infinite error recursion?+ *+ * This function exists to provide common control of various fallback steps+ * that we take if we think we are facing infinite error recursion. See the+ * callers for details.+ */+bool+in_error_recursion_trouble(void)+{+ /* Pull the plug if recurse more than once */+ return (recursion_depth > 2);+}++/*+ * One of those fallback steps is to stop trying to localize the error+ * message, since there's a significant probability that that's exactly+ * what's causing the recursion.+ */+static inline const char *+err_gettext(const char *str)+{+#ifdef ENABLE_NLS+ if (in_error_recursion_trouble())+ return str;+ else+ return gettext(str);+#else+ return str;+#endif+}+++/*+ * errstart --- begin an error-reporting cycle+ *+ * Create a stack entry and store the given parameters in it. Subsequently,+ * errmsg() and perhaps other routines will be called to further populate+ * the stack entry. Finally, errfinish() will be called to actually process+ * the error report.+ *+ * Returns TRUE in normal case. Returns FALSE to short-circuit the error+ * report (if it's a warning or lower and not to be reported anywhere).+ */+bool+errstart(int elevel, const char *filename, int lineno,+ const char *funcname, const char *domain)+{+ ErrorData *edata;+ bool output_to_server;+ bool output_to_client = false;+ int i;++ /*+ * Check some cases in which we want to promote an error into a more+ * severe error. None of this logic applies for non-error messages.+ */+ if (elevel >= ERROR)+ {+ /*+ * If we are inside a critical section, all errors become PANIC+ * errors. See miscadmin.h.+ */+ if (CritSectionCount > 0)+ elevel = PANIC;++ /*+ * Check reasons for treating ERROR as FATAL:+ *+ * 1. we have no handler to pass the error to (implies we are in the+ * postmaster or in backend startup).+ *+ * 2. ExitOnAnyError mode switch is set (initdb uses this).+ *+ * 3. the error occurred after proc_exit has begun to run. (It's+ * proc_exit's responsibility to see that this doesn't turn into+ * infinite recursion!)+ */+ if (elevel == ERROR)+ {+ if (PG_exception_stack == NULL ||+ ExitOnAnyError ||+ proc_exit_inprogress)+ elevel = FATAL;+ }++ /*+ * If the error level is ERROR or more, errfinish is not going to+ * return to caller; therefore, if there is any stacked error already+ * in progress it will be lost. This is more or less okay, except we+ * do not want to have a FATAL or PANIC error downgraded because the+ * reporting process was interrupted by a lower-grade error. So check+ * the stack and make sure we panic if panic is warranted.+ */+ for (i = 0; i <= errordata_stack_depth; i++)+ elevel = Max(elevel, errordata[i].elevel);+ }++ /*+ * Now decide whether we need to process this report at all; if it's+ * warning or less and not enabled for logging, just return FALSE without+ * starting up any error logging machinery.+ */++ /* Determine whether message is enabled for server log output */+ output_to_server = is_log_level_output(elevel, log_min_messages);++ /* Determine whether message is enabled for client output */+ if (whereToSendOutput == DestRemote && elevel != COMMERROR)+ {+ /*+ * client_min_messages is honored only after we complete the+ * authentication handshake. This is required both for security+ * reasons and because many clients can't handle NOTICE messages+ * during authentication.+ */+ if (ClientAuthInProgress)+ output_to_client = (elevel >= ERROR);+ else+ output_to_client = (elevel >= client_min_messages ||+ elevel == INFO);+ }++ /* Skip processing effort if non-error message will not be output */+ if (elevel < ERROR && !output_to_server && !output_to_client)+ return false;++ /*+ * We need to do some actual work. Make sure that memory context+ * initialization has finished, else we can't do anything useful.+ */+ if (ErrorContext == NULL)+ {+ /* Ooops, hard crash time; very little we can do safely here */+ write_stderr("error occurred at %s:%d before error message processing is available\n",+ filename ? filename : "(unknown file)", lineno);+ exit(2);+ }++ /*+ * Okay, crank up a stack entry to store the info in.+ */++ if (recursion_depth++ > 0 && elevel >= ERROR)+ {+ /*+ * Ooops, error during error processing. Clear ErrorContext as+ * discussed at top of file. We will not return to the original+ * error's reporter or handler, so we don't need it.+ */+ MemoryContextReset(ErrorContext);++ /*+ * Infinite error recursion might be due to something broken in a+ * context traceback routine. Abandon them too. We also abandon+ * attempting to print the error statement (which, if long, could+ * itself be the source of the recursive failure).+ */+ if (in_error_recursion_trouble())+ {+ error_context_stack = NULL;+ debug_query_string = NULL;+ }+ }+ if (++errordata_stack_depth >= ERRORDATA_STACK_SIZE)+ {+ /*+ * Wups, stack not big enough. We treat this as a PANIC condition+ * because it suggests an infinite loop of errors during error+ * recovery.+ */+ errordata_stack_depth = -1; /* make room on stack */+ ereport(PANIC, (errmsg_internal("ERRORDATA_STACK_SIZE exceeded")));+ }++ /* Initialize data for this error frame */+ edata = &errordata[errordata_stack_depth];+ MemSet(edata, 0, sizeof(ErrorData));+ edata->elevel = elevel;+ edata->output_to_server = output_to_server;+ edata->output_to_client = output_to_client;+ if (filename)+ {+ const char *slash;++ /* keep only base name, useful especially for vpath builds */+ slash = strrchr(filename, '/');+ if (slash)+ filename = slash + 1;+ }+ edata->filename = filename;+ edata->lineno = lineno;+ edata->funcname = funcname;+ /* the default text domain is the backend's */+ edata->domain = domain ? domain : PG_TEXTDOMAIN("postgres");+ /* initialize context_domain the same way (see set_errcontext_domain()) */+ edata->context_domain = edata->domain;+ /* Select default errcode based on elevel */+ if (elevel >= ERROR)+ edata->sqlerrcode = ERRCODE_INTERNAL_ERROR;+ else if (elevel == WARNING)+ edata->sqlerrcode = ERRCODE_WARNING;+ else+ edata->sqlerrcode = ERRCODE_SUCCESSFUL_COMPLETION;+ /* errno is saved here so that error parameter eval can't change it */+ edata->saved_errno = errno;++ /*+ * Any allocations for this error state level should go into ErrorContext+ */+ edata->assoc_context = ErrorContext;++ recursion_depth--;+ return true;+}++/*+ * errfinish --- end an error-reporting cycle+ *+ * Produce the appropriate error report(s) and pop the error stack.+ *+ * If elevel is ERROR or worse, control does not return to the caller.+ * See elog.h for the error level definitions.+ */+void+errfinish(int dummy,...)+{+ ErrorData *edata = &errordata[errordata_stack_depth];+ int elevel;+ MemoryContext oldcontext;+ ErrorContextCallback *econtext;++ recursion_depth++;+ CHECK_STACK_DEPTH();+ elevel = edata->elevel;++ /*+ * Do processing in ErrorContext, which we hope has enough reserved space+ * to report an error.+ */+ oldcontext = MemoryContextSwitchTo(ErrorContext);++ /*+ * Call any context callback functions. Errors occurring in callback+ * functions will be treated as recursive errors --- this ensures we will+ * avoid infinite recursion (see errstart).+ */+ for (econtext = error_context_stack;+ econtext != NULL;+ econtext = econtext->previous)+ (*econtext->callback) (econtext->arg);++ /*+ * If ERROR (not more nor less) we pass it off to the current handler.+ * Printing it and popping the stack is the responsibility of the handler.+ */+ if (elevel == ERROR)+ {+ /*+ * We do some minimal cleanup before longjmp'ing so that handlers can+ * execute in a reasonably sane state.+ *+ * Reset InterruptHoldoffCount in case we ereport'd from inside an+ * interrupt holdoff section. (We assume here that no handler will+ * itself be inside a holdoff section. If necessary, such a handler+ * could save and restore InterruptHoldoffCount for itself, but this+ * should make life easier for most.)+ */+ InterruptHoldoffCount = 0;+ QueryCancelHoldoffCount = 0;++ CritSectionCount = 0; /* should be unnecessary, but... */++ /*+ * Note that we leave CurrentMemoryContext set to ErrorContext. The+ * handler should reset it to something else soon.+ */++ recursion_depth--;+ PG_RE_THROW();+ }++ /*+ * If we are doing FATAL or PANIC, abort any old-style COPY OUT in+ * progress, so that we can report the message before dying. (Without+ * this, pq_putmessage will refuse to send the message at all, which is+ * what we want for NOTICE messages, but not for fatal exits.) This hack+ * is necessary because of poor design of old-style copy protocol. Note+ * we must do this even if client is fool enough to have set+ * client_min_messages above FATAL, so don't look at output_to_client.+ */+ if (elevel >= FATAL && whereToSendOutput == DestRemote)+ pq_endcopyout(true);++ /* Emit the message to the right places */+ EmitErrorReport();++ /* Now free up subsidiary data attached to stack entry, and release it */+ if (edata->message)+ pfree(edata->message);+ if (edata->detail)+ pfree(edata->detail);+ if (edata->detail_log)+ pfree(edata->detail_log);+ if (edata->hint)+ pfree(edata->hint);+ if (edata->context)+ pfree(edata->context);+ if (edata->schema_name)+ pfree(edata->schema_name);+ if (edata->table_name)+ pfree(edata->table_name);+ if (edata->column_name)+ pfree(edata->column_name);+ if (edata->datatype_name)+ pfree(edata->datatype_name);+ if (edata->constraint_name)+ pfree(edata->constraint_name);+ if (edata->internalquery)+ pfree(edata->internalquery);++ errordata_stack_depth--;++ /* Exit error-handling context */+ MemoryContextSwitchTo(oldcontext);+ recursion_depth--;++ /*+ * Perform error recovery action as specified by elevel.+ */+ if (elevel == FATAL)+ {+ /*+ * For a FATAL error, we let proc_exit clean up and exit.+ *+ * If we just reported a startup failure, the client will disconnect+ * on receiving it, so don't send any more to the client.+ */+ if (PG_exception_stack == NULL && whereToSendOutput == DestRemote)+ whereToSendOutput = DestNone;++ /*+ * fflush here is just to improve the odds that we get to see the+ * error message, in case things are so hosed that proc_exit crashes.+ * Any other code you might be tempted to add here should probably be+ * in an on_proc_exit or on_shmem_exit callback instead.+ */+ fflush(stdout);+ fflush(stderr);++ /*+ * Do normal process-exit cleanup, then return exit code 1 to indicate+ * FATAL termination. The postmaster may or may not consider this+ * worthy of panic, depending on which subprocess returns it.+ */+ proc_exit(1);+ }++ if (elevel >= PANIC)+ {+ /*+ * Serious crash time. Postmaster will observe SIGABRT process exit+ * status and kill the other backends too.+ *+ * XXX: what if we are *in* the postmaster? abort() won't kill our+ * children...+ */+ fflush(stdout);+ fflush(stderr);+ abort();+ }++ /*+ * Check for cancel/die interrupt first --- this is so that the user can+ * stop a query emitting tons of notice or warning messages, even if it's+ * in a loop that otherwise fails to check for interrupts.+ */+ CHECK_FOR_INTERRUPTS();+}+++/*+ * errcode --- add SQLSTATE error code to the current error+ *+ * The code is expected to be represented as per MAKE_SQLSTATE().+ */+int+errcode(int sqlerrcode)+{+ ErrorData *edata = &errordata[errordata_stack_depth];++ /* we don't bother incrementing recursion_depth */+ CHECK_STACK_DEPTH();++ edata->sqlerrcode = sqlerrcode;++ return 0; /* return value does not matter */+}+++/*+ * errcode_for_file_access --- add SQLSTATE error code to the current error+ *+ * The SQLSTATE code is chosen based on the saved errno value. We assume+ * that the failing operation was some type of disk file access.+ *+ * NOTE: the primary error message string should generally include %m+ * when this is used.+ */+#ifdef EROFS+#endif+#if defined(ENOTEMPTY) && (ENOTEMPTY != EEXIST) /* same code on AIX */+#endif++/*+ * errcode_for_socket_access --- add SQLSTATE error code to the current error+ *+ * The SQLSTATE code is chosen based on the saved errno value. We assume+ * that the failing operation was some type of socket access.+ *+ * NOTE: the primary error message string should generally include %m+ * when this is used.+ */+#ifdef ECONNRESET+#endif+++/*+ * This macro handles expansion of a format string and associated parameters;+ * it's common code for errmsg(), errdetail(), etc. Must be called inside+ * a routine that is declared like "const char *fmt, ..." and has an edata+ * pointer set up. The message is assigned to edata->targetfield, or+ * appended to it if appendval is true. The message is subject to translation+ * if translateit is true.+ *+ * Note: we pstrdup the buffer rather than just transferring its storage+ * to the edata field because the buffer might be considerably larger than+ * really necessary.+ */+#define EVALUATE_MESSAGE(domain, targetfield, appendval, translateit) \+ { \+ char *fmtbuf; \+ StringInfoData buf; \+ /* Internationalize the error format string */ \+ if ((translateit) && !in_error_recursion_trouble()) \+ fmt = dgettext((domain), fmt); \+ /* Expand %m in format string */ \+ fmtbuf = expand_fmt_string(fmt, edata); \+ initStringInfo(&buf); \+ if ((appendval) && edata->targetfield) { \+ appendStringInfoString(&buf, edata->targetfield); \+ appendStringInfoChar(&buf, '\n'); \+ } \+ /* Generate actual output --- have to use appendStringInfoVA */ \+ for (;;) \+ { \+ va_list args; \+ int needed; \+ va_start(args, fmt); \+ needed = appendStringInfoVA(&buf, fmtbuf, args); \+ va_end(args); \+ if (needed == 0) \+ break; \+ enlargeStringInfo(&buf, needed); \+ } \+ /* Done with expanded fmt */ \+ pfree(fmtbuf); \+ /* Save the completed message into the stack item */ \+ if (edata->targetfield) \+ pfree(edata->targetfield); \+ edata->targetfield = pstrdup(buf.data); \+ pfree(buf.data); \+ }++/*+ * Same as above, except for pluralized error messages. The calling routine+ * must be declared like "const char *fmt_singular, const char *fmt_plural,+ * unsigned long n, ...". Translation is assumed always wanted.+ */+#define EVALUATE_MESSAGE_PLURAL(domain, targetfield, appendval) \+ { \+ const char *fmt; \+ char *fmtbuf; \+ StringInfoData buf; \+ /* Internationalize the error format string */ \+ if (!in_error_recursion_trouble()) \+ fmt = dngettext((domain), fmt_singular, fmt_plural, n); \+ else \+ fmt = (n == 1 ? fmt_singular : fmt_plural); \+ /* Expand %m in format string */ \+ fmtbuf = expand_fmt_string(fmt, edata); \+ initStringInfo(&buf); \+ if ((appendval) && edata->targetfield) { \+ appendStringInfoString(&buf, edata->targetfield); \+ appendStringInfoChar(&buf, '\n'); \+ } \+ /* Generate actual output --- have to use appendStringInfoVA */ \+ for (;;) \+ { \+ va_list args; \+ int needed; \+ va_start(args, n); \+ needed = appendStringInfoVA(&buf, fmtbuf, args); \+ va_end(args); \+ if (needed == 0) \+ break; \+ enlargeStringInfo(&buf, needed); \+ } \+ /* Done with expanded fmt */ \+ pfree(fmtbuf); \+ /* Save the completed message into the stack item */ \+ if (edata->targetfield) \+ pfree(edata->targetfield); \+ edata->targetfield = pstrdup(buf.data); \+ pfree(buf.data); \+ }+++/*+ * errmsg --- add a primary error message text to the current error+ *+ * In addition to the usual %-escapes recognized by printf, "%m" in+ * fmt is replaced by the error message for the caller's value of errno.+ *+ * Note: no newline is needed at the end of the fmt string, since+ * ereport will provide one for the output methods that need it.+ */+int+errmsg(const char *fmt,...)+{+ ErrorData *edata = &errordata[errordata_stack_depth];+ MemoryContext oldcontext;++ recursion_depth++;+ CHECK_STACK_DEPTH();+ oldcontext = MemoryContextSwitchTo(edata->assoc_context);++ EVALUATE_MESSAGE(edata->domain, message, false, true);++ MemoryContextSwitchTo(oldcontext);+ recursion_depth--;+ return 0; /* return value does not matter */+}+++/*+ * errmsg_internal --- add a primary error message text to the current error+ *+ * This is exactly like errmsg() except that strings passed to errmsg_internal+ * are not translated, and are customarily left out of the+ * internationalization message dictionary. This should be used for "can't+ * happen" cases that are probably not worth spending translation effort on.+ * We also use this for certain cases where we *must* not try to translate+ * the message because the translation would fail and result in infinite+ * error recursion.+ */+int+errmsg_internal(const char *fmt,...)+{+ ErrorData *edata = &errordata[errordata_stack_depth];+ MemoryContext oldcontext;++ recursion_depth++;+ CHECK_STACK_DEPTH();+ oldcontext = MemoryContextSwitchTo(edata->assoc_context);++ EVALUATE_MESSAGE(edata->domain, message, false, false);++ MemoryContextSwitchTo(oldcontext);+ recursion_depth--;+ return 0; /* return value does not matter */+}+++/*+ * errmsg_plural --- add a primary error message text to the current error,+ * with support for pluralization of the message text+ */++++/*+ * errdetail --- add a detail error message text to the current error+ */+int+errdetail(const char *fmt,...)+{+ ErrorData *edata = &errordata[errordata_stack_depth];+ MemoryContext oldcontext;++ recursion_depth++;+ CHECK_STACK_DEPTH();+ oldcontext = MemoryContextSwitchTo(edata->assoc_context);++ EVALUATE_MESSAGE(edata->domain, detail, false, true);++ MemoryContextSwitchTo(oldcontext);+ recursion_depth--;+ return 0; /* return value does not matter */+}+++/*+ * errdetail_internal --- add a detail error message text to the current error+ *+ * This is exactly like errdetail() except that strings passed to+ * errdetail_internal are not translated, and are customarily left out of the+ * internationalization message dictionary. This should be used for detail+ * messages that seem not worth translating for one reason or another+ * (typically, that they don't seem to be useful to average users).+ */++++/*+ * errdetail_log --- add a detail_log error message text to the current error+ */+++/*+ * errdetail_log_plural --- add a detail_log error message text to the current error+ * with support for pluralization of the message text+ */++++/*+ * errdetail_plural --- add a detail error message text to the current error,+ * with support for pluralization of the message text+ */++++/*+ * errhint --- add a hint error message text to the current error+ */+int+errhint(const char *fmt,...)+{+ ErrorData *edata = &errordata[errordata_stack_depth];+ MemoryContext oldcontext;++ recursion_depth++;+ CHECK_STACK_DEPTH();+ oldcontext = MemoryContextSwitchTo(edata->assoc_context);++ EVALUATE_MESSAGE(edata->domain, hint, false, true);++ MemoryContextSwitchTo(oldcontext);+ recursion_depth--;+ return 0; /* return value does not matter */+}+++/*+ * errcontext_msg --- add a context error message text to the current error+ *+ * Unlike other cases, multiple calls are allowed to build up a stack of+ * context information. We assume earlier calls represent more-closely-nested+ * states.+ */+int+errcontext_msg(const char *fmt,...)+{+ ErrorData *edata = &errordata[errordata_stack_depth];+ MemoryContext oldcontext;++ recursion_depth++;+ CHECK_STACK_DEPTH();+ oldcontext = MemoryContextSwitchTo(edata->assoc_context);++ EVALUATE_MESSAGE(edata->context_domain, context, true, true);++ MemoryContextSwitchTo(oldcontext);+ recursion_depth--;+ return 0; /* return value does not matter */+}++/*+ * set_errcontext_domain --- set message domain to be used by errcontext()+ *+ * errcontext_msg() can be called from a different module than the original+ * ereport(), so we cannot use the message domain passed in errstart() to+ * translate it. Instead, each errcontext_msg() call should be preceded by+ * a set_errcontext_domain() call to specify the domain. This is usually+ * done transparently by the errcontext() macro.+ *+ * Although errcontext is primarily meant for use at call sites distant from+ * the original ereport call, there are a few places that invoke errcontext+ * within ereport. The expansion of errcontext as a comma expression calling+ * set_errcontext_domain then errcontext_msg is problematic in this case,+ * because the intended comma expression becomes two arguments to errfinish,+ * which the compiler is at liberty to evaluate in either order. But in+ * such a case, the set_errcontext_domain calls must be selecting the same+ * TEXTDOMAIN value that the errstart call did, so order does not matter+ * so long as errstart initializes context_domain along with domain.+ */+int+set_errcontext_domain(const char *domain)+{+ ErrorData *edata = &errordata[errordata_stack_depth];++ /* we don't bother incrementing recursion_depth */+ CHECK_STACK_DEPTH();++ /* the default text domain is the backend's */+ edata->context_domain = domain ? domain : PG_TEXTDOMAIN("postgres");++ return 0; /* return value does not matter */+}+++/*+ * errhidestmt --- optionally suppress STATEMENT: field of log entry+ *+ * This should be called if the message text already includes the statement.+ */+++/*+ * errhidecontext --- optionally suppress CONTEXT: field of log entry+ *+ * This should only be used for verbose debugging messages where the repeated+ * inclusion of CONTEXT: bloats the log volume too much.+ */++++/*+ * errfunction --- add reporting function name to the current error+ *+ * This is used when backwards compatibility demands that the function+ * name appear in messages sent to old-protocol clients. Note that the+ * passed string is expected to be a non-freeable constant string.+ */+++/*+ * errposition --- add cursor position to the current error+ */+int+errposition(int cursorpos)+{+ ErrorData *edata = &errordata[errordata_stack_depth];++ /* we don't bother incrementing recursion_depth */+ CHECK_STACK_DEPTH();++ edata->cursorpos = cursorpos;++ return 0; /* return value does not matter */+}++/*+ * internalerrposition --- add internal cursor position to the current error+ */+int+internalerrposition(int cursorpos)+{+ ErrorData *edata = &errordata[errordata_stack_depth];++ /* we don't bother incrementing recursion_depth */+ CHECK_STACK_DEPTH();++ edata->internalpos = cursorpos;++ return 0; /* return value does not matter */+}++/*+ * internalerrquery --- add internal query text to the current error+ *+ * Can also pass NULL to drop the internal query text entry. This case+ * is intended for use in error callback subroutines that are editorializing+ * on the layout of the error report.+ */+int+internalerrquery(const char *query)+{+ ErrorData *edata = &errordata[errordata_stack_depth];++ /* we don't bother incrementing recursion_depth */+ CHECK_STACK_DEPTH();++ if (edata->internalquery)+ {+ pfree(edata->internalquery);+ edata->internalquery = NULL;+ }++ if (query)+ edata->internalquery = MemoryContextStrdup(edata->assoc_context, query);++ return 0; /* return value does not matter */+}++/*+ * err_generic_string -- used to set individual ErrorData string fields+ * identified by PG_DIAG_xxx codes.+ *+ * This intentionally only supports fields that don't use localized strings,+ * so that there are no translation considerations.+ *+ * Most potential callers should not use this directly, but instead prefer+ * higher-level abstractions, such as errtablecol() (see relcache.c).+ */+++/*+ * set_errdata_field --- set an ErrorData string field+ */+++/*+ * geterrcode --- return the currently set SQLSTATE error code+ *+ * This is only intended for use in error callback subroutines, since there+ * is no other place outside elog.c where the concept is meaningful.+ */+++/*+ * geterrposition --- return the currently set error position (0 if none)+ *+ * This is only intended for use in error callback subroutines, since there+ * is no other place outside elog.c where the concept is meaningful.+ */+int+geterrposition(void)+{+ ErrorData *edata = &errordata[errordata_stack_depth];++ /* we don't bother incrementing recursion_depth */+ CHECK_STACK_DEPTH();++ return edata->cursorpos;+}++/*+ * getinternalerrposition --- same for internal error position+ *+ * This is only intended for use in error callback subroutines, since there+ * is no other place outside elog.c where the concept is meaningful.+ */+int+getinternalerrposition(void)+{+ ErrorData *edata = &errordata[errordata_stack_depth];++ /* we don't bother incrementing recursion_depth */+ CHECK_STACK_DEPTH();++ return edata->internalpos;+}+++/*+ * elog_start --- startup for old-style API+ *+ * All that we do here is stash the hidden filename/lineno/funcname+ * arguments into a stack entry, along with the current value of errno.+ *+ * We need this to be separate from elog_finish because there's no other+ * C89-compliant way to deal with inserting extra arguments into the elog+ * call. (When using C99's __VA_ARGS__, we could possibly merge this with+ * elog_finish, but there doesn't seem to be a good way to save errno before+ * evaluating the format arguments if we do that.)+ */+void+elog_start(const char *filename, int lineno, const char *funcname)+{+ ErrorData *edata;++ /* Make sure that memory context initialization has finished */+ if (ErrorContext == NULL)+ {+ /* Ooops, hard crash time; very little we can do safely here */+ write_stderr("error occurred at %s:%d before error message processing is available\n",+ filename ? filename : "(unknown file)", lineno);+ exit(2);+ }++ if (++errordata_stack_depth >= ERRORDATA_STACK_SIZE)+ {+ /*+ * Wups, stack not big enough. We treat this as a PANIC condition+ * because it suggests an infinite loop of errors during error+ * recovery. Note that the message is intentionally not localized,+ * else failure to convert it to client encoding could cause further+ * recursion.+ */+ errordata_stack_depth = -1; /* make room on stack */+ ereport(PANIC, (errmsg_internal("ERRORDATA_STACK_SIZE exceeded")));+ }++ edata = &errordata[errordata_stack_depth];+ if (filename)+ {+ const char *slash;++ /* keep only base name, useful especially for vpath builds */+ slash = strrchr(filename, '/');+ if (slash)+ filename = slash + 1;+ }+ edata->filename = filename;+ edata->lineno = lineno;+ edata->funcname = funcname;+ /* errno is saved now so that error parameter eval can't change it */+ edata->saved_errno = errno;++ /* Use ErrorContext for any allocations done at this level. */+ edata->assoc_context = ErrorContext;+}++/*+ * elog_finish --- finish up for old-style API+ */+void+elog_finish(int elevel, const char *fmt,...)+{+ ErrorData *edata = &errordata[errordata_stack_depth];+ MemoryContext oldcontext;++ CHECK_STACK_DEPTH();++ /*+ * Do errstart() to see if we actually want to report the message.+ */+ errordata_stack_depth--;+ errno = edata->saved_errno;+ if (!errstart(elevel, edata->filename, edata->lineno, edata->funcname, NULL))+ return; /* nothing to do */++ /*+ * Format error message just like errmsg_internal().+ */+ recursion_depth++;+ oldcontext = MemoryContextSwitchTo(edata->assoc_context);++ EVALUATE_MESSAGE(edata->domain, message, false, false);++ MemoryContextSwitchTo(oldcontext);+ recursion_depth--;++ /*+ * And let errfinish() finish up.+ */+ errfinish(0);+}+++/*+ * Functions to allow construction of error message strings separately from+ * the ereport() call itself.+ *+ * The expected calling convention is+ *+ * pre_format_elog_string(errno, domain), var = format_elog_string(format,...)+ *+ * which can be hidden behind a macro such as GUC_check_errdetail(). We+ * assume that any functions called in the arguments of format_elog_string()+ * cannot result in re-entrant use of these functions --- otherwise the wrong+ * text domain might be used, or the wrong errno substituted for %m. This is+ * okay for the current usage with GUC check hooks, but might need further+ * effort someday.+ *+ * The result of format_elog_string() is stored in ErrorContext, and will+ * therefore survive until FlushErrorState() is called.+ */+++++++++/*+ * Actual output of the top-of-stack error message+ *+ * In the ereport(ERROR) case this is called from PostgresMain (or not at all,+ * if the error is caught by somebody). For all other severity levels this+ * is called by errfinish.+ */+void+EmitErrorReport(void)+{+ ErrorData *edata = &errordata[errordata_stack_depth];+ MemoryContext oldcontext;++ recursion_depth++;+ CHECK_STACK_DEPTH();+ oldcontext = MemoryContextSwitchTo(edata->assoc_context);++ /*+ * Call hook before sending message to log. The hook function is allowed+ * to turn off edata->output_to_server, so we must recheck that afterward.+ * Making any other change in the content of edata is not considered+ * supported.+ *+ * Note: the reason why the hook can only turn off output_to_server, and+ * not turn it on, is that it'd be unreliable: we will never get here at+ * all if errstart() deems the message uninteresting. A hook that could+ * make decisions in that direction would have to hook into errstart(),+ * where it would have much less information available. emit_log_hook is+ * intended for custom log filtering and custom log message transmission+ * mechanisms.+ */+ if (edata->output_to_server && emit_log_hook)+ (*emit_log_hook) (edata);++ /* Send to server log, if enabled */+ if (edata->output_to_server)+ send_message_to_server_log(edata);++ /* Send to client, if enabled */+ if (edata->output_to_client)+ send_message_to_frontend(edata);++ MemoryContextSwitchTo(oldcontext);+ recursion_depth--;+}++/*+ * CopyErrorData --- obtain a copy of the topmost error stack entry+ *+ * This is only for use in error handler code. The data is copied into the+ * current memory context, so callers should always switch away from+ * ErrorContext first; otherwise it will be lost when FlushErrorState is done.+ */+ErrorData *+CopyErrorData(void)+{+ ErrorData *edata = &errordata[errordata_stack_depth];+ ErrorData *newedata;++ /*+ * we don't increment recursion_depth because out-of-memory here does not+ * indicate a problem within the error subsystem.+ */+ CHECK_STACK_DEPTH();++ Assert(CurrentMemoryContext != ErrorContext);++ /* Copy the struct itself */+ newedata = (ErrorData *) palloc(sizeof(ErrorData));+ memcpy(newedata, edata, sizeof(ErrorData));++ /* Make copies of separately-allocated fields */+ if (newedata->message)+ newedata->message = pstrdup(newedata->message);+ if (newedata->detail)+ newedata->detail = pstrdup(newedata->detail);+ if (newedata->detail_log)+ newedata->detail_log = pstrdup(newedata->detail_log);+ if (newedata->hint)+ newedata->hint = pstrdup(newedata->hint);+ if (newedata->context)+ newedata->context = pstrdup(newedata->context);+ if (newedata->schema_name)+ newedata->schema_name = pstrdup(newedata->schema_name);+ if (newedata->table_name)+ newedata->table_name = pstrdup(newedata->table_name);+ if (newedata->column_name)+ newedata->column_name = pstrdup(newedata->column_name);+ if (newedata->datatype_name)+ newedata->datatype_name = pstrdup(newedata->datatype_name);+ if (newedata->constraint_name)+ newedata->constraint_name = pstrdup(newedata->constraint_name);+ if (newedata->internalquery)+ newedata->internalquery = pstrdup(newedata->internalquery);++ /* Use the calling context for string allocation */+ newedata->assoc_context = CurrentMemoryContext;++ return newedata;+}++/*+ * FreeErrorData --- free the structure returned by CopyErrorData.+ *+ * Error handlers should use this in preference to assuming they know all+ * the separately-allocated fields.+ */+++/*+ * FlushErrorState --- flush the error state after error recovery+ *+ * This should be called by an error handler after it's done processing+ * the error; or as soon as it's done CopyErrorData, if it intends to+ * do stuff that is likely to provoke another error. You are not "out" of+ * the error subsystem until you have done this.+ */+void+FlushErrorState(void)+{+ /*+ * Reset stack to empty. The only case where it would be more than one+ * deep is if we serviced an error that interrupted construction of+ * another message. We assume control escaped out of that message+ * construction and won't ever go back.+ */+ errordata_stack_depth = -1;+ recursion_depth = 0;+ /* Delete all data in ErrorContext */+ MemoryContextResetAndDeleteChildren(ErrorContext);+}++/*+ * ThrowErrorData --- report an error described by an ErrorData structure+ *+ * This is intended to be used to re-report errors originally thrown by+ * background worker processes and then propagated (with or without+ * modification) to the backend responsible for them.+ */+++/*+ * ReThrowError --- re-throw a previously copied error+ *+ * A handler can do CopyErrorData/FlushErrorState to get out of the error+ * subsystem, then do some processing, and finally ReThrowError to re-throw+ * the original error. This is slower than just PG_RE_THROW() but should+ * be used if the "some processing" is likely to incur another error.+ */+++/*+ * pg_re_throw --- out-of-line implementation of PG_RE_THROW() macro+ */+void+pg_re_throw(void)+{+ /* If possible, throw the error to the next outer setjmp handler */+ if (PG_exception_stack != NULL)+ siglongjmp(*PG_exception_stack, 1);+ else+ {+ /*+ * If we get here, elog(ERROR) was thrown inside a PG_TRY block, which+ * we have now exited only to discover that there is no outer setjmp+ * handler to pass the error to. Had the error been thrown outside+ * the block to begin with, we'd have promoted the error to FATAL, so+ * the correct behavior is to make it FATAL now; that is, emit it and+ * then call proc_exit.+ */+ ErrorData *edata = &errordata[errordata_stack_depth];++ Assert(errordata_stack_depth >= 0);+ Assert(edata->elevel == ERROR);+ edata->elevel = FATAL;++ /*+ * At least in principle, the increase in severity could have changed+ * where-to-output decisions, so recalculate. This should stay in+ * sync with errstart(), which see for comments.+ */+ if (IsPostmasterEnvironment)+ edata->output_to_server = is_log_level_output(FATAL,+ log_min_messages);+ else+ edata->output_to_server = (FATAL >= log_min_messages);+ if (whereToSendOutput == DestRemote)+ {+ if (ClientAuthInProgress)+ edata->output_to_client = true;+ else+ edata->output_to_client = (FATAL >= client_min_messages);+ }++ /*+ * We can use errfinish() for the rest, but we don't want it to call+ * any error context routines a second time. Since we know we are+ * about to exit, it should be OK to just clear the context stack.+ */+ error_context_stack = NULL;++ errfinish(0);+ }++ /* Doesn't return ... */+ ExceptionalCondition("pg_re_throw tried to return", "FailedAssertion",+ __FILE__, __LINE__);+}+++/*+ * GetErrorContextStack - Return the context stack, for display/diags+ *+ * Returns a pstrdup'd string in the caller's context which includes the PG+ * error call stack. It is the caller's responsibility to ensure this string+ * is pfree'd (or its context cleaned up) when done.+ *+ * This information is collected by traversing the error contexts and calling+ * each context's callback function, each of which is expected to call+ * errcontext() to return a string which can be presented to the user.+ */++++/*+ * Initialization of error output file+ */++++#ifdef HAVE_SYSLOG++/*+ * Set or update the parameters for syslog logging+ */++++/*+ * Write a message line to syslog+ */++#endif /* HAVE_SYSLOG */++#ifdef WIN32+/*+ * Get the PostgreSQL equivalent of the Windows ANSI code page. "ANSI" system+ * interfaces (e.g. CreateFileA()) expect string arguments in this encoding.+ * Every process in a given system will find the same value at all times.+ */+static int+GetACPEncoding(void)+{+ static int encoding = -2;++ if (encoding == -2)+ encoding = pg_codepage_to_encoding(GetACP());++ return encoding;+}++/*+ * Write a message line to the windows event log+ */+static void+write_eventlog(int level, const char *line, int len)+{+ WCHAR *utf16;+ int eventlevel = EVENTLOG_ERROR_TYPE;+ static HANDLE evtHandle = INVALID_HANDLE_VALUE;++ if (evtHandle == INVALID_HANDLE_VALUE)+ {+ evtHandle = RegisterEventSource(NULL,+ event_source ? event_source : DEFAULT_EVENT_SOURCE);+ if (evtHandle == NULL)+ {+ evtHandle = INVALID_HANDLE_VALUE;+ return;+ }+ }++ switch (level)+ {+ case DEBUG5:+ case DEBUG4:+ case DEBUG3:+ case DEBUG2:+ case DEBUG1:+ case LOG:+ case COMMERROR:+ case INFO:+ case NOTICE:+ eventlevel = EVENTLOG_INFORMATION_TYPE;+ break;+ case WARNING:+ eventlevel = EVENTLOG_WARNING_TYPE;+ break;+ case ERROR:+ case FATAL:+ case PANIC:+ default:+ eventlevel = EVENTLOG_ERROR_TYPE;+ break;+ }++ /*+ * If message character encoding matches the encoding expected by+ * ReportEventA(), call it to avoid the hazards of conversion. Otherwise,+ * try to convert the message to UTF16 and write it with ReportEventW().+ * Fall back on ReportEventA() if conversion failed.+ *+ * Also verify that we are not on our way into error recursion trouble due+ * to error messages thrown deep inside pgwin32_message_to_UTF16().+ */+ if (!in_error_recursion_trouble() &&+ GetMessageEncoding() != GetACPEncoding())+ {+ utf16 = pgwin32_message_to_UTF16(line, len, NULL);+ if (utf16)+ {+ ReportEventW(evtHandle,+ eventlevel,+ 0,+ 0, /* All events are Id 0 */+ NULL,+ 1,+ 0,+ (LPCWSTR *) &utf16,+ NULL);+ /* XXX Try ReportEventA() when ReportEventW() fails? */++ pfree(utf16);+ return;+ }+ }+ ReportEventA(evtHandle,+ eventlevel,+ 0,+ 0, /* All events are Id 0 */+ NULL,+ 1,+ 0,+ &line,+ NULL);+}+#endif /* WIN32 */++#ifdef WIN32+#else+#endif++/*+ * setup formatted_log_time, for consistent times between CSV and regular logs+ */+++/*+ * setup formatted_start_time+ */+++/*+ * process_log_prefix_padding --- helper function for processing the format+ * string in log_line_prefix+ *+ * Note: This function returns NULL if it finds something which+ * it deems invalid in the format string.+ */+++/*+ * Format tag info for log lines; append to the provided buffer.+ */+++/*+ * append a CSV'd version of a string to a StringInfo+ * We use the PostgreSQL defaults for CSV, i.e. quote = escape = '"'+ * If it's NULL, append nothing.+ */+++/*+ * Constructs the error message, depending on the Errordata it gets, in a CSV+ * format which is described in doc/src/sgml/config.sgml.+ */+++/*+ * Unpack MAKE_SQLSTATE code. Note that this returns a pointer to a+ * static buffer.+ */++++/*+ * Write error report to server's log+ */+static void send_message_to_server_log(ErrorData *edata) {}+++/*+ * Send data to the syslogger using the chunked protocol+ *+ * Note: when there are multiple backends writing into the syslogger pipe,+ * it's critical that each write go into the pipe indivisibly, and not+ * get interleaved with data from other processes. Fortunately, the POSIX+ * spec requires that writes to pipes be atomic so long as they are not+ * more than PIPE_BUF bytes long. So we divide long messages into chunks+ * that are no more than that length, and send one chunk per write() call.+ * The collector process knows how to reassemble the chunks.+ *+ * Because of the atomic write requirement, there are only two possible+ * results from write() here: -1 for failure, or the requested number of+ * bytes. There is not really anything we can do about a failure; retry would+ * probably be an infinite loop, and we can't even report the error usefully.+ * (There is noplace else we could send it!) So we might as well just ignore+ * the result from write(). However, on some platforms you get a compiler+ * warning from ignoring write()'s result, so do a little dance with casting+ * rc to void to shut up the compiler.+ */++++/*+ * Append a text string to the error report being built for the client.+ *+ * This is ordinarily identical to pq_sendstring(), but if we are in+ * error recursion trouble we skip encoding conversion, because of the+ * possibility that the problem is a failure in the encoding conversion+ * subsystem itself. Code elsewhere should ensure that the passed-in+ * strings will be plain 7-bit ASCII, and thus not in need of conversion,+ * in such cases. (In particular, we disable localization of error messages+ * to help ensure that's true.)+ */+++/*+ * Write error report to client+ */+static void send_message_to_frontend(ErrorData *edata) {}++++/*+ * Support routines for formatting error messages.+ */+++/*+ * expand_fmt_string --- process special format codes in a format string+ *+ * We must replace %m with the appropriate strerror string, since vsnprintf+ * won't know what to do with it.+ *+ * The result is a palloc'd string.+ */+static char *+expand_fmt_string(const char *fmt, ErrorData *edata)+{+ StringInfoData buf;+ const char *cp;++ initStringInfo(&buf);++ for (cp = fmt; *cp; cp++)+ {+ if (cp[0] == '%' && cp[1] != '\0')+ {+ cp++;+ if (*cp == 'm')+ {+ /*+ * Replace %m by system error string. If there are any %'s in+ * the string, we'd better double them so that vsnprintf won't+ * misinterpret.+ */+ const char *cp2;++ cp2 = useful_strerror(edata->saved_errno);+ for (; *cp2; cp2++)+ {+ if (*cp2 == '%')+ appendStringInfoCharMacro(&buf, '%');+ appendStringInfoCharMacro(&buf, *cp2);+ }+ }+ else+ {+ /* copy % and next char --- this avoids trouble with %%m */+ appendStringInfoCharMacro(&buf, '%');+ appendStringInfoCharMacro(&buf, *cp);+ }+ }+ else+ appendStringInfoCharMacro(&buf, *cp);+ }++ return buf.data;+}+++/*+ * A slightly cleaned-up version of strerror()+ */+static const char *+useful_strerror(int errnum)+{+ /* this buffer is only used if strerror() and get_errno_symbol() fail */+ static char errorstr_buf[48];+ const char *str;++#ifdef WIN32+ /* Winsock error code range, per WinError.h */+ if (errnum >= 10000 && errnum <= 11999)+ return pgwin32_socket_strerror(errnum);+#endif+ str = strerror(errnum);++ /*+ * Some strerror()s return an empty string for out-of-range errno. This+ * is ANSI C spec compliant, but not exactly useful. Also, we may get+ * back strings of question marks if libc cannot transcode the message to+ * the codeset specified by LC_CTYPE. If we get nothing useful, first try+ * get_errno_symbol(), and if that fails, print the numeric errno.+ */+ if (str == NULL || *str == '\0' || *str == '?')+ str = get_errno_symbol(errnum);++ if (str == NULL)+ {+ snprintf(errorstr_buf, sizeof(errorstr_buf),+ /*------+ translator: This string will be truncated at 47+ characters expanded. */+ _("operating system error %d"), errnum);+ str = errorstr_buf;+ }++ return str;+}++/*+ * Returns a symbol (e.g. "ENOENT") for an errno code.+ * Returns NULL if the code is unrecognized.+ */+static const char *+get_errno_symbol(int errnum)+{+ switch (errnum)+ {+ case E2BIG:+ return "E2BIG";+ case EACCES:+ return "EACCES";+#ifdef EADDRINUSE+ case EADDRINUSE:+ return "EADDRINUSE";+#endif+#ifdef EADDRNOTAVAIL+ case EADDRNOTAVAIL:+ return "EADDRNOTAVAIL";+#endif+ case EAFNOSUPPORT:+ return "EAFNOSUPPORT";+#ifdef EAGAIN+ case EAGAIN:+ return "EAGAIN";+#endif+#ifdef EALREADY+ case EALREADY:+ return "EALREADY";+#endif+ case EBADF:+ return "EBADF";+#ifdef EBADMSG+ case EBADMSG:+ return "EBADMSG";+#endif+ case EBUSY:+ return "EBUSY";+ case ECHILD:+ return "ECHILD";+#ifdef ECONNABORTED+ case ECONNABORTED:+ return "ECONNABORTED";+#endif+ case ECONNREFUSED:+ return "ECONNREFUSED";+#ifdef ECONNRESET+ case ECONNRESET:+ return "ECONNRESET";+#endif+ case EDEADLK:+ return "EDEADLK";+ case EDOM:+ return "EDOM";+ case EEXIST:+ return "EEXIST";+ case EFAULT:+ return "EFAULT";+ case EFBIG:+ return "EFBIG";+#ifdef EHOSTUNREACH+ case EHOSTUNREACH:+ return "EHOSTUNREACH";+#endif+ case EIDRM:+ return "EIDRM";+ case EINPROGRESS:+ return "EINPROGRESS";+ case EINTR:+ return "EINTR";+ case EINVAL:+ return "EINVAL";+ case EIO:+ return "EIO";+#ifdef EISCONN+ case EISCONN:+ return "EISCONN";+#endif+ case EISDIR:+ return "EISDIR";+#ifdef ELOOP+ case ELOOP:+ return "ELOOP";+#endif+ case EMFILE:+ return "EMFILE";+ case EMLINK:+ return "EMLINK";+ case EMSGSIZE:+ return "EMSGSIZE";+ case ENAMETOOLONG:+ return "ENAMETOOLONG";+ case ENFILE:+ return "ENFILE";+ case ENOBUFS:+ return "ENOBUFS";+ case ENODEV:+ return "ENODEV";+ case ENOENT:+ return "ENOENT";+ case ENOEXEC:+ return "ENOEXEC";+ case ENOMEM:+ return "ENOMEM";+ case ENOSPC:+ return "ENOSPC";+ case ENOSYS:+ return "ENOSYS";+#ifdef ENOTCONN+ case ENOTCONN:+ return "ENOTCONN";+#endif+ case ENOTDIR:+ return "ENOTDIR";+#if defined(ENOTEMPTY) && (ENOTEMPTY != EEXIST) /* same code on AIX */+ case ENOTEMPTY:+ return "ENOTEMPTY";+#endif+#ifdef ENOTSOCK+ case ENOTSOCK:+ return "ENOTSOCK";+#endif+#ifdef ENOTSUP+ case ENOTSUP:+ return "ENOTSUP";+#endif+ case ENOTTY:+ return "ENOTTY";+ case ENXIO:+ return "ENXIO";+#if defined(EOPNOTSUPP) && (!defined(ENOTSUP) || (EOPNOTSUPP != ENOTSUP))+ case EOPNOTSUPP:+ return "EOPNOTSUPP";+#endif+#ifdef EOVERFLOW+ case EOVERFLOW:+ return "EOVERFLOW";+#endif+ case EPERM:+ return "EPERM";+ case EPIPE:+ return "EPIPE";+ case EPROTONOSUPPORT:+ return "EPROTONOSUPPORT";+ case ERANGE:+ return "ERANGE";+#ifdef EROFS+ case EROFS:+ return "EROFS";+#endif+ case ESRCH:+ return "ESRCH";+#ifdef ETIMEDOUT+ case ETIMEDOUT:+ return "ETIMEDOUT";+#endif+#ifdef ETXTBSY+ case ETXTBSY:+ return "ETXTBSY";+#endif+#if defined(EWOULDBLOCK) && (!defined(EAGAIN) || (EWOULDBLOCK != EAGAIN))+ case EWOULDBLOCK:+ return "EWOULDBLOCK";+#endif+ case EXDEV:+ return "EXDEV";+ }++ return NULL;+}+++/*+ * error_severity --- get localized string representing elevel+ */++++/*+ * append_with_tabs+ *+ * Append the string to the StringInfo buffer, inserting a tab after any+ * newline.+ */++++/*+ * Write errors to stderr (or by equal means when stderr is+ * not available). Used before ereport/elog can be used+ * safely (memory context, GUC load etc)+ */+void+write_stderr(const char *fmt,...)+{+ va_list ap;++#ifdef WIN32+ char errbuf[2048]; /* Arbitrary size? */+#endif++ fmt = _(fmt);++ va_start(ap, fmt);+#ifndef WIN32+ /* On Unix, we just fprintf to stderr */+ vfprintf(stderr, fmt, ap);+ fflush(stderr);+#else+ vsnprintf(errbuf, sizeof(errbuf), fmt, ap);++ /*+ * On Win32, we print to stderr if running on a console, or write to+ * eventlog if running as a service+ */+ if (pgwin32_is_service()) /* Running as a service */+ {+ write_eventlog(ERROR, errbuf, strlen(errbuf));+ }+ else+ {+ /* Not running as service, write to stderr */+ write_console(errbuf, strlen(errbuf));+ fflush(stderr);+ }+#endif+ va_end(ap);+}+++/*+ * is_log_level_output -- is elevel logically >= log_min_level?+ *+ * We use this for tests that should consider LOG to sort out-of-order,+ * between ERROR and FATAL. Generally this is the right thing for testing+ * whether a message should go to the postmaster log, whereas a simple >=+ * test is correct for testing whether the message should go to the client.+ */+static bool+is_log_level_output(int elevel, int log_min_level)+{+ if (elevel == LOG || elevel == COMMERROR)+ {+ if (log_min_level == LOG || log_min_level <= ERROR)+ return true;+ }+ else if (log_min_level == LOG)+ {+ /* elevel != LOG */+ if (elevel >= FATAL)+ return true;+ }+ /* Neither is LOG */+ else if (elevel >= log_min_level)+ return true;++ return false;+}++/*+ * Adjust the level of a recovery-related message per trace_recovery_messages.+ *+ * The argument is the default log level of the message, eg, DEBUG2. (This+ * should only be applied to DEBUGn log messages, otherwise it's a no-op.)+ * If the level is >= trace_recovery_messages, we return LOG, causing the+ * message to be logged unconditionally (for most settings of+ * log_min_messages). Otherwise, we return the argument unchanged.+ * The message will then be shown based on the setting of log_min_messages.+ *+ * Intention is to keep this for at least the whole of the 9.0 production+ * release, so we can more easily diagnose production problems in the field.+ * It should go away eventually, though, because it's an ugly and+ * hard-to-explain kluge.+ */+
+ foreign/libpg_query/src/postgres/src_backend_utils_init_globals.c view
@@ -0,0 +1,151 @@+/*--------------------------------------------------------------------+ * Symbols referenced in this file:+ * - CritSectionCount+ * - ExitOnAnyError+ * - InterruptHoldoffCount+ * - QueryCancelHoldoffCount+ * - IsPostmasterEnvironment+ * - InterruptPending+ *--------------------------------------------------------------------+ */++/*-------------------------------------------------------------------------+ *+ * globals.c+ * global variable declarations+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ *+ * IDENTIFICATION+ * src/backend/utils/init/globals.c+ *+ * NOTES+ * Globals used all over the place should be declared here and not+ * in other modules.+ *+ *-------------------------------------------------------------------------+ */+#include "postgres.h"++#include "libpq/libpq-be.h"+#include "libpq/pqcomm.h"+#include "miscadmin.h"+#include "storage/backendid.h"+++++__thread volatile bool InterruptPending = false;+++++__thread volatile uint32 InterruptHoldoffCount = 0;++__thread volatile uint32 QueryCancelHoldoffCount = 0;++__thread volatile uint32 CritSectionCount = 0;+++++++++/*+ * MyLatch points to the latch that should be used for signal handling by the+ * current process. It will either point to a process local latch if the+ * current process does not have a PGPROC entry in that moment, or to+ * PGPROC->procLatch if it has. Thus it can always be used in signal handlers,+ * without checking for its existence.+ */+++/*+ * DataDir is the absolute path to the top level of the PGDATA directory tree.+ * Except during early startup, this is also the server's working directory;+ * most code therefore can simply use relative paths and not reference DataDir+ * explicitly.+ */+++ /* debugging output file */++ /* full path to my executable */+ /* full path to lib directory */++#ifdef EXEC_BACKEND+char postgres_exec_path[MAXPGPATH]; /* full path to backend */++/* note: currently this is not valid in backend processes */+#endif++++++++/*+ * DatabasePath is the path (relative to DataDir) of my database's+ * primary directory, ie, its directory in the default tablespace.+ */+++++/*+ * IsPostmasterEnvironment is true in a postmaster process and any postmaster+ * child process; it is false in a standalone process (bootstrap or+ * standalone backend). IsUnderPostmaster is true in postmaster child+ * processes. Note that "child process" includes all children, not only+ * regular backends. These should be set correctly as early as possible+ * in the execution of a process, so that error handling will do the right+ * things if an error should occur during process initialization.+ *+ * These are initialized for the bootstrap/standalone case.+ */+__thread bool IsPostmasterEnvironment = false;++++++__thread bool ExitOnAnyError = false;++++++++++++/*+ * Primary determinants of sizes of shared-memory structures.+ *+ * MaxBackends is computed by PostmasterMain after modules have had a chance to+ * register background workers.+ */++++++ /* GUC parameters for vacuum */++++++++++ /* working state for vacuum */+
+ foreign/libpg_query/src/postgres/src_backend_utils_mb_encnames.c view
@@ -0,0 +1,146 @@+/*--------------------------------------------------------------------+ * Symbols referenced in this file:+ * - pg_enc2name_tbl+ *--------------------------------------------------------------------+ */++/*+ * Encoding names and routines for work with it. All+ * in this file is shared between FE and BE.+ *+ * src/backend/utils/mb/encnames.c+ */+#ifdef FRONTEND+#include "postgres_fe.h"+#else+#include "postgres.h"+#include "utils/builtins.h"+#endif++#include <ctype.h>+#include <unistd.h>++#include "mb/pg_wchar.h"+++/* ----------+ * All encoding names, sorted: *** A L P H A B E T I C ***+ *+ * All names must be without irrelevant chars, search routines use+ * isalnum() chars only. It means ISO-8859-1, iso_8859-1 and Iso8859_1+ * are always converted to 'iso88591'. All must be lower case.+ *+ * The table doesn't contain 'cs' aliases (like csISOLatin1). It's needed?+ *+ * Karel Zak, Aug 2001+ * ----------+ */+typedef struct pg_encname+{+ const char *name;+ pg_enc encoding;+} pg_encname;++++/* ----------+ * These are "official" encoding names.+ * XXX must be sorted by the same order as enum pg_enc (in mb/pg_wchar.h)+ * ----------+ */+#ifndef WIN32+#define DEF_ENC2NAME(name, codepage) { #name, PG_##name }+#else+#define DEF_ENC2NAME(name, codepage) { #name, PG_##name, codepage }+#endif+const pg_enc2name pg_enc2name_tbl[] =+{+ DEF_ENC2NAME(SQL_ASCII, 0),+ DEF_ENC2NAME(EUC_JP, 20932),+ DEF_ENC2NAME(EUC_CN, 20936),+ DEF_ENC2NAME(EUC_KR, 51949),+ DEF_ENC2NAME(EUC_TW, 0),+ DEF_ENC2NAME(EUC_JIS_2004, 20932),+ DEF_ENC2NAME(UTF8, 65001),+ DEF_ENC2NAME(MULE_INTERNAL, 0),+ DEF_ENC2NAME(LATIN1, 28591),+ DEF_ENC2NAME(LATIN2, 28592),+ DEF_ENC2NAME(LATIN3, 28593),+ DEF_ENC2NAME(LATIN4, 28594),+ DEF_ENC2NAME(LATIN5, 28599),+ DEF_ENC2NAME(LATIN6, 0),+ DEF_ENC2NAME(LATIN7, 0),+ DEF_ENC2NAME(LATIN8, 0),+ DEF_ENC2NAME(LATIN9, 28605),+ DEF_ENC2NAME(LATIN10, 0),+ DEF_ENC2NAME(WIN1256, 1256),+ DEF_ENC2NAME(WIN1258, 1258),+ DEF_ENC2NAME(WIN866, 866),+ DEF_ENC2NAME(WIN874, 874),+ DEF_ENC2NAME(KOI8R, 20866),+ DEF_ENC2NAME(WIN1251, 1251),+ DEF_ENC2NAME(WIN1252, 1252),+ DEF_ENC2NAME(ISO_8859_5, 28595),+ DEF_ENC2NAME(ISO_8859_6, 28596),+ DEF_ENC2NAME(ISO_8859_7, 28597),+ DEF_ENC2NAME(ISO_8859_8, 28598),+ DEF_ENC2NAME(WIN1250, 1250),+ DEF_ENC2NAME(WIN1253, 1253),+ DEF_ENC2NAME(WIN1254, 1254),+ DEF_ENC2NAME(WIN1255, 1255),+ DEF_ENC2NAME(WIN1257, 1257),+ DEF_ENC2NAME(KOI8U, 21866),+ DEF_ENC2NAME(SJIS, 932),+ DEF_ENC2NAME(BIG5, 950),+ DEF_ENC2NAME(GBK, 936),+ DEF_ENC2NAME(UHC, 949),+ DEF_ENC2NAME(GB18030, 54936),+ DEF_ENC2NAME(JOHAB, 0),+ DEF_ENC2NAME(SHIFT_JIS_2004, 932)+};++/* ----------+ * These are encoding names for gettext.+ *+ * This covers all encodings except MULE_INTERNAL, which is alien to gettext.+ * ----------+ */++++/* ----------+ * Encoding checks, for error returns -1 else encoding id+ * ----------+ */+++++++/* ----------+ * Remove irrelevant chars from encoding name+ * ----------+ */+++/* ----------+ * Search encoding by encoding name+ *+ * Returns encoding ID, or -1 for error+ * ----------+ */+#ifdef FRONTEND+#else+#endif++#ifndef FRONTEND++#endif++++#ifndef FRONTEND+++#endif
+ foreign/libpg_query/src/postgres/src_backend_utils_mb_mbutils.c view
@@ -0,0 +1,542 @@+/*--------------------------------------------------------------------+ * Symbols referenced in this file:+ * - GetDatabaseEncoding+ * - DatabaseEncoding+ * - pg_get_client_encoding+ * - ClientEncoding+ * - pg_mbcliplen+ * - pg_encoding_mbcliplen+ * - cliplen+ * - pg_mblen+ * - pg_mbstrlen_with_len+ * - SetDatabaseEncoding+ *--------------------------------------------------------------------+ */++/*-------------------------------------------------------------------------+ *+ * mbutils.c+ * This file contains functions for encoding conversion.+ *+ * The string-conversion functions in this file share some API quirks.+ * Note the following:+ *+ * The functions return a palloc'd, null-terminated string if conversion+ * is required. However, if no conversion is performed, the given source+ * string pointer is returned as-is.+ *+ * Although the presence of a length argument means that callers can pass+ * non-null-terminated strings, care is required because the same string+ * will be passed back if no conversion occurs. Such callers *must* check+ * whether result == src and handle that case differently.+ *+ * If the source and destination encodings are the same, the source string+ * is returned without any verification; it's assumed to be valid data.+ * If that might not be the case, the caller is responsible for validating+ * the string using a separate call to pg_verify_mbstr(). Whenever the+ * source and destination encodings are different, the functions ensure that+ * the result is validly encoded according to the destination encoding.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ *+ * IDENTIFICATION+ * src/backend/utils/mb/mbutils.c+ *+ *-------------------------------------------------------------------------+ */+#include "postgres.h"++#include "access/xact.h"+#include "catalog/namespace.h"+#include "mb/pg_wchar.h"+#include "utils/builtins.h"+#include "utils/memutils.h"+#include "utils/syscache.h"++/*+ * When converting strings between different encodings, we assume that space+ * for converted result is 4-to-1 growth in the worst case. The rate for+ * currently supported encoding pairs are within 3 (SJIS JIS X0201 half width+ * kanna -> UTF8 is the worst case). So "4" should be enough for the moment.+ *+ * Note that this is not the same as the maximum character width in any+ * particular encoding.+ */+#define MAX_CONVERSION_GROWTH 4++/*+ * We maintain a simple linked list caching the fmgr lookup info for the+ * currently selected conversion functions, as well as any that have been+ * selected previously in the current session. (We remember previous+ * settings because we must be able to restore a previous setting during+ * transaction rollback, without doing any fresh catalog accesses.)+ *+ * Since we'll never release this data, we just keep it in TopMemoryContext.+ */+typedef struct ConvProcInfo+{+ int s_encoding; /* server and client encoding IDs */+ int c_encoding;+ FmgrInfo to_server_info; /* lookup info for conversion procs */+ FmgrInfo to_client_info;+} ConvProcInfo;++ /* List of ConvProcInfo */++/*+ * These variables point to the currently active conversion functions,+ * or are NULL when no conversion is needed.+ */++++/*+ * These variables track the currently-selected encodings.+ */+static const pg_enc2name *ClientEncoding = &pg_enc2name_tbl[PG_SQL_ASCII];+static const pg_enc2name *DatabaseEncoding = &pg_enc2name_tbl[PG_SQL_ASCII];+++/*+ * During backend startup we can't set client encoding because we (a)+ * can't look up the conversion functions, and (b) may not know the database+ * encoding yet either. So SetClientEncoding() just accepts anything and+ * remembers it for InitializeClientEncoding() to apply later.+ */+++++/* Internal functions */+static char *perform_default_encoding_conversion(const char *src,+ int len, bool is_client_to_server);+static int cliplen(const char *str, int len, int limit);+++/*+ * Prepare for a future call to SetClientEncoding. Success should mean+ * that SetClientEncoding is guaranteed to succeed for this encoding request.+ *+ * (But note that success before backend_startup_complete does not guarantee+ * success after ...)+ *+ * Returns 0 if okay, -1 if not (bad encoding or can't support conversion)+ */+++/*+ * Set the active client encoding and set up the conversion-function pointers.+ * PrepareClientEncoding should have been called previously for this encoding.+ *+ * Returns 0 if okay, -1 if not (bad encoding or can't support conversion)+ */+++/*+ * Initialize client encoding conversions.+ * Called from InitPostgres() once during backend startup.+ */+++/*+ * returns the current client encoding+ */+int+pg_get_client_encoding(void)+{+ return ClientEncoding->encoding;+}++/*+ * returns the current client encoding name+ */+++/*+ * Convert src string to another encoding (general case).+ *+ * See the notes about string conversion functions at the top of this file.+ */+++/*+ * Convert string to encoding encoding_name. The source+ * encoding is the DB encoding.+ *+ * BYTEA convert_to(TEXT string, NAME encoding_name) */+++/*+ * Convert string from encoding encoding_name. The destination+ * encoding is the DB encoding.+ *+ * TEXT convert_from(BYTEA string, NAME encoding_name) */+++/*+ * Convert string between two arbitrary encodings.+ *+ * BYTEA convert(BYTEA string, NAME src_encoding_name, NAME dest_encoding_name)+ */+++/*+ * get the length of the string considered as text in the specified+ * encoding. Raises an error if the data is not valid in that+ * encoding.+ *+ * INT4 length (BYTEA string, NAME src_encoding_name)+ */+++/*+ * Get maximum multibyte character length in the specified encoding.+ *+ * Note encoding is specified numerically, not by name as above.+ */+++/*+ * Convert client encoding to server encoding.+ *+ * See the notes about string conversion functions at the top of this file.+ */+++/*+ * Convert any encoding to server encoding.+ *+ * See the notes about string conversion functions at the top of this file.+ *+ * Unlike the other string conversion functions, this will apply validation+ * even if encoding == DatabaseEncoding->encoding. This is because this is+ * used to process data coming in from outside the database, and we never+ * want to just assume validity.+ */+++/*+ * Convert server encoding to client encoding.+ *+ * See the notes about string conversion functions at the top of this file.+ */+++/*+ * Convert server encoding to any encoding.+ *+ * See the notes about string conversion functions at the top of this file.+ */+++/*+ * Perform default encoding conversion using cached FmgrInfo. Since+ * this function does not access database at all, it is safe to call+ * outside transactions. If the conversion has not been set up by+ * SetClientEncoding(), no conversion is performed.+ */++++/* convert a multibyte string to a wchar */+++/* convert a multibyte string to a wchar with a limited length */+++/* same, with any encoding */+++/* convert a wchar string to a multibyte */+++/* convert a wchar string to a multibyte with a limited length */+++/* same, with any encoding */+++/* returns the byte length of a multibyte character */+int+pg_mblen(const char *mbstr)+{+ return ((*pg_wchar_table[DatabaseEncoding->encoding].mblen) ((const unsigned char *) mbstr));+}++/* returns the display length of a multibyte character */+++/* returns the length (counted in wchars) of a multibyte string */+++/* returns the length (counted in wchars) of a multibyte string+ * (not necessarily NULL terminated)+ */+int+pg_mbstrlen_with_len(const char *mbstr, int limit)+{+ int len = 0;++ /* optimization for single byte encoding */+ if (pg_database_encoding_max_length() == 1)+ return limit;++ while (limit > 0 && *mbstr)+ {+ int l = pg_mblen(mbstr);++ limit -= l;+ mbstr += l;+ len++;+ }+ return len;+}++/*+ * returns the byte length of a multibyte string+ * (not necessarily NULL terminated)+ * that is no longer than limit.+ * this function does not break multibyte character boundary.+ */+int+pg_mbcliplen(const char *mbstr, int len, int limit)+{+ return pg_encoding_mbcliplen(DatabaseEncoding->encoding, mbstr,+ len, limit);+}++/*+ * pg_mbcliplen with specified encoding+ */+int+pg_encoding_mbcliplen(int encoding, const char *mbstr,+ int len, int limit)+{+ mblen_converter mblen_fn;+ int clen = 0;+ int l;++ /* optimization for single byte encoding */+ if (pg_encoding_max_length(encoding) == 1)+ return cliplen(mbstr, len, limit);++ mblen_fn = pg_wchar_table[encoding].mblen;++ while (len > 0 && *mbstr)+ {+ l = (*mblen_fn) ((const unsigned char *) mbstr);+ if ((clen + l) > limit)+ break;+ clen += l;+ if (clen == limit)+ break;+ len -= l;+ mbstr += l;+ }+ return clen;+}++/*+ * Similar to pg_mbcliplen except the limit parameter specifies the+ * character length, not the byte length.+ */+++/* mbcliplen for any single-byte encoding */+static int+cliplen(const char *str, int len, int limit)+{+ int l = 0;++ len = Min(len, limit);+ while (l < len && str[l])+ l++;+ return l;+}++void+SetDatabaseEncoding(int encoding)+{+ if (!PG_VALID_BE_ENCODING(encoding))+ elog(ERROR, "invalid database encoding: %d", encoding);++ DatabaseEncoding = &pg_enc2name_tbl[encoding];+ Assert(DatabaseEncoding->encoding == encoding);+}++++#ifdef ENABLE_NLS+/*+ * Make one bind_textdomain_codeset() call, translating a pg_enc to a gettext+ * codeset. Fails for MULE_INTERNAL, an encoding unknown to gettext; can also+ * fail for gettext-internal causes like out-of-memory.+ */+static bool+raw_pg_bind_textdomain_codeset(const char *domainname, int encoding)+{+ bool elog_ok = (CurrentMemoryContext != NULL);+ int i;++ for (i = 0; pg_enc2gettext_tbl[i].name != NULL; i++)+ {+ if (pg_enc2gettext_tbl[i].encoding == encoding)+ {+ if (bind_textdomain_codeset(domainname,+ pg_enc2gettext_tbl[i].name) != NULL)+ return true;++ if (elog_ok)+ elog(LOG, "bind_textdomain_codeset failed");+ else+ write_stderr("bind_textdomain_codeset failed");++ break;+ }+ }++ return false;+}++/*+ * Bind a gettext message domain to the codeset corresponding to the database+ * encoding. For SQL_ASCII, instead bind to the codeset implied by LC_CTYPE.+ * Return the MessageEncoding implied by the new settings.+ *+ * On most platforms, gettext defaults to the codeset implied by LC_CTYPE.+ * When that matches the database encoding, we don't need to do anything. In+ * CREATE DATABASE, we enforce or trust that the locale's codeset matches the+ * database encoding, except for the C locale. (On Windows, we also permit a+ * discrepancy under the UTF8 encoding.) For the C locale, explicitly bind+ * gettext to the right codeset.+ *+ * On Windows, gettext defaults to the Windows ANSI code page. This is a+ * convenient departure for software that passes the strings to Windows ANSI+ * APIs, but we don't do that. Compel gettext to use database encoding or,+ * failing that, the LC_CTYPE encoding as it would on other platforms.+ *+ * This function is called before elog() and palloc() are usable.+ */+int+pg_bind_textdomain_codeset(const char *domainname)+{+ bool elog_ok = (CurrentMemoryContext != NULL);+ int encoding = GetDatabaseEncoding();+ int new_msgenc;++#ifndef WIN32+ const char *ctype = setlocale(LC_CTYPE, NULL);++ if (pg_strcasecmp(ctype, "C") == 0 || pg_strcasecmp(ctype, "POSIX") == 0)+#endif+ if (encoding != PG_SQL_ASCII &&+ raw_pg_bind_textdomain_codeset(domainname, encoding))+ return encoding;++ new_msgenc = pg_get_encoding_from_locale(NULL, elog_ok);+ if (new_msgenc < 0)+ new_msgenc = PG_SQL_ASCII;++#ifdef WIN32+ if (!raw_pg_bind_textdomain_codeset(domainname, new_msgenc))+ /* On failure, the old message encoding remains valid. */+ return GetMessageEncoding();+#endif++ return new_msgenc;+}+#endif++/*+ * The database encoding, also called the server encoding, represents the+ * encoding of data stored in text-like data types. Affected types include+ * cstring, text, varchar, name, xml, and json.+ */+int+GetDatabaseEncoding(void)+{+ return DatabaseEncoding->encoding;+}++++++++/*+ * gettext() returns messages in this encoding. This often matches the+ * database encoding, but it differs for SQL_ASCII databases, for processes+ * not attached to a database, and under a database encoding lacking iconv+ * support (MULE_INTERNAL).+ */+++#ifdef WIN32+/*+ * Result is palloc'ed null-terminated utf16 string. The character length+ * is also passed to utf16len if not null. Returns NULL iff failed.+ */+WCHAR *+pgwin32_message_to_UTF16(const char *str, int len, int *utf16len)+{+ WCHAR *utf16;+ int dstlen;+ UINT codepage;++ codepage = pg_enc2name_tbl[GetMessageEncoding()].codepage;++ /*+ * Use MultiByteToWideChar directly if there is a corresponding codepage,+ * or double conversion through UTF8 if not. Double conversion is needed,+ * for example, in an ENCODING=LATIN8, LC_CTYPE=C database.+ */+ if (codepage != 0)+ {+ utf16 = (WCHAR *) palloc(sizeof(WCHAR) * (len + 1));+ dstlen = MultiByteToWideChar(codepage, 0, str, len, utf16, len);+ utf16[dstlen] = (WCHAR) 0;+ }+ else+ {+ char *utf8;++ /*+ * XXX pg_do_encoding_conversion() requires a transaction. In the+ * absence of one, hope for the input to be valid UTF8.+ */+ if (IsTransactionState())+ {+ utf8 = (char *) pg_do_encoding_conversion((unsigned char *) str,+ len,+ GetMessageEncoding(),+ PG_UTF8);+ if (utf8 != str)+ len = strlen(utf8);+ }+ else+ utf8 = (char *) str;++ utf16 = (WCHAR *) palloc(sizeof(WCHAR) * (len + 1));+ dstlen = MultiByteToWideChar(CP_UTF8, 0, utf8, len, utf16, len);+ utf16[dstlen] = (WCHAR) 0;++ if (utf8 != str)+ pfree(utf8);+ }++ if (dstlen == 0 && len > 0)+ {+ pfree(utf16);+ return NULL; /* error */+ }++ if (utf16len)+ *utf16len = dstlen;+ return utf16;+}++#endif
+ foreign/libpg_query/src/postgres/src_backend_utils_mb_wchar.c view
@@ -0,0 +1,1888 @@+/*--------------------------------------------------------------------+ * Symbols referenced in this file:+ * - pg_verifymbstr+ * - pg_verify_mbstr_len+ * - pg_encoding_max_length+ * - report_invalid_encoding+ * - pg_encoding_mblen+ * - pg_wchar_table+ * - pg_utf_mblen+ * - pg_mule_mblen+ * - pg_ascii2wchar_with_len+ * - pg_wchar2single_with_len+ * - pg_ascii_mblen+ * - pg_ascii_dsplen+ * - pg_ascii_verifier+ * - pg_eucjp2wchar_with_len+ * - pg_euc2wchar_with_len+ * - pg_wchar2euc_with_len+ * - pg_eucjp_mblen+ * - pg_euc_mblen+ * - pg_eucjp_dsplen+ * - pg_eucjp_verifier+ * - pg_euccn2wchar_with_len+ * - pg_euccn_mblen+ * - pg_euccn_dsplen+ * - pg_euckr_verifier+ * - pg_euckr2wchar_with_len+ * - pg_euckr_mblen+ * - pg_euckr_dsplen+ * - pg_euc_dsplen+ * - pg_euctw2wchar_with_len+ * - pg_euctw_mblen+ * - pg_euctw_dsplen+ * - pg_euctw_verifier+ * - pg_utf2wchar_with_len+ * - pg_wchar2utf_with_len+ * - unicode_to_utf8+ * - pg_utf_dsplen+ * - utf8_to_unicode+ * - ucs_wcwidth+ * - mbbisearch+ * - pg_utf8_verifier+ * - pg_utf8_islegal+ * - pg_mule2wchar_with_len+ * - pg_wchar2mule_with_len+ * - pg_mule_dsplen+ * - pg_mule_verifier+ * - pg_latin12wchar_with_len+ * - pg_latin1_mblen+ * - pg_latin1_dsplen+ * - pg_latin1_verifier+ * - pg_sjis_mblen+ * - pg_sjis_dsplen+ * - pg_sjis_verifier+ * - pg_big5_mblen+ * - pg_big5_dsplen+ * - pg_big5_verifier+ * - pg_gbk_mblen+ * - pg_gbk_dsplen+ * - pg_gbk_verifier+ * - pg_uhc_mblen+ * - pg_uhc_dsplen+ * - pg_uhc_verifier+ * - pg_gb18030_mblen+ * - pg_gb18030_dsplen+ * - pg_gb18030_verifier+ * - pg_johab_mblen+ * - pg_johab_dsplen+ * - pg_johab_verifier+ * - pg_database_encoding_max_length+ *--------------------------------------------------------------------+ */++/*+ * conversion functions between pg_wchar and multibyte streams.+ * Tatsuo Ishii+ * src/backend/utils/mb/wchar.c+ *+ */+/* can be used in either frontend or backend */+#ifdef FRONTEND+#include "postgres_fe.h"+#else+#include "postgres.h"+#endif++#include "mb/pg_wchar.h"+++/*+ * conversion to pg_wchar is done by "table driven."+ * to add an encoding support, define mb2wchar_with_len(), mblen(), dsplen()+ * for the particular encoding. Note that if the encoding is only+ * supported in the client, you don't need to define+ * mb2wchar_with_len() function (SJIS is the case).+ *+ * These functions generally assume that their input is validly formed.+ * The "verifier" functions, further down in the file, have to be more+ * paranoid. We expect that mblen() does not need to examine more than+ * the first byte of the character to discover the correct length.+ *+ * Note: for the display output of psql to work properly, the return values+ * of the dsplen functions must conform to the Unicode standard. In particular+ * the NUL character is zero width and control characters are generally+ * width -1. It is recommended that non-ASCII encodings refer their ASCII+ * subset to the ASCII routines to ensure consistency.+ */++/*+ * SQL/ASCII+ */+static int+pg_ascii2wchar_with_len(const unsigned char *from, pg_wchar *to, int len)+{+ int cnt = 0;++ while (len > 0 && *from)+ {+ *to++ = *from++;+ len--;+ cnt++;+ }+ *to = 0;+ return cnt;+}++static int+pg_ascii_mblen(const unsigned char *s)+{+ return 1;+}++static int+pg_ascii_dsplen(const unsigned char *s)+{+ if (*s == '\0')+ return 0;+ if (*s < 0x20 || *s == 0x7f)+ return -1;++ return 1;+}++/*+ * EUC+ */+static int+pg_euc2wchar_with_len(const unsigned char *from, pg_wchar *to, int len)+{+ int cnt = 0;++ while (len > 0 && *from)+ {+ if (*from == SS2 && len >= 2) /* JIS X 0201 (so called "1 byte+ * KANA") */+ {+ from++;+ *to = (SS2 << 8) | *from++;+ len -= 2;+ }+ else if (*from == SS3 && len >= 3) /* JIS X 0212 KANJI */+ {+ from++;+ *to = (SS3 << 16) | (*from++ << 8);+ *to |= *from++;+ len -= 3;+ }+ else if (IS_HIGHBIT_SET(*from) && len >= 2) /* JIS X 0208 KANJI */+ {+ *to = *from++ << 8;+ *to |= *from++;+ len -= 2;+ }+ else /* must be ASCII */+ {+ *to = *from++;+ len--;+ }+ to++;+ cnt++;+ }+ *to = 0;+ return cnt;+}++static inline int+pg_euc_mblen(const unsigned char *s)+{+ int len;++ if (*s == SS2)+ len = 2;+ else if (*s == SS3)+ len = 3;+ else if (IS_HIGHBIT_SET(*s))+ len = 2;+ else+ len = 1;+ return len;+}++static inline int+pg_euc_dsplen(const unsigned char *s)+{+ int len;++ if (*s == SS2)+ len = 2;+ else if (*s == SS3)+ len = 2;+ else if (IS_HIGHBIT_SET(*s))+ len = 2;+ else+ len = pg_ascii_dsplen(s);+ return len;+}++/*+ * EUC_JP+ */+static int+pg_eucjp2wchar_with_len(const unsigned char *from, pg_wchar *to, int len)+{+ return pg_euc2wchar_with_len(from, to, len);+}++static int+pg_eucjp_mblen(const unsigned char *s)+{+ return pg_euc_mblen(s);+}++static int+pg_eucjp_dsplen(const unsigned char *s)+{+ int len;++ if (*s == SS2)+ len = 1;+ else if (*s == SS3)+ len = 2;+ else if (IS_HIGHBIT_SET(*s))+ len = 2;+ else+ len = pg_ascii_dsplen(s);+ return len;+}++/*+ * EUC_KR+ */+static int+pg_euckr2wchar_with_len(const unsigned char *from, pg_wchar *to, int len)+{+ return pg_euc2wchar_with_len(from, to, len);+}++static int+pg_euckr_mblen(const unsigned char *s)+{+ return pg_euc_mblen(s);+}++static int+pg_euckr_dsplen(const unsigned char *s)+{+ return pg_euc_dsplen(s);+}++/*+ * EUC_CN+ *+ */+static int+pg_euccn2wchar_with_len(const unsigned char *from, pg_wchar *to, int len)+{+ int cnt = 0;++ while (len > 0 && *from)+ {+ if (*from == SS2 && len >= 3) /* code set 2 (unused?) */+ {+ from++;+ *to = (SS2 << 16) | (*from++ << 8);+ *to |= *from++;+ len -= 3;+ }+ else if (*from == SS3 && len >= 3) /* code set 3 (unused ?) */+ {+ from++;+ *to = (SS3 << 16) | (*from++ << 8);+ *to |= *from++;+ len -= 3;+ }+ else if (IS_HIGHBIT_SET(*from) && len >= 2) /* code set 1 */+ {+ *to = *from++ << 8;+ *to |= *from++;+ len -= 2;+ }+ else+ {+ *to = *from++;+ len--;+ }+ to++;+ cnt++;+ }+ *to = 0;+ return cnt;+}++static int+pg_euccn_mblen(const unsigned char *s)+{+ int len;++ if (IS_HIGHBIT_SET(*s))+ len = 2;+ else+ len = 1;+ return len;+}++static int+pg_euccn_dsplen(const unsigned char *s)+{+ int len;++ if (IS_HIGHBIT_SET(*s))+ len = 2;+ else+ len = pg_ascii_dsplen(s);+ return len;+}++/*+ * EUC_TW+ *+ */+static int+pg_euctw2wchar_with_len(const unsigned char *from, pg_wchar *to, int len)+{+ int cnt = 0;++ while (len > 0 && *from)+ {+ if (*from == SS2 && len >= 4) /* code set 2 */+ {+ from++;+ *to = (((uint32) SS2) << 24) | (*from++ << 16);+ *to |= *from++ << 8;+ *to |= *from++;+ len -= 4;+ }+ else if (*from == SS3 && len >= 3) /* code set 3 (unused?) */+ {+ from++;+ *to = (SS3 << 16) | (*from++ << 8);+ *to |= *from++;+ len -= 3;+ }+ else if (IS_HIGHBIT_SET(*from) && len >= 2) /* code set 2 */+ {+ *to = *from++ << 8;+ *to |= *from++;+ len -= 2;+ }+ else+ {+ *to = *from++;+ len--;+ }+ to++;+ cnt++;+ }+ *to = 0;+ return cnt;+}++static int+pg_euctw_mblen(const unsigned char *s)+{+ int len;++ if (*s == SS2)+ len = 4;+ else if (*s == SS3)+ len = 3;+ else if (IS_HIGHBIT_SET(*s))+ len = 2;+ else+ len = 1;+ return len;+}++static int+pg_euctw_dsplen(const unsigned char *s)+{+ int len;++ if (*s == SS2)+ len = 2;+ else if (*s == SS3)+ len = 2;+ else if (IS_HIGHBIT_SET(*s))+ len = 2;+ else+ len = pg_ascii_dsplen(s);+ return len;+}++/*+ * Convert pg_wchar to EUC_* encoding.+ * caller must allocate enough space for "to", including a trailing zero!+ * len: length of from.+ * "from" not necessarily null terminated.+ */+static int+pg_wchar2euc_with_len(const pg_wchar *from, unsigned char *to, int len)+{+ int cnt = 0;++ while (len > 0 && *from)+ {+ unsigned char c;++ if ((c = (*from >> 24)))+ {+ *to++ = c;+ *to++ = (*from >> 16) & 0xff;+ *to++ = (*from >> 8) & 0xff;+ *to++ = *from & 0xff;+ cnt += 4;+ }+ else if ((c = (*from >> 16)))+ {+ *to++ = c;+ *to++ = (*from >> 8) & 0xff;+ *to++ = *from & 0xff;+ cnt += 3;+ }+ else if ((c = (*from >> 8)))+ {+ *to++ = c;+ *to++ = *from & 0xff;+ cnt += 2;+ }+ else+ {+ *to++ = *from;+ cnt++;+ }+ from++;+ len--;+ }+ *to = 0;+ return cnt;+}+++/*+ * JOHAB+ */+static int+pg_johab_mblen(const unsigned char *s)+{+ return pg_euc_mblen(s);+}++static int+pg_johab_dsplen(const unsigned char *s)+{+ return pg_euc_dsplen(s);+}++/*+ * convert UTF8 string to pg_wchar (UCS-4)+ * caller must allocate enough space for "to", including a trailing zero!+ * len: length of from.+ * "from" not necessarily null terminated.+ */+static int+pg_utf2wchar_with_len(const unsigned char *from, pg_wchar *to, int len)+{+ int cnt = 0;+ uint32 c1,+ c2,+ c3,+ c4;++ while (len > 0 && *from)+ {+ if ((*from & 0x80) == 0)+ {+ *to = *from++;+ len--;+ }+ else if ((*from & 0xe0) == 0xc0)+ {+ if (len < 2)+ break; /* drop trailing incomplete char */+ c1 = *from++ & 0x1f;+ c2 = *from++ & 0x3f;+ *to = (c1 << 6) | c2;+ len -= 2;+ }+ else if ((*from & 0xf0) == 0xe0)+ {+ if (len < 3)+ break; /* drop trailing incomplete char */+ c1 = *from++ & 0x0f;+ c2 = *from++ & 0x3f;+ c3 = *from++ & 0x3f;+ *to = (c1 << 12) | (c2 << 6) | c3;+ len -= 3;+ }+ else if ((*from & 0xf8) == 0xf0)+ {+ if (len < 4)+ break; /* drop trailing incomplete char */+ c1 = *from++ & 0x07;+ c2 = *from++ & 0x3f;+ c3 = *from++ & 0x3f;+ c4 = *from++ & 0x3f;+ *to = (c1 << 18) | (c2 << 12) | (c3 << 6) | c4;+ len -= 4;+ }+ else+ {+ /* treat a bogus char as length 1; not ours to raise error */+ *to = *from++;+ len--;+ }+ to++;+ cnt++;+ }+ *to = 0;+ return cnt;+}+++/*+ * Map a Unicode code point to UTF-8. utf8string must have 4 bytes of+ * space allocated.+ */+unsigned char *+unicode_to_utf8(pg_wchar c, unsigned char *utf8string)+{+ if (c <= 0x7F)+ {+ utf8string[0] = c;+ }+ else if (c <= 0x7FF)+ {+ utf8string[0] = 0xC0 | ((c >> 6) & 0x1F);+ utf8string[1] = 0x80 | (c & 0x3F);+ }+ else if (c <= 0xFFFF)+ {+ utf8string[0] = 0xE0 | ((c >> 12) & 0x0F);+ utf8string[1] = 0x80 | ((c >> 6) & 0x3F);+ utf8string[2] = 0x80 | (c & 0x3F);+ }+ else+ {+ utf8string[0] = 0xF0 | ((c >> 18) & 0x07);+ utf8string[1] = 0x80 | ((c >> 12) & 0x3F);+ utf8string[2] = 0x80 | ((c >> 6) & 0x3F);+ utf8string[3] = 0x80 | (c & 0x3F);+ }++ return utf8string;+}++/*+ * Trivial conversion from pg_wchar to UTF-8.+ * caller should allocate enough space for "to"+ * len: length of from.+ * "from" not necessarily null terminated.+ */+static int+pg_wchar2utf_with_len(const pg_wchar *from, unsigned char *to, int len)+{+ int cnt = 0;++ while (len > 0 && *from)+ {+ int char_len;++ unicode_to_utf8(*from, to);+ char_len = pg_utf_mblen(to);+ cnt += char_len;+ to += char_len;+ from++;+ len--;+ }+ *to = 0;+ return cnt;+}++/*+ * Return the byte length of a UTF8 character pointed to by s+ *+ * Note: in the current implementation we do not support UTF8 sequences+ * of more than 4 bytes; hence do NOT return a value larger than 4.+ * We return "1" for any leading byte that is either flat-out illegal or+ * indicates a length larger than we support.+ *+ * pg_utf2wchar_with_len(), utf8_to_unicode(), pg_utf8_islegal(), and perhaps+ * other places would need to be fixed to change this.+ */+int+pg_utf_mblen(const unsigned char *s)+{+ int len;++ if ((*s & 0x80) == 0)+ len = 1;+ else if ((*s & 0xe0) == 0xc0)+ len = 2;+ else if ((*s & 0xf0) == 0xe0)+ len = 3;+ else if ((*s & 0xf8) == 0xf0)+ len = 4;+#ifdef NOT_USED+ else if ((*s & 0xfc) == 0xf8)+ len = 5;+ else if ((*s & 0xfe) == 0xfc)+ len = 6;+#endif+ else+ len = 1;+ return len;+}++/*+ * This is an implementation of wcwidth() and wcswidth() as defined in+ * "The Single UNIX Specification, Version 2, The Open Group, 1997"+ * <http://www.UNIX-systems.org/online.html>+ *+ * Markus Kuhn -- 2001-09-08 -- public domain+ *+ * customised for PostgreSQL+ *+ * original available at : http://www.cl.cam.ac.uk/~mgk25/ucs/wcwidth.c+ */++struct mbinterval+{+ unsigned short first;+ unsigned short last;+};++/* auxiliary function for binary search in interval table */+static int+mbbisearch(pg_wchar ucs, const struct mbinterval * table, int max)+{+ int min = 0;+ int mid;++ if (ucs < table[0].first || ucs > table[max].last)+ return 0;+ while (max >= min)+ {+ mid = (min + max) / 2;+ if (ucs > table[mid].last)+ min = mid + 1;+ else if (ucs < table[mid].first)+ max = mid - 1;+ else+ return 1;+ }++ return 0;+}+++/* The following functions define the column width of an ISO 10646+ * character as follows:+ *+ * - The null character (U+0000) has a column width of 0.+ *+ * - Other C0/C1 control characters and DEL will lead to a return+ * value of -1.+ *+ * - Non-spacing and enclosing combining characters (general+ * category code Mn or Me in the Unicode database) have a+ * column width of 0.+ *+ * - Other format characters (general category code Cf in the Unicode+ * database) and ZERO WIDTH SPACE (U+200B) have a column width of 0.+ *+ * - Hangul Jamo medial vowels and final consonants (U+1160-U+11FF)+ * have a column width of 0.+ *+ * - Spacing characters in the East Asian Wide (W) or East Asian+ * FullWidth (F) category as defined in Unicode Technical+ * Report #11 have a column width of 2.+ *+ * - All remaining characters (including all printable+ * ISO 8859-1 and WGL4 characters, Unicode control characters,+ * etc.) have a column width of 1.+ *+ * This implementation assumes that wchar_t characters are encoded+ * in ISO 10646.+ */++static int+ucs_wcwidth(pg_wchar ucs)+{+ /* sorted list of non-overlapping intervals of non-spacing characters */+ static const struct mbinterval combining[] = {+ {0x0300, 0x034E}, {0x0360, 0x0362}, {0x0483, 0x0486},+ {0x0488, 0x0489}, {0x0591, 0x05A1}, {0x05A3, 0x05B9},+ {0x05BB, 0x05BD}, {0x05BF, 0x05BF}, {0x05C1, 0x05C2},+ {0x05C4, 0x05C4}, {0x064B, 0x0655}, {0x0670, 0x0670},+ {0x06D6, 0x06E4}, {0x06E7, 0x06E8}, {0x06EA, 0x06ED},+ {0x070F, 0x070F}, {0x0711, 0x0711}, {0x0730, 0x074A},+ {0x07A6, 0x07B0}, {0x0901, 0x0902}, {0x093C, 0x093C},+ {0x0941, 0x0948}, {0x094D, 0x094D}, {0x0951, 0x0954},+ {0x0962, 0x0963}, {0x0981, 0x0981}, {0x09BC, 0x09BC},+ {0x09C1, 0x09C4}, {0x09CD, 0x09CD}, {0x09E2, 0x09E3},+ {0x0A02, 0x0A02}, {0x0A3C, 0x0A3C}, {0x0A41, 0x0A42},+ {0x0A47, 0x0A48}, {0x0A4B, 0x0A4D}, {0x0A70, 0x0A71},+ {0x0A81, 0x0A82}, {0x0ABC, 0x0ABC}, {0x0AC1, 0x0AC5},+ {0x0AC7, 0x0AC8}, {0x0ACD, 0x0ACD}, {0x0B01, 0x0B01},+ {0x0B3C, 0x0B3C}, {0x0B3F, 0x0B3F}, {0x0B41, 0x0B43},+ {0x0B4D, 0x0B4D}, {0x0B56, 0x0B56}, {0x0B82, 0x0B82},+ {0x0BC0, 0x0BC0}, {0x0BCD, 0x0BCD}, {0x0C3E, 0x0C40},+ {0x0C46, 0x0C48}, {0x0C4A, 0x0C4D}, {0x0C55, 0x0C56},+ {0x0CBF, 0x0CBF}, {0x0CC6, 0x0CC6}, {0x0CCC, 0x0CCD},+ {0x0D41, 0x0D43}, {0x0D4D, 0x0D4D}, {0x0DCA, 0x0DCA},+ {0x0DD2, 0x0DD4}, {0x0DD6, 0x0DD6}, {0x0E31, 0x0E31},+ {0x0E34, 0x0E3A}, {0x0E47, 0x0E4E}, {0x0EB1, 0x0EB1},+ {0x0EB4, 0x0EB9}, {0x0EBB, 0x0EBC}, {0x0EC8, 0x0ECD},+ {0x0F18, 0x0F19}, {0x0F35, 0x0F35}, {0x0F37, 0x0F37},+ {0x0F39, 0x0F39}, {0x0F71, 0x0F7E}, {0x0F80, 0x0F84},+ {0x0F86, 0x0F87}, {0x0F90, 0x0F97}, {0x0F99, 0x0FBC},+ {0x0FC6, 0x0FC6}, {0x102D, 0x1030}, {0x1032, 0x1032},+ {0x1036, 0x1037}, {0x1039, 0x1039}, {0x1058, 0x1059},+ {0x1160, 0x11FF}, {0x17B7, 0x17BD}, {0x17C6, 0x17C6},+ {0x17C9, 0x17D3}, {0x180B, 0x180E}, {0x18A9, 0x18A9},+ {0x200B, 0x200F}, {0x202A, 0x202E}, {0x206A, 0x206F},+ {0x20D0, 0x20E3}, {0x302A, 0x302F}, {0x3099, 0x309A},+ {0xFB1E, 0xFB1E}, {0xFE20, 0xFE23}, {0xFEFF, 0xFEFF},+ {0xFFF9, 0xFFFB}+ };++ /* test for 8-bit control characters */+ if (ucs == 0)+ return 0;++ if (ucs < 0x20 || (ucs >= 0x7f && ucs < 0xa0) || ucs > 0x0010ffff)+ return -1;++ /* binary search in table of non-spacing characters */+ if (mbbisearch(ucs, combining,+ sizeof(combining) / sizeof(struct mbinterval) - 1))+ return 0;++ /*+ * if we arrive here, ucs is not a combining or C0/C1 control character+ */++ return 1 ++ (ucs >= 0x1100 &&+ (ucs <= 0x115f || /* Hangul Jamo init. consonants */+ (ucs >= 0x2e80 && ucs <= 0xa4cf && (ucs & ~0x0011) != 0x300a &&+ ucs != 0x303f) || /* CJK ... Yi */+ (ucs >= 0xac00 && ucs <= 0xd7a3) || /* Hangul Syllables */+ (ucs >= 0xf900 && ucs <= 0xfaff) || /* CJK Compatibility+ * Ideographs */+ (ucs >= 0xfe30 && ucs <= 0xfe6f) || /* CJK Compatibility Forms */+ (ucs >= 0xff00 && ucs <= 0xff5f) || /* Fullwidth Forms */+ (ucs >= 0xffe0 && ucs <= 0xffe6) ||+ (ucs >= 0x20000 && ucs <= 0x2ffff)));+}++/*+ * Convert a UTF-8 character to a Unicode code point.+ * This is a one-character version of pg_utf2wchar_with_len.+ *+ * No error checks here, c must point to a long-enough string.+ */+pg_wchar+utf8_to_unicode(const unsigned char *c)+{+ if ((*c & 0x80) == 0)+ return (pg_wchar) c[0];+ else if ((*c & 0xe0) == 0xc0)+ return (pg_wchar) (((c[0] & 0x1f) << 6) |+ (c[1] & 0x3f));+ else if ((*c & 0xf0) == 0xe0)+ return (pg_wchar) (((c[0] & 0x0f) << 12) |+ ((c[1] & 0x3f) << 6) |+ (c[2] & 0x3f));+ else if ((*c & 0xf8) == 0xf0)+ return (pg_wchar) (((c[0] & 0x07) << 18) |+ ((c[1] & 0x3f) << 12) |+ ((c[2] & 0x3f) << 6) |+ (c[3] & 0x3f));+ else+ /* that is an invalid code on purpose */+ return 0xffffffff;+}++static int+pg_utf_dsplen(const unsigned char *s)+{+ return ucs_wcwidth(utf8_to_unicode(s));+}++/*+ * convert mule internal code to pg_wchar+ * caller should allocate enough space for "to"+ * len: length of from.+ * "from" not necessarily null terminated.+ */+static int+pg_mule2wchar_with_len(const unsigned char *from, pg_wchar *to, int len)+{+ int cnt = 0;++ while (len > 0 && *from)+ {+ if (IS_LC1(*from) && len >= 2)+ {+ *to = *from++ << 16;+ *to |= *from++;+ len -= 2;+ }+ else if (IS_LCPRV1(*from) && len >= 3)+ {+ from++;+ *to = *from++ << 16;+ *to |= *from++;+ len -= 3;+ }+ else if (IS_LC2(*from) && len >= 3)+ {+ *to = *from++ << 16;+ *to |= *from++ << 8;+ *to |= *from++;+ len -= 3;+ }+ else if (IS_LCPRV2(*from) && len >= 4)+ {+ from++;+ *to = *from++ << 16;+ *to |= *from++ << 8;+ *to |= *from++;+ len -= 4;+ }+ else+ { /* assume ASCII */+ *to = (unsigned char) *from++;+ len--;+ }+ to++;+ cnt++;+ }+ *to = 0;+ return cnt;+}++/*+ * convert pg_wchar to mule internal code+ * caller should allocate enough space for "to"+ * len: length of from.+ * "from" not necessarily null terminated.+ */+static int+pg_wchar2mule_with_len(const pg_wchar *from, unsigned char *to, int len)+{+ int cnt = 0;++ while (len > 0 && *from)+ {+ unsigned char lb;++ lb = (*from >> 16) & 0xff;+ if (IS_LC1(lb))+ {+ *to++ = lb;+ *to++ = *from & 0xff;+ cnt += 2;+ }+ else if (IS_LC2(lb))+ {+ *to++ = lb;+ *to++ = (*from >> 8) & 0xff;+ *to++ = *from & 0xff;+ cnt += 3;+ }+ else if (IS_LCPRV1_A_RANGE(lb))+ {+ *to++ = LCPRV1_A;+ *to++ = lb;+ *to++ = *from & 0xff;+ cnt += 3;+ }+ else if (IS_LCPRV1_B_RANGE(lb))+ {+ *to++ = LCPRV1_B;+ *to++ = lb;+ *to++ = *from & 0xff;+ cnt += 3;+ }+ else if (IS_LCPRV2_A_RANGE(lb))+ {+ *to++ = LCPRV2_A;+ *to++ = lb;+ *to++ = (*from >> 8) & 0xff;+ *to++ = *from & 0xff;+ cnt += 4;+ }+ else if (IS_LCPRV2_B_RANGE(lb))+ {+ *to++ = LCPRV2_B;+ *to++ = lb;+ *to++ = (*from >> 8) & 0xff;+ *to++ = *from & 0xff;+ cnt += 4;+ }+ else+ {+ *to++ = *from & 0xff;+ cnt += 1;+ }+ from++;+ len--;+ }+ *to = 0;+ return cnt;+}++int+pg_mule_mblen(const unsigned char *s)+{+ int len;++ if (IS_LC1(*s))+ len = 2;+ else if (IS_LCPRV1(*s))+ len = 3;+ else if (IS_LC2(*s))+ len = 3;+ else if (IS_LCPRV2(*s))+ len = 4;+ else+ len = 1; /* assume ASCII */+ return len;+}++static int+pg_mule_dsplen(const unsigned char *s)+{+ int len;++ /*+ * Note: it's not really appropriate to assume that all multibyte charsets+ * are double-wide on screen. But this seems an okay approximation for+ * the MULE charsets we currently support.+ */++ if (IS_LC1(*s))+ len = 1;+ else if (IS_LCPRV1(*s))+ len = 1;+ else if (IS_LC2(*s))+ len = 2;+ else if (IS_LCPRV2(*s))+ len = 2;+ else+ len = 1; /* assume ASCII */++ return len;+}++/*+ * ISO8859-1+ */+static int+pg_latin12wchar_with_len(const unsigned char *from, pg_wchar *to, int len)+{+ int cnt = 0;++ while (len > 0 && *from)+ {+ *to++ = *from++;+ len--;+ cnt++;+ }+ *to = 0;+ return cnt;+}++/*+ * Trivial conversion from pg_wchar to single byte encoding. Just ignores+ * high bits.+ * caller should allocate enough space for "to"+ * len: length of from.+ * "from" not necessarily null terminated.+ */+static int+pg_wchar2single_with_len(const pg_wchar *from, unsigned char *to, int len)+{+ int cnt = 0;++ while (len > 0 && *from)+ {+ *to++ = *from++;+ len--;+ cnt++;+ }+ *to = 0;+ return cnt;+}++static int+pg_latin1_mblen(const unsigned char *s)+{+ return 1;+}++static int+pg_latin1_dsplen(const unsigned char *s)+{+ return pg_ascii_dsplen(s);+}++/*+ * SJIS+ */+static int+pg_sjis_mblen(const unsigned char *s)+{+ int len;++ if (*s >= 0xa1 && *s <= 0xdf)+ len = 1; /* 1 byte kana? */+ else if (IS_HIGHBIT_SET(*s))+ len = 2; /* kanji? */+ else+ len = 1; /* should be ASCII */+ return len;+}++static int+pg_sjis_dsplen(const unsigned char *s)+{+ int len;++ if (*s >= 0xa1 && *s <= 0xdf)+ len = 1; /* 1 byte kana? */+ else if (IS_HIGHBIT_SET(*s))+ len = 2; /* kanji? */+ else+ len = pg_ascii_dsplen(s); /* should be ASCII */+ return len;+}++/*+ * Big5+ */+static int+pg_big5_mblen(const unsigned char *s)+{+ int len;++ if (IS_HIGHBIT_SET(*s))+ len = 2; /* kanji? */+ else+ len = 1; /* should be ASCII */+ return len;+}++static int+pg_big5_dsplen(const unsigned char *s)+{+ int len;++ if (IS_HIGHBIT_SET(*s))+ len = 2; /* kanji? */+ else+ len = pg_ascii_dsplen(s); /* should be ASCII */+ return len;+}++/*+ * GBK+ */+static int+pg_gbk_mblen(const unsigned char *s)+{+ int len;++ if (IS_HIGHBIT_SET(*s))+ len = 2; /* kanji? */+ else+ len = 1; /* should be ASCII */+ return len;+}++static int+pg_gbk_dsplen(const unsigned char *s)+{+ int len;++ if (IS_HIGHBIT_SET(*s))+ len = 2; /* kanji? */+ else+ len = pg_ascii_dsplen(s); /* should be ASCII */+ return len;+}++/*+ * UHC+ */+static int+pg_uhc_mblen(const unsigned char *s)+{+ int len;++ if (IS_HIGHBIT_SET(*s))+ len = 2; /* 2byte? */+ else+ len = 1; /* should be ASCII */+ return len;+}++static int+pg_uhc_dsplen(const unsigned char *s)+{+ int len;++ if (IS_HIGHBIT_SET(*s))+ len = 2; /* 2byte? */+ else+ len = pg_ascii_dsplen(s); /* should be ASCII */+ return len;+}++/*+ * GB18030+ * Added by Bill Huang <bhuang@redhat.com>,<bill_huanghb@ybb.ne.jp>+ */+static int+pg_gb18030_mblen(const unsigned char *s)+{+ int len;++ if (!IS_HIGHBIT_SET(*s))+ len = 1; /* ASCII */+ else if (*(s + 1) >= 0x30 && *(s + 1) <= 0x39)+ len = 4;+ else+ len = 2;+ return len;+}++static int+pg_gb18030_dsplen(const unsigned char *s)+{+ int len;++ if (IS_HIGHBIT_SET(*s))+ len = 2;+ else+ len = pg_ascii_dsplen(s); /* ASCII */+ return len;+}++/*+ *-------------------------------------------------------------------+ * multibyte sequence validators+ *+ * These functions accept "s", a pointer to the first byte of a string,+ * and "len", the remaining length of the string. If there is a validly+ * encoded character beginning at *s, return its length in bytes; else+ * return -1.+ *+ * The functions can assume that len > 0 and that *s != '\0', but they must+ * test for and reject zeroes in any additional bytes of a multibyte character.+ *+ * Note that this definition allows the function for a single-byte+ * encoding to be just "return 1".+ *-------------------------------------------------------------------+ */++static int+pg_ascii_verifier(const unsigned char *s, int len)+{+ return 1;+}++#define IS_EUC_RANGE_VALID(c) ((c) >= 0xa1 && (c) <= 0xfe)++static int+pg_eucjp_verifier(const unsigned char *s, int len)+{+ int l;+ unsigned char c1,+ c2;++ c1 = *s++;++ switch (c1)+ {+ case SS2: /* JIS X 0201 */+ l = 2;+ if (l > len)+ return -1;+ c2 = *s++;+ if (c2 < 0xa1 || c2 > 0xdf)+ return -1;+ break;++ case SS3: /* JIS X 0212 */+ l = 3;+ if (l > len)+ return -1;+ c2 = *s++;+ if (!IS_EUC_RANGE_VALID(c2))+ return -1;+ c2 = *s++;+ if (!IS_EUC_RANGE_VALID(c2))+ return -1;+ break;++ default:+ if (IS_HIGHBIT_SET(c1)) /* JIS X 0208? */+ {+ l = 2;+ if (l > len)+ return -1;+ if (!IS_EUC_RANGE_VALID(c1))+ return -1;+ c2 = *s++;+ if (!IS_EUC_RANGE_VALID(c2))+ return -1;+ }+ else+ /* must be ASCII */+ {+ l = 1;+ }+ break;+ }++ return l;+}++static int+pg_euckr_verifier(const unsigned char *s, int len)+{+ int l;+ unsigned char c1,+ c2;++ c1 = *s++;++ if (IS_HIGHBIT_SET(c1))+ {+ l = 2;+ if (l > len)+ return -1;+ if (!IS_EUC_RANGE_VALID(c1))+ return -1;+ c2 = *s++;+ if (!IS_EUC_RANGE_VALID(c2))+ return -1;+ }+ else+ /* must be ASCII */+ {+ l = 1;+ }++ return l;+}++/* EUC-CN byte sequences are exactly same as EUC-KR */+#define pg_euccn_verifier pg_euckr_verifier++static int+pg_euctw_verifier(const unsigned char *s, int len)+{+ int l;+ unsigned char c1,+ c2;++ c1 = *s++;++ switch (c1)+ {+ case SS2: /* CNS 11643 Plane 1-7 */+ l = 4;+ if (l > len)+ return -1;+ c2 = *s++;+ if (c2 < 0xa1 || c2 > 0xa7)+ return -1;+ c2 = *s++;+ if (!IS_EUC_RANGE_VALID(c2))+ return -1;+ c2 = *s++;+ if (!IS_EUC_RANGE_VALID(c2))+ return -1;+ break;++ case SS3: /* unused */+ return -1;++ default:+ if (IS_HIGHBIT_SET(c1)) /* CNS 11643 Plane 1 */+ {+ l = 2;+ if (l > len)+ return -1;+ /* no further range check on c1? */+ c2 = *s++;+ if (!IS_EUC_RANGE_VALID(c2))+ return -1;+ }+ else+ /* must be ASCII */+ {+ l = 1;+ }+ break;+ }+ return l;+}++static int+pg_johab_verifier(const unsigned char *s, int len)+{+ int l,+ mbl;+ unsigned char c;++ l = mbl = pg_johab_mblen(s);++ if (len < l)+ return -1;++ if (!IS_HIGHBIT_SET(*s))+ return mbl;++ while (--l > 0)+ {+ c = *++s;+ if (!IS_EUC_RANGE_VALID(c))+ return -1;+ }+ return mbl;+}++static int+pg_mule_verifier(const unsigned char *s, int len)+{+ int l,+ mbl;+ unsigned char c;++ l = mbl = pg_mule_mblen(s);++ if (len < l)+ return -1;++ while (--l > 0)+ {+ c = *++s;+ if (!IS_HIGHBIT_SET(c))+ return -1;+ }+ return mbl;+}++static int+pg_latin1_verifier(const unsigned char *s, int len)+{+ return 1;+}++static int+pg_sjis_verifier(const unsigned char *s, int len)+{+ int l,+ mbl;+ unsigned char c1,+ c2;++ l = mbl = pg_sjis_mblen(s);++ if (len < l)+ return -1;++ if (l == 1) /* pg_sjis_mblen already verified it */+ return mbl;++ c1 = *s++;+ c2 = *s;+ if (!ISSJISHEAD(c1) || !ISSJISTAIL(c2))+ return -1;+ return mbl;+}++static int+pg_big5_verifier(const unsigned char *s, int len)+{+ int l,+ mbl;++ l = mbl = pg_big5_mblen(s);++ if (len < l)+ return -1;++ while (--l > 0)+ {+ if (*++s == '\0')+ return -1;+ }++ return mbl;+}++static int+pg_gbk_verifier(const unsigned char *s, int len)+{+ int l,+ mbl;++ l = mbl = pg_gbk_mblen(s);++ if (len < l)+ return -1;++ while (--l > 0)+ {+ if (*++s == '\0')+ return -1;+ }++ return mbl;+}++static int+pg_uhc_verifier(const unsigned char *s, int len)+{+ int l,+ mbl;++ l = mbl = pg_uhc_mblen(s);++ if (len < l)+ return -1;++ while (--l > 0)+ {+ if (*++s == '\0')+ return -1;+ }++ return mbl;+}++static int+pg_gb18030_verifier(const unsigned char *s, int len)+{+ int l;++ if (!IS_HIGHBIT_SET(*s))+ l = 1; /* ASCII */+ else if (len >= 4 && *(s + 1) >= 0x30 && *(s + 1) <= 0x39)+ {+ /* Should be 4-byte, validate remaining bytes */+ if (*s >= 0x81 && *s <= 0xfe &&+ *(s + 2) >= 0x81 && *(s + 2) <= 0xfe &&+ *(s + 3) >= 0x30 && *(s + 3) <= 0x39)+ l = 4;+ else+ l = -1;+ }+ else if (len >= 2 && *s >= 0x81 && *s <= 0xfe)+ {+ /* Should be 2-byte, validate */+ if ((*(s + 1) >= 0x40 && *(s + 1) <= 0x7e) ||+ (*(s + 1) >= 0x80 && *(s + 1) <= 0xfe))+ l = 2;+ else+ l = -1;+ }+ else+ l = -1;+ return l;+}++static int+pg_utf8_verifier(const unsigned char *s, int len)+{+ int l = pg_utf_mblen(s);++ if (len < l)+ return -1;++ if (!pg_utf8_islegal(s, l))+ return -1;++ return l;+}++/*+ * Check for validity of a single UTF-8 encoded character+ *+ * This directly implements the rules in RFC3629. The bizarre-looking+ * restrictions on the second byte are meant to ensure that there isn't+ * more than one encoding of a given Unicode character point; that is,+ * you may not use a longer-than-necessary byte sequence with high order+ * zero bits to represent a character that would fit in fewer bytes.+ * To do otherwise is to create security hazards (eg, create an apparent+ * non-ASCII character that decodes to plain ASCII).+ *+ * length is assumed to have been obtained by pg_utf_mblen(), and the+ * caller must have checked that that many bytes are present in the buffer.+ */+bool+pg_utf8_islegal(const unsigned char *source, int length)+{+ unsigned char a;++ switch (length)+ {+ default:+ /* reject lengths 5 and 6 for now */+ return false;+ case 4:+ a = source[3];+ if (a < 0x80 || a > 0xBF)+ return false;+ /* FALL THRU */+ case 3:+ a = source[2];+ if (a < 0x80 || a > 0xBF)+ return false;+ /* FALL THRU */+ case 2:+ a = source[1];+ switch (*source)+ {+ case 0xE0:+ if (a < 0xA0 || a > 0xBF)+ return false;+ break;+ case 0xED:+ if (a < 0x80 || a > 0x9F)+ return false;+ break;+ case 0xF0:+ if (a < 0x90 || a > 0xBF)+ return false;+ break;+ case 0xF4:+ if (a < 0x80 || a > 0x8F)+ return false;+ break;+ default:+ if (a < 0x80 || a > 0xBF)+ return false;+ break;+ }+ /* FALL THRU */+ case 1:+ a = *source;+ if (a >= 0x80 && a < 0xC2)+ return false;+ if (a > 0xF4)+ return false;+ break;+ }+ return true;+}++#ifndef FRONTEND++/*+ * Generic character incrementer function.+ *+ * Not knowing anything about the properties of the encoding in use, we just+ * keep incrementing the last byte until we get a validly-encoded result,+ * or we run out of values to try. We don't bother to try incrementing+ * higher-order bytes, so there's no growth in runtime for wider characters.+ * (If we did try to do that, we'd need to consider the likelihood that 255+ * is not a valid final byte in the encoding.)+ */+++/*+ * UTF-8 character incrementer function.+ *+ * For a one-byte character less than 0x7F, we just increment the byte.+ *+ * For a multibyte character, every byte but the first must fall between 0x80+ * and 0xBF; and the first byte must be between 0xC0 and 0xF4. We increment+ * the last byte that's not already at its maximum value. If we can't find a+ * byte that's less than the maximum allowable value, we simply fail. We also+ * need some special-case logic to skip regions used for surrogate pair+ * handling, as those should not occur in valid UTF-8.+ *+ * Note that we don't reset lower-order bytes back to their minimums, since+ * we can't afford to make an exhaustive search (see make_greater_string).+ */+++/*+ * EUC-JP character incrementer function.+ *+ * If the sequence starts with SS2 (0x8e), it must be a two-byte sequence+ * representing JIS X 0201 characters with the second byte ranging between+ * 0xa1 and 0xdf. We just increment the last byte if it's less than 0xdf,+ * and otherwise rewrite the whole sequence to 0xa1 0xa1.+ *+ * If the sequence starts with SS3 (0x8f), it must be a three-byte sequence+ * in which the last two bytes range between 0xa1 and 0xfe. The last byte+ * is incremented if possible, otherwise the second-to-last byte.+ *+ * If the sequence starts with a value other than the above and its MSB+ * is set, it must be a two-byte sequence representing JIS X 0208 characters+ * with both bytes ranging between 0xa1 and 0xfe. The last byte is+ * incremented if possible, otherwise the second-to-last byte.+ *+ * Otherwise, the sequence is a single-byte ASCII character. It is+ * incremented up to 0x7f.+ */++#endif /* !FRONTEND */+++/*+ *-------------------------------------------------------------------+ * encoding info table+ * XXX must be sorted by the same order as enum pg_enc (in mb/pg_wchar.h)+ *-------------------------------------------------------------------+ */+const pg_wchar_tbl pg_wchar_table[] = {+ {pg_ascii2wchar_with_len, pg_wchar2single_with_len, pg_ascii_mblen, pg_ascii_dsplen, pg_ascii_verifier, 1}, /* PG_SQL_ASCII */+ {pg_eucjp2wchar_with_len, pg_wchar2euc_with_len, pg_eucjp_mblen, pg_eucjp_dsplen, pg_eucjp_verifier, 3}, /* PG_EUC_JP */+ {pg_euccn2wchar_with_len, pg_wchar2euc_with_len, pg_euccn_mblen, pg_euccn_dsplen, pg_euccn_verifier, 2}, /* PG_EUC_CN */+ {pg_euckr2wchar_with_len, pg_wchar2euc_with_len, pg_euckr_mblen, pg_euckr_dsplen, pg_euckr_verifier, 3}, /* PG_EUC_KR */+ {pg_euctw2wchar_with_len, pg_wchar2euc_with_len, pg_euctw_mblen, pg_euctw_dsplen, pg_euctw_verifier, 4}, /* PG_EUC_TW */+ {pg_eucjp2wchar_with_len, pg_wchar2euc_with_len, pg_eucjp_mblen, pg_eucjp_dsplen, pg_eucjp_verifier, 3}, /* PG_EUC_JIS_2004 */+ {pg_utf2wchar_with_len, pg_wchar2utf_with_len, pg_utf_mblen, pg_utf_dsplen, pg_utf8_verifier, 4}, /* PG_UTF8 */+ {pg_mule2wchar_with_len, pg_wchar2mule_with_len, pg_mule_mblen, pg_mule_dsplen, pg_mule_verifier, 4}, /* PG_MULE_INTERNAL */+ {pg_latin12wchar_with_len, pg_wchar2single_with_len, pg_latin1_mblen, pg_latin1_dsplen, pg_latin1_verifier, 1}, /* PG_LATIN1 */+ {pg_latin12wchar_with_len, pg_wchar2single_with_len, pg_latin1_mblen, pg_latin1_dsplen, pg_latin1_verifier, 1}, /* PG_LATIN2 */+ {pg_latin12wchar_with_len, pg_wchar2single_with_len, pg_latin1_mblen, pg_latin1_dsplen, pg_latin1_verifier, 1}, /* PG_LATIN3 */+ {pg_latin12wchar_with_len, pg_wchar2single_with_len, pg_latin1_mblen, pg_latin1_dsplen, pg_latin1_verifier, 1}, /* PG_LATIN4 */+ {pg_latin12wchar_with_len, pg_wchar2single_with_len, pg_latin1_mblen, pg_latin1_dsplen, pg_latin1_verifier, 1}, /* PG_LATIN5 */+ {pg_latin12wchar_with_len, pg_wchar2single_with_len, pg_latin1_mblen, pg_latin1_dsplen, pg_latin1_verifier, 1}, /* PG_LATIN6 */+ {pg_latin12wchar_with_len, pg_wchar2single_with_len, pg_latin1_mblen, pg_latin1_dsplen, pg_latin1_verifier, 1}, /* PG_LATIN7 */+ {pg_latin12wchar_with_len, pg_wchar2single_with_len, pg_latin1_mblen, pg_latin1_dsplen, pg_latin1_verifier, 1}, /* PG_LATIN8 */+ {pg_latin12wchar_with_len, pg_wchar2single_with_len, pg_latin1_mblen, pg_latin1_dsplen, pg_latin1_verifier, 1}, /* PG_LATIN9 */+ {pg_latin12wchar_with_len, pg_wchar2single_with_len, pg_latin1_mblen, pg_latin1_dsplen, pg_latin1_verifier, 1}, /* PG_LATIN10 */+ {pg_latin12wchar_with_len, pg_wchar2single_with_len, pg_latin1_mblen, pg_latin1_dsplen, pg_latin1_verifier, 1}, /* PG_WIN1256 */+ {pg_latin12wchar_with_len, pg_wchar2single_with_len, pg_latin1_mblen, pg_latin1_dsplen, pg_latin1_verifier, 1}, /* PG_WIN1258 */+ {pg_latin12wchar_with_len, pg_wchar2single_with_len, pg_latin1_mblen, pg_latin1_dsplen, pg_latin1_verifier, 1}, /* PG_WIN866 */+ {pg_latin12wchar_with_len, pg_wchar2single_with_len, pg_latin1_mblen, pg_latin1_dsplen, pg_latin1_verifier, 1}, /* PG_WIN874 */+ {pg_latin12wchar_with_len, pg_wchar2single_with_len, pg_latin1_mblen, pg_latin1_dsplen, pg_latin1_verifier, 1}, /* PG_KOI8R */+ {pg_latin12wchar_with_len, pg_wchar2single_with_len, pg_latin1_mblen, pg_latin1_dsplen, pg_latin1_verifier, 1}, /* PG_WIN1251 */+ {pg_latin12wchar_with_len, pg_wchar2single_with_len, pg_latin1_mblen, pg_latin1_dsplen, pg_latin1_verifier, 1}, /* PG_WIN1252 */+ {pg_latin12wchar_with_len, pg_wchar2single_with_len, pg_latin1_mblen, pg_latin1_dsplen, pg_latin1_verifier, 1}, /* ISO-8859-5 */+ {pg_latin12wchar_with_len, pg_wchar2single_with_len, pg_latin1_mblen, pg_latin1_dsplen, pg_latin1_verifier, 1}, /* ISO-8859-6 */+ {pg_latin12wchar_with_len, pg_wchar2single_with_len, pg_latin1_mblen, pg_latin1_dsplen, pg_latin1_verifier, 1}, /* ISO-8859-7 */+ {pg_latin12wchar_with_len, pg_wchar2single_with_len, pg_latin1_mblen, pg_latin1_dsplen, pg_latin1_verifier, 1}, /* ISO-8859-8 */+ {pg_latin12wchar_with_len, pg_wchar2single_with_len, pg_latin1_mblen, pg_latin1_dsplen, pg_latin1_verifier, 1}, /* PG_WIN1250 */+ {pg_latin12wchar_with_len, pg_wchar2single_with_len, pg_latin1_mblen, pg_latin1_dsplen, pg_latin1_verifier, 1}, /* PG_WIN1253 */+ {pg_latin12wchar_with_len, pg_wchar2single_with_len, pg_latin1_mblen, pg_latin1_dsplen, pg_latin1_verifier, 1}, /* PG_WIN1254 */+ {pg_latin12wchar_with_len, pg_wchar2single_with_len, pg_latin1_mblen, pg_latin1_dsplen, pg_latin1_verifier, 1}, /* PG_WIN1255 */+ {pg_latin12wchar_with_len, pg_wchar2single_with_len, pg_latin1_mblen, pg_latin1_dsplen, pg_latin1_verifier, 1}, /* PG_WIN1257 */+ {pg_latin12wchar_with_len, pg_wchar2single_with_len, pg_latin1_mblen, pg_latin1_dsplen, pg_latin1_verifier, 1}, /* PG_KOI8U */+ {0, 0, pg_sjis_mblen, pg_sjis_dsplen, pg_sjis_verifier, 2}, /* PG_SJIS */+ {0, 0, pg_big5_mblen, pg_big5_dsplen, pg_big5_verifier, 2}, /* PG_BIG5 */+ {0, 0, pg_gbk_mblen, pg_gbk_dsplen, pg_gbk_verifier, 2}, /* PG_GBK */+ {0, 0, pg_uhc_mblen, pg_uhc_dsplen, pg_uhc_verifier, 2}, /* PG_UHC */+ {0, 0, pg_gb18030_mblen, pg_gb18030_dsplen, pg_gb18030_verifier, 4}, /* PG_GB18030 */+ {0, 0, pg_johab_mblen, pg_johab_dsplen, pg_johab_verifier, 3}, /* PG_JOHAB */+ {0, 0, pg_sjis_mblen, pg_sjis_dsplen, pg_sjis_verifier, 2} /* PG_SHIFT_JIS_2004 */+};++/* returns the byte length of a word for mule internal code */+++/*+ * Returns the byte length of a multibyte character.+ */+int+pg_encoding_mblen(int encoding, const char *mbstr)+{+ return (PG_VALID_ENCODING(encoding) ?+ ((*pg_wchar_table[encoding].mblen) ((const unsigned char *) mbstr)) :+ ((*pg_wchar_table[PG_SQL_ASCII].mblen) ((const unsigned char *) mbstr)));+}++/*+ * Returns the display length of a multibyte character.+ */+++/*+ * Verify the first multibyte character of the given string.+ * Return its byte length if good, -1 if bad. (See comments above for+ * full details of the mbverify API.)+ */+++/*+ * fetch maximum length of a given encoding+ */+int+pg_encoding_max_length(int encoding)+{+ Assert(PG_VALID_ENCODING(encoding));++ return pg_wchar_table[encoding].maxmblen;+}++#ifndef FRONTEND++/*+ * fetch maximum length of the encoding for the current database+ */+int+pg_database_encoding_max_length(void)+{+ return pg_wchar_table[GetDatabaseEncoding()].maxmblen;+}++/*+ * get the character incrementer for the encoding for the current database+ */+++/*+ * Verify mbstr to make sure that it is validly encoded in the current+ * database encoding. Otherwise same as pg_verify_mbstr().+ */+bool+pg_verifymbstr(const char *mbstr, int len, bool noError)+{+ return+ pg_verify_mbstr_len(GetDatabaseEncoding(), mbstr, len, noError) >= 0;+}++/*+ * Verify mbstr to make sure that it is validly encoded in the specified+ * encoding.+ */+++/*+ * Verify mbstr to make sure that it is validly encoded in the specified+ * encoding.+ *+ * mbstr is not necessarily zero terminated; length of mbstr is+ * specified by len.+ *+ * If OK, return length of string in the encoding.+ * If a problem is found, return -1 when noError is+ * true; when noError is false, ereport() a descriptive message.+ */+int+pg_verify_mbstr_len(int encoding, const char *mbstr, int len, bool noError)+{+ mbverifier mbverify;+ int mb_len;++ Assert(PG_VALID_ENCODING(encoding));++ /*+ * In single-byte encodings, we need only reject nulls (\0).+ */+ if (pg_encoding_max_length(encoding) <= 1)+ {+ const char *nullpos = memchr(mbstr, 0, len);++ if (nullpos == NULL)+ return len;+ if (noError)+ return -1;+ report_invalid_encoding(encoding, nullpos, 1);+ }++ /* fetch function pointer just once */+ mbverify = pg_wchar_table[encoding].mbverify;++ mb_len = 0;++ while (len > 0)+ {+ int l;++ /* fast path for ASCII-subset characters */+ if (!IS_HIGHBIT_SET(*mbstr))+ {+ if (*mbstr != '\0')+ {+ mb_len++;+ mbstr++;+ len--;+ continue;+ }+ if (noError)+ return -1;+ report_invalid_encoding(encoding, mbstr, len);+ }++ l = (*mbverify) ((const unsigned char *) mbstr, len);++ if (l < 0)+ {+ if (noError)+ return -1;+ report_invalid_encoding(encoding, mbstr, len);+ }++ mbstr += l;+ len -= l;+ mb_len++;+ }+ return mb_len;+}++/*+ * check_encoding_conversion_args: check arguments of a conversion function+ *+ * "expected" arguments can be either an encoding ID or -1 to indicate that+ * the caller will check whether it accepts the ID.+ *+ * Note: the errors here are not really user-facing, so elog instead of+ * ereport seems sufficient. Also, we trust that the "expected" encoding+ * arguments are valid encoding IDs, but we don't trust the actuals.+ */+++/*+ * report_invalid_encoding: complain about invalid multibyte character+ *+ * note: len is remaining length of string, not length of character;+ * len must be greater than zero, as we always examine the first byte.+ */+void+report_invalid_encoding(int encoding, const char *mbstr, int len)+{+ int l = pg_encoding_mblen(encoding, mbstr);+ char buf[8 * 5 + 1];+ char *p = buf;+ int j,+ jlimit;++ jlimit = Min(l, len);+ jlimit = Min(jlimit, 8); /* prevent buffer overrun */++ for (j = 0; j < jlimit; j++)+ {+ p += sprintf(p, "0x%02x", (unsigned char) mbstr[j]);+ if (j < jlimit - 1)+ p += sprintf(p, " ");+ }++ ereport(ERROR,+ (errcode(ERRCODE_CHARACTER_NOT_IN_REPERTOIRE),+ errmsg("invalid byte sequence for encoding \"%s\": %s",+ pg_enc2name_tbl[encoding].name,+ buf)));+}++/*+ * report_untranslatable_char: complain about untranslatable character+ *+ * note: len is remaining length of string, not length of character;+ * len must be greater than zero, as we always examine the first byte.+ */+++#endif /* !FRONTEND */
+ foreign/libpg_query/src/postgres/src_backend_utils_misc_guc.c view
@@ -0,0 +1,1580 @@+/*--------------------------------------------------------------------+ * Symbols referenced in this file:+ * - log_min_messages+ * - client_min_messages+ * - check_function_bodies+ *--------------------------------------------------------------------+ */++/*--------------------------------------------------------------------+ * guc.c+ *+ * Support for grand unified configuration scheme, including SET+ * command, configuration file, and command line options.+ * See src/backend/utils/misc/README for more information.+ *+ *+ * Copyright (c) 2000-2015, PostgreSQL Global Development Group+ * Written by Peter Eisentraut <peter_e@gmx.net>.+ *+ * IDENTIFICATION+ * src/backend/utils/misc/guc.c+ *+ *--------------------------------------------------------------------+ */+#include "postgres.h"++#include <ctype.h>+#include <float.h>+#include <math.h>+#include <limits.h>+#include <unistd.h>+#include <sys/stat.h>+#ifdef HAVE_SYSLOG+#include <syslog.h>+#endif++#include "access/commit_ts.h"+#include "access/gin.h"+#include "access/transam.h"+#include "access/twophase.h"+#include "access/xact.h"+#include "catalog/namespace.h"+#include "commands/async.h"+#include "commands/prepare.h"+#include "commands/vacuum.h"+#include "commands/variable.h"+#include "commands/trigger.h"+#include "funcapi.h"+#include "libpq/auth.h"+#include "libpq/be-fsstubs.h"+#include "libpq/libpq.h"+#include "libpq/pqformat.h"+#include "miscadmin.h"+#include "optimizer/cost.h"+#include "optimizer/geqo.h"+#include "optimizer/paths.h"+#include "optimizer/planmain.h"+#include "parser/parse_expr.h"+#include "parser/parse_type.h"+#include "parser/parser.h"+#include "parser/scansup.h"+#include "pgstat.h"+#include "postmaster/autovacuum.h"+#include "postmaster/bgworker.h"+#include "postmaster/bgwriter.h"+#include "postmaster/postmaster.h"+#include "postmaster/syslogger.h"+#include "postmaster/walwriter.h"+#include "replication/slot.h"+#include "replication/syncrep.h"+#include "replication/walreceiver.h"+#include "replication/walsender.h"+#include "storage/bufmgr.h"+#include "storage/dsm_impl.h"+#include "storage/standby.h"+#include "storage/fd.h"+#include "storage/pg_shmem.h"+#include "storage/proc.h"+#include "storage/predicate.h"+#include "tcop/tcopprot.h"+#include "tsearch/ts_cache.h"+#include "utils/builtins.h"+#include "utils/bytea.h"+#include "utils/guc_tables.h"+#include "utils/memutils.h"+#include "utils/pg_locale.h"+#include "utils/plancache.h"+#include "utils/portal.h"+#include "utils/ps_status.h"+#include "utils/rls.h"+#include "utils/snapmgr.h"+#include "utils/tzparser.h"+#include "utils/xml.h"++#ifndef PG_KRB_SRVTAB+#define PG_KRB_SRVTAB ""+#endif++#define CONFIG_FILENAME "postgresql.conf"+#define HBA_FILENAME "pg_hba.conf"+#define IDENT_FILENAME "pg_ident.conf"++#ifdef EXEC_BACKEND+#define CONFIG_EXEC_PARAMS "global/config_exec_params"+#define CONFIG_EXEC_PARAMS_NEW "global/config_exec_params.new"+#endif++/*+ * Precision with which REAL type guc values are to be printed for GUC+ * serialization.+ */+#define REALTYPE_PRECISION 17++/* XXX these should appear in other modules' header files */+extern bool Log_disconnections;+extern int CommitDelay;+extern int CommitSiblings;+extern char *default_tablespace;+extern char *temp_tablespaces;+extern bool ignore_checksum_failure;+extern bool synchronize_seqscans;++#ifdef TRACE_SYNCSCAN+extern bool trace_syncscan;+#endif+#ifdef DEBUG_BOUNDED_SORT+extern bool optimize_bounded_sort;+#endif++++/* global variables for check hook support */+++++static void do_serialize(char **destptr, Size *maxbytes, const char *fmt,...) pg_attribute_printf(3, 4);++static void set_config_sourcefile(const char *name, char *sourcefile,+ int sourceline);+static bool call_bool_check_hook(struct config_bool * conf, bool *newval,+ void **extra, GucSource source, int elevel);+static bool call_int_check_hook(struct config_int * conf, int *newval,+ void **extra, GucSource source, int elevel);+static bool call_real_check_hook(struct config_real * conf, double *newval,+ void **extra, GucSource source, int elevel);+static bool call_string_check_hook(struct config_string * conf, char **newval,+ void **extra, GucSource source, int elevel);+static bool call_enum_check_hook(struct config_enum * conf, int *newval,+ void **extra, GucSource source, int elevel);++static bool check_log_destination(char **newval, void **extra, GucSource source);+static void assign_log_destination(const char *newval, void *extra);++#ifdef HAVE_SYSLOG++#else+static int syslog_facility = 0;+#endif++static void assign_syslog_facility(int newval, void *extra);+static void assign_syslog_ident(const char *newval, void *extra);+static void assign_session_replication_role(int newval, void *extra);+static bool check_temp_buffers(int *newval, void **extra, GucSource source);+static bool check_bonjour(bool *newval, void **extra, GucSource source);+static bool check_ssl(bool *newval, void **extra, GucSource source);+static bool check_stage_log_stats(bool *newval, void **extra, GucSource source);+static bool check_log_stats(bool *newval, void **extra, GucSource source);+static bool check_canonical_path(char **newval, void **extra, GucSource source);+static bool check_timezone_abbreviations(char **newval, void **extra, GucSource source);+static void assign_timezone_abbreviations(const char *newval, void *extra);+static void pg_timezone_abbrev_initialize(void);+static const char *show_archive_command(void);+static void assign_tcp_keepalives_idle(int newval, void *extra);+static void assign_tcp_keepalives_interval(int newval, void *extra);+static void assign_tcp_keepalives_count(int newval, void *extra);+static const char *show_tcp_keepalives_idle(void);+static const char *show_tcp_keepalives_interval(void);+static const char *show_tcp_keepalives_count(void);+static bool check_maxconnections(int *newval, void **extra, GucSource source);+static bool check_max_worker_processes(int *newval, void **extra, GucSource source);+static bool check_autovacuum_max_workers(int *newval, void **extra, GucSource source);+static bool check_autovacuum_work_mem(int *newval, void **extra, GucSource source);+static bool check_effective_io_concurrency(int *newval, void **extra, GucSource source);+static void assign_effective_io_concurrency(int newval, void *extra);+static void assign_pgstat_temp_directory(const char *newval, void *extra);+static bool check_application_name(char **newval, void **extra, GucSource source);+static void assign_application_name(const char *newval, void *extra);+static bool check_cluster_name(char **newval, void **extra, GucSource source);+static const char *show_unix_socket_permissions(void);+static const char *show_log_file_mode(void);++/* Private functions in guc-file.l that need to be called from guc.c */+static ConfigVariable *ProcessConfigFileInternal(GucContext context,+ bool applySettings, int elevel);+++/*+ * Options for enum values defined in this module.+ *+ * NOTE! Option values may not contain double quotes!+ */++++/*+ * We have different sets for client and server message level options because+ * they sort slightly different (see "log" level)+ */+++++++++++++++#ifdef HAVE_SYSLOG+#else+#endif++++++++/*+ * Although only "on", "off", and "safe_encoding" are documented, we+ * accept all the likely variants of "on" and "off".+ */+++/*+ * Although only "on", "off", and "partition" are documented, we+ * accept all the likely variants of "on" and "off".+ */+++/*+ * Although only "on", "off", "remote_write", and "local" are documented, we+ * accept all the likely variants of "on" and "off".+ */+++/*+ * Although only "on", "off", "try" are documented, we accept all the likely+ * variants of "on" and "off".+ */+++/*+ * Options for enum values stored in other modules+ */+extern const struct config_enum_entry wal_level_options[];+extern const struct config_enum_entry archive_mode_options[];+extern const struct config_enum_entry sync_method_options[];+extern const struct config_enum_entry dynamic_shared_memory_options[];++/*+ * GUC option variables that are exported from this module+ */++++++++++ /* this is sort of all three+ * above together */+++++__thread bool check_function_bodies = true;++++++++__thread int log_min_messages = WARNING;++__thread int client_min_messages = NOTICE;++++++++++++++++++++++++/*+ * SSL renegotiation was been removed in PostgreSQL 9.5, but we tolerate it+ * being set to zero (meaning never renegotiate) for backward compatibility.+ * This avoids breaking compatibility with clients that have never supported+ * renegotiation and therefore always try to zero it.+ */+++/*+ * This really belongs in pg_shmem.c, but is defined here so that it doesn't+ * need to be duplicated in all the different implementations of pg_shmem.c.+ */+++/*+ * These variables are all dummies that don't do anything, except in some+ * cases provide the value for SHOW to display. The real state is elsewhere+ * and is kept in sync by assign_hooks.+ */+++++++++++++++++++++++++++++/* should be static, but commands/variable.c needs to get at this */++++/*+ * Displayable names for context types (enum GucContext)+ *+ * Note: these strings are deliberately not localized.+ */+++/*+ * Displayable names for source types (enum GucSource)+ *+ * Note: these strings are deliberately not localized.+ */+++/*+ * Displayable names for the groupings defined in enum config_group+ */+++/*+ * Displayable names for GUC variable types (enum config_type)+ *+ * Note: these strings are deliberately not localized.+ */+++/*+ * Unit conversion tables.+ *+ * There are two tables, one for memory units, and another for time units.+ * For each supported conversion from one unit to another, we have an entry+ * in the table.+ *+ * To keep things simple, and to avoid intermediate-value overflows,+ * conversions are never chained. There needs to be a direct conversion+ * between all units (of the same type).+ *+ * The conversions from each base unit must be kept in order from greatest+ * to smallest unit; convert_from_base_unit() relies on that. (The order of+ * the base units does not matter.)+ */+#define MAX_UNIT_LEN 3 /* length of longest recognized unit string */++typedef struct+{+ char unit[MAX_UNIT_LEN + 1]; /* unit, as a string, like "kB" or+ * "min" */+ int base_unit; /* GUC_UNIT_XXX */+ int multiplier; /* If positive, multiply the value with this+ * for unit -> base_unit conversion. If+ * negative, divide (with the absolute value) */+} unit_conversion;++/* Ensure that the constants in the tables don't overflow or underflow */+#if BLCKSZ < 1024 || BLCKSZ > (1024*1024)+#error BLCKSZ must be between 1KB and 1MB+#endif+#if XLOG_BLCKSZ < 1024 || XLOG_BLCKSZ > (1024*1024)+#error XLOG_BLCKSZ must be between 1KB and 1MB+#endif+#if XLOG_SEG_SIZE < (1024*1024) || XLOG_BLCKSZ > (1024*1024*1024)+#error XLOG_SEG_SIZE must be between 1MB and 1GB+#endif++++++++++/*+ * Contents of GUC tables+ *+ * See src/backend/utils/misc/README for design notes.+ *+ * TO ADD AN OPTION:+ *+ * 1. Declare a global variable of type bool, int, double, or char*+ * and make use of it.+ *+ * 2. Decide at what times it's safe to set the option. See guc.h for+ * details.+ *+ * 3. Decide on a name, a default value, upper and lower bounds (if+ * applicable), etc.+ *+ * 4. Add a record below.+ *+ * 5. Add it to src/backend/utils/misc/postgresql.conf.sample, if+ * appropriate.+ *+ * 6. Don't forget to document the option (at least in config.sgml).+ *+ * 7. If it's a new GUC_LIST option you must edit pg_dumpall.c to ensure+ * it is not single quoted at dump time.+ */+++/******** option records follow ********/++#ifdef USE_ASSERT_CHECKING+#else+#endif+#ifdef BTREE_BUILD_STATS+#endif+#ifdef LOCK_DEBUG+#endif+#ifdef TRACE_SORT+#endif+#ifdef TRACE_SYNCSCAN+#endif+#ifdef DEBUG_BOUNDED_SORT+#endif+#ifdef WAL_DEBUG+#endif+#ifdef HAVE_INT64_TIMESTAMP+#else+#endif+++#ifdef LOCK_DEBUG+#endif+#ifdef USE_PREFETCH+#else+#endif++++++#ifdef HAVE_UNIX_SOCKETS+#else+#endif+#ifdef USE_SSL+#else+#endif+#ifdef USE_SSL+#else+#endif+++#ifdef HAVE_SYSLOG+#else+#endif++/******** end of options list ********/+++/*+ * To allow continued support of obsolete names for GUC variables, we apply+ * the following mappings to any unrecognized name. Note that an old name+ * should be mapped to a new one only if the new variable has very similar+ * semantics to the old.+ */++++/*+ * Actual lookup of variables is done through this single, sorted array.+ */+++/* Current number of variables contained in the vector */+++/* Vector capacity */++++ /* TRUE if need to do commit/abort work */++ /* TRUE to enable GUC_REPORT */++ /* 1 when in main transaction */+++static int guc_var_compare(const void *a, const void *b);+static int guc_name_compare(const char *namea, const char *nameb);+static void InitializeGUCOptionsFromEnvironment(void);+static void InitializeOneGUCOption(struct config_generic * gconf);+static void push_old_value(struct config_generic * gconf, GucAction action);+static void ReportGUCOption(struct config_generic * record);+static void reapply_stacked_values(struct config_generic * variable,+ struct config_string * pHolder,+ GucStack *stack,+ const char *curvalue,+ GucContext curscontext, GucSource cursource);+static void ShowGUCConfigOption(const char *name, DestReceiver *dest);+static void ShowAllGUCConfig(DestReceiver *dest);+static char *_ShowOption(struct config_generic * record, bool use_units);+static bool validate_option_array_item(const char *name, const char *value,+ bool skipIfNoPermissions);+static void write_auto_conf_file(int fd, const char *filename, ConfigVariable *head_p);+static void replace_auto_config_value(ConfigVariable **head_p, ConfigVariable **tail_p,+ const char *name, const char *value);+++/*+ * Some infrastructure for checking malloc/strdup/realloc calls+ */++++++++/*+ * Detect whether strval is referenced anywhere in a GUC string item+ */+++/*+ * Support for assigning to a field of a string GUC item. Free the prior+ * value if it's not referenced anywhere else in the item (including stacked+ * states).+ */+++/*+ * Detect whether an "extra" struct is referenced anywhere in a GUC item+ */+++/*+ * Support for assigning to an "extra" field of a GUC item. Free the prior+ * value if it's not referenced anywhere else in the item (including stacked+ * states).+ */+++/*+ * Support for copying a variable's active value into a stack entry.+ * The "extra" field associated with the active value is copied, too.+ *+ * NB: be sure stringval and extra fields of a new stack entry are+ * initialized to NULL before this is used, else we'll try to free() them.+ */+++/*+ * Support for discarding a no-longer-needed value in a stack entry.+ * The "extra" field associated with the stack entry is cleared, too.+ */++++/*+ * Fetch the sorted array pointer (exported for help_config.c's use ONLY)+ */++++/*+ * Build the sorted array. This is split out so that it could be+ * re-executed after startup (eg, we could allow loadable modules to+ * add vars, and then we'd need to re-sort).+ */+++/*+ * Add a new GUC variable to the list of known variables. The+ * list is expanded if needed.+ */+++/*+ * Create and add a placeholder variable for a custom variable name.+ */+++/*+ * Look up option NAME. If it exists, return a pointer to its record,+ * else return NULL. If create_placeholders is TRUE, we'll create a+ * placeholder record for a valid-looking custom variable name.+ */++++/*+ * comparator for qsorting and bsearching guc_variables array+ */+++/*+ * the bare comparison function for GUC names+ */++++/*+ * Initialize GUC options during program startup.+ *+ * Note that we cannot read the config file yet, since we have not yet+ * processed command-line switches.+ */+++/*+ * Assign any GUC values that can come from the server's environment.+ *+ * This is called from InitializeGUCOptions, and also from ProcessConfigFile+ * to deal with the possibility that a setting has been removed from+ * postgresql.conf and should now get a value from the environment.+ * (The latter is a kludge that should probably go away someday; if so,+ * fold this back into InitializeGUCOptions.)+ */+++/*+ * Initialize one GUC option variable to its compiled-in default.+ *+ * Note: the reason for calling check_hooks is not that we think the boot_val+ * might fail, but that the hooks might wish to compute an "extra" struct.+ */++++/*+ * Select the configuration files and data directory to be used, and+ * do the initial read of postgresql.conf.+ *+ * This is called after processing command-line switches.+ * userDoption is the -D switch value if any (NULL if unspecified).+ * progname is just for use in error messages.+ *+ * Returns true on success; on failure, prints a suitable error message+ * to stderr and returns false.+ */++++/*+ * Reset all options to their saved default values (implements RESET ALL)+ */++++/*+ * push_old_value+ * Push previous state during transactional assignment to a GUC variable.+ */++++/*+ * Do GUC processing at main transaction start.+ */+++/*+ * Enter a new nesting level for GUC values. This is called at subtransaction+ * start, and when entering a function that has proconfig settings, and in+ * some other places where we want to set GUC variables transiently.+ * NOTE we must not risk error here, else subtransaction start will be unhappy.+ */+++/*+ * Do GUC processing at transaction or subtransaction commit or abort, or+ * when exiting a function that has proconfig settings, or when undoing a+ * transient assignment to some GUC variables. (The name is thus a bit of+ * a misnomer; perhaps it should be ExitGUCNestLevel or some such.)+ * During abort, we discard all GUC settings that were applied at nesting+ * levels >= nestLevel. nestLevel == 1 corresponds to the main transaction.+ */++++/*+ * Start up automatic reporting of changes to variables marked GUC_REPORT.+ * This is executed at completion of backend startup.+ */+++/*+ * ReportGUCOption: if appropriate, transmit option value to frontend+ */+++/*+ * Convert a value from one of the human-friendly units ("kB", "min" etc.)+ * to the given base unit. 'value' and 'unit' are the input value and unit+ * to convert from. The converted value is stored in *base_value.+ *+ * Returns true on success, false if the input unit is not recognized.+ */+++/*+ * Convert a value in some base unit to a human-friendly unit. The output+ * unit is chosen so that it's the greatest unit that can represent the value+ * without loss. For example, if the base unit is GUC_UNIT_KB, 1024 is+ * converted to 1 MB, but 1025 is represented as 1025 kB.+ */++++/*+ * Try to parse value as an integer. The accepted formats are the+ * usual decimal, octal, or hexadecimal formats, optionally followed by+ * a unit name if "flags" indicates a unit is allowed.+ *+ * If the string parses okay, return true, else false.+ * If okay and result is not NULL, return the value in *result.+ * If not okay and hintmsg is not NULL, *hintmsg is set to a suitable+ * HINT message, or NULL if no hint provided.+ */+++++/*+ * Try to parse value as a floating point number in the usual format.+ * If the string parses okay, return true, else false.+ * If okay and result is not NULL, return the value in *result.+ */++++/*+ * Lookup the name for an enum option with the selected value.+ * Should only ever be called with known-valid values, so throws+ * an elog(ERROR) if the enum option is not found.+ *+ * The returned string is a pointer to static data and not+ * allocated for modification.+ */++++/*+ * Lookup the value for an enum option with the selected name+ * (case-insensitive).+ * If the enum option is found, sets the retval value and returns+ * true. If it's not found, return FALSE and retval is set to 0.+ */++++/*+ * Return a list of all available options for an enum, excluding+ * hidden ones, separated by the given separator.+ * If prefix is non-NULL, it is added before the first enum value.+ * If suffix is non-NULL, it is added to the end of the string.+ */+++/*+ * Parse and validate a proposed value for the specified configuration+ * parameter.+ *+ * This does built-in checks (such as range limits for an integer parameter)+ * and also calls any check hook the parameter may have.+ *+ * record: GUC variable's info record+ * name: variable name (should match the record of course)+ * value: proposed value, as a string+ * source: identifies source of value (check hooks may need this)+ * elevel: level to log any error reports at+ * newval: on success, converted parameter value is returned here+ * newextra: on success, receives any "extra" data returned by check hook+ * (caller must initialize *newextra to NULL)+ *+ * Returns true if OK, false if not (or throws error, if elevel >= ERROR)+ */++++/*+ * Sets option `name' to given value.+ *+ * The value should be a string, which will be parsed and converted to+ * the appropriate data type. The context and source parameters indicate+ * in which context this function is being called, so that it can apply the+ * access restrictions properly.+ *+ * If value is NULL, set the option to its default value (normally the+ * reset_val, but if source == PGC_S_DEFAULT we instead use the boot_val).+ *+ * action indicates whether to set the value globally in the session, locally+ * to the current top transaction, or just for the duration of a function call.+ *+ * If changeVal is false then don't really set the option but do all+ * the checks to see if it would work.+ *+ * elevel should normally be passed as zero, allowing this function to make+ * its standard choice of ereport level. However some callers need to be+ * able to override that choice; they should pass the ereport level to use.+ *+ * Return value:+ * +1: the value is valid and was successfully applied.+ * 0: the name or value is invalid (but see below).+ * -1: the value was not applied because of context, priority, or changeVal.+ *+ * If there is an error (non-existing option, invalid value) then an+ * ereport(ERROR) is thrown *unless* this is called for a source for which+ * we don't want an ERROR (currently, those are defaults, the config file,+ * and per-database or per-user settings, as well as callers who specify+ * a less-than-ERROR elevel). In those cases we write a suitable error+ * message via ereport() and return 0.+ *+ * See also SetConfigOption for an external interface.+ */+#define newval (newval_union.boolval)+#undef newval+#define newval (newval_union.intval)+#undef newval+#define newval (newval_union.realval)+#undef newval+#define newval (newval_union.stringval)+#undef newval+#define newval (newval_union.enumval)+#undef newval+++/*+ * Set the fields for source file and line number the setting came from.+ */+++/*+ * Set a config option to the given value.+ *+ * See also set_config_option; this is just the wrapper to be called from+ * outside GUC. (This function should be used when possible, because its API+ * is more stable than set_config_option's.)+ *+ * Note: there is no support here for setting source file/line, as it+ * is currently not needed.+ */+++++/*+ * Fetch the current value of the option `name', as a string.+ *+ * If the option doesn't exist, return NULL if missing_ok is true (NOTE that+ * this cannot be distinguished from a string variable with a NULL value!),+ * otherwise throw an ereport and don't return.+ *+ * If restrict_superuser is true, we also enforce that only superusers can+ * see GUC_SUPERUSER_ONLY variables. This should only be passed as true+ * in user-driven calls.+ *+ * The string is *not* allocated for modification and is really only+ * valid until the next call to configuration related functions.+ */+++/*+ * Get the RESET value associated with the given option.+ *+ * Note: this is not re-entrant, due to use of static result buffer;+ * not to mention that a string variable could have its reset_val changed.+ * Beware of assuming the result value is good for very long.+ */++++/*+ * flatten_set_variable_args+ * Given a parsenode List as emitted by the grammar for SET,+ * convert to the flat string representation used by GUC.+ *+ * We need to be told the name of the variable the args are for, because+ * the flattening rules vary (ugh).+ *+ * The result is NULL if args is NIL (ie, SET ... TO DEFAULT), otherwise+ * a palloc'd string.+ */+++/*+ * Write updated configuration parameter values into a temporary file.+ * This function traverses the list of parameters and quotes the string+ * values before writing them.+ */+++/*+ * Update the given list of configuration parameters, adding, replacing+ * or deleting the entry for item "name" (delete if "value" == NULL).+ */++++/*+ * Execute ALTER SYSTEM statement.+ *+ * Read the old PG_AUTOCONF_FILENAME file, merge in the new variable value,+ * and write out an updated file. If the command is ALTER SYSTEM RESET ALL,+ * we can skip reading the old file and just write an empty file.+ *+ * An LWLock is used to serialize updates of the configuration file.+ *+ * In case of an error, we leave the original automatic+ * configuration file (PG_AUTOCONF_FILENAME) intact.+ */+++/*+ * SET command+ */+++/*+ * Get the value to assign for a VariableSetStmt, or NULL if it's RESET.+ * The result is palloc'd.+ *+ * This is exported for use by actions such as ALTER ROLE SET.+ */+++/*+ * SetPGVariable - SET command exported as an easily-C-callable function.+ *+ * This provides access to SET TO value, as well as SET TO DEFAULT (expressed+ * by passing args == NIL), but not SET FROM CURRENT functionality.+ */+++/*+ * SET command wrapped as a SQL callable function.+ */++++/*+ * Common code for DefineCustomXXXVariable subroutines: allocate the+ * new variable's config struct and fill in generic fields.+ */+++/*+ * Common code for DefineCustomXXXVariable subroutines: insert the new+ * variable into the GUC variable array, replacing any placeholder.+ */+++/*+ * Recursive subroutine for define_custom_variable: reapply non-reset values+ *+ * We recurse so that the values are applied in the same order as originally.+ * At each recursion level, apply the upper-level value (passed in) in the+ * fashion implied by the stack entry.+ */++++++++++++++++/*+ * SHOW command+ */++++++/*+ * SHOW command+ */+++/*+ * SHOW ALL command+ */+++/*+ * Return GUC variable value by name; optionally return canonical+ * form of name. Return value is palloc'd.+ */+++/*+ * Return GUC variable value by variable number; optionally return canonical+ * form of name. Return value is palloc'd.+ */+++/*+ * Return the total number of GUC variables+ */+++/*+ * show_config_by_name - equiv to SHOW X command but implemented as+ * a function.+ */+++/*+ * show_all_settings - equiv to SHOW ALL command but implemented as+ * a Table Function.+ */+#define NUM_PG_SETTINGS_ATTS 17++++/*+ * show_all_file_settings+ *+ * Returns a table of all parameter settings in all configuration files+ * which includes the config file pathname, the line number, a sequence number+ * indicating the order in which the settings were encountered, the parameter+ * name and value, a bool showing if the value could be applied, and possibly+ * an associated error message. (For problems such as syntax errors, the+ * parameter name/value might be NULL.)+ *+ * Note: no filtering is done here, instead we depend on the GRANT system+ * to prevent unprivileged users from accessing this function or the view+ * built on top of it.+ */+#define NUM_PG_FILE_SETTINGS_ATTS 7+++++#ifdef EXEC_BACKEND++/*+ * These routines dump out all non-default GUC options into a binary+ * file that is read by all exec'ed backends. The format is:+ *+ * variable name, string, null terminated+ * variable value, string, null terminated+ * variable sourcefile, string, null terminated (empty if none)+ * variable sourceline, integer+ * variable source, integer+ * variable scontext, integer+ */+static void+write_one_nondefault_variable(FILE *fp, struct config_generic * gconf)+{+ if (gconf->source == PGC_S_DEFAULT)+ return;++ fprintf(fp, "%s", gconf->name);+ fputc(0, fp);++ switch (gconf->vartype)+ {+ case PGC_BOOL:+ {+ struct config_bool *conf = (struct config_bool *) gconf;++ if (*conf->variable)+ fprintf(fp, "true");+ else+ fprintf(fp, "false");+ }+ break;++ case PGC_INT:+ {+ struct config_int *conf = (struct config_int *) gconf;++ fprintf(fp, "%d", *conf->variable);+ }+ break;++ case PGC_REAL:+ {+ struct config_real *conf = (struct config_real *) gconf;++ fprintf(fp, "%.17g", *conf->variable);+ }+ break;++ case PGC_STRING:+ {+ struct config_string *conf = (struct config_string *) gconf;++ fprintf(fp, "%s", *conf->variable);+ }+ break;++ case PGC_ENUM:+ {+ struct config_enum *conf = (struct config_enum *) gconf;++ fprintf(fp, "%s",+ config_enum_lookup_by_value(conf, *conf->variable));+ }+ break;+ }++ fputc(0, fp);++ if (gconf->sourcefile)+ fprintf(fp, "%s", gconf->sourcefile);+ fputc(0, fp);++ fwrite(&gconf->sourceline, 1, sizeof(gconf->sourceline), fp);+ fwrite(&gconf->source, 1, sizeof(gconf->source), fp);+ fwrite(&gconf->scontext, 1, sizeof(gconf->scontext), fp);+}++void+write_nondefault_variables(GucContext context)+{+ int elevel;+ FILE *fp;+ int i;++ Assert(context == PGC_POSTMASTER || context == PGC_SIGHUP);++ elevel = (context == PGC_SIGHUP) ? LOG : ERROR;++ /*+ * Open file+ */+ fp = AllocateFile(CONFIG_EXEC_PARAMS_NEW, "w");+ if (!fp)+ {+ ereport(elevel,+ (errcode_for_file_access(),+ errmsg("could not write to file \"%s\": %m",+ CONFIG_EXEC_PARAMS_NEW)));+ return;+ }++ for (i = 0; i < num_guc_variables; i++)+ {+ write_one_nondefault_variable(fp, guc_variables[i]);+ }++ if (FreeFile(fp))+ {+ ereport(elevel,+ (errcode_for_file_access(),+ errmsg("could not write to file \"%s\": %m",+ CONFIG_EXEC_PARAMS_NEW)));+ return;+ }++ /*+ * Put new file in place. This could delay on Win32, but we don't hold+ * any exclusive locks.+ */+ rename(CONFIG_EXEC_PARAMS_NEW, CONFIG_EXEC_PARAMS);+}+++/*+ * Read string, including null byte from file+ *+ * Return NULL on EOF and nothing read+ */+static char *+read_string_with_null(FILE *fp)+{+ int i = 0,+ ch,+ maxlen = 256;+ char *str = NULL;++ do+ {+ if ((ch = fgetc(fp)) == EOF)+ {+ if (i == 0)+ return NULL;+ else+ elog(FATAL, "invalid format of exec config params file");+ }+ if (i == 0)+ str = guc_malloc(FATAL, maxlen);+ else if (i == maxlen)+ str = guc_realloc(FATAL, str, maxlen *= 2);+ str[i++] = ch;+ } while (ch != 0);++ return str;+}+++/*+ * This routine loads a previous postmaster dump of its non-default+ * settings.+ */+void+read_nondefault_variables(void)+{+ FILE *fp;+ char *varname,+ *varvalue,+ *varsourcefile;+ int varsourceline;+ GucSource varsource;+ GucContext varscontext;++ /*+ * Assert that PGC_BACKEND/PGC_SU_BACKEND case in set_config_option() will+ * do the right thing.+ */+ Assert(IsInitProcessingMode());++ /*+ * Open file+ */+ fp = AllocateFile(CONFIG_EXEC_PARAMS, "r");+ if (!fp)+ {+ /* File not found is fine */+ if (errno != ENOENT)+ ereport(FATAL,+ (errcode_for_file_access(),+ errmsg("could not read from file \"%s\": %m",+ CONFIG_EXEC_PARAMS)));+ return;+ }++ for (;;)+ {+ struct config_generic *record;++ if ((varname = read_string_with_null(fp)) == NULL)+ break;++ if ((record = find_option(varname, true, FATAL)) == NULL)+ elog(FATAL, "failed to locate variable \"%s\" in exec config params file", varname);++ if ((varvalue = read_string_with_null(fp)) == NULL)+ elog(FATAL, "invalid format of exec config params file");+ if ((varsourcefile = read_string_with_null(fp)) == NULL)+ elog(FATAL, "invalid format of exec config params file");+ if (fread(&varsourceline, 1, sizeof(varsourceline), fp) != sizeof(varsourceline))+ elog(FATAL, "invalid format of exec config params file");+ if (fread(&varsource, 1, sizeof(varsource), fp) != sizeof(varsource))+ elog(FATAL, "invalid format of exec config params file");+ if (fread(&varscontext, 1, sizeof(varscontext), fp) != sizeof(varscontext))+ elog(FATAL, "invalid format of exec config params file");++ (void) set_config_option(varname, varvalue,+ varscontext, varsource,+ GUC_ACTION_SET, true, 0, true);+ if (varsourcefile[0])+ set_config_sourcefile(varname, varsourcefile, varsourceline);++ free(varname);+ free(varvalue);+ free(varsourcefile);+ }++ FreeFile(fp);+}+#endif /* EXEC_BACKEND */++/*+ * can_skip_gucvar:+ * When serializing, determine whether to skip this GUC. When restoring, the+ * negation of this test determines whether to restore the compiled-in default+ * value before processing serialized values.+ *+ * A PGC_S_DEFAULT setting on the serialize side will typically match new+ * postmaster children, but that can be false when got_SIGHUP == true and the+ * pending configuration change modifies this setting. Nonetheless, we omit+ * PGC_S_DEFAULT settings from serialization and make up for that by restoring+ * defaults before applying serialized values.+ *+ * PGC_POSTMASTER variables always have the same value in every child of a+ * particular postmaster. Most PGC_INTERNAL variables are compile-time+ * constants; a few, like server_encoding and lc_ctype, are handled specially+ * outside the serialize/restore procedure. Therefore, SerializeGUCState()+ * never sends these, and RestoreGUCState() never changes them.+ */+++/*+ * estimate_variable_size:+ * Estimate max size for dumping the given GUC variable.+ */+++/*+ * EstimateGUCStateSpace:+ * Returns the size needed to store the GUC state for the current process+ */+++/*+ * do_serialize:+ * Copies the formatted string into the destination. Moves ahead the+ * destination pointer, and decrements the maxbytes by that many bytes. If+ * maxbytes is not sufficient to copy the string, error out.+ */+++/* Binary copy version of do_serialize() */+++/*+ * serialize_variable:+ * Dumps name, value and other information of a GUC variable into destptr.+ */+++/*+ * SerializeGUCState:+ * Dumps the complete GUC state onto the memory location at start_address.+ */+++/*+ * read_gucstate:+ * Actually it does not read anything, just returns the srcptr. But it does+ * move the srcptr past the terminating zero byte, so that the caller is ready+ * to read the next string.+ */+++/* Binary read version of read_gucstate(). Copies into dest */+++/*+ * RestoreGUCState:+ * Reads the GUC state at the specified address and updates the GUCs with the+ * values read from the GUC state.+ */+++/*+ * A little "long argument" simulation, although not quite GNU+ * compliant. Takes a string of the form "some-option=some value" and+ * returns name = "some_option" and value = "some value" in malloc'ed+ * storage. Note that '-' is converted to '_' in the option name. If+ * there is no '=' in the input string then value will be NULL.+ */++++/*+ * Handle options fetched from pg_db_role_setting.setconfig,+ * pg_proc.proconfig, etc. Caller must specify proper context/source/action.+ *+ * The array parameter must be an array of TEXT (it must not be NULL).+ */++++/*+ * Add an entry to an option array. The array parameter may be NULL+ * to indicate the current table entry is NULL.+ */++++/*+ * Delete an entry from an option array. The array parameter may be NULL+ * to indicate the current table entry is NULL. Also, if the return value+ * is NULL then a null should be stored.+ */++++/*+ * Given a GUC array, delete all settings from it that our permission+ * level allows: if superuser, delete them all; if regular user, only+ * those that are PGC_USERSET+ */+++/*+ * Validate a proposed option setting for GUCArrayAdd/Delete/Reset.+ *+ * name is the option name. value is the proposed value for the Add case,+ * or NULL for the Delete/Reset cases. If skipIfNoPermissions is true, it's+ * not an error to have no permissions to set the option.+ *+ * Returns TRUE if OK, FALSE if skipIfNoPermissions is true and user does not+ * have permission to change this option (all other error cases result in an+ * error being thrown).+ */++++/*+ * Called by check_hooks that want to override the normal+ * ERRCODE_INVALID_PARAMETER_VALUE SQLSTATE for check hook failures.+ *+ * Note that GUC_check_errmsg() etc are just macros that result in a direct+ * assignment to the associated variables. That is ugly, but forced by the+ * limitations of C's macro mechanisms.+ */++++/*+ * Convenience functions to manage calling a variable's check_hook.+ * These mostly take care of the protocol for letting check hooks supply+ * portions of the error report on failure.+ */+++++++++++++/*+ * check_hook, assign_hook and show_hook subroutines+ */++#ifdef HAVE_SYSLOG+#endif+#ifdef WIN32+#endif++++#ifdef HAVE_SYSLOG+#endif++#ifdef HAVE_SYSLOG+#endif+++++++#ifndef USE_BONJOUR+#endif++#ifndef USE_SSL+#endif++++++++++++/*+ * pg_timezone_abbrev_initialize --- set default value if not done already+ *+ * This is called after initial loading of postgresql.conf. If no+ * timezone_abbreviations setting was found therein, select default.+ * If a non-default value is already installed, nothing will happen.+ *+ * This can also be called from ProcessConfigFile to establish the default+ * value after a postgresql.conf entry for it is removed.+ */+++++++++++++++++++++++++#ifdef USE_PREFETCH+#else+#endif /* USE_PREFETCH */++#ifdef USE_PREFETCH+#endif /* USE_PREFETCH */++++++++++++++#include "guc-file.c"
+ foreign/libpg_query/src/postgres/src_backend_utils_mmgr_aset.c view
@@ -0,0 +1,1387 @@+/*--------------------------------------------------------------------+ * Symbols referenced in this file:+ * - AllocSetContextCreate+ * - AllocSetMethods+ * - AllocSetAlloc+ * - AllocSetFreeIndex+ * - LogTable256+ * - AllocSetFree+ * - AllocSetRealloc+ * - AllocSetInit+ * - AllocSetReset+ * - AllocSetDelete+ * - AllocSetGetChunkSpace+ * - AllocSetIsEmpty+ * - AllocSetStats+ * - AllocSetContextCreate+ *--------------------------------------------------------------------+ */++/*-------------------------------------------------------------------------+ *+ * aset.c+ * Allocation set definitions.+ *+ * AllocSet is our standard implementation of the abstract MemoryContext+ * type.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ * IDENTIFICATION+ * src/backend/utils/mmgr/aset.c+ *+ * NOTE:+ * This is a new (Feb. 05, 1999) implementation of the allocation set+ * routines. AllocSet...() does not use OrderedSet...() any more.+ * Instead it manages allocations in a block pool by itself, combining+ * many small allocations in a few bigger blocks. AllocSetFree() normally+ * doesn't free() memory really. It just add's the free'd area to some+ * list for later reuse by AllocSetAlloc(). All memory blocks are free()'d+ * at once on AllocSetReset(), which happens when the memory context gets+ * destroyed.+ * Jan Wieck+ *+ * Performance improvement from Tom Lane, 8/99: for extremely large request+ * sizes, we do want to be able to give the memory back to free() as soon+ * as it is pfree()'d. Otherwise we risk tying up a lot of memory in+ * freelist entries that might never be usable. This is specially needed+ * when the caller is repeatedly repalloc()'ing a block bigger and bigger;+ * the previous instances of the block were guaranteed to be wasted until+ * AllocSetReset() under the old way.+ *+ * Further improvement 12/00: as the code stood, request sizes in the+ * midrange between "small" and "large" were handled very inefficiently,+ * because any sufficiently large free chunk would be used to satisfy a+ * request, even if it was much larger than necessary. This led to more+ * and more wasted space in allocated chunks over time. To fix, get rid+ * of the midrange behavior: we now handle only "small" power-of-2-size+ * chunks as chunks. Anything "large" is passed off to malloc(). Change+ * the number of freelists to change the small/large boundary.+ *+ *+ * About CLOBBER_FREED_MEMORY:+ *+ * If this symbol is defined, all freed memory is overwritten with 0x7F's.+ * This is useful for catching places that reference already-freed memory.+ *+ * About MEMORY_CONTEXT_CHECKING:+ *+ * Since we usually round request sizes up to the next power of 2, there+ * is often some unused space immediately after a requested data area.+ * Thus, if someone makes the common error of writing past what they've+ * requested, the problem is likely to go unnoticed ... until the day when+ * there *isn't* any wasted space, perhaps because of different memory+ * alignment on a new platform, or some other effect. To catch this sort+ * of problem, the MEMORY_CONTEXT_CHECKING option stores 0x7E just beyond+ * the requested space whenever the request is less than the actual chunk+ * size, and verifies that the byte is undamaged when the chunk is freed.+ *+ *+ * About USE_VALGRIND and Valgrind client requests:+ *+ * Valgrind provides "client request" macros that exchange information with+ * the host Valgrind (if any). Under !USE_VALGRIND, memdebug.h stubs out+ * currently-used macros.+ *+ * When running under Valgrind, we want a NOACCESS memory region both before+ * and after the allocation. The chunk header is tempting as the preceding+ * region, but mcxt.c expects to able to examine the standard chunk header+ * fields. Therefore, we use, when available, the requested_size field and+ * any subsequent padding. requested_size is made NOACCESS before returning+ * a chunk pointer to a caller. However, to reduce client request traffic,+ * it is kept DEFINED in chunks on the free list.+ *+ * The rounded-up capacity of the chunk usually acts as a post-allocation+ * NOACCESS region. If the request consumes precisely the entire chunk,+ * there is no such region; another chunk header may immediately follow. In+ * that case, Valgrind will not detect access beyond the end of the chunk.+ *+ * See also the cooperating Valgrind client requests in mcxt.c.+ *+ *-------------------------------------------------------------------------+ */++#include "postgres.h"++#include "utils/memdebug.h"+#include "utils/memutils.h"++/* Define this to detail debug alloc information */+/* #define HAVE_ALLOCINFO */++/*--------------------+ * Chunk freelist k holds chunks of size 1 << (k + ALLOC_MINBITS),+ * for k = 0 .. ALLOCSET_NUM_FREELISTS-1.+ *+ * Note that all chunks in the freelists have power-of-2 sizes. This+ * improves recyclability: we may waste some space, but the wasted space+ * should stay pretty constant as requests are made and released.+ *+ * A request too large for the last freelist is handled by allocating a+ * dedicated block from malloc(). The block still has a block header and+ * chunk header, but when the chunk is freed we'll return the whole block+ * to malloc(), not put it on our freelists.+ *+ * CAUTION: ALLOC_MINBITS must be large enough so that+ * 1<<ALLOC_MINBITS is at least MAXALIGN,+ * or we may fail to align the smallest chunks adequately.+ * 8-byte alignment is enough on all currently known machines.+ *+ * With the current parameters, request sizes up to 8K are treated as chunks,+ * larger requests go into dedicated blocks. Change ALLOCSET_NUM_FREELISTS+ * to adjust the boundary point; and adjust ALLOCSET_SEPARATE_THRESHOLD in+ * memutils.h to agree. (Note: in contexts with small maxBlockSize, we may+ * set the allocChunkLimit to less than 8K, so as to avoid space wastage.)+ *--------------------+ */++#define ALLOC_MINBITS 3 /* smallest chunk size is 8 bytes */+#define ALLOCSET_NUM_FREELISTS 11+#define ALLOC_CHUNK_LIMIT (1 << (ALLOCSET_NUM_FREELISTS-1+ALLOC_MINBITS))+/* Size of largest chunk that we use a fixed size for */+#define ALLOC_CHUNK_FRACTION 4+/* We allow chunks to be at most 1/4 of maxBlockSize (less overhead) */++/*--------------------+ * The first block allocated for an allocset has size initBlockSize.+ * Each time we have to allocate another block, we double the block size+ * (if possible, and without exceeding maxBlockSize), so as to reduce+ * the bookkeeping load on malloc().+ *+ * Blocks allocated to hold oversize chunks do not follow this rule, however;+ * they are just however big they need to be to hold that single chunk.+ *--------------------+ */++#define ALLOC_BLOCKHDRSZ MAXALIGN(sizeof(AllocBlockData))+#define ALLOC_CHUNKHDRSZ MAXALIGN(sizeof(AllocChunkData))++/* Portion of ALLOC_CHUNKHDRSZ examined outside aset.c. */+#define ALLOC_CHUNK_PUBLIC \+ (offsetof(AllocChunkData, size) + sizeof(Size))++/* Portion of ALLOC_CHUNKHDRSZ excluding trailing padding. */+#ifdef MEMORY_CONTEXT_CHECKING+#define ALLOC_CHUNK_USED \+ (offsetof(AllocChunkData, requested_size) + sizeof(Size))+#else+#define ALLOC_CHUNK_USED \+ (offsetof(AllocChunkData, size) + sizeof(Size))+#endif++typedef struct AllocBlockData *AllocBlock; /* forward reference */+typedef struct AllocChunkData *AllocChunk;++/*+ * AllocPointer+ * Aligned pointer which may be a member of an allocation set.+ */+typedef void *AllocPointer;++/*+ * AllocSetContext is our standard implementation of MemoryContext.+ *+ * Note: header.isReset means there is nothing for AllocSetReset to do.+ * This is different from the aset being physically empty (empty blocks list)+ * because we may still have a keeper block. It's also different from the set+ * being logically empty, because we don't attempt to detect pfree'ing the+ * last active chunk.+ */+typedef struct AllocSetContext+{+ MemoryContextData header; /* Standard memory-context fields */+ /* Info about storage allocated in this context: */+ AllocBlock blocks; /* head of list of blocks in this set */+ AllocChunk freelist[ALLOCSET_NUM_FREELISTS]; /* free chunk lists */+ /* Allocation parameters for this context: */+ Size initBlockSize; /* initial block size */+ Size maxBlockSize; /* maximum block size */+ Size nextBlockSize; /* next block size to allocate */+ Size allocChunkLimit; /* effective chunk size limit */+ AllocBlock keeper; /* if not NULL, keep this block over resets */+} AllocSetContext;++typedef AllocSetContext *AllocSet;++/*+ * AllocBlock+ * An AllocBlock is the unit of memory that is obtained by aset.c+ * from malloc(). It contains one or more AllocChunks, which are+ * the units requested by palloc() and freed by pfree(). AllocChunks+ * cannot be returned to malloc() individually, instead they are put+ * on freelists by pfree() and re-used by the next palloc() that has+ * a matching request size.+ *+ * AllocBlockData is the header data for a block --- the usable space+ * within the block begins at the next alignment boundary.+ */+typedef struct AllocBlockData+{+ AllocSet aset; /* aset that owns this block */+ AllocBlock next; /* next block in aset's blocks list */+ char *freeptr; /* start of free space in this block */+ char *endptr; /* end of space in this block */+} AllocBlockData;++/*+ * AllocChunk+ * The prefix of each piece of memory in an AllocBlock+ *+ * NB: this MUST match StandardChunkHeader as defined by utils/memutils.h.+ */+typedef struct AllocChunkData+{+ /* aset is the owning aset if allocated, or the freelist link if free */+ void *aset;+ /* size is always the size of the usable space in the chunk */+ Size size;+#ifdef MEMORY_CONTEXT_CHECKING+ /* when debugging memory usage, also store actual requested size */+ /* this is zero in a free chunk */+ Size requested_size;+#endif+} AllocChunkData;++/*+ * AllocPointerIsValid+ * True iff pointer is valid allocation pointer.+ */+#define AllocPointerIsValid(pointer) PointerIsValid(pointer)++/*+ * AllocSetIsValid+ * True iff set is valid allocation set.+ */+#define AllocSetIsValid(set) PointerIsValid(set)++#define AllocPointerGetChunk(ptr) \+ ((AllocChunk)(((char *)(ptr)) - ALLOC_CHUNKHDRSZ))+#define AllocChunkGetPointer(chk) \+ ((AllocPointer)(((char *)(chk)) + ALLOC_CHUNKHDRSZ))++/*+ * These functions implement the MemoryContext API for AllocSet contexts.+ */+static void *AllocSetAlloc(MemoryContext context, Size size);+static void AllocSetFree(MemoryContext context, void *pointer);+static void *AllocSetRealloc(MemoryContext context, void *pointer, Size size);+static void AllocSetInit(MemoryContext context);+static void AllocSetReset(MemoryContext context);+static void AllocSetDelete(MemoryContext context);+static Size AllocSetGetChunkSpace(MemoryContext context, void *pointer);+static bool AllocSetIsEmpty(MemoryContext context);+static void AllocSetStats(MemoryContext context, int level);++#ifdef MEMORY_CONTEXT_CHECKING+static void AllocSetCheck(MemoryContext context);+#endif++/*+ * This is the virtual function table for AllocSet contexts.+ */+static MemoryContextMethods AllocSetMethods = {+ AllocSetAlloc,+ AllocSetFree,+ AllocSetRealloc,+ AllocSetInit,+ AllocSetReset,+ AllocSetDelete,+ AllocSetGetChunkSpace,+ AllocSetIsEmpty,+ AllocSetStats+#ifdef MEMORY_CONTEXT_CHECKING+ ,AllocSetCheck+#endif+};++/*+ * Table for AllocSetFreeIndex+ */+#define LT16(n) n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n++static const unsigned char LogTable256[256] =+{+ 0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4,+ LT16(5), LT16(6), LT16(6), LT16(7), LT16(7), LT16(7), LT16(7),+ LT16(8), LT16(8), LT16(8), LT16(8), LT16(8), LT16(8), LT16(8), LT16(8)+};++/* ----------+ * Debug macros+ * ----------+ */+#ifdef HAVE_ALLOCINFO+#define AllocFreeInfo(_cxt, _chunk) \+ fprintf(stderr, "AllocFree: %s: %p, %d\n", \+ (_cxt)->header.name, (_chunk), (_chunk)->size)+#define AllocAllocInfo(_cxt, _chunk) \+ fprintf(stderr, "AllocAlloc: %s: %p, %d\n", \+ (_cxt)->header.name, (_chunk), (_chunk)->size)+#else+#define AllocFreeInfo(_cxt, _chunk)+#define AllocAllocInfo(_cxt, _chunk)+#endif++/* ----------+ * AllocSetFreeIndex -+ *+ * Depending on the size of an allocation compute which freechunk+ * list of the alloc set it belongs to. Caller must have verified+ * that size <= ALLOC_CHUNK_LIMIT.+ * ----------+ */+static inline int+AllocSetFreeIndex(Size size)+{+ int idx;+ unsigned int t,+ tsize;++ if (size > (1 << ALLOC_MINBITS))+ {+ tsize = (size - 1) >> ALLOC_MINBITS;++ /*+ * At this point we need to obtain log2(tsize)+1, ie, the number of+ * not-all-zero bits at the right. We used to do this with a+ * shift-and-count loop, but this function is enough of a hotspot to+ * justify micro-optimization effort. The best approach seems to be+ * to use a lookup table. Note that this code assumes that+ * ALLOCSET_NUM_FREELISTS <= 17, since we only cope with two bytes of+ * the tsize value.+ */+ t = tsize >> 8;+ idx = t ? LogTable256[t] + 8 : LogTable256[tsize];++ Assert(idx < ALLOCSET_NUM_FREELISTS);+ }+ else+ idx = 0;++ return idx;+}++#ifdef CLOBBER_FREED_MEMORY++/* Wipe freed memory for debugging purposes */+static void+wipe_mem(void *ptr, size_t size)+{+ VALGRIND_MAKE_MEM_UNDEFINED(ptr, size);+ memset(ptr, 0x7F, size);+ VALGRIND_MAKE_MEM_NOACCESS(ptr, size);+}+#endif++#ifdef MEMORY_CONTEXT_CHECKING+static void+set_sentinel(void *base, Size offset)+{+ char *ptr = (char *) base + offset;++ VALGRIND_MAKE_MEM_UNDEFINED(ptr, 1);+ *ptr = 0x7E;+ VALGRIND_MAKE_MEM_NOACCESS(ptr, 1);+}++static bool+sentinel_ok(const void *base, Size offset)+{+ const char *ptr = (const char *) base + offset;+ bool ret;++ VALGRIND_MAKE_MEM_DEFINED(ptr, 1);+ ret = *ptr == 0x7E;+ VALGRIND_MAKE_MEM_NOACCESS(ptr, 1);++ return ret;+}+#endif++#ifdef RANDOMIZE_ALLOCATED_MEMORY++/*+ * Fill a just-allocated piece of memory with "random" data. It's not really+ * very random, just a repeating sequence with a length that's prime. What+ * we mainly want out of it is to have a good probability that two palloc's+ * of the same number of bytes start out containing different data.+ *+ * The region may be NOACCESS, so make it UNDEFINED first to avoid errors as+ * we fill it. Filling the region makes it DEFINED, so make it UNDEFINED+ * again afterward. Whether to finally make it UNDEFINED or NOACCESS is+ * fairly arbitrary. UNDEFINED is more convenient for AllocSetRealloc(), and+ * other callers have no preference.+ */+static void+randomize_mem(char *ptr, size_t size)+{+ static int save_ctr = 1;+ size_t remaining = size;+ int ctr;++ ctr = save_ctr;+ VALGRIND_MAKE_MEM_UNDEFINED(ptr, size);+ while (remaining-- > 0)+ {+ *ptr++ = ctr;+ if (++ctr > 251)+ ctr = 1;+ }+ VALGRIND_MAKE_MEM_UNDEFINED(ptr - size, size);+ save_ctr = ctr;+}+#endif /* RANDOMIZE_ALLOCATED_MEMORY */+++/*+ * Public routines+ */+++/*+ * AllocSetContextCreate+ * Create a new AllocSet context.+ *+ * parent: parent context, or NULL if top-level context+ * name: name of context (for debugging --- string will be copied)+ * minContextSize: minimum context size+ * initBlockSize: initial allocation block size+ * maxBlockSize: maximum allocation block size+ */+MemoryContext+AllocSetContextCreate(MemoryContext parent,+ const char *name,+ Size minContextSize,+ Size initBlockSize,+ Size maxBlockSize)+{+ AllocSet set;++ /* Do the type-independent part of context creation */+ set = (AllocSet) MemoryContextCreate(T_AllocSetContext,+ sizeof(AllocSetContext),+ &AllocSetMethods,+ parent,+ name);++ /*+ * Make sure alloc parameters are reasonable, and save them.+ *+ * We somewhat arbitrarily enforce a minimum 1K block size.+ */+ initBlockSize = MAXALIGN(initBlockSize);+ if (initBlockSize < 1024)+ initBlockSize = 1024;+ maxBlockSize = MAXALIGN(maxBlockSize);+ if (maxBlockSize < initBlockSize)+ maxBlockSize = initBlockSize;+ Assert(AllocHugeSizeIsValid(maxBlockSize)); /* must be safe to double */+ set->initBlockSize = initBlockSize;+ set->maxBlockSize = maxBlockSize;+ set->nextBlockSize = initBlockSize;++ /*+ * Compute the allocation chunk size limit for this context. It can't be+ * more than ALLOC_CHUNK_LIMIT because of the fixed number of freelists.+ * If maxBlockSize is small then requests exceeding the maxBlockSize, or+ * even a significant fraction of it, should be treated as large chunks+ * too. For the typical case of maxBlockSize a power of 2, the chunk size+ * limit will be at most 1/8th maxBlockSize, so that given a stream of+ * requests that are all the maximum chunk size we will waste at most+ * 1/8th of the allocated space.+ *+ * We have to have allocChunkLimit a power of two, because the requested+ * and actually-allocated sizes of any chunk must be on the same side of+ * the limit, else we get confused about whether the chunk is "big".+ *+ * Also, allocChunkLimit must not exceed ALLOCSET_SEPARATE_THRESHOLD.+ */+ StaticAssertStmt(ALLOC_CHUNK_LIMIT == ALLOCSET_SEPARATE_THRESHOLD,+ "ALLOC_CHUNK_LIMIT != ALLOCSET_SEPARATE_THRESHOLD");++ set->allocChunkLimit = ALLOC_CHUNK_LIMIT;+ while ((Size) (set->allocChunkLimit + ALLOC_CHUNKHDRSZ) >+ (Size) ((maxBlockSize - ALLOC_BLOCKHDRSZ) / ALLOC_CHUNK_FRACTION))+ set->allocChunkLimit >>= 1;++ /*+ * Grab always-allocated space, if requested+ */+ if (minContextSize > ALLOC_BLOCKHDRSZ + ALLOC_CHUNKHDRSZ)+ {+ Size blksize = MAXALIGN(minContextSize);+ AllocBlock block;++ block = (AllocBlock) malloc(blksize);+ if (block == NULL)+ {+ MemoryContextStats(TopMemoryContext);+ ereport(ERROR,+ (errcode(ERRCODE_OUT_OF_MEMORY),+ errmsg("out of memory"),+ errdetail("Failed while creating memory context \"%s\".",+ name)));+ }+ block->aset = set;+ block->freeptr = ((char *) block) + ALLOC_BLOCKHDRSZ;+ block->endptr = ((char *) block) + blksize;+ block->next = set->blocks;+ set->blocks = block;+ /* Mark block as not to be released at reset time */+ set->keeper = block;++ /* Mark unallocated space NOACCESS; leave the block header alone. */+ VALGRIND_MAKE_MEM_NOACCESS(block->freeptr,+ blksize - ALLOC_BLOCKHDRSZ);+ }++ return (MemoryContext) set;+}++/*+ * AllocSetInit+ * Context-type-specific initialization routine.+ *+ * This is called by MemoryContextCreate() after setting up the+ * generic MemoryContext fields and before linking the new context+ * into the context tree. We must do whatever is needed to make the+ * new context minimally valid for deletion. We must *not* risk+ * failure --- thus, for example, allocating more memory is not cool.+ * (AllocSetContextCreate can allocate memory when it gets control+ * back, however.)+ */+static void+AllocSetInit(MemoryContext context)+{+ /*+ * Since MemoryContextCreate already zeroed the context node, we don't+ * have to do anything here: it's already OK.+ */+}++/*+ * AllocSetReset+ * Frees all memory which is allocated in the given set.+ *+ * Actually, this routine has some discretion about what to do.+ * It should mark all allocated chunks freed, but it need not necessarily+ * give back all the resources the set owns. Our actual implementation is+ * that we hang onto any "keeper" block specified for the set. In this way,+ * we don't thrash malloc() when a context is repeatedly reset after small+ * allocations, which is typical behavior for per-tuple contexts.+ */+static void+AllocSetReset(MemoryContext context)+{+ AllocSet set = (AllocSet) context;+ AllocBlock block;++ AssertArg(AllocSetIsValid(set));++#ifdef MEMORY_CONTEXT_CHECKING+ /* Check for corruption and leaks before freeing */+ AllocSetCheck(context);+#endif++ /* Clear chunk freelists */+ MemSetAligned(set->freelist, 0, sizeof(set->freelist));++ block = set->blocks;++ /* New blocks list is either empty or just the keeper block */+ set->blocks = set->keeper;++ while (block != NULL)+ {+ AllocBlock next = block->next;++ if (block == set->keeper)+ {+ /* Reset the block, but don't return it to malloc */+ char *datastart = ((char *) block) + ALLOC_BLOCKHDRSZ;++#ifdef CLOBBER_FREED_MEMORY+ wipe_mem(datastart, block->freeptr - datastart);+#else+ /* wipe_mem() would have done this */+ VALGRIND_MAKE_MEM_NOACCESS(datastart, block->freeptr - datastart);+#endif+ block->freeptr = datastart;+ block->next = NULL;+ }+ else+ {+ /* Normal case, release the block */+#ifdef CLOBBER_FREED_MEMORY+ wipe_mem(block, block->freeptr - ((char *) block));+#endif+ free(block);+ }+ block = next;+ }++ /* Reset block size allocation sequence, too */+ set->nextBlockSize = set->initBlockSize;+}++/*+ * AllocSetDelete+ * Frees all memory which is allocated in the given set,+ * in preparation for deletion of the set.+ *+ * Unlike AllocSetReset, this *must* free all resources of the set.+ * But note we are not responsible for deleting the context node itself.+ */+static void+AllocSetDelete(MemoryContext context)+{+ AllocSet set = (AllocSet) context;+ AllocBlock block = set->blocks;++ AssertArg(AllocSetIsValid(set));++#ifdef MEMORY_CONTEXT_CHECKING+ /* Check for corruption and leaks before freeing */+ AllocSetCheck(context);+#endif++ /* Make it look empty, just in case... */+ MemSetAligned(set->freelist, 0, sizeof(set->freelist));+ set->blocks = NULL;+ set->keeper = NULL;++ while (block != NULL)+ {+ AllocBlock next = block->next;++#ifdef CLOBBER_FREED_MEMORY+ wipe_mem(block, block->freeptr - ((char *) block));+#endif+ free(block);+ block = next;+ }+}++/*+ * AllocSetAlloc+ * Returns pointer to allocated memory of given size or NULL if+ * request could not be completed; memory is added to the set.+ *+ * No request may exceed:+ * MAXALIGN_DOWN(SIZE_MAX) - ALLOC_BLOCKHDRSZ - ALLOC_CHUNKHDRSZ+ * All callers use a much-lower limit.+ */+static void *+AllocSetAlloc(MemoryContext context, Size size)+{+ AllocSet set = (AllocSet) context;+ AllocBlock block;+ AllocChunk chunk;+ int fidx;+ Size chunk_size;+ Size blksize;++ AssertArg(AllocSetIsValid(set));++ /*+ * If requested size exceeds maximum for chunks, allocate an entire block+ * for this request.+ */+ if (size > set->allocChunkLimit)+ {+ chunk_size = MAXALIGN(size);+ blksize = chunk_size + ALLOC_BLOCKHDRSZ + ALLOC_CHUNKHDRSZ;+ block = (AllocBlock) malloc(blksize);+ if (block == NULL)+ return NULL;+ block->aset = set;+ block->freeptr = block->endptr = ((char *) block) + blksize;++ chunk = (AllocChunk) (((char *) block) + ALLOC_BLOCKHDRSZ);+ chunk->aset = set;+ chunk->size = chunk_size;+#ifdef MEMORY_CONTEXT_CHECKING+ /* Valgrind: Will be made NOACCESS below. */+ chunk->requested_size = size;+ /* set mark to catch clobber of "unused" space */+ if (size < chunk_size)+ set_sentinel(AllocChunkGetPointer(chunk), size);+#endif+#ifdef RANDOMIZE_ALLOCATED_MEMORY+ /* fill the allocated space with junk */+ randomize_mem((char *) AllocChunkGetPointer(chunk), size);+#endif++ /*+ * Stick the new block underneath the active allocation block, so that+ * we don't lose the use of the space remaining therein.+ */+ if (set->blocks != NULL)+ {+ block->next = set->blocks->next;+ set->blocks->next = block;+ }+ else+ {+ block->next = NULL;+ set->blocks = block;+ }++ AllocAllocInfo(set, chunk);++ /*+ * Chunk header public fields remain DEFINED. The requested+ * allocation itself can be NOACCESS or UNDEFINED; our caller will+ * soon make it UNDEFINED. Make extra space at the end of the chunk,+ * if any, NOACCESS.+ */+ VALGRIND_MAKE_MEM_NOACCESS((char *) chunk + ALLOC_CHUNK_PUBLIC,+ chunk_size + ALLOC_CHUNKHDRSZ - ALLOC_CHUNK_PUBLIC);++ return AllocChunkGetPointer(chunk);+ }++ /*+ * Request is small enough to be treated as a chunk. Look in the+ * corresponding free list to see if there is a free chunk we could reuse.+ * If one is found, remove it from the free list, make it again a member+ * of the alloc set and return its data address.+ */+ fidx = AllocSetFreeIndex(size);+ chunk = set->freelist[fidx];+ if (chunk != NULL)+ {+ Assert(chunk->size >= size);++ set->freelist[fidx] = (AllocChunk) chunk->aset;++ chunk->aset = (void *) set;++#ifdef MEMORY_CONTEXT_CHECKING+ /* Valgrind: Free list requested_size should be DEFINED. */+ chunk->requested_size = size;+ VALGRIND_MAKE_MEM_NOACCESS(&chunk->requested_size,+ sizeof(chunk->requested_size));+ /* set mark to catch clobber of "unused" space */+ if (size < chunk->size)+ set_sentinel(AllocChunkGetPointer(chunk), size);+#endif+#ifdef RANDOMIZE_ALLOCATED_MEMORY+ /* fill the allocated space with junk */+ randomize_mem((char *) AllocChunkGetPointer(chunk), size);+#endif++ AllocAllocInfo(set, chunk);+ return AllocChunkGetPointer(chunk);+ }++ /*+ * Choose the actual chunk size to allocate.+ */+ chunk_size = (1 << ALLOC_MINBITS) << fidx;+ Assert(chunk_size >= size);++ /*+ * If there is enough room in the active allocation block, we will put the+ * chunk into that block. Else must start a new one.+ */+ if ((block = set->blocks) != NULL)+ {+ Size availspace = block->endptr - block->freeptr;++ if (availspace < (chunk_size + ALLOC_CHUNKHDRSZ))+ {+ /*+ * The existing active (top) block does not have enough room for+ * the requested allocation, but it might still have a useful+ * amount of space in it. Once we push it down in the block list,+ * we'll never try to allocate more space from it. So, before we+ * do that, carve up its free space into chunks that we can put on+ * the set's freelists.+ *+ * Because we can only get here when there's less than+ * ALLOC_CHUNK_LIMIT left in the block, this loop cannot iterate+ * more than ALLOCSET_NUM_FREELISTS-1 times.+ */+ while (availspace >= ((1 << ALLOC_MINBITS) + ALLOC_CHUNKHDRSZ))+ {+ Size availchunk = availspace - ALLOC_CHUNKHDRSZ;+ int a_fidx = AllocSetFreeIndex(availchunk);++ /*+ * In most cases, we'll get back the index of the next larger+ * freelist than the one we need to put this chunk on. The+ * exception is when availchunk is exactly a power of 2.+ */+ if (availchunk != ((Size) 1 << (a_fidx + ALLOC_MINBITS)))+ {+ a_fidx--;+ Assert(a_fidx >= 0);+ availchunk = ((Size) 1 << (a_fidx + ALLOC_MINBITS));+ }++ chunk = (AllocChunk) (block->freeptr);++ /* Prepare to initialize the chunk header. */+ VALGRIND_MAKE_MEM_UNDEFINED(chunk, ALLOC_CHUNK_USED);++ block->freeptr += (availchunk + ALLOC_CHUNKHDRSZ);+ availspace -= (availchunk + ALLOC_CHUNKHDRSZ);++ chunk->size = availchunk;+#ifdef MEMORY_CONTEXT_CHECKING+ chunk->requested_size = 0; /* mark it free */+#endif+ chunk->aset = (void *) set->freelist[a_fidx];+ set->freelist[a_fidx] = chunk;+ }++ /* Mark that we need to create a new block */+ block = NULL;+ }+ }++ /*+ * Time to create a new regular (multi-chunk) block?+ */+ if (block == NULL)+ {+ Size required_size;++ /*+ * The first such block has size initBlockSize, and we double the+ * space in each succeeding block, but not more than maxBlockSize.+ */+ blksize = set->nextBlockSize;+ set->nextBlockSize <<= 1;+ if (set->nextBlockSize > set->maxBlockSize)+ set->nextBlockSize = set->maxBlockSize;++ /*+ * If initBlockSize is less than ALLOC_CHUNK_LIMIT, we could need more+ * space... but try to keep it a power of 2.+ */+ required_size = chunk_size + ALLOC_BLOCKHDRSZ + ALLOC_CHUNKHDRSZ;+ while (blksize < required_size)+ blksize <<= 1;++ /* Try to allocate it */+ block = (AllocBlock) malloc(blksize);++ /*+ * We could be asking for pretty big blocks here, so cope if malloc+ * fails. But give up if there's less than a meg or so available...+ */+ while (block == NULL && blksize > 1024 * 1024)+ {+ blksize >>= 1;+ if (blksize < required_size)+ break;+ block = (AllocBlock) malloc(blksize);+ }++ if (block == NULL)+ return NULL;++ block->aset = set;+ block->freeptr = ((char *) block) + ALLOC_BLOCKHDRSZ;+ block->endptr = ((char *) block) + blksize;++ /*+ * If this is the first block of the set, make it the "keeper" block.+ * Formerly, a keeper block could only be created during context+ * creation, but allowing it to happen here lets us have fast reset+ * cycling even for contexts created with minContextSize = 0; that way+ * we don't have to force space to be allocated in contexts that might+ * never need any space. Don't mark an oversize block as a keeper,+ * however.+ */+ if (set->keeper == NULL && blksize == set->initBlockSize)+ set->keeper = block;++ /* Mark unallocated space NOACCESS. */+ VALGRIND_MAKE_MEM_NOACCESS(block->freeptr,+ blksize - ALLOC_BLOCKHDRSZ);++ block->next = set->blocks;+ set->blocks = block;+ }++ /*+ * OK, do the allocation+ */+ chunk = (AllocChunk) (block->freeptr);++ /* Prepare to initialize the chunk header. */+ VALGRIND_MAKE_MEM_UNDEFINED(chunk, ALLOC_CHUNK_USED);++ block->freeptr += (chunk_size + ALLOC_CHUNKHDRSZ);+ Assert(block->freeptr <= block->endptr);++ chunk->aset = (void *) set;+ chunk->size = chunk_size;+#ifdef MEMORY_CONTEXT_CHECKING+ chunk->requested_size = size;+ VALGRIND_MAKE_MEM_NOACCESS(&chunk->requested_size,+ sizeof(chunk->requested_size));+ /* set mark to catch clobber of "unused" space */+ if (size < chunk->size)+ set_sentinel(AllocChunkGetPointer(chunk), size);+#endif+#ifdef RANDOMIZE_ALLOCATED_MEMORY+ /* fill the allocated space with junk */+ randomize_mem((char *) AllocChunkGetPointer(chunk), size);+#endif++ AllocAllocInfo(set, chunk);+ return AllocChunkGetPointer(chunk);+}++/*+ * AllocSetFree+ * Frees allocated memory; memory is removed from the set.+ */+static void+AllocSetFree(MemoryContext context, void *pointer)+{+ AllocSet set = (AllocSet) context;+ AllocChunk chunk = AllocPointerGetChunk(pointer);++ AllocFreeInfo(set, chunk);++#ifdef MEMORY_CONTEXT_CHECKING+ VALGRIND_MAKE_MEM_DEFINED(&chunk->requested_size,+ sizeof(chunk->requested_size));+ /* Test for someone scribbling on unused space in chunk */+ if (chunk->requested_size < chunk->size)+ if (!sentinel_ok(pointer, chunk->requested_size))+ elog(WARNING, "detected write past chunk end in %s %p",+ set->header.name, chunk);+#endif++ if (chunk->size > set->allocChunkLimit)+ {+ /*+ * Big chunks are certain to have been allocated as single-chunk+ * blocks. Find the containing block and return it to malloc().+ */+ AllocBlock block = set->blocks;+ AllocBlock prevblock = NULL;++ while (block != NULL)+ {+ if (chunk == (AllocChunk) (((char *) block) + ALLOC_BLOCKHDRSZ))+ break;+ prevblock = block;+ block = block->next;+ }+ if (block == NULL)+ elog(ERROR, "could not find block containing chunk %p", chunk);+ /* let's just make sure chunk is the only one in the block */+ Assert(block->freeptr == ((char *) block) ++ (chunk->size + ALLOC_BLOCKHDRSZ + ALLOC_CHUNKHDRSZ));++ /* OK, remove block from aset's list and free it */+ if (prevblock == NULL)+ set->blocks = block->next;+ else+ prevblock->next = block->next;+#ifdef CLOBBER_FREED_MEMORY+ wipe_mem(block, block->freeptr - ((char *) block));+#endif+ free(block);+ }+ else+ {+ /* Normal case, put the chunk into appropriate freelist */+ int fidx = AllocSetFreeIndex(chunk->size);++ chunk->aset = (void *) set->freelist[fidx];++#ifdef CLOBBER_FREED_MEMORY+ wipe_mem(pointer, chunk->size);+#endif++#ifdef MEMORY_CONTEXT_CHECKING+ /* Reset requested_size to 0 in chunks that are on freelist */+ chunk->requested_size = 0;+#endif+ set->freelist[fidx] = chunk;+ }+}++/*+ * AllocSetRealloc+ * Returns new pointer to allocated memory of given size or NULL if+ * request could not be completed; this memory is added to the set.+ * Memory associated with given pointer is copied into the new memory,+ * and the old memory is freed.+ *+ * Without MEMORY_CONTEXT_CHECKING, we don't know the old request size. This+ * makes our Valgrind client requests less-precise, hazarding false negatives.+ * (In principle, we could use VALGRIND_GET_VBITS() to rediscover the old+ * request size.)+ */+static void *+AllocSetRealloc(MemoryContext context, void *pointer, Size size)+{+ AllocSet set = (AllocSet) context;+ AllocChunk chunk = AllocPointerGetChunk(pointer);+ Size oldsize = chunk->size;++#ifdef MEMORY_CONTEXT_CHECKING+ VALGRIND_MAKE_MEM_DEFINED(&chunk->requested_size,+ sizeof(chunk->requested_size));+ /* Test for someone scribbling on unused space in chunk */+ if (chunk->requested_size < oldsize)+ if (!sentinel_ok(pointer, chunk->requested_size))+ elog(WARNING, "detected write past chunk end in %s %p",+ set->header.name, chunk);+#endif++ /*+ * Chunk sizes are aligned to power of 2 in AllocSetAlloc(). Maybe the+ * allocated area already is >= the new size. (In particular, we always+ * fall out here if the requested size is a decrease.)+ */+ if (oldsize >= size)+ {+#ifdef MEMORY_CONTEXT_CHECKING+ Size oldrequest = chunk->requested_size;++#ifdef RANDOMIZE_ALLOCATED_MEMORY+ /* We can only fill the extra space if we know the prior request */+ if (size > oldrequest)+ randomize_mem((char *) pointer + oldrequest,+ size - oldrequest);+#endif++ chunk->requested_size = size;+ VALGRIND_MAKE_MEM_NOACCESS(&chunk->requested_size,+ sizeof(chunk->requested_size));++ /*+ * If this is an increase, mark any newly-available part UNDEFINED.+ * Otherwise, mark the obsolete part NOACCESS.+ */+ if (size > oldrequest)+ VALGRIND_MAKE_MEM_UNDEFINED((char *) pointer + oldrequest,+ size - oldrequest);+ else+ VALGRIND_MAKE_MEM_NOACCESS((char *) pointer + size,+ oldsize - size);++ /* set mark to catch clobber of "unused" space */+ if (size < oldsize)+ set_sentinel(pointer, size);+#else /* !MEMORY_CONTEXT_CHECKING */++ /*+ * We don't have the information to determine whether we're growing+ * the old request or shrinking it, so we conservatively mark the+ * entire new allocation DEFINED.+ */+ VALGRIND_MAKE_MEM_NOACCESS(pointer, oldsize);+ VALGRIND_MAKE_MEM_DEFINED(pointer, size);+#endif++ return pointer;+ }++ if (oldsize > set->allocChunkLimit)+ {+ /*+ * The chunk must have been allocated as a single-chunk block. Find+ * the containing block and use realloc() to make it bigger with+ * minimum space wastage.+ */+ AllocBlock block = set->blocks;+ AllocBlock prevblock = NULL;+ Size chksize;+ Size blksize;++ while (block != NULL)+ {+ if (chunk == (AllocChunk) (((char *) block) + ALLOC_BLOCKHDRSZ))+ break;+ prevblock = block;+ block = block->next;+ }+ if (block == NULL)+ elog(ERROR, "could not find block containing chunk %p", chunk);+ /* let's just make sure chunk is the only one in the block */+ Assert(block->freeptr == ((char *) block) ++ (chunk->size + ALLOC_BLOCKHDRSZ + ALLOC_CHUNKHDRSZ));++ /* Do the realloc */+ chksize = MAXALIGN(size);+ blksize = chksize + ALLOC_BLOCKHDRSZ + ALLOC_CHUNKHDRSZ;+ block = (AllocBlock) realloc(block, blksize);+ if (block == NULL)+ return NULL;+ block->freeptr = block->endptr = ((char *) block) + blksize;++ /* Update pointers since block has likely been moved */+ chunk = (AllocChunk) (((char *) block) + ALLOC_BLOCKHDRSZ);+ pointer = AllocChunkGetPointer(chunk);+ if (prevblock == NULL)+ set->blocks = block;+ else+ prevblock->next = block;+ chunk->size = chksize;++#ifdef MEMORY_CONTEXT_CHECKING+#ifdef RANDOMIZE_ALLOCATED_MEMORY+ /* We can only fill the extra space if we know the prior request */+ randomize_mem((char *) pointer + chunk->requested_size,+ size - chunk->requested_size);+#endif++ /*+ * realloc() (or randomize_mem()) will have left the newly-allocated+ * part UNDEFINED, but we may need to adjust trailing bytes from the+ * old allocation.+ */+ VALGRIND_MAKE_MEM_UNDEFINED((char *) pointer + chunk->requested_size,+ oldsize - chunk->requested_size);++ chunk->requested_size = size;+ VALGRIND_MAKE_MEM_NOACCESS(&chunk->requested_size,+ sizeof(chunk->requested_size));++ /* set mark to catch clobber of "unused" space */+ if (size < chunk->size)+ set_sentinel(AllocChunkGetPointer(chunk), size);+#else /* !MEMORY_CONTEXT_CHECKING */++ /*+ * We don't know how much of the old chunk size was the actual+ * allocation; it could have been as small as one byte. We have to be+ * conservative and just mark the entire old portion DEFINED.+ */+ VALGRIND_MAKE_MEM_DEFINED(pointer, oldsize);+#endif++ /* Make any trailing alignment padding NOACCESS. */+ VALGRIND_MAKE_MEM_NOACCESS((char *) pointer + size, chksize - size);+ return AllocChunkGetPointer(chunk);+ }+ else+ {+ /*+ * Small-chunk case. We just do this by brute force, ie, allocate a+ * new chunk and copy the data. Since we know the existing data isn't+ * huge, this won't involve any great memcpy expense, so it's not+ * worth being smarter. (At one time we tried to avoid memcpy when it+ * was possible to enlarge the chunk in-place, but that turns out to+ * misbehave unpleasantly for repeated cycles of+ * palloc/repalloc/pfree: the eventually freed chunks go into the+ * wrong freelist for the next initial palloc request, and so we leak+ * memory indefinitely. See pgsql-hackers archives for 2007-08-11.)+ */+ AllocPointer newPointer;++ /* allocate new chunk */+ newPointer = AllocSetAlloc((MemoryContext) set, size);++ /* leave immediately if request was not completed */+ if (newPointer == NULL)+ return NULL;++ /*+ * AllocSetAlloc() just made the region NOACCESS. Change it to+ * UNDEFINED for the moment; memcpy() will then transfer definedness+ * from the old allocation to the new. If we know the old allocation,+ * copy just that much. Otherwise, make the entire old chunk defined+ * to avoid errors as we copy the currently-NOACCESS trailing bytes.+ */+ VALGRIND_MAKE_MEM_UNDEFINED(newPointer, size);+#ifdef MEMORY_CONTEXT_CHECKING+ oldsize = chunk->requested_size;+#else+ VALGRIND_MAKE_MEM_DEFINED(pointer, oldsize);+#endif++ /* transfer existing data (certain to fit) */+ memcpy(newPointer, pointer, oldsize);++ /* free old chunk */+ AllocSetFree((MemoryContext) set, pointer);++ return newPointer;+ }+}++/*+ * AllocSetGetChunkSpace+ * Given a currently-allocated chunk, determine the total space+ * it occupies (including all memory-allocation overhead).+ */+static Size+AllocSetGetChunkSpace(MemoryContext context, void *pointer)+{+ AllocChunk chunk = AllocPointerGetChunk(pointer);++ return chunk->size + ALLOC_CHUNKHDRSZ;+}++/*+ * AllocSetIsEmpty+ * Is an allocset empty of any allocated space?+ */+static bool+AllocSetIsEmpty(MemoryContext context)+{+ /*+ * For now, we say "empty" only if the context is new or just reset. We+ * could examine the freelists to determine if all space has been freed,+ * but it's not really worth the trouble for present uses of this+ * functionality.+ */+ if (context->isReset)+ return true;+ return false;+}++/*+ * AllocSetStats+ * Displays stats about memory consumption of an allocset.+ */+static void+AllocSetStats(MemoryContext context, int level)+{+ AllocSet set = (AllocSet) context;+ Size nblocks = 0;+ Size nchunks = 0;+ Size totalspace = 0;+ Size freespace = 0;+ AllocBlock block;+ AllocChunk chunk;+ int fidx;+ int i;++ for (block = set->blocks; block != NULL; block = block->next)+ {+ nblocks++;+ totalspace += block->endptr - ((char *) block);+ freespace += block->endptr - block->freeptr;+ }+ for (fidx = 0; fidx < ALLOCSET_NUM_FREELISTS; fidx++)+ {+ for (chunk = set->freelist[fidx]; chunk != NULL;+ chunk = (AllocChunk) chunk->aset)+ {+ nchunks++;+ freespace += chunk->size + ALLOC_CHUNKHDRSZ;+ }+ }++ for (i = 0; i < level; i++)+ fprintf(stderr, " ");++ fprintf(stderr,+ "%s: %zu total in %zd blocks; %zu free (%zd chunks); %zu used\n",+ set->header.name, totalspace, nblocks, freespace, nchunks,+ totalspace - freespace);+}+++#ifdef MEMORY_CONTEXT_CHECKING++/*+ * AllocSetCheck+ * Walk through chunks and check consistency of memory.+ *+ * NOTE: report errors as WARNING, *not* ERROR or FATAL. Otherwise you'll+ * find yourself in an infinite loop when trouble occurs, because this+ * routine will be entered again when elog cleanup tries to release memory!+ */+static void+AllocSetCheck(MemoryContext context)+{+ AllocSet set = (AllocSet) context;+ char *name = set->header.name;+ AllocBlock block;++ for (block = set->blocks; block != NULL; block = block->next)+ {+ char *bpoz = ((char *) block) + ALLOC_BLOCKHDRSZ;+ long blk_used = block->freeptr - bpoz;+ long blk_data = 0;+ long nchunks = 0;++ /*+ * Empty block - empty can be keeper-block only+ */+ if (!blk_used)+ {+ if (set->keeper != block)+ elog(WARNING, "problem in alloc set %s: empty block %p",+ name, block);+ }++ /*+ * Chunk walker+ */+ while (bpoz < block->freeptr)+ {+ AllocChunk chunk = (AllocChunk) bpoz;+ Size chsize,+ dsize;++ chsize = chunk->size; /* aligned chunk size */+ VALGRIND_MAKE_MEM_DEFINED(&chunk->requested_size,+ sizeof(chunk->requested_size));+ dsize = chunk->requested_size; /* real data */+ if (dsize > 0) /* not on a free list */+ VALGRIND_MAKE_MEM_NOACCESS(&chunk->requested_size,+ sizeof(chunk->requested_size));++ /*+ * Check chunk size+ */+ if (dsize > chsize)+ elog(WARNING, "problem in alloc set %s: req size > alloc size for chunk %p in block %p",+ name, chunk, block);+ if (chsize < (1 << ALLOC_MINBITS))+ elog(WARNING, "problem in alloc set %s: bad size %zu for chunk %p in block %p",+ name, chsize, chunk, block);++ /* single-chunk block? */+ if (chsize > set->allocChunkLimit &&+ chsize + ALLOC_CHUNKHDRSZ != blk_used)+ elog(WARNING, "problem in alloc set %s: bad single-chunk %p in block %p",+ name, chunk, block);++ /*+ * If chunk is allocated, check for correct aset pointer. (If it's+ * free, the aset is the freelist pointer, which we can't check as+ * easily...)+ */+ if (dsize > 0 && chunk->aset != (void *) set)+ elog(WARNING, "problem in alloc set %s: bogus aset link in block %p, chunk %p",+ name, block, chunk);++ /*+ * Check for overwrite of "unallocated" space in chunk+ */+ if (dsize > 0 && dsize < chsize &&+ !sentinel_ok(chunk, ALLOC_CHUNKHDRSZ + dsize))+ elog(WARNING, "problem in alloc set %s: detected write past chunk end in block %p, chunk %p",+ name, block, chunk);++ blk_data += chsize;+ nchunks++;++ bpoz += ALLOC_CHUNKHDRSZ + chsize;+ }++ if ((blk_data + (nchunks * ALLOC_CHUNKHDRSZ)) != blk_used)+ elog(WARNING, "problem in alloc set %s: found inconsistent memory block %p",+ name, block);+ }+}++#endif /* MEMORY_CONTEXT_CHECKING */
+ foreign/libpg_query/src/postgres/src_backend_utils_mmgr_mcxt.c view
@@ -0,0 +1,886 @@+/*--------------------------------------------------------------------+ * Symbols referenced in this file:+ * - ErrorContext+ * - MemoryContextReset+ * - MemoryContextDeleteChildren+ * - MemoryContextDelete+ * - MemoryContextSetParent+ * - pfree+ * - MemoryContextCallResetCallbacks+ * - MemoryContextResetOnly+ * - repalloc+ * - MemoryContextStats+ * - MemoryContextStatsInternal+ * - TopMemoryContext+ * - pstrdup+ * - MemoryContextStrdup+ * - MemoryContextAlloc+ * - CurrentMemoryContext+ * - palloc+ * - MemoryContextAllocZeroAligned+ * - MemoryContextAllocZero+ * - palloc0+ * - MemoryContextCreate+ * - MemoryContextInit+ * - MemoryContextAllowInCriticalSection+ * - CurrentMemoryContext+ * - MemoryContextDelete+ * - palloc0+ *--------------------------------------------------------------------+ */++/*-------------------------------------------------------------------------+ *+ * mcxt.c+ * POSTGRES memory context management code.+ *+ * This module handles context management operations that are independent+ * of the particular kind of context being operated on. It calls+ * context-type-specific operations via the function pointers in a+ * context's MemoryContextMethods struct.+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ *+ * IDENTIFICATION+ * src/backend/utils/mmgr/mcxt.c+ *+ *-------------------------------------------------------------------------+ */++/* see palloc.h. Must be before postgres.h */+#define MCXT_INCLUDE_DEFINITIONS++#include "postgres.h"++#include "miscadmin.h"+#include "utils/memdebug.h"+#include "utils/memutils.h"+++/*****************************************************************************+ * GLOBAL MEMORY *+ *****************************************************************************/++/*+ * CurrentMemoryContext+ * Default memory context for allocations.+ */+__thread MemoryContext CurrentMemoryContext = NULL;+++/*+ * Standard top-level contexts. For a description of the purpose of each+ * of these contexts, refer to src/backend/utils/mmgr/README+ */+__thread MemoryContext TopMemoryContext = NULL;++__thread MemoryContext ErrorContext = NULL;++++++++/* This is a transient link to the active portal's memory context: */+++static void MemoryContextCallResetCallbacks(MemoryContext context);+static void MemoryContextStatsInternal(MemoryContext context, int level);++/*+ * You should not do memory allocations within a critical section, because+ * an out-of-memory error will be escalated to a PANIC. To enforce that+ * rule, the allocation functions Assert that.+ */+#define AssertNotInCriticalSection(context) \+ Assert(CritSectionCount == 0 || (context)->allowInCritSection)++/*****************************************************************************+ * EXPORTED ROUTINES *+ *****************************************************************************/+++/*+ * MemoryContextInit+ * Start up the memory-context subsystem.+ *+ * This must be called before creating contexts or allocating memory in+ * contexts. TopMemoryContext and ErrorContext are initialized here;+ * other contexts must be created afterwards.+ *+ * In normal multi-backend operation, this is called once during+ * postmaster startup, and not at all by individual backend startup+ * (since the backends inherit an already-initialized context subsystem+ * by virtue of being forked off the postmaster). But in an EXEC_BACKEND+ * build, each process must do this for itself.+ *+ * In a standalone backend this must be called during backend startup.+ */+void+MemoryContextInit(void)+{+ AssertState(TopMemoryContext == NULL);++ /*+ * Initialize TopMemoryContext as an AllocSetContext with slow growth rate+ * --- we don't really expect much to be allocated in it.+ *+ * (There is special-case code in MemoryContextCreate() for this call.)+ */+ TopMemoryContext = AllocSetContextCreate((MemoryContext) NULL,+ "TopMemoryContext",+ 0,+ 8 * 1024,+ 8 * 1024);++ /*+ * Not having any other place to point CurrentMemoryContext, make it point+ * to TopMemoryContext. Caller should change this soon!+ */+ CurrentMemoryContext = TopMemoryContext;++ /*+ * Initialize ErrorContext as an AllocSetContext with slow growth rate ---+ * we don't really expect much to be allocated in it. More to the point,+ * require it to contain at least 8K at all times. This is the only case+ * where retained memory in a context is *essential* --- we want to be+ * sure ErrorContext still has some memory even if we've run out+ * elsewhere! Also, allow allocations in ErrorContext within a critical+ * section. Otherwise a PANIC will cause an assertion failure in the error+ * reporting code, before printing out the real cause of the failure.+ *+ * This should be the last step in this function, as elog.c assumes memory+ * management works once ErrorContext is non-null.+ */+ ErrorContext = AllocSetContextCreate(TopMemoryContext,+ "ErrorContext",+ 8 * 1024,+ 8 * 1024,+ 8 * 1024);+ MemoryContextAllowInCriticalSection(ErrorContext, true);+}++/*+ * MemoryContextReset+ * Release all space allocated within a context and delete all its+ * descendant contexts (but not the named context itself).+ */+void+MemoryContextReset(MemoryContext context)+{+ AssertArg(MemoryContextIsValid(context));++ /* save a function call in common case where there are no children */+ if (context->firstchild != NULL)+ MemoryContextDeleteChildren(context);++ /* save a function call if no pallocs since startup or last reset */+ if (!context->isReset)+ MemoryContextResetOnly(context);+}++/*+ * MemoryContextResetOnly+ * Release all space allocated within a context.+ * Nothing is done to the context's descendant contexts.+ */+void+MemoryContextResetOnly(MemoryContext context)+{+ AssertArg(MemoryContextIsValid(context));++ /* Nothing to do if no pallocs since startup or last reset */+ if (!context->isReset)+ {+ MemoryContextCallResetCallbacks(context);+ (*context->methods->reset) (context);+ context->isReset = true;+ VALGRIND_DESTROY_MEMPOOL(context);+ VALGRIND_CREATE_MEMPOOL(context, 0, false);+ }+}++/*+ * MemoryContextResetChildren+ * Release all space allocated within a context's descendants,+ * but don't delete the contexts themselves. The named context+ * itself is not touched.+ */+++/*+ * MemoryContextDelete+ * Delete a context and its descendants, and release all space+ * allocated therein.+ *+ * The type-specific delete routine removes all subsidiary storage+ * for the context, but we have to delete the context node itself,+ * as well as recurse to get the children. We must also delink the+ * node from its parent, if it has one.+ */+void+MemoryContextDelete(MemoryContext context)+{+ AssertArg(MemoryContextIsValid(context));+ /* We had better not be deleting TopMemoryContext ... */+ Assert(context != TopMemoryContext);+ /* And not CurrentMemoryContext, either */+ Assert(context != CurrentMemoryContext);++ MemoryContextDeleteChildren(context);++ /*+ * It's not entirely clear whether 'tis better to do this before or after+ * delinking the context; but an error in a callback will likely result in+ * leaking the whole context (if it's not a root context) if we do it+ * after, so let's do it before.+ */+ MemoryContextCallResetCallbacks(context);++ /*+ * We delink the context from its parent before deleting it, so that if+ * there's an error we won't have deleted/busted contexts still attached+ * to the context tree. Better a leak than a crash.+ */+ MemoryContextSetParent(context, NULL);++ (*context->methods->delete_context) (context);+ VALGRIND_DESTROY_MEMPOOL(context);+ pfree(context);+}++/*+ * MemoryContextDeleteChildren+ * Delete all the descendants of the named context and release all+ * space allocated therein. The named context itself is not touched.+ */+void+MemoryContextDeleteChildren(MemoryContext context)+{+ AssertArg(MemoryContextIsValid(context));++ /*+ * MemoryContextDelete will delink the child from me, so just iterate as+ * long as there is a child.+ */+ while (context->firstchild != NULL)+ MemoryContextDelete(context->firstchild);+}++/*+ * MemoryContextRegisterResetCallback+ * Register a function to be called before next context reset/delete.+ * Such callbacks will be called in reverse order of registration.+ *+ * The caller is responsible for allocating a MemoryContextCallback struct+ * to hold the info about this callback request, and for filling in the+ * "func" and "arg" fields in the struct to show what function to call with+ * what argument. Typically the callback struct should be allocated within+ * the specified context, since that means it will automatically be freed+ * when no longer needed.+ *+ * There is no API for deregistering a callback once registered. If you+ * want it to not do anything anymore, adjust the state pointed to by its+ * "arg" to indicate that.+ */+++/*+ * MemoryContextCallResetCallbacks+ * Internal function to call all registered callbacks for context.+ */+static void+MemoryContextCallResetCallbacks(MemoryContext context)+{+ MemoryContextCallback *cb;++ /*+ * We pop each callback from the list before calling. That way, if an+ * error occurs inside the callback, we won't try to call it a second time+ * in the likely event that we reset or delete the context later.+ */+ while ((cb = context->reset_cbs) != NULL)+ {+ context->reset_cbs = cb->next;+ (*cb->func) (cb->arg);+ }+}++/*+ * MemoryContextSetParent+ * Change a context to belong to a new parent (or no parent).+ *+ * We provide this as an API function because it is sometimes useful to+ * change a context's lifespan after creation. For example, a context+ * might be created underneath a transient context, filled with data,+ * and then reparented underneath CacheMemoryContext to make it long-lived.+ * In this way no special effort is needed to get rid of the context in case+ * a failure occurs before its contents are completely set up.+ *+ * Callers often assume that this function cannot fail, so don't put any+ * elog(ERROR) calls in it.+ *+ * A possible caller error is to reparent a context under itself, creating+ * a loop in the context graph. We assert here that context != new_parent,+ * but checking for multi-level loops seems more trouble than it's worth.+ */+void+MemoryContextSetParent(MemoryContext context, MemoryContext new_parent)+{+ AssertArg(MemoryContextIsValid(context));+ AssertArg(context != new_parent);++ /* Fast path if it's got correct parent already */+ if (new_parent == context->parent)+ return;++ /* Delink from existing parent, if any */+ if (context->parent)+ {+ MemoryContext parent = context->parent;++ if (context == parent->firstchild)+ parent->firstchild = context->nextchild;+ else+ {+ MemoryContext child;++ for (child = parent->firstchild; child; child = child->nextchild)+ {+ if (context == child->nextchild)+ {+ child->nextchild = context->nextchild;+ break;+ }+ }+ }+ }++ /* And relink */+ if (new_parent)+ {+ AssertArg(MemoryContextIsValid(new_parent));+ context->parent = new_parent;+ context->nextchild = new_parent->firstchild;+ new_parent->firstchild = context;+ }+ else+ {+ context->parent = NULL;+ context->nextchild = NULL;+ }+}++/*+ * MemoryContextAllowInCriticalSection+ * Allow/disallow allocations in this memory context within a critical+ * section.+ *+ * Normally, memory allocations are not allowed within a critical section,+ * because a failure would lead to PANIC. There are a few exceptions to+ * that, like allocations related to debugging code that is not supposed to+ * be enabled in production. This function can be used to exempt specific+ * memory contexts from the assertion in palloc().+ */+void+MemoryContextAllowInCriticalSection(MemoryContext context, bool allow)+{+ AssertArg(MemoryContextIsValid(context));++ context->allowInCritSection = allow;+}++/*+ * GetMemoryChunkSpace+ * Given a currently-allocated chunk, determine the total space+ * it occupies (including all memory-allocation overhead).+ *+ * This is useful for measuring the total space occupied by a set of+ * allocated chunks.+ */+++/*+ * GetMemoryChunkContext+ * Given a currently-allocated chunk, determine the context+ * it belongs to.+ */+++/*+ * MemoryContextGetParent+ * Get the parent context (if any) of the specified context+ */+++/*+ * MemoryContextIsEmpty+ * Is a memory context empty of any allocated space?+ */+++/*+ * MemoryContextStats+ * Print statistics about the named context and all its descendants.+ *+ * This is just a debugging utility, so it's not fancy. The statistics+ * are merely sent to stderr.+ */+void+MemoryContextStats(MemoryContext context)+{+ MemoryContextStatsInternal(context, 0);+}++static void+MemoryContextStatsInternal(MemoryContext context, int level)+{+ MemoryContext child;++ AssertArg(MemoryContextIsValid(context));++ (*context->methods->stats) (context, level);+ for (child = context->firstchild; child != NULL; child = child->nextchild)+ MemoryContextStatsInternal(child, level + 1);+}++/*+ * MemoryContextCheck+ * Check all chunks in the named context.+ *+ * This is just a debugging utility, so it's not fancy.+ */+#ifdef MEMORY_CONTEXT_CHECKING+void+MemoryContextCheck(MemoryContext context)+{+ MemoryContext child;++ AssertArg(MemoryContextIsValid(context));++ (*context->methods->check) (context);+ for (child = context->firstchild; child != NULL; child = child->nextchild)+ MemoryContextCheck(child);+}+#endif++/*+ * MemoryContextContains+ * Detect whether an allocated chunk of memory belongs to a given+ * context or not.+ *+ * Caution: this test is reliable as long as 'pointer' does point to+ * a chunk of memory allocated from *some* context. If 'pointer' points+ * at memory obtained in some other way, there is a small chance of a+ * false-positive result, since the bits right before it might look like+ * a valid chunk header by chance.+ */+++/*--------------------+ * MemoryContextCreate+ * Context-type-independent part of context creation.+ *+ * This is only intended to be called by context-type-specific+ * context creation routines, not by the unwashed masses.+ *+ * The context creation procedure is a little bit tricky because+ * we want to be sure that we don't leave the context tree invalid+ * in case of failure (such as insufficient memory to allocate the+ * context node itself). The procedure goes like this:+ * 1. Context-type-specific routine first calls MemoryContextCreate(),+ * passing the appropriate tag/size/methods values (the methods+ * pointer will ordinarily point to statically allocated data).+ * The parent and name parameters usually come from the caller.+ * 2. MemoryContextCreate() attempts to allocate the context node,+ * plus space for the name. If this fails we can ereport() with no+ * damage done.+ * 3. We fill in all of the type-independent MemoryContext fields.+ * 4. We call the type-specific init routine (using the methods pointer).+ * The init routine is required to make the node minimally valid+ * with zero chance of failure --- it can't allocate more memory,+ * for example.+ * 5. Now we have a minimally valid node that can behave correctly+ * when told to reset or delete itself. We link the node to its+ * parent (if any), making the node part of the context tree.+ * 6. We return to the context-type-specific routine, which finishes+ * up type-specific initialization. This routine can now do things+ * that might fail (like allocate more memory), so long as it's+ * sure the node is left in a state that delete will handle.+ *+ * This protocol doesn't prevent us from leaking memory if step 6 fails+ * during creation of a top-level context, since there's no parent link+ * in that case. However, if you run out of memory while you're building+ * a top-level context, you might as well go home anyway...+ *+ * Normally, the context node and the name are allocated from+ * TopMemoryContext (NOT from the parent context, since the node must+ * survive resets of its parent context!). However, this routine is itself+ * used to create TopMemoryContext! If we see that TopMemoryContext is NULL,+ * we assume we are creating TopMemoryContext and use malloc() to allocate+ * the node.+ *+ * Note that the name field of a MemoryContext does not point to+ * separately-allocated storage, so it should not be freed at context+ * deletion.+ *--------------------+ */+MemoryContext+MemoryContextCreate(NodeTag tag, Size size,+ MemoryContextMethods *methods,+ MemoryContext parent,+ const char *name)+{+ MemoryContext node;+ Size needed = size + strlen(name) + 1;++ /* creating new memory contexts is not allowed in a critical section */+ Assert(CritSectionCount == 0);++ /* Get space for node and name */+ if (TopMemoryContext != NULL)+ {+ /* Normal case: allocate the node in TopMemoryContext */+ node = (MemoryContext) MemoryContextAlloc(TopMemoryContext,+ needed);+ }+ else+ {+ /* Special case for startup: use good ol' malloc */+ node = (MemoryContext) malloc(needed);+ Assert(node != NULL);+ }++ /* Initialize the node as best we can */+ MemSet(node, 0, size);+ node->type = tag;+ node->methods = methods;+ node->parent = NULL; /* for the moment */+ node->firstchild = NULL;+ node->nextchild = NULL;+ node->isReset = true;+ node->name = ((char *) node) + size;+ strcpy(node->name, name);++ /* Type-specific routine finishes any other essential initialization */+ (*node->methods->init) (node);++ /* OK to link node to parent (if any) */+ /* Could use MemoryContextSetParent here, but doesn't seem worthwhile */+ if (parent)+ {+ node->parent = parent;+ node->nextchild = parent->firstchild;+ parent->firstchild = node;+ /* inherit allowInCritSection flag from parent */+ node->allowInCritSection = parent->allowInCritSection;+ }++ VALGRIND_CREATE_MEMPOOL(node, 0, false);++ /* Return to type-specific creation routine to finish up */+ return node;+}++/*+ * MemoryContextAlloc+ * Allocate space within the specified context.+ *+ * This could be turned into a macro, but we'd have to import+ * nodes/memnodes.h into postgres.h which seems a bad idea.+ */+void *+MemoryContextAlloc(MemoryContext context, Size size)+{+ void *ret;++ AssertArg(MemoryContextIsValid(context));+ AssertNotInCriticalSection(context);++ if (!AllocSizeIsValid(size))+ elog(ERROR, "invalid memory alloc request size %zu", size);++ context->isReset = false;++ ret = (*context->methods->alloc) (context, size);+ if (ret == NULL)+ {+ MemoryContextStats(TopMemoryContext);+ ereport(ERROR,+ (errcode(ERRCODE_OUT_OF_MEMORY),+ errmsg("out of memory"),+ errdetail("Failed on request of size %zu.", size)));+ }++ VALGRIND_MEMPOOL_ALLOC(context, ret, size);++ return ret;+}++/*+ * MemoryContextAllocZero+ * Like MemoryContextAlloc, but clears allocated memory+ *+ * We could just call MemoryContextAlloc then clear the memory, but this+ * is a very common combination, so we provide the combined operation.+ */+void *+MemoryContextAllocZero(MemoryContext context, Size size)+{+ void *ret;++ AssertArg(MemoryContextIsValid(context));+ AssertNotInCriticalSection(context);++ if (!AllocSizeIsValid(size))+ elog(ERROR, "invalid memory alloc request size %zu", size);++ context->isReset = false;++ ret = (*context->methods->alloc) (context, size);+ if (ret == NULL)+ {+ MemoryContextStats(TopMemoryContext);+ ereport(ERROR,+ (errcode(ERRCODE_OUT_OF_MEMORY),+ errmsg("out of memory"),+ errdetail("Failed on request of size %zu.", size)));+ }++ VALGRIND_MEMPOOL_ALLOC(context, ret, size);++ MemSetAligned(ret, 0, size);++ return ret;+}++/*+ * MemoryContextAllocZeroAligned+ * MemoryContextAllocZero where length is suitable for MemSetLoop+ *+ * This might seem overly specialized, but it's not because newNode()+ * is so often called with compile-time-constant sizes.+ */+void *+MemoryContextAllocZeroAligned(MemoryContext context, Size size)+{+ void *ret;++ AssertArg(MemoryContextIsValid(context));+ AssertNotInCriticalSection(context);++ if (!AllocSizeIsValid(size))+ elog(ERROR, "invalid memory alloc request size %zu", size);++ context->isReset = false;++ ret = (*context->methods->alloc) (context, size);+ if (ret == NULL)+ {+ MemoryContextStats(TopMemoryContext);+ ereport(ERROR,+ (errcode(ERRCODE_OUT_OF_MEMORY),+ errmsg("out of memory"),+ errdetail("Failed on request of size %zu.", size)));+ }++ VALGRIND_MEMPOOL_ALLOC(context, ret, size);++ MemSetLoop(ret, 0, size);++ return ret;+}++/*+ * MemoryContextAllocExtended+ * Allocate space within the specified context using the given flags.+ */+++void *+palloc(Size size)+{+ /* duplicates MemoryContextAlloc to avoid increased overhead */+ void *ret;++ AssertArg(MemoryContextIsValid(CurrentMemoryContext));+ AssertNotInCriticalSection(CurrentMemoryContext);++ if (!AllocSizeIsValid(size))+ elog(ERROR, "invalid memory alloc request size %zu", size);++ CurrentMemoryContext->isReset = false;++ ret = (*CurrentMemoryContext->methods->alloc) (CurrentMemoryContext, size);+ if (ret == NULL)+ {+ MemoryContextStats(TopMemoryContext);+ ereport(ERROR,+ (errcode(ERRCODE_OUT_OF_MEMORY),+ errmsg("out of memory"),+ errdetail("Failed on request of size %zu.", size)));+ }++ VALGRIND_MEMPOOL_ALLOC(CurrentMemoryContext, ret, size);++ return ret;+}++void *+palloc0(Size size)+{+ /* duplicates MemoryContextAllocZero to avoid increased overhead */+ void *ret;++ AssertArg(MemoryContextIsValid(CurrentMemoryContext));+ AssertNotInCriticalSection(CurrentMemoryContext);++ if (!AllocSizeIsValid(size))+ elog(ERROR, "invalid memory alloc request size %zu", size);++ CurrentMemoryContext->isReset = false;++ ret = (*CurrentMemoryContext->methods->alloc) (CurrentMemoryContext, size);+ if (ret == NULL)+ {+ MemoryContextStats(TopMemoryContext);+ ereport(ERROR,+ (errcode(ERRCODE_OUT_OF_MEMORY),+ errmsg("out of memory"),+ errdetail("Failed on request of size %zu.", size)));+ }++ VALGRIND_MEMPOOL_ALLOC(CurrentMemoryContext, ret, size);++ MemSetAligned(ret, 0, size);++ return ret;+}++++/*+ * pfree+ * Release an allocated chunk.+ */+void+pfree(void *pointer)+{+ MemoryContext context;++ /*+ * Try to detect bogus pointers handed to us, poorly though we can.+ * Presumably, a pointer that isn't MAXALIGNED isn't pointing at an+ * allocated chunk.+ */+ Assert(pointer != NULL);+ Assert(pointer == (void *) MAXALIGN(pointer));++ /*+ * OK, it's probably safe to look at the chunk header.+ */+ context = ((StandardChunkHeader *)+ ((char *) pointer - STANDARDCHUNKHEADERSIZE))->context;++ AssertArg(MemoryContextIsValid(context));++ (*context->methods->free_p) (context, pointer);+ VALGRIND_MEMPOOL_FREE(context, pointer);+}++/*+ * repalloc+ * Adjust the size of a previously allocated chunk.+ */+void *+repalloc(void *pointer, Size size)+{+ MemoryContext context;+ void *ret;++ if (!AllocSizeIsValid(size))+ elog(ERROR, "invalid memory alloc request size %zu", size);++ /*+ * Try to detect bogus pointers handed to us, poorly though we can.+ * Presumably, a pointer that isn't MAXALIGNED isn't pointing at an+ * allocated chunk.+ */+ Assert(pointer != NULL);+ Assert(pointer == (void *) MAXALIGN(pointer));++ /*+ * OK, it's probably safe to look at the chunk header.+ */+ context = ((StandardChunkHeader *)+ ((char *) pointer - STANDARDCHUNKHEADERSIZE))->context;++ AssertArg(MemoryContextIsValid(context));+ AssertNotInCriticalSection(context);++ /* isReset must be false already */+ Assert(!context->isReset);++ ret = (*context->methods->realloc) (context, pointer, size);+ if (ret == NULL)+ {+ MemoryContextStats(TopMemoryContext);+ ereport(ERROR,+ (errcode(ERRCODE_OUT_OF_MEMORY),+ errmsg("out of memory"),+ errdetail("Failed on request of size %zu.", size)));+ }++ VALGRIND_MEMPOOL_CHANGE(context, pointer, ret, size);++ return ret;+}++/*+ * MemoryContextAllocHuge+ * Allocate (possibly-expansive) space within the specified context.+ *+ * See considerations in comment at MaxAllocHugeSize.+ */+++/*+ * repalloc_huge+ * Adjust the size of a previously allocated chunk, permitting a large+ * value. The previous allocation need not have been "huge".+ */+++/*+ * MemoryContextStrdup+ * Like strdup(), but allocate from the specified context+ */+char *+MemoryContextStrdup(MemoryContext context, const char *string)+{+ char *nstr;+ Size len = strlen(string) + 1;++ nstr = (char *) MemoryContextAlloc(context, len);++ memcpy(nstr, string, len);++ return nstr;+}++char *+pstrdup(const char *in)+{+ return MemoryContextStrdup(CurrentMemoryContext, in);+}++/*+ * pnstrdup+ * Like pstrdup(), but append null byte to a+ * not-necessarily-null-terminated input string.+ */+
+ foreign/libpg_query/src/postgres/src_common_psprintf.c view
@@ -0,0 +1,197 @@+/*--------------------------------------------------------------------+ * Symbols referenced in this file:+ * - pvsnprintf+ * - psprintf+ *--------------------------------------------------------------------+ */++/*-------------------------------------------------------------------------+ *+ * psprintf.c+ * sprintf into an allocated-on-demand buffer+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ *+ * IDENTIFICATION+ * src/common/psprintf.c+ *+ *-------------------------------------------------------------------------+ */++#ifndef FRONTEND++#include "postgres.h"++#include "utils/memutils.h"++#else++#include "postgres_fe.h"++/* It's possible we could use a different value for this in frontend code */+#define MaxAllocSize ((Size) 0x3fffffff) /* 1 gigabyte - 1 */++#endif+++/*+ * psprintf+ *+ * Format text data under the control of fmt (an sprintf-style format string)+ * and return it in an allocated-on-demand buffer. The buffer is allocated+ * with palloc in the backend, or malloc in frontend builds. Caller is+ * responsible to free the buffer when no longer needed, if appropriate.+ *+ * Errors are not returned to the caller, but are reported via elog(ERROR)+ * in the backend, or printf-to-stderr-and-exit() in frontend builds.+ * One should therefore think twice about using this in libpq.+ */+char *+psprintf(const char *fmt,...)+{+ size_t len = 128; /* initial assumption about buffer size */++ for (;;)+ {+ char *result;+ va_list args;+ size_t newlen;++ /*+ * Allocate result buffer. Note that in frontend this maps to malloc+ * with exit-on-error.+ */+ result = (char *) palloc(len);++ /* Try to format the data. */+ va_start(args, fmt);+ newlen = pvsnprintf(result, len, fmt, args);+ va_end(args);++ if (newlen < len)+ return result; /* success */++ /* Release buffer and loop around to try again with larger len. */+ pfree(result);+ len = newlen;+ }+}++/*+ * pvsnprintf+ *+ * Attempt to format text data under the control of fmt (an sprintf-style+ * format string) and insert it into buf (which has length len, len > 0).+ *+ * If successful, return the number of bytes emitted, not counting the+ * trailing zero byte. This will always be strictly less than len.+ *+ * If there's not enough space in buf, return an estimate of the buffer size+ * needed to succeed (this *must* be more than the given len, else callers+ * might loop infinitely).+ *+ * Other error cases do not return, but exit via elog(ERROR) or exit().+ * Hence, this shouldn't be used inside libpq.+ *+ * This function exists mainly to centralize our workarounds for+ * non-C99-compliant vsnprintf implementations. Generally, any call that+ * pays any attention to the return value should go through here rather+ * than calling snprintf or vsnprintf directly.+ *+ * Note that the semantics of the return value are not exactly C99's.+ * First, we don't promise that the estimated buffer size is exactly right;+ * callers must be prepared to loop multiple times to get the right size.+ * Second, we return the recommended buffer size, not one less than that;+ * this lets overflow concerns be handled here rather than in the callers.+ */+size_t+pvsnprintf(char *buf, size_t len, const char *fmt, va_list args)+{+ int nprinted;++ Assert(len > 0);++ errno = 0;++ /*+ * Assert check here is to catch buggy vsnprintf that overruns the+ * specified buffer length. Solaris 7 in 64-bit mode is an example of a+ * platform with such a bug.+ */+#ifdef USE_ASSERT_CHECKING+ buf[len - 1] = '\0';+#endif++ nprinted = vsnprintf(buf, len, fmt, args);++ Assert(buf[len - 1] == '\0');++ /*+ * If vsnprintf reports an error other than ENOMEM, fail. The possible+ * causes of this are not user-facing errors, so elog should be enough.+ */+ if (nprinted < 0 && errno != 0 && errno != ENOMEM)+ {+#ifndef FRONTEND+ elog(ERROR, "vsnprintf failed: %m");+#else+ fprintf(stderr, "vsnprintf failed: %s\n", strerror(errno));+ exit(EXIT_FAILURE);+#endif+ }++ /*+ * Note: some versions of vsnprintf return the number of chars actually+ * stored, not the total space needed as C99 specifies. And at least one+ * returns -1 on failure. Be conservative about believing whether the+ * print worked.+ */+ if (nprinted >= 0 && (size_t) nprinted < len - 1)+ {+ /* Success. Note nprinted does not include trailing null. */+ return (size_t) nprinted;+ }++ if (nprinted >= 0 && (size_t) nprinted > len)+ {+ /*+ * This appears to be a C99-compliant vsnprintf, so believe its+ * estimate of the required space. (If it's wrong, the logic will+ * still work, but we may loop multiple times.) Note that the space+ * needed should be only nprinted+1 bytes, but we'd better allocate+ * one more than that so that the test above will succeed next time.+ *+ * In the corner case where the required space just barely overflows,+ * fall through so that we'll error out below (possibly after+ * looping).+ */+ if ((size_t) nprinted <= MaxAllocSize - 2)+ return nprinted + 2;+ }++ /*+ * Buffer overrun, and we don't know how much space is needed. Estimate+ * twice the previous buffer size, but not more than MaxAllocSize; if we+ * are already at MaxAllocSize, choke. Note we use this palloc-oriented+ * overflow limit even when in frontend.+ */+ if (len >= MaxAllocSize)+ {+#ifndef FRONTEND+ ereport(ERROR,+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),+ errmsg("out of memory")));+#else+ fprintf(stderr, _("out of memory\n"));+ exit(EXIT_FAILURE);+#endif+ }++ if (len >= MaxAllocSize / 2)+ return MaxAllocSize;++ return len * 2;+}
+ foreign/libpg_query/src/postgres/src_pl_plpgsql_src_pl_comp.c view
@@ -0,0 +1,1114 @@+/*--------------------------------------------------------------------+ * Symbols referenced in this file:+ * - plpgsql_compile_inline+ * - plpgsql_error_funcname+ * - plpgsql_check_syntax+ * - plpgsql_curr_compile+ * - compile_tmp_cxt+ * - plpgsql_DumpExecTree+ * - plpgsql_nDatums+ * - plpgsql_Datums+ * - plpgsql_build_variable+ * - plpgsql_adddatum+ * - plpgsql_build_record+ * - build_row_from_class+ * - plpgsql_build_datatype+ * - plpgsql_parse_tripword+ * - plpgsql_parse_dblword+ * - plpgsql_parse_word+ * - plpgsql_add_initdatums+ * - plpgsql_recognize_err_condition+ * - exception_label_map+ * - plpgsql_parse_err_condition+ * - plpgsql_parse_wordtype+ * - plpgsql_parse_wordrowtype+ * - plpgsql_parse_cwordtype+ * - plpgsql_parse_cwordrowtype+ * - plpgsql_parse_result+ * - plpgsql_compile_error_callback+ * - datums_alloc+ * - datums_last+ * - add_dummy_return+ *--------------------------------------------------------------------+ */++/*-------------------------------------------------------------------------+ *+ * pl_comp.c - Compiler part of the PL/pgSQL+ * procedural language+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ *+ * IDENTIFICATION+ * src/pl/plpgsql/src/pl_comp.c+ *+ *-------------------------------------------------------------------------+ */++#include "plpgsql.h"++#include <ctype.h>++#include "access/htup_details.h"+#include "catalog/namespace.h"+#include "catalog/pg_proc.h"+#include "catalog/pg_proc_fn.h"+#include "catalog/pg_type.h"+#include "funcapi.h"+#include "nodes/makefuncs.h"+#include "parser/parse_type.h"+#include "utils/builtins.h"+#include "utils/guc.h"+#include "utils/lsyscache.h"+#include "utils/memutils.h"+#include "utils/rel.h"+#include "utils/syscache.h"+++/* ----------+ * Our own local and global variables+ * ----------+ */+__thread PLpgSQL_stmt_block *plpgsql_parse_result;+++static int datums_alloc;+__thread int plpgsql_nDatums;++__thread PLpgSQL_datum **plpgsql_Datums;++static int datums_last = 0;++__thread char *plpgsql_error_funcname;++__thread bool plpgsql_DumpExecTree = false;++__thread bool plpgsql_check_syntax = false;+++__thread PLpgSQL_function *plpgsql_curr_compile;+++/* A context appropriate for short-term allocs during compilation */+__thread MemoryContext compile_tmp_cxt;+++/* ----------+ * Hash table for compiled functions+ * ----------+ */+++typedef struct plpgsql_hashent+{+ PLpgSQL_func_hashkey key;+ PLpgSQL_function *function;+} plpgsql_HashEnt;++#define FUNCS_PER_USER 128 /* initial table size */++/* ----------+ * Lookup table for EXCEPTION condition names+ * ----------+ */+typedef struct+{+ const char *label;+ int sqlerrstate;+} ExceptionLabelMap;++static const ExceptionLabelMap exception_label_map[] = {+#include "plerrcodes.h" /* pgrminclude ignore */+ {NULL, 0}+};+++/* ----------+ * static prototypes+ * ----------+ */+static PLpgSQL_function *do_compile(FunctionCallInfo fcinfo,+ HeapTuple procTup,+ PLpgSQL_function *function,+ PLpgSQL_func_hashkey *hashkey,+ bool forValidator);+static void plpgsql_compile_error_callback(void *arg);+static void add_parameter_name(int itemtype, int itemno, const char *name);+static void add_dummy_return(PLpgSQL_function *function);+static Node *plpgsql_pre_column_ref(ParseState *pstate, ColumnRef *cref);+static Node *plpgsql_post_column_ref(ParseState *pstate, ColumnRef *cref, Node *var);+static Node *plpgsql_param_ref(ParseState *pstate, ParamRef *pref);+static Node *resolve_column_ref(ParseState *pstate, PLpgSQL_expr *expr,+ ColumnRef *cref, bool error_if_no_field);+static Node *make_datum_param(PLpgSQL_expr *expr, int dno, int location);+static PLpgSQL_row *build_row_from_class(Oid classOid);+static PLpgSQL_row *build_row_from_vars(PLpgSQL_variable **vars, int numvars);+static PLpgSQL_type *build_datatype(HeapTuple typeTup, int32 typmod, Oid collation);+static void compute_function_hashkey(FunctionCallInfo fcinfo,+ Form_pg_proc procStruct,+ PLpgSQL_func_hashkey *hashkey,+ bool forValidator);+static void plpgsql_resolve_polymorphic_argtypes(int numargs,+ Oid *argtypes, char *argmodes,+ Node *call_expr, bool forValidator,+ const char *proname);+static PLpgSQL_function *plpgsql_HashTableLookup(PLpgSQL_func_hashkey *func_key);+static void plpgsql_HashTableInsert(PLpgSQL_function *function,+ PLpgSQL_func_hashkey *func_key);+static void plpgsql_HashTableDelete(PLpgSQL_function *function);+static void delete_function(PLpgSQL_function *func);++/* ----------+ * plpgsql_compile Make an execution tree for a PL/pgSQL function.+ *+ * If forValidator is true, we're only compiling for validation purposes,+ * and so some checks are skipped.+ *+ * Note: it's important for this to fall through quickly if the function+ * has already been compiled.+ * ----------+ */+++/*+ * This is the slow part of plpgsql_compile().+ *+ * The passed-in "function" pointer is either NULL or an already-allocated+ * function struct to overwrite.+ *+ * While compiling a function, the CurrentMemoryContext is the+ * per-function memory context of the function we are compiling. That+ * means a palloc() will allocate storage with the same lifetime as+ * the function itself.+ *+ * Because palloc()'d storage will not be immediately freed, temporary+ * allocations should either be performed in a short-lived memory+ * context or explicitly pfree'd. Since not all backend functions are+ * careful about pfree'ing their allocations, it is also wise to+ * switch into a short-term context before calling into the+ * backend. An appropriate context for performing short-term+ * allocations is the compile_tmp_cxt.+ *+ * NB: this code is not re-entrant. We assume that nothing we do here could+ * result in the invocation of another plpgsql function.+ */+++/* ----------+ * plpgsql_compile_inline Make an execution tree for an anonymous code block.+ *+ * Note: this is generally parallel to do_compile(); is it worth trying to+ * merge the two?+ *+ * Note: we assume the block will be thrown away so there is no need to build+ * persistent data structures.+ * ----------+ */+PLpgSQL_function *+plpgsql_compile_inline(char *proc_source)+{+ char *func_name = "inline_code_block";+ PLpgSQL_function *function;+ ErrorContextCallback plerrcontext;+ PLpgSQL_variable *var;+ int parse_rc;+ MemoryContext func_cxt;+ int i;++ /*+ * Setup the scanner input and error info. We assume that this function+ * cannot be invoked recursively, so there's no need to save and restore+ * the static variables used here.+ */+ plpgsql_scanner_init(proc_source);++ plpgsql_error_funcname = func_name;++ /*+ * Setup error traceback support for ereport()+ */+ plerrcontext.callback = plpgsql_compile_error_callback;+ plerrcontext.arg = proc_source;+ plerrcontext.previous = error_context_stack;+ error_context_stack = &plerrcontext;++ /* Do extra syntax checking if check_function_bodies is on */+ plpgsql_check_syntax = check_function_bodies;++ /* Function struct does not live past current statement */+ function = (PLpgSQL_function *) palloc0(sizeof(PLpgSQL_function));++ plpgsql_curr_compile = function;++ /*+ * All the rest of the compile-time storage (e.g. parse tree) is kept in+ * its own memory context, so it can be reclaimed easily.+ */+ func_cxt = AllocSetContextCreate(CurrentMemoryContext,+ "PL/pgSQL function context",+ ALLOCSET_DEFAULT_MINSIZE,+ ALLOCSET_DEFAULT_INITSIZE,+ ALLOCSET_DEFAULT_MAXSIZE);+ compile_tmp_cxt = MemoryContextSwitchTo(func_cxt);++ function->fn_signature = pstrdup(func_name);+ function->fn_is_trigger = PLPGSQL_NOT_TRIGGER;+ function->fn_input_collation = InvalidOid;+ function->fn_cxt = func_cxt;+ function->out_param_varno = -1; /* set up for no OUT param */+ function->resolve_option = plpgsql_variable_conflict;+ function->print_strict_params = plpgsql_print_strict_params;++ /*+ * don't do extra validation for inline code as we don't want to add spam+ * at runtime+ */+ function->extra_warnings = 0;+ function->extra_errors = 0;++ plpgsql_ns_init();+ plpgsql_ns_push(func_name);+ plpgsql_DumpExecTree = false;++ datums_alloc = 128;+ plpgsql_nDatums = 0;+ plpgsql_Datums = palloc(sizeof(PLpgSQL_datum *) * datums_alloc);+ datums_last = 0;++ /* Set up as though in a function returning VOID */+ function->fn_rettype = VOIDOID;+ function->fn_retset = false;+ function->fn_retistuple = false;+ /* a bit of hardwired knowledge about type VOID here */+ function->fn_retbyval = true;+ function->fn_rettyplen = sizeof(int32);++ /*+ * Remember if function is STABLE/IMMUTABLE. XXX would it be better to+ * set this TRUE inside a read-only transaction? Not clear.+ */+ function->fn_readonly = false;++ /*+ * Create the magic FOUND variable.+ */+ var = plpgsql_build_variable("found", 0,+ plpgsql_build_datatype(BOOLOID,+ -1,+ InvalidOid),+ true);+ function->found_varno = var->dno;++ /*+ * Now parse the function's text+ */+ parse_rc = plpgsql_yyparse();+ if (parse_rc != 0)+ elog(ERROR, "plpgsql parser returned %d", parse_rc);+ function->action = plpgsql_parse_result;++ plpgsql_scanner_finish();++ /*+ * If it returns VOID (always true at the moment), we allow control to+ * fall off the end without an explicit RETURN statement.+ */+ if (function->fn_rettype == VOIDOID)+ add_dummy_return(function);++ /*+ * Complete the function's info+ */+ function->fn_nargs = 0;+ function->ndatums = plpgsql_nDatums;+ function->datums = palloc(sizeof(PLpgSQL_datum *) * plpgsql_nDatums);+ for (i = 0; i < plpgsql_nDatums; i++)+ function->datums[i] = plpgsql_Datums[i];++ /*+ * Pop the error context stack+ */+ error_context_stack = plerrcontext.previous;+ plpgsql_error_funcname = NULL;++ plpgsql_check_syntax = false;++ MemoryContextSwitchTo(compile_tmp_cxt);+ compile_tmp_cxt = NULL;+ return function;+}+++/*+ * error context callback to let us supply a call-stack traceback.+ * If we are validating or executing an anonymous code block, the function+ * source text is passed as an argument.+ */+static void+plpgsql_compile_error_callback(void *arg)+{+ if (arg)+ {+ /*+ * Try to convert syntax error position to reference text of original+ * CREATE FUNCTION or DO command.+ */+ if (function_parse_error_transpose((const char *) arg))+ return;++ /*+ * Done if a syntax error position was reported; otherwise we have to+ * fall back to a "near line N" report.+ */+ }++ if (plpgsql_error_funcname)+ errcontext("compilation of PL/pgSQL function \"%s\" near line %d",+ plpgsql_error_funcname, plpgsql_latest_lineno());+}+++/*+ * Add a name for a function parameter to the function's namespace+ */+++/*+ * Add a dummy RETURN statement to the given function's body+ */+static void+add_dummy_return(PLpgSQL_function *function)+{+ /*+ * If the outer block has an EXCEPTION clause, we need to make a new outer+ * block, since the added RETURN shouldn't act like it is inside the+ * EXCEPTION clause.+ */+ if (function->action->exceptions != NULL)+ {+ PLpgSQL_stmt_block *new;++ new = palloc0(sizeof(PLpgSQL_stmt_block));+ new->cmd_type = PLPGSQL_STMT_BLOCK;+ new->body = list_make1(function->action);++ function->action = new;+ }+ if (function->action->body == NIL ||+ ((PLpgSQL_stmt *) llast(function->action->body))->cmd_type != PLPGSQL_STMT_RETURN)+ {+ PLpgSQL_stmt_return *new;++ new = palloc0(sizeof(PLpgSQL_stmt_return));+ new->cmd_type = PLPGSQL_STMT_RETURN;+ new->expr = NULL;+ new->retvarno = function->out_param_varno;++ function->action->body = lappend(function->action->body, new);+ }+}+++/*+ * plpgsql_parser_setup set up parser hooks for dynamic parameters+ *+ * Note: this routine, and the hook functions it prepares for, are logically+ * part of plpgsql parsing. But they actually run during function execution,+ * when we are ready to evaluate a SQL query or expression that has not+ * previously been parsed and planned.+ */+++/*+ * plpgsql_pre_column_ref parser callback before parsing a ColumnRef+ */+++/*+ * plpgsql_post_column_ref parser callback after parsing a ColumnRef+ */+++/*+ * plpgsql_param_ref parser callback for ParamRefs ($n symbols)+ */+++/*+ * resolve_column_ref attempt to resolve a ColumnRef as a plpgsql var+ *+ * Returns the translated node structure, or NULL if name not found+ *+ * error_if_no_field tells whether to throw error or quietly return NULL if+ * we are able to match a record/row name but don't find a field name match.+ */+++/*+ * Helper for columnref parsing: build a Param referencing a plpgsql datum,+ * and make sure that that datum is listed in the expression's paramnos.+ */++++/* ----------+ * plpgsql_parse_word The scanner calls this to postparse+ * any single word that is not a reserved keyword.+ *+ * word1 is the downcased/dequoted identifier; it must be palloc'd in the+ * function's long-term memory context.+ *+ * yytxt is the original token text; we need this to check for quoting,+ * so that later checks for unreserved keywords work properly.+ *+ * If recognized as a variable, fill in *wdatum and return TRUE;+ * if not recognized, fill in *word and return FALSE.+ * (Note: those two pointers actually point to members of the same union,+ * but for notational reasons we pass them separately.)+ * ----------+ */+bool+plpgsql_parse_word(char *word1, const char *yytxt,+ PLwdatum *wdatum, PLword *word)+{+ PLpgSQL_nsitem *ns;++ /*+ * We should do nothing in DECLARE sections. In SQL expressions, there's+ * no need to do anything either --- lookup will happen when the+ * expression is compiled.+ */+ if (plpgsql_IdentifierLookup == IDENTIFIER_LOOKUP_NORMAL)+ {+ /*+ * Do a lookup in the current namespace stack+ */+ ns = plpgsql_ns_lookup(plpgsql_ns_top(), false,+ word1, NULL, NULL,+ NULL);++ if (ns != NULL)+ {+ switch (ns->itemtype)+ {+ case PLPGSQL_NSTYPE_VAR:+ case PLPGSQL_NSTYPE_ROW:+ case PLPGSQL_NSTYPE_REC:+ wdatum->datum = plpgsql_Datums[ns->itemno];+ wdatum->ident = word1;+ wdatum->quoted = (yytxt[0] == '"');+ wdatum->idents = NIL;+ return true;++ default:+ /* plpgsql_ns_lookup should never return anything else */+ elog(ERROR, "unrecognized plpgsql itemtype: %d",+ ns->itemtype);+ }+ }+ }++ /*+ * Nothing found - up to now it's a word without any special meaning for+ * us.+ */+ word->ident = word1;+ word->quoted = (yytxt[0] == '"');+ return false;+}+++/* ----------+ * plpgsql_parse_dblword Same lookup for two words+ * separated by a dot.+ * ----------+ */+bool+plpgsql_parse_dblword(char *word1, char *word2,+ PLwdatum *wdatum, PLcword *cword)+{+ PLpgSQL_nsitem *ns;+ List *idents;+ int nnames;++ idents = list_make2(makeString(word1),+ makeString(word2));++ /*+ * We should do nothing in DECLARE sections. In SQL expressions, we+ * really only need to make sure that RECFIELD datums are created when+ * needed.+ */+ if (plpgsql_IdentifierLookup != IDENTIFIER_LOOKUP_DECLARE)+ {+ /*+ * Do a lookup in the current namespace stack+ */+ ns = plpgsql_ns_lookup(plpgsql_ns_top(), false,+ word1, word2, NULL,+ &nnames);+ if (ns != NULL)+ {+ switch (ns->itemtype)+ {+ case PLPGSQL_NSTYPE_VAR:+ /* Block-qualified reference to scalar variable. */+ wdatum->datum = plpgsql_Datums[ns->itemno];+ wdatum->ident = NULL;+ wdatum->quoted = false; /* not used */+ wdatum->idents = idents;+ return true;++ case PLPGSQL_NSTYPE_REC:+ if (nnames == 1)+ {+ /*+ * First word is a record name, so second word could+ * be a field in this record. We build a RECFIELD+ * datum whether it is or not --- any error will be+ * detected later.+ */+ PLpgSQL_recfield *new;++ new = palloc(sizeof(PLpgSQL_recfield));+ new->dtype = PLPGSQL_DTYPE_RECFIELD;+ new->fieldname = pstrdup(word2);+ new->recparentno = ns->itemno;++ plpgsql_adddatum((PLpgSQL_datum *) new);++ wdatum->datum = (PLpgSQL_datum *) new;+ }+ else+ {+ /* Block-qualified reference to record variable. */+ wdatum->datum = plpgsql_Datums[ns->itemno];+ }+ wdatum->ident = NULL;+ wdatum->quoted = false; /* not used */+ wdatum->idents = idents;+ return true;++ case PLPGSQL_NSTYPE_ROW:+ if (nnames == 1)+ {+ /*+ * First word is a row name, so second word could be a+ * field in this row. Again, no error now if it+ * isn't.+ */+ PLpgSQL_row *row;+ int i;++ row = (PLpgSQL_row *) (plpgsql_Datums[ns->itemno]);+ for (i = 0; i < row->nfields; i++)+ {+ if (row->fieldnames[i] &&+ strcmp(row->fieldnames[i], word2) == 0)+ {+ wdatum->datum = plpgsql_Datums[row->varnos[i]];+ wdatum->ident = NULL;+ wdatum->quoted = false; /* not used */+ wdatum->idents = idents;+ return true;+ }+ }+ /* fall through to return CWORD */+ }+ else+ {+ /* Block-qualified reference to row variable. */+ wdatum->datum = plpgsql_Datums[ns->itemno];+ wdatum->ident = NULL;+ wdatum->quoted = false; /* not used */+ wdatum->idents = idents;+ return true;+ }+ break;++ default:+ break;+ }+ }+ }++ /* Nothing found */+ cword->idents = idents;+ return false;+}+++/* ----------+ * plpgsql_parse_tripword Same lookup for three words+ * separated by dots.+ * ----------+ */+bool+plpgsql_parse_tripword(char *word1, char *word2, char *word3,+ PLwdatum *wdatum, PLcword *cword)+{+ PLpgSQL_nsitem *ns;+ List *idents;+ int nnames;++ idents = list_make3(makeString(word1),+ makeString(word2),+ makeString(word3));++ /*+ * We should do nothing in DECLARE sections. In SQL expressions, we+ * really only need to make sure that RECFIELD datums are created when+ * needed.+ */+ if (plpgsql_IdentifierLookup != IDENTIFIER_LOOKUP_DECLARE)+ {+ /*+ * Do a lookup in the current namespace stack. Must find a qualified+ * reference, else ignore.+ */+ ns = plpgsql_ns_lookup(plpgsql_ns_top(), false,+ word1, word2, word3,+ &nnames);+ if (ns != NULL && nnames == 2)+ {+ switch (ns->itemtype)+ {+ case PLPGSQL_NSTYPE_REC:+ {+ /*+ * words 1/2 are a record name, so third word could be+ * a field in this record.+ */+ PLpgSQL_recfield *new;++ new = palloc(sizeof(PLpgSQL_recfield));+ new->dtype = PLPGSQL_DTYPE_RECFIELD;+ new->fieldname = pstrdup(word3);+ new->recparentno = ns->itemno;++ plpgsql_adddatum((PLpgSQL_datum *) new);++ wdatum->datum = (PLpgSQL_datum *) new;+ wdatum->ident = NULL;+ wdatum->quoted = false; /* not used */+ wdatum->idents = idents;+ return true;+ }++ case PLPGSQL_NSTYPE_ROW:+ {+ /*+ * words 1/2 are a row name, so third word could be a+ * field in this row.+ */+ PLpgSQL_row *row;+ int i;++ row = (PLpgSQL_row *) (plpgsql_Datums[ns->itemno]);+ for (i = 0; i < row->nfields; i++)+ {+ if (row->fieldnames[i] &&+ strcmp(row->fieldnames[i], word3) == 0)+ {+ wdatum->datum = plpgsql_Datums[row->varnos[i]];+ wdatum->ident = NULL;+ wdatum->quoted = false; /* not used */+ wdatum->idents = idents;+ return true;+ }+ }+ /* fall through to return CWORD */+ break;+ }++ default:+ break;+ }+ }+ }++ /* Nothing found */+ cword->idents = idents;+ return false;+}+++/* ----------+ * plpgsql_parse_wordtype The scanner found word%TYPE. word can be+ * a variable name or a basetype.+ *+ * Returns datatype struct, or NULL if no match found for word.+ * ----------+ */+PLpgSQL_type * plpgsql_parse_wordtype(char *ident) { return NULL; }++++/* ----------+ * plpgsql_parse_cwordtype Same lookup for compositeword%TYPE+ * ----------+ */+PLpgSQL_type * plpgsql_parse_cwordtype(List *idents) { return NULL; }+++/* ----------+ * plpgsql_parse_wordrowtype Scanner found word%ROWTYPE.+ * So word must be a table name.+ * ----------+ */+PLpgSQL_type * plpgsql_parse_wordrowtype(char *ident) { return NULL; }+++/* ----------+ * plpgsql_parse_cwordrowtype Scanner found compositeword%ROWTYPE.+ * So word must be a namespace qualified table name.+ * ----------+ */+PLpgSQL_type * plpgsql_parse_cwordrowtype(List *idents) { return NULL; }+++/*+ * plpgsql_build_variable - build a datum-array entry of a given+ * datatype+ *+ * The returned struct may be a PLpgSQL_var, PLpgSQL_row, or+ * PLpgSQL_rec depending on the given datatype, and is allocated via+ * palloc. The struct is automatically added to the current datum+ * array, and optionally to the current namespace.+ */+PLpgSQL_variable *+plpgsql_build_variable(const char *refname, int lineno, PLpgSQL_type *dtype,+ bool add2namespace)+{+ PLpgSQL_variable *result;++ switch (dtype->ttype)+ {+ case PLPGSQL_TTYPE_SCALAR:+ {+ /* Ordinary scalar datatype */+ PLpgSQL_var *var;++ var = palloc0(sizeof(PLpgSQL_var));+ var->dtype = PLPGSQL_DTYPE_VAR;+ var->refname = pstrdup(refname);+ var->lineno = lineno;+ var->datatype = dtype;+ /* other fields might be filled by caller */++ /* preset to NULL */+ var->value = 0;+ var->isnull = true;+ var->freeval = false;++ plpgsql_adddatum((PLpgSQL_datum *) var);+ if (add2namespace)+ plpgsql_ns_additem(PLPGSQL_NSTYPE_VAR,+ var->dno,+ refname);+ result = (PLpgSQL_variable *) var;+ break;+ }+ case PLPGSQL_TTYPE_ROW:+ {+ /* Composite type -- build a row variable */+ PLpgSQL_row *row;++ row = build_row_from_class(dtype->typrelid);++ row->dtype = PLPGSQL_DTYPE_ROW;+ row->refname = pstrdup(refname);+ row->lineno = lineno;++ plpgsql_adddatum((PLpgSQL_datum *) row);+ if (add2namespace)+ plpgsql_ns_additem(PLPGSQL_NSTYPE_ROW,+ row->dno,+ refname);+ result = (PLpgSQL_variable *) row;+ break;+ }+ case PLPGSQL_TTYPE_REC:+ {+ /* "record" type -- build a record variable */+ PLpgSQL_rec *rec;++ rec = plpgsql_build_record(refname, lineno, add2namespace);+ result = (PLpgSQL_variable *) rec;+ break;+ }+ case PLPGSQL_TTYPE_PSEUDO:+ ereport(ERROR,+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),+ errmsg("variable \"%s\" has pseudo-type %s",+ refname, format_type_be(dtype->typoid))));+ result = NULL; /* keep compiler quiet */+ break;+ default:+ elog(ERROR, "unrecognized ttype: %d", dtype->ttype);+ result = NULL; /* keep compiler quiet */+ break;+ }++ return result;+}++/*+ * Build empty named record variable, and optionally add it to namespace+ */+PLpgSQL_rec *+plpgsql_build_record(const char *refname, int lineno, bool add2namespace)+{+ PLpgSQL_rec *rec;++ rec = palloc0(sizeof(PLpgSQL_rec));+ rec->dtype = PLPGSQL_DTYPE_REC;+ rec->refname = pstrdup(refname);+ rec->lineno = lineno;+ rec->tup = NULL;+ rec->tupdesc = NULL;+ rec->freetup = false;+ plpgsql_adddatum((PLpgSQL_datum *) rec);+ if (add2namespace)+ plpgsql_ns_additem(PLPGSQL_NSTYPE_REC, rec->dno, rec->refname);++ return rec;+}++/*+ * Build a row-variable data structure given the pg_class OID.+ */+static PLpgSQL_row *build_row_from_class(Oid classOid) { return NULL; }+++/*+ * Build a row-variable data structure given the component variables.+ */+++/*+ * plpgsql_build_datatype+ * Build PLpgSQL_type struct given type OID, typmod, and collation.+ *+ * If collation is not InvalidOid then it overrides the type's default+ * collation. But collation is ignored if the datatype is non-collatable.+ */+PLpgSQL_type * plpgsql_build_datatype(Oid typeOid, int32 typmod, Oid collation) { PLpgSQL_type *typ; typ = (PLpgSQL_type *) palloc0(sizeof(PLpgSQL_type)); typ->typname = pstrdup("UNKNOWN"); typ->ttype = PLPGSQL_TTYPE_SCALAR; return typ; }+++/*+ * Utility subroutine to make a PLpgSQL_type struct given a pg_type entry+ */+++/*+ * plpgsql_recognize_err_condition+ * Check condition name and translate it to SQLSTATE.+ *+ * Note: there are some cases where the same condition name has multiple+ * entries in the table. We arbitrarily return the first match.+ */+int+plpgsql_recognize_err_condition(const char *condname, bool allow_sqlstate)+{+ int i;++ if (allow_sqlstate)+ {+ if (strlen(condname) == 5 &&+ strspn(condname, "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ") == 5)+ return MAKE_SQLSTATE(condname[0],+ condname[1],+ condname[2],+ condname[3],+ condname[4]);+ }++ for (i = 0; exception_label_map[i].label != NULL; i++)+ {+ if (strcmp(condname, exception_label_map[i].label) == 0)+ return exception_label_map[i].sqlerrstate;+ }++ ereport(ERROR,+ (errcode(ERRCODE_UNDEFINED_OBJECT),+ errmsg("unrecognized exception condition \"%s\"",+ condname)));+ return 0; /* keep compiler quiet */+}++/*+ * plpgsql_parse_err_condition+ * Generate PLpgSQL_condition entry(s) for an exception condition name+ *+ * This has to be able to return a list because there are some duplicate+ * names in the table of error code names.+ */+PLpgSQL_condition *+plpgsql_parse_err_condition(char *condname)+{+ int i;+ PLpgSQL_condition *new;+ PLpgSQL_condition *prev;++ /*+ * XXX Eventually we will want to look for user-defined exception names+ * here.+ */++ /*+ * OTHERS is represented as code 0 (which would map to '00000', but we+ * have no need to represent that as an exception condition).+ */+ if (strcmp(condname, "others") == 0)+ {+ new = palloc(sizeof(PLpgSQL_condition));+ new->sqlerrstate = 0;+ new->condname = condname;+ new->next = NULL;+ return new;+ }++ prev = NULL;+ for (i = 0; exception_label_map[i].label != NULL; i++)+ {+ if (strcmp(condname, exception_label_map[i].label) == 0)+ {+ new = palloc(sizeof(PLpgSQL_condition));+ new->sqlerrstate = exception_label_map[i].sqlerrstate;+ new->condname = condname;+ new->next = prev;+ prev = new;+ }+ }++ if (!prev)+ ereport(ERROR,+ (errcode(ERRCODE_UNDEFINED_OBJECT),+ errmsg("unrecognized exception condition \"%s\"",+ condname)));++ return prev;+}++/* ----------+ * plpgsql_adddatum Add a variable, record or row+ * to the compiler's datum list.+ * ----------+ */+void+plpgsql_adddatum(PLpgSQL_datum *new)+{+ if (plpgsql_nDatums == datums_alloc)+ {+ datums_alloc *= 2;+ plpgsql_Datums = repalloc(plpgsql_Datums, sizeof(PLpgSQL_datum *) * datums_alloc);+ }++ new->dno = plpgsql_nDatums;+ plpgsql_Datums[plpgsql_nDatums++] = new;+}+++/* ----------+ * plpgsql_add_initdatums Make an array of the datum numbers of+ * all the simple VAR datums created since the last call+ * to this function.+ *+ * If varnos is NULL, we just forget any datum entries created since the+ * last call.+ *+ * This is used around a DECLARE section to create a list of the VARs+ * that have to be initialized at block entry. Note that VARs can also+ * be created elsewhere than DECLARE, eg by a FOR-loop, but it is then+ * the responsibility of special-purpose code to initialize them.+ * ----------+ */+int+plpgsql_add_initdatums(int **varnos)+{+ int i;+ int n = 0;++ for (i = datums_last; i < plpgsql_nDatums; i++)+ {+ switch (plpgsql_Datums[i]->dtype)+ {+ case PLPGSQL_DTYPE_VAR:+ n++;+ break;++ default:+ break;+ }+ }++ if (varnos != NULL)+ {+ if (n > 0)+ {+ *varnos = (int *) palloc(sizeof(int) * n);++ n = 0;+ for (i = datums_last; i < plpgsql_nDatums; i++)+ {+ switch (plpgsql_Datums[i]->dtype)+ {+ case PLPGSQL_DTYPE_VAR:+ (*varnos)[n++] = plpgsql_Datums[i]->dno;++ default:+ break;+ }+ }+ }+ else+ *varnos = NULL;+ }++ datums_last = plpgsql_nDatums;+ return n;+}+++/*+ * Compute the hashkey for a given function invocation+ *+ * The hashkey is returned into the caller-provided storage at *hashkey.+ */+++/*+ * This is the same as the standard resolve_polymorphic_argtypes() function,+ * but with a special case for validation: assume that polymorphic arguments+ * are integer, integer-array or integer-range. Also, we go ahead and report+ * the error if we can't resolve the types.+ */+++/*+ * delete_function - clean up as much as possible of a stale function cache+ *+ * We can't release the PLpgSQL_function struct itself, because of the+ * possibility that there are fn_extra pointers to it. We can release+ * the subsidiary storage, but only if there are no active evaluations+ * in progress. Otherwise we'll just leak that storage. Since the+ * case would only occur if a pg_proc update is detected during a nested+ * recursive call on the function, a leak seems acceptable.+ *+ * Note that this can be called more than once if there are multiple fn_extra+ * pointers to the same function cache. Hence be careful not to do things+ * twice.+ */+++/* exported so we can call it from plpgsql_init() */+++++++
+ foreign/libpg_query/src/postgres/src_pl_plpgsql_src_pl_funcs.c view
@@ -0,0 +1,798 @@+/*--------------------------------------------------------------------+ * Symbols referenced in this file:+ * - plpgsql_ns_init+ * - ns_top+ * - plpgsql_ns_push+ * - plpgsql_ns_additem+ * - plpgsql_ns_pop+ * - plpgsql_ns_lookup+ * - plpgsql_ns_top+ * - plpgsql_getdiag_kindname+ * - plpgsql_ns_lookup_label+ * - plpgsql_free_function_memory+ * - free_expr+ * - free_block+ * - free_stmts+ * - free_stmt+ * - free_assign+ * - free_if+ * - free_case+ * - free_loop+ * - free_while+ * - free_fori+ * - free_fors+ * - free_forc+ * - free_foreach_a+ * - free_exit+ * - free_return+ * - free_return_next+ * - free_return_query+ * - free_raise+ * - free_assert+ * - free_execsql+ * - free_dynexecute+ * - free_dynfors+ * - free_getdiag+ * - free_open+ * - free_fetch+ * - free_close+ * - free_perform+ *--------------------------------------------------------------------+ */++/*-------------------------------------------------------------------------+ *+ * pl_funcs.c - Misc functions for the PL/pgSQL+ * procedural language+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ *+ * IDENTIFICATION+ * src/pl/plpgsql/src/pl_funcs.c+ *+ *-------------------------------------------------------------------------+ */++#include "plpgsql.h"++#include "utils/memutils.h"+++/* ----------+ * Local variables for namespace handling+ *+ * The namespace structure actually forms a tree, of which only one linear+ * list or "chain" (from the youngest item to the root) is accessible from+ * any one plpgsql statement. During initial parsing of a function, ns_top+ * points to the youngest item accessible from the block currently being+ * parsed. We store the entire tree, however, since at runtime we will need+ * to access the chain that's relevant to any one statement.+ *+ * Block boundaries in the namespace chain are marked by PLPGSQL_NSTYPE_LABEL+ * items.+ * ----------+ */+static PLpgSQL_nsitem *ns_top = NULL;+++/* ----------+ * plpgsql_ns_init Initialize namespace processing for a new function+ * ----------+ */+void+plpgsql_ns_init(void)+{+ ns_top = NULL;+}+++/* ----------+ * plpgsql_ns_push Create a new namespace level+ * ----------+ */+void+plpgsql_ns_push(const char *label)+{+ if (label == NULL)+ label = "";+ plpgsql_ns_additem(PLPGSQL_NSTYPE_LABEL, 0, label);+}+++/* ----------+ * plpgsql_ns_pop Pop entries back to (and including) the last label+ * ----------+ */+void+plpgsql_ns_pop(void)+{+ Assert(ns_top != NULL);+ while (ns_top->itemtype != PLPGSQL_NSTYPE_LABEL)+ ns_top = ns_top->prev;+ ns_top = ns_top->prev;+}+++/* ----------+ * plpgsql_ns_top Fetch the current namespace chain end+ * ----------+ */+PLpgSQL_nsitem *+plpgsql_ns_top(void)+{+ return ns_top;+}+++/* ----------+ * plpgsql_ns_additem Add an item to the current namespace chain+ * ----------+ */+void+plpgsql_ns_additem(int itemtype, int itemno, const char *name)+{+ PLpgSQL_nsitem *nse;++ Assert(name != NULL);+ /* first item added must be a label */+ Assert(ns_top != NULL || itemtype == PLPGSQL_NSTYPE_LABEL);++ nse = palloc(offsetof(PLpgSQL_nsitem, name) +strlen(name) + 1);+ nse->itemtype = itemtype;+ nse->itemno = itemno;+ nse->prev = ns_top;+ strcpy(nse->name, name);+ ns_top = nse;+}+++/* ----------+ * plpgsql_ns_lookup Lookup an identifier in the given namespace chain+ *+ * Note that this only searches for variables, not labels.+ *+ * If localmode is TRUE, only the topmost block level is searched.+ *+ * name1 must be non-NULL. Pass NULL for name2 and/or name3 if parsing a name+ * with fewer than three components.+ *+ * If names_used isn't NULL, *names_used receives the number of names+ * matched: 0 if no match, 1 if name1 matched an unqualified variable name,+ * 2 if name1 and name2 matched a block label + variable name.+ *+ * Note that name3 is never directly matched to anything. However, if it+ * isn't NULL, we will disregard qualified matches to scalar variables.+ * Similarly, if name2 isn't NULL, we disregard unqualified matches to+ * scalar variables.+ * ----------+ */+PLpgSQL_nsitem *+plpgsql_ns_lookup(PLpgSQL_nsitem *ns_cur, bool localmode,+ const char *name1, const char *name2, const char *name3,+ int *names_used)+{+ /* Outer loop iterates once per block level in the namespace chain */+ while (ns_cur != NULL)+ {+ PLpgSQL_nsitem *nsitem;++ /* Check this level for unqualified match to variable name */+ for (nsitem = ns_cur;+ nsitem->itemtype != PLPGSQL_NSTYPE_LABEL;+ nsitem = nsitem->prev)+ {+ if (strcmp(nsitem->name, name1) == 0)+ {+ if (name2 == NULL ||+ nsitem->itemtype != PLPGSQL_NSTYPE_VAR)+ {+ if (names_used)+ *names_used = 1;+ return nsitem;+ }+ }+ }++ /* Check this level for qualified match to variable name */+ if (name2 != NULL &&+ strcmp(nsitem->name, name1) == 0)+ {+ for (nsitem = ns_cur;+ nsitem->itemtype != PLPGSQL_NSTYPE_LABEL;+ nsitem = nsitem->prev)+ {+ if (strcmp(nsitem->name, name2) == 0)+ {+ if (name3 == NULL ||+ nsitem->itemtype != PLPGSQL_NSTYPE_VAR)+ {+ if (names_used)+ *names_used = 2;+ return nsitem;+ }+ }+ }+ }++ if (localmode)+ break; /* do not look into upper levels */++ ns_cur = nsitem->prev;+ }++ /* This is just to suppress possibly-uninitialized-variable warnings */+ if (names_used)+ *names_used = 0;+ return NULL; /* No match found */+}+++/* ----------+ * plpgsql_ns_lookup_label Lookup a label in the given namespace chain+ * ----------+ */+PLpgSQL_nsitem *+plpgsql_ns_lookup_label(PLpgSQL_nsitem *ns_cur, const char *name)+{+ while (ns_cur != NULL)+ {+ if (ns_cur->itemtype == PLPGSQL_NSTYPE_LABEL &&+ strcmp(ns_cur->name, name) == 0)+ return ns_cur;+ ns_cur = ns_cur->prev;+ }++ return NULL; /* label not found */+}+++/*+ * Statement type as a string, for use in error messages etc.+ */+++/*+ * GET DIAGNOSTICS item name as a string, for use in error messages etc.+ */+const char *+plpgsql_getdiag_kindname(int kind)+{+ switch (kind)+ {+ case PLPGSQL_GETDIAG_ROW_COUNT:+ return "ROW_COUNT";+ case PLPGSQL_GETDIAG_RESULT_OID:+ return "RESULT_OID";+ case PLPGSQL_GETDIAG_CONTEXT:+ return "PG_CONTEXT";+ case PLPGSQL_GETDIAG_ERROR_CONTEXT:+ return "PG_EXCEPTION_CONTEXT";+ case PLPGSQL_GETDIAG_ERROR_DETAIL:+ return "PG_EXCEPTION_DETAIL";+ case PLPGSQL_GETDIAG_ERROR_HINT:+ return "PG_EXCEPTION_HINT";+ case PLPGSQL_GETDIAG_RETURNED_SQLSTATE:+ return "RETURNED_SQLSTATE";+ case PLPGSQL_GETDIAG_COLUMN_NAME:+ return "COLUMN_NAME";+ case PLPGSQL_GETDIAG_CONSTRAINT_NAME:+ return "CONSTRAINT_NAME";+ case PLPGSQL_GETDIAG_DATATYPE_NAME:+ return "PG_DATATYPE_NAME";+ case PLPGSQL_GETDIAG_MESSAGE_TEXT:+ return "MESSAGE_TEXT";+ case PLPGSQL_GETDIAG_TABLE_NAME:+ return "TABLE_NAME";+ case PLPGSQL_GETDIAG_SCHEMA_NAME:+ return "SCHEMA_NAME";+ }++ return "unknown";+}+++/**********************************************************************+ * Release memory when a PL/pgSQL function is no longer needed+ *+ * The code for recursing through the function tree is really only+ * needed to locate PLpgSQL_expr nodes, which may contain references+ * to saved SPI Plans that must be freed. The function tree itself,+ * along with subsidiary data, is freed in one swoop by freeing the+ * function's permanent memory context.+ **********************************************************************/+static void free_stmt(PLpgSQL_stmt *stmt);+static void free_block(PLpgSQL_stmt_block *block);+static void free_assign(PLpgSQL_stmt_assign *stmt);+static void free_if(PLpgSQL_stmt_if *stmt);+static void free_case(PLpgSQL_stmt_case *stmt);+static void free_loop(PLpgSQL_stmt_loop *stmt);+static void free_while(PLpgSQL_stmt_while *stmt);+static void free_fori(PLpgSQL_stmt_fori *stmt);+static void free_fors(PLpgSQL_stmt_fors *stmt);+static void free_forc(PLpgSQL_stmt_forc *stmt);+static void free_foreach_a(PLpgSQL_stmt_foreach_a *stmt);+static void free_exit(PLpgSQL_stmt_exit *stmt);+static void free_return(PLpgSQL_stmt_return *stmt);+static void free_return_next(PLpgSQL_stmt_return_next *stmt);+static void free_return_query(PLpgSQL_stmt_return_query *stmt);+static void free_raise(PLpgSQL_stmt_raise *stmt);+static void free_assert(PLpgSQL_stmt_assert *stmt);+static void free_execsql(PLpgSQL_stmt_execsql *stmt);+static void free_dynexecute(PLpgSQL_stmt_dynexecute *stmt);+static void free_dynfors(PLpgSQL_stmt_dynfors *stmt);+static void free_getdiag(PLpgSQL_stmt_getdiag *stmt);+static void free_open(PLpgSQL_stmt_open *stmt);+static void free_fetch(PLpgSQL_stmt_fetch *stmt);+static void free_close(PLpgSQL_stmt_close *stmt);+static void free_perform(PLpgSQL_stmt_perform *stmt);+static void free_expr(PLpgSQL_expr *expr);+++static void+free_stmt(PLpgSQL_stmt *stmt)+{+ switch ((enum PLpgSQL_stmt_types) stmt->cmd_type)+ {+ case PLPGSQL_STMT_BLOCK:+ free_block((PLpgSQL_stmt_block *) stmt);+ break;+ case PLPGSQL_STMT_ASSIGN:+ free_assign((PLpgSQL_stmt_assign *) stmt);+ break;+ case PLPGSQL_STMT_IF:+ free_if((PLpgSQL_stmt_if *) stmt);+ break;+ case PLPGSQL_STMT_CASE:+ free_case((PLpgSQL_stmt_case *) stmt);+ break;+ case PLPGSQL_STMT_LOOP:+ free_loop((PLpgSQL_stmt_loop *) stmt);+ break;+ case PLPGSQL_STMT_WHILE:+ free_while((PLpgSQL_stmt_while *) stmt);+ break;+ case PLPGSQL_STMT_FORI:+ free_fori((PLpgSQL_stmt_fori *) stmt);+ break;+ case PLPGSQL_STMT_FORS:+ free_fors((PLpgSQL_stmt_fors *) stmt);+ break;+ case PLPGSQL_STMT_FORC:+ free_forc((PLpgSQL_stmt_forc *) stmt);+ break;+ case PLPGSQL_STMT_FOREACH_A:+ free_foreach_a((PLpgSQL_stmt_foreach_a *) stmt);+ break;+ case PLPGSQL_STMT_EXIT:+ free_exit((PLpgSQL_stmt_exit *) stmt);+ break;+ case PLPGSQL_STMT_RETURN:+ free_return((PLpgSQL_stmt_return *) stmt);+ break;+ case PLPGSQL_STMT_RETURN_NEXT:+ free_return_next((PLpgSQL_stmt_return_next *) stmt);+ break;+ case PLPGSQL_STMT_RETURN_QUERY:+ free_return_query((PLpgSQL_stmt_return_query *) stmt);+ break;+ case PLPGSQL_STMT_RAISE:+ free_raise((PLpgSQL_stmt_raise *) stmt);+ break;+ case PLPGSQL_STMT_ASSERT:+ free_assert((PLpgSQL_stmt_assert *) stmt);+ break;+ case PLPGSQL_STMT_EXECSQL:+ free_execsql((PLpgSQL_stmt_execsql *) stmt);+ break;+ case PLPGSQL_STMT_DYNEXECUTE:+ free_dynexecute((PLpgSQL_stmt_dynexecute *) stmt);+ break;+ case PLPGSQL_STMT_DYNFORS:+ free_dynfors((PLpgSQL_stmt_dynfors *) stmt);+ break;+ case PLPGSQL_STMT_GETDIAG:+ free_getdiag((PLpgSQL_stmt_getdiag *) stmt);+ break;+ case PLPGSQL_STMT_OPEN:+ free_open((PLpgSQL_stmt_open *) stmt);+ break;+ case PLPGSQL_STMT_FETCH:+ free_fetch((PLpgSQL_stmt_fetch *) stmt);+ break;+ case PLPGSQL_STMT_CLOSE:+ free_close((PLpgSQL_stmt_close *) stmt);+ break;+ case PLPGSQL_STMT_PERFORM:+ free_perform((PLpgSQL_stmt_perform *) stmt);+ break;+ default:+ elog(ERROR, "unrecognized cmd_type: %d", stmt->cmd_type);+ break;+ }+}++static void+free_stmts(List *stmts)+{+ ListCell *s;++ foreach(s, stmts)+ {+ free_stmt((PLpgSQL_stmt *) lfirst(s));+ }+}++static void+free_block(PLpgSQL_stmt_block *block)+{+ free_stmts(block->body);+ if (block->exceptions)+ {+ ListCell *e;++ foreach(e, block->exceptions->exc_list)+ {+ PLpgSQL_exception *exc = (PLpgSQL_exception *) lfirst(e);++ free_stmts(exc->action);+ }+ }+}++static void+free_assign(PLpgSQL_stmt_assign *stmt)+{+ free_expr(stmt->expr);+}++static void+free_if(PLpgSQL_stmt_if *stmt)+{+ ListCell *l;++ free_expr(stmt->cond);+ free_stmts(stmt->then_body);+ foreach(l, stmt->elsif_list)+ {+ PLpgSQL_if_elsif *elif = (PLpgSQL_if_elsif *) lfirst(l);++ free_expr(elif->cond);+ free_stmts(elif->stmts);+ }+ free_stmts(stmt->else_body);+}++static void+free_case(PLpgSQL_stmt_case *stmt)+{+ ListCell *l;++ free_expr(stmt->t_expr);+ foreach(l, stmt->case_when_list)+ {+ PLpgSQL_case_when *cwt = (PLpgSQL_case_when *) lfirst(l);++ free_expr(cwt->expr);+ free_stmts(cwt->stmts);+ }+ free_stmts(stmt->else_stmts);+}++static void+free_loop(PLpgSQL_stmt_loop *stmt)+{+ free_stmts(stmt->body);+}++static void+free_while(PLpgSQL_stmt_while *stmt)+{+ free_expr(stmt->cond);+ free_stmts(stmt->body);+}++static void+free_fori(PLpgSQL_stmt_fori *stmt)+{+ free_expr(stmt->lower);+ free_expr(stmt->upper);+ free_expr(stmt->step);+ free_stmts(stmt->body);+}++static void+free_fors(PLpgSQL_stmt_fors *stmt)+{+ free_stmts(stmt->body);+ free_expr(stmt->query);+}++static void+free_forc(PLpgSQL_stmt_forc *stmt)+{+ free_stmts(stmt->body);+ free_expr(stmt->argquery);+}++static void+free_foreach_a(PLpgSQL_stmt_foreach_a *stmt)+{+ free_expr(stmt->expr);+ free_stmts(stmt->body);+}++static void+free_open(PLpgSQL_stmt_open *stmt)+{+ ListCell *lc;++ free_expr(stmt->argquery);+ free_expr(stmt->query);+ free_expr(stmt->dynquery);+ foreach(lc, stmt->params)+ {+ free_expr((PLpgSQL_expr *) lfirst(lc));+ }+}++static void+free_fetch(PLpgSQL_stmt_fetch *stmt)+{+ free_expr(stmt->expr);+}++static void+free_close(PLpgSQL_stmt_close *stmt)+{+}++static void+free_perform(PLpgSQL_stmt_perform *stmt)+{+ free_expr(stmt->expr);+}++static void+free_exit(PLpgSQL_stmt_exit *stmt)+{+ free_expr(stmt->cond);+}++static void+free_return(PLpgSQL_stmt_return *stmt)+{+ free_expr(stmt->expr);+}++static void+free_return_next(PLpgSQL_stmt_return_next *stmt)+{+ free_expr(stmt->expr);+}++static void+free_return_query(PLpgSQL_stmt_return_query *stmt)+{+ ListCell *lc;++ free_expr(stmt->query);+ free_expr(stmt->dynquery);+ foreach(lc, stmt->params)+ {+ free_expr((PLpgSQL_expr *) lfirst(lc));+ }+}++static void+free_raise(PLpgSQL_stmt_raise *stmt)+{+ ListCell *lc;++ foreach(lc, stmt->params)+ {+ free_expr((PLpgSQL_expr *) lfirst(lc));+ }+ foreach(lc, stmt->options)+ {+ PLpgSQL_raise_option *opt = (PLpgSQL_raise_option *) lfirst(lc);++ free_expr(opt->expr);+ }+}++static void+free_assert(PLpgSQL_stmt_assert *stmt)+{+ free_expr(stmt->cond);+ free_expr(stmt->message);+}++static void+free_execsql(PLpgSQL_stmt_execsql *stmt)+{+ free_expr(stmt->sqlstmt);+}++static void+free_dynexecute(PLpgSQL_stmt_dynexecute *stmt)+{+ ListCell *lc;++ free_expr(stmt->query);+ foreach(lc, stmt->params)+ {+ free_expr((PLpgSQL_expr *) lfirst(lc));+ }+}++static void+free_dynfors(PLpgSQL_stmt_dynfors *stmt)+{+ ListCell *lc;++ free_stmts(stmt->body);+ free_expr(stmt->query);+ foreach(lc, stmt->params)+ {+ free_expr((PLpgSQL_expr *) lfirst(lc));+ }+}++static void+free_getdiag(PLpgSQL_stmt_getdiag *stmt)+{+}++static void free_expr(PLpgSQL_expr *expr) {}+++void+plpgsql_free_function_memory(PLpgSQL_function *func)+{+ int i;++ /* Better not call this on an in-use function */+ Assert(func->use_count == 0);++ /* Release plans associated with variable declarations */+ for (i = 0; i < func->ndatums; i++)+ {+ PLpgSQL_datum *d = func->datums[i];++ switch (d->dtype)+ {+ case PLPGSQL_DTYPE_VAR:+ {+ PLpgSQL_var *var = (PLpgSQL_var *) d;++ free_expr(var->default_val);+ free_expr(var->cursor_explicit_expr);+ }+ break;+ case PLPGSQL_DTYPE_ROW:+ break;+ case PLPGSQL_DTYPE_REC:+ break;+ case PLPGSQL_DTYPE_RECFIELD:+ break;+ case PLPGSQL_DTYPE_ARRAYELEM:+ free_expr(((PLpgSQL_arrayelem *) d)->subscript);+ break;+ default:+ elog(ERROR, "unrecognized data type: %d", d->dtype);+ }+ }+ func->ndatums = 0;++ /* Release plans in statement tree */+ if (func->action)+ free_block(func->action);+ func->action = NULL;++ /*+ * And finally, release all memory except the PLpgSQL_function struct+ * itself (which has to be kept around because there may be multiple+ * fn_extra pointers to it).+ */+ if (func->fn_cxt)+ MemoryContextDelete(func->fn_cxt);+ func->fn_cxt = NULL;+}+++/**********************************************************************+ * Debug functions for analyzing the compiled code+ **********************************************************************/+++static void dump_ind(void);+static void dump_stmt(PLpgSQL_stmt *stmt);+static void dump_block(PLpgSQL_stmt_block *block);+static void dump_assign(PLpgSQL_stmt_assign *stmt);+static void dump_if(PLpgSQL_stmt_if *stmt);+static void dump_case(PLpgSQL_stmt_case *stmt);+static void dump_loop(PLpgSQL_stmt_loop *stmt);+static void dump_while(PLpgSQL_stmt_while *stmt);+static void dump_fori(PLpgSQL_stmt_fori *stmt);+static void dump_fors(PLpgSQL_stmt_fors *stmt);+static void dump_forc(PLpgSQL_stmt_forc *stmt);+static void dump_foreach_a(PLpgSQL_stmt_foreach_a *stmt);+static void dump_exit(PLpgSQL_stmt_exit *stmt);+static void dump_return(PLpgSQL_stmt_return *stmt);+static void dump_return_next(PLpgSQL_stmt_return_next *stmt);+static void dump_return_query(PLpgSQL_stmt_return_query *stmt);+static void dump_raise(PLpgSQL_stmt_raise *stmt);+static void dump_assert(PLpgSQL_stmt_assert *stmt);+static void dump_execsql(PLpgSQL_stmt_execsql *stmt);+static void dump_dynexecute(PLpgSQL_stmt_dynexecute *stmt);+static void dump_dynfors(PLpgSQL_stmt_dynfors *stmt);+static void dump_getdiag(PLpgSQL_stmt_getdiag *stmt);+static void dump_open(PLpgSQL_stmt_open *stmt);+static void dump_fetch(PLpgSQL_stmt_fetch *stmt);+static void dump_cursor_direction(PLpgSQL_stmt_fetch *stmt);+static void dump_close(PLpgSQL_stmt_close *stmt);+static void dump_perform(PLpgSQL_stmt_perform *stmt);+static void dump_expr(PLpgSQL_expr *expr);+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ foreign/libpg_query/src/postgres/src_pl_plpgsql_src_pl_gram.c view
@@ -0,0 +1,6151 @@+/*--------------------------------------------------------------------+ * Symbols referenced in this file:+ * - plpgsql_yyparse+ * - plpgsql_yynerrs+ * - plpgsql_yychar+ * - plpgsql_yylloc+ * - plpgsql_yylval+ * - yypact+ * - yytranslate+ * - yycheck+ * - yytable+ * - yydefact+ * - yyr2+ * - check_labels+ * - read_sql_stmt+ * - read_datatype+ * - parse_datatype+ * - read_sql_expression+ * - tok_is_keyword+ * - check_assignable+ * - NameOfDatum+ * - word_is_not_variable+ * - cword_is_not_variable+ * - make_case+ * - read_sql_expression2+ * - make_scalar_list1+ * - read_cursor_args+ * - read_sql_construct+ * - check_sql_expr+ * - plpgsql_sql_error_callback+ * - read_into_scalar_list+ * - current_token_is_not_variable+ * - make_return_next_stmt+ * - make_return_query_stmt+ * - make_return_stmt+ * - read_raise_options+ * - check_raise_parameters+ * - make_execsql_stmt+ * - read_into_target+ * - read_fetch_direction+ * - complete_direction+ * - yyr1+ * - yypgoto+ * - yydefgoto+ * - yydestruct+ * - yystos+ *--------------------------------------------------------------------+ */++/* A Bison parser, made by GNU Bison 3.0.2. */++/* Bison implementation for Yacc-like parsers in C++ Copyright (C) 1984, 1989-1990, 2000-2013 Free Software Foundation, Inc.++ This program is free software: you can redistribute it and/or modify+ it under the terms of the GNU General Public License as published by+ the Free Software Foundation, either version 3 of the License, or+ (at your option) any later version.++ This program is distributed in the hope that it will be useful,+ but WITHOUT ANY WARRANTY; without even the implied warranty of+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the+ GNU General Public License for more details.++ You should have received a copy of the GNU General Public License+ along with this program. If not, see <http://www.gnu.org/licenses/>. */++/* As a special exception, you may create a larger work that contains+ part or all of the Bison parser skeleton and distribute that work+ under terms of your choice, so long as that work isn't itself a+ parser generator using the skeleton or a modified version thereof+ as a parser skeleton. Alternatively, if you modify or redistribute+ the parser skeleton itself, you may (at your option) remove this+ special exception, which will cause the skeleton and the resulting+ Bison output files to be licensed under the GNU General Public+ License without this special exception.++ This special exception was added by the Free Software Foundation in+ version 2.2 of Bison. */++/* C LALR(1) parser skeleton written by Richard Stallman, by+ simplifying the original so-called "semantic" parser. */++/* All symbols defined below should begin with yy or YY, to avoid+ infringing on user name space. This should be done even for local+ variables, as they might otherwise be expanded by user macros.+ There are some unavoidable exceptions within include files to+ define necessary library symbols; they are noted "INFRINGES ON+ USER NAME SPACE" below. */++/* Identify Bison output. */+#define YYBISON 1++/* Bison version. */+#define YYBISON_VERSION "3.0.2"++/* Skeleton name. */+#define YYSKELETON_NAME "yacc.c"++/* Pure parsers. */+#define YYPURE 0++/* Push parsers. */+#define YYPUSH 0++/* Pull parsers. */+#define YYPULL 1+++/* Substitute the variable and function names. */+#define yyparse plpgsql_yyparse+#define yylex plpgsql_yylex+#define yyerror plpgsql_yyerror+#define yydebug plpgsql_yydebug+#define yynerrs plpgsql_yynerrs++#define yylval plpgsql_yylval+#define yychar plpgsql_yychar+#define yylloc plpgsql_yylloc++/* Copy the first part of user declarations. */+#line 1 "pl_gram.y" /* yacc.c:339 */++/*-------------------------------------------------------------------------+ *+ * pl_gram.y - Parser for the PL/pgSQL procedural language+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ *+ * IDENTIFICATION+ * src/pl/plpgsql/src/pl_gram.y+ *+ *-------------------------------------------------------------------------+ */++#include "plpgsql.h"++#include "catalog/namespace.h"+#include "catalog/pg_type.h"+#include "parser/parser.h"+#include "parser/parse_type.h"+#include "parser/scanner.h"+#include "parser/scansup.h"+#include "utils/builtins.h"+++/* Location tracking support --- simpler than bison's default */+#define YYLLOC_DEFAULT(Current, Rhs, N) \+ do { \+ if (N) \+ (Current) = (Rhs)[1]; \+ else \+ (Current) = (Rhs)[0]; \+ } while (0)++/*+ * Bison doesn't allocate anything that needs to live across parser calls,+ * so we can easily have it use palloc instead of malloc. This prevents+ * memory leaks if we error out during parsing. Note this only works with+ * bison >= 2.0. However, in bison 1.875 the default is to use alloca()+ * if possible, so there's not really much problem anyhow, at least if+ * you're building with gcc.+ */+#define YYMALLOC palloc+#define YYFREE pfree+++typedef struct+{+ int location;+ int leaderlen;+} sql_error_callback_arg;++#define parser_errposition(pos) plpgsql_scanner_errposition(pos)++union YYSTYPE; /* need forward reference for tok_is_keyword */++static bool tok_is_keyword(int token, union YYSTYPE *lval,+ int kw_token, const char *kw_str);+static void word_is_not_variable(PLword *word, int location);+static void cword_is_not_variable(PLcword *cword, int location);+static void current_token_is_not_variable(int tok);+static PLpgSQL_expr *read_sql_construct(int until,+ int until2,+ int until3,+ const char *expected,+ const char *sqlstart,+ bool isexpression,+ bool valid_sql,+ bool trim,+ int *startloc,+ int *endtoken);+static PLpgSQL_expr *read_sql_expression(int until,+ const char *expected);+static PLpgSQL_expr *read_sql_expression2(int until, int until2,+ const char *expected,+ int *endtoken);+static PLpgSQL_expr *read_sql_stmt(const char *sqlstart);+static PLpgSQL_type *read_datatype(int tok);+static PLpgSQL_stmt *make_execsql_stmt(int firsttoken, int location);+static PLpgSQL_stmt_fetch *read_fetch_direction(void);+static void complete_direction(PLpgSQL_stmt_fetch *fetch,+ bool *check_FROM);+static PLpgSQL_stmt *make_return_stmt(int location);+static PLpgSQL_stmt *make_return_next_stmt(int location);+static PLpgSQL_stmt *make_return_query_stmt(int location);+static PLpgSQL_stmt *make_case(int location, PLpgSQL_expr *t_expr,+ List *case_when_list, List *else_stmts);+static char *NameOfDatum(PLwdatum *wdatum);+static void check_assignable(PLpgSQL_datum *datum, int location);+static void read_into_target(PLpgSQL_rec **rec, PLpgSQL_row **row,+ bool *strict);+static PLpgSQL_row *read_into_scalar_list(char *initial_name,+ PLpgSQL_datum *initial_datum,+ int initial_location);+static PLpgSQL_row *make_scalar_list1(char *initial_name,+ PLpgSQL_datum *initial_datum,+ int lineno, int location);+static void check_sql_expr(const char *stmt, int location,+ int leaderlen);+static void plpgsql_sql_error_callback(void *arg);+static PLpgSQL_type *parse_datatype(const char *string, int location);+static void check_labels(const char *start_label,+ const char *end_label,+ int end_location);+static PLpgSQL_expr *read_cursor_args(PLpgSQL_var *cursor,+ int until, const char *expected);+static List *read_raise_options(void);+static void check_raise_parameters(PLpgSQL_stmt_raise *stmt);+++#line 187 "pl_gram.c" /* yacc.c:339 */++# ifndef YY_NULLPTR+# if defined __cplusplus && 201103L <= __cplusplus+# define YY_NULLPTR nullptr+# else+# define YY_NULLPTR 0+# endif+# endif++/* Enabling verbose error messages. */+#ifdef YYERROR_VERBOSE+# undef YYERROR_VERBOSE+# define YYERROR_VERBOSE 1+#else+# define YYERROR_VERBOSE 0+#endif++/* In a future release of Bison, this section will be replaced+ by #include "pl_gram.h". */+#ifndef YY_PLPGSQL_YY_PL_GRAM_H_INCLUDED+# define YY_PLPGSQL_YY_PL_GRAM_H_INCLUDED+/* Debug traces. */+#ifndef YYDEBUG+# define YYDEBUG 0+#endif+#if YYDEBUG+extern int plpgsql_yydebug;+#endif++/* Token type. */+#ifndef YYTOKENTYPE+# define YYTOKENTYPE+ enum yytokentype+ {+ IDENT = 258,+ FCONST = 259,+ SCONST = 260,+ BCONST = 261,+ XCONST = 262,+ Op = 263,+ ICONST = 264,+ PARAM = 265,+ TYPECAST = 266,+ DOT_DOT = 267,+ COLON_EQUALS = 268,+ EQUALS_GREATER = 269,+ LESS_EQUALS = 270,+ GREATER_EQUALS = 271,+ NOT_EQUALS = 272,+ T_WORD = 273,+ T_CWORD = 274,+ T_DATUM = 275,+ LESS_LESS = 276,+ GREATER_GREATER = 277,+ K_ABSOLUTE = 278,+ K_ALIAS = 279,+ K_ALL = 280,+ K_ARRAY = 281,+ K_ASSERT = 282,+ K_BACKWARD = 283,+ K_BEGIN = 284,+ K_BY = 285,+ K_CASE = 286,+ K_CLOSE = 287,+ K_COLLATE = 288,+ K_COLUMN = 289,+ K_COLUMN_NAME = 290,+ K_CONSTANT = 291,+ K_CONSTRAINT = 292,+ K_CONSTRAINT_NAME = 293,+ K_CONTINUE = 294,+ K_CURRENT = 295,+ K_CURSOR = 296,+ K_DATATYPE = 297,+ K_DEBUG = 298,+ K_DECLARE = 299,+ K_DEFAULT = 300,+ K_DETAIL = 301,+ K_DIAGNOSTICS = 302,+ K_DUMP = 303,+ K_ELSE = 304,+ K_ELSIF = 305,+ K_END = 306,+ K_ERRCODE = 307,+ K_ERROR = 308,+ K_EXCEPTION = 309,+ K_EXECUTE = 310,+ K_EXIT = 311,+ K_FETCH = 312,+ K_FIRST = 313,+ K_FOR = 314,+ K_FOREACH = 315,+ K_FORWARD = 316,+ K_FROM = 317,+ K_GET = 318,+ K_HINT = 319,+ K_IF = 320,+ K_IN = 321,+ K_INFO = 322,+ K_INSERT = 323,+ K_INTO = 324,+ K_IS = 325,+ K_LAST = 326,+ K_LOG = 327,+ K_LOOP = 328,+ K_MESSAGE = 329,+ K_MESSAGE_TEXT = 330,+ K_MOVE = 331,+ K_NEXT = 332,+ K_NO = 333,+ K_NOT = 334,+ K_NOTICE = 335,+ K_NULL = 336,+ K_OPEN = 337,+ K_OPTION = 338,+ K_OR = 339,+ K_PERFORM = 340,+ K_PG_CONTEXT = 341,+ K_PG_DATATYPE_NAME = 342,+ K_PG_EXCEPTION_CONTEXT = 343,+ K_PG_EXCEPTION_DETAIL = 344,+ K_PG_EXCEPTION_HINT = 345,+ K_PRINT_STRICT_PARAMS = 346,+ K_PRIOR = 347,+ K_QUERY = 348,+ K_RAISE = 349,+ K_RELATIVE = 350,+ K_RESULT_OID = 351,+ K_RETURN = 352,+ K_RETURNED_SQLSTATE = 353,+ K_REVERSE = 354,+ K_ROW_COUNT = 355,+ K_ROWTYPE = 356,+ K_SCHEMA = 357,+ K_SCHEMA_NAME = 358,+ K_SCROLL = 359,+ K_SLICE = 360,+ K_SQLSTATE = 361,+ K_STACKED = 362,+ K_STRICT = 363,+ K_TABLE = 364,+ K_TABLE_NAME = 365,+ K_THEN = 366,+ K_TO = 367,+ K_TYPE = 368,+ K_USE_COLUMN = 369,+ K_USE_VARIABLE = 370,+ K_USING = 371,+ K_VARIABLE_CONFLICT = 372,+ K_WARNING = 373,+ K_WHEN = 374,+ K_WHILE = 375+ };+#endif++/* Value type. */+#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED+typedef union YYSTYPE YYSTYPE;+union YYSTYPE+{+#line 117 "pl_gram.y" /* yacc.c:355 */++ core_YYSTYPE core_yystype;+ /* these fields must match core_YYSTYPE: */+ int ival;+ char *str;+ const char *keyword;++ PLword word;+ PLcword cword;+ PLwdatum wdatum;+ bool boolean;+ Oid oid;+ struct+ {+ char *name;+ int lineno;+ } varname;+ struct+ {+ char *name;+ int lineno;+ PLpgSQL_datum *scalar;+ PLpgSQL_rec *rec;+ PLpgSQL_row *row;+ } forvariable;+ struct+ {+ char *label;+ int n_initvars;+ int *initvarnos;+ } declhdr;+ struct+ {+ List *stmts;+ char *end_label;+ int end_label_location;+ } loop_body;+ List *list;+ PLpgSQL_type *dtype;+ PLpgSQL_datum *datum;+ PLpgSQL_var *var;+ PLpgSQL_expr *expr;+ PLpgSQL_stmt *stmt;+ PLpgSQL_condition *condition;+ PLpgSQL_exception *exception;+ PLpgSQL_exception_block *exception_block;+ PLpgSQL_nsitem *nsitem;+ PLpgSQL_diag_item *diagitem;+ PLpgSQL_stmt_fetch *fetch;+ PLpgSQL_case_when *casewhen;++#line 400 "pl_gram.c" /* yacc.c:355 */+};+# define YYSTYPE_IS_TRIVIAL 1+# define YYSTYPE_IS_DECLARED 1+#endif++/* Location type. */+#if ! defined YYLTYPE && ! defined YYLTYPE_IS_DECLARED+typedef struct YYLTYPE YYLTYPE;+struct YYLTYPE+{+ int first_line;+ int first_column;+ int last_line;+ int last_column;+};+# define YYLTYPE_IS_DECLARED 1+# define YYLTYPE_IS_TRIVIAL 1+#endif+++extern __thread YYSTYPE plpgsql_yylval;+extern __thread YYLTYPE plpgsql_yylloc;+int plpgsql_yyparse (void);++#endif /* !YY_PLPGSQL_YY_PL_GRAM_H_INCLUDED */++/* Copy the second part of user declarations. */++#line 429 "pl_gram.c" /* yacc.c:358 */++#ifdef short+# undef short+#endif++#ifdef YYTYPE_UINT8+typedef YYTYPE_UINT8 yytype_uint8;+#else+typedef unsigned char yytype_uint8;+#endif++#ifdef YYTYPE_INT8+typedef YYTYPE_INT8 yytype_int8;+#else+typedef signed char yytype_int8;+#endif++#ifdef YYTYPE_UINT16+typedef YYTYPE_UINT16 yytype_uint16;+#else+typedef unsigned short int yytype_uint16;+#endif++#ifdef YYTYPE_INT16+typedef YYTYPE_INT16 yytype_int16;+#else+typedef short int yytype_int16;+#endif++#ifndef YYSIZE_T+# ifdef __SIZE_TYPE__+# define YYSIZE_T __SIZE_TYPE__+# elif defined size_t+# define YYSIZE_T size_t+# elif ! defined YYSIZE_T+# include <stddef.h> /* INFRINGES ON USER NAME SPACE */+# define YYSIZE_T size_t+# else+# define YYSIZE_T unsigned int+# endif+#endif++#define YYSIZE_MAXIMUM ((YYSIZE_T) -1)++#ifndef YY_+# if defined YYENABLE_NLS && YYENABLE_NLS+# if ENABLE_NLS+# include <libintl.h> /* INFRINGES ON USER NAME SPACE */+# define YY_(Msgid) dgettext ("bison-runtime", Msgid)+# endif+# endif+# ifndef YY_+# define YY_(Msgid) Msgid+# endif+#endif++#ifndef YY_ATTRIBUTE+# if (defined __GNUC__ \+ && (2 < __GNUC__ || (__GNUC__ == 2 && 96 <= __GNUC_MINOR__))) \+ || defined __SUNPRO_C && 0x5110 <= __SUNPRO_C+# define YY_ATTRIBUTE(Spec) __attribute__(Spec)+# else+# define YY_ATTRIBUTE(Spec) /* empty */+# endif+#endif++#ifndef YY_ATTRIBUTE_PURE+# define YY_ATTRIBUTE_PURE YY_ATTRIBUTE ((__pure__))+#endif++#ifndef YY_ATTRIBUTE_UNUSED+# define YY_ATTRIBUTE_UNUSED YY_ATTRIBUTE ((__unused__))+#endif++#if !defined _Noreturn \+ && (!defined __STDC_VERSION__ || __STDC_VERSION__ < 201112)+# if defined _MSC_VER && 1200 <= _MSC_VER+# define _Noreturn __declspec (noreturn)+# else+# define _Noreturn YY_ATTRIBUTE ((__noreturn__))+# endif+#endif++/* Suppress unused-variable warnings by "using" E. */+#if ! defined lint || defined __GNUC__+# define YYUSE(E) ((void) (E))+#else+# define YYUSE(E) /* empty */+#endif++#if defined __GNUC__ && 407 <= __GNUC__ * 100 + __GNUC_MINOR__+/* Suppress an incorrect diagnostic about yylval being uninitialized. */+# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \+ _Pragma ("GCC diagnostic push") \+ _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"")\+ _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"")+# define YY_IGNORE_MAYBE_UNINITIALIZED_END \+ _Pragma ("GCC diagnostic pop")+#else+# define YY_INITIAL_VALUE(Value) Value+#endif+#ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN+# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN+# define YY_IGNORE_MAYBE_UNINITIALIZED_END+#endif+#ifndef YY_INITIAL_VALUE+# define YY_INITIAL_VALUE(Value) /* Nothing. */+#endif+++#if ! defined yyoverflow || YYERROR_VERBOSE++/* The parser invokes alloca or malloc; define the necessary symbols. */++# ifdef YYSTACK_USE_ALLOCA+# if YYSTACK_USE_ALLOCA+# ifdef __GNUC__+# define YYSTACK_ALLOC __builtin_alloca+# elif defined __BUILTIN_VA_ARG_INCR+# include <alloca.h> /* INFRINGES ON USER NAME SPACE */+# elif defined _AIX+# define YYSTACK_ALLOC __alloca+# elif defined _MSC_VER+# include <malloc.h> /* INFRINGES ON USER NAME SPACE */+# define alloca _alloca+# else+# define YYSTACK_ALLOC alloca+# if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS+# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */+ /* Use EXIT_SUCCESS as a witness for stdlib.h. */+# ifndef EXIT_SUCCESS+# define EXIT_SUCCESS 0+# endif+# endif+# endif+# endif+# endif++# ifdef YYSTACK_ALLOC+ /* Pacify GCC's 'empty if-body' warning. */+# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0)+# ifndef YYSTACK_ALLOC_MAXIMUM+ /* The OS might guarantee only one guard page at the bottom of the stack,+ and a page size can be as small as 4096 bytes. So we cannot safely+ invoke alloca (N) if N exceeds 4096. Use a slightly smaller number+ to allow for a few compiler-allocated temporary stack slots. */+# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */+# endif+# else+# define YYSTACK_ALLOC YYMALLOC+# define YYSTACK_FREE YYFREE+# ifndef YYSTACK_ALLOC_MAXIMUM+# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM+# endif+# if (defined __cplusplus && ! defined EXIT_SUCCESS \+ && ! ((defined YYMALLOC || defined malloc) \+ && (defined YYFREE || defined free)))+# include <stdlib.h> /* INFRINGES ON USER NAME SPACE */+# ifndef EXIT_SUCCESS+# define EXIT_SUCCESS 0+# endif+# endif+# ifndef YYMALLOC+# define YYMALLOC malloc+# if ! defined malloc && ! defined EXIT_SUCCESS+void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */+# endif+# endif+# ifndef YYFREE+# define YYFREE free+# if ! defined free && ! defined EXIT_SUCCESS+void free (void *); /* INFRINGES ON USER NAME SPACE */+# endif+# endif+# endif+#endif /* ! defined yyoverflow || YYERROR_VERBOSE */+++#if (! defined yyoverflow \+ && (! defined __cplusplus \+ || (defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL \+ && defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))++/* A type that is properly aligned for any stack member. */+union yyalloc+{+ yytype_int16 yyss_alloc;+ YYSTYPE yyvs_alloc;+ YYLTYPE yyls_alloc;+};++/* The size of the maximum gap between one aligned stack and the next. */+# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)++/* The size of an array large to enough to hold all stacks, each with+ N elements. */+# define YYSTACK_BYTES(N) \+ ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE) + sizeof (YYLTYPE)) \+ + 2 * YYSTACK_GAP_MAXIMUM)++# define YYCOPY_NEEDED 1++/* Relocate STACK from its old location to the new one. The+ local variables YYSIZE and YYSTACKSIZE give the old and new number of+ elements in the stack, and YYPTR gives the new location of the+ stack. Advance YYPTR to a properly aligned location for the next+ stack. */+# define YYSTACK_RELOCATE(Stack_alloc, Stack) \+ do \+ { \+ YYSIZE_T yynewbytes; \+ YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \+ Stack = &yyptr->Stack_alloc; \+ yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \+ yyptr += yynewbytes / sizeof (*yyptr); \+ } \+ while (0)++#endif++#if defined YYCOPY_NEEDED && YYCOPY_NEEDED+/* Copy COUNT objects from SRC to DST. The source and destination do+ not overlap. */+# ifndef YYCOPY+# if defined __GNUC__ && 1 < __GNUC__+# define YYCOPY(Dst, Src, Count) \+ __builtin_memcpy (Dst, Src, (Count) * sizeof (*(Src)))+# else+# define YYCOPY(Dst, Src, Count) \+ do \+ { \+ YYSIZE_T yyi; \+ for (yyi = 0; yyi < (Count); yyi++) \+ (Dst)[yyi] = (Src)[yyi]; \+ } \+ while (0)+# endif+# endif+#endif /* !YYCOPY_NEEDED */++/* YYFINAL -- State number of the termination state. */+#define YYFINAL 3+/* YYLAST -- Last index in YYTABLE. */+#define YYLAST 1139++/* YYNTOKENS -- Number of terminals. */+#define YYNTOKENS 128+/* YYNNTS -- Number of nonterminals. */+#define YYNNTS 84+/* YYNRULES -- Number of rules. */+#define YYNRULES 234+/* YYNSTATES -- Number of states. */+#define YYNSTATES 312++/* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned+ by yylex, with out-of-bounds checking. */+#define YYUNDEFTOK 2+#define YYMAXUTOK 375++#define YYTRANSLATE(YYX) \+ ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)++/* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM+ as returned by yylex, without out-of-bounds checking. */+static const yytype_uint8 yytranslate[] =+{+ 0, 2, 2, 2, 2, 2, 2, 2, 2, 2,+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,+ 2, 2, 2, 2, 2, 121, 2, 2, 2, 2,+ 123, 124, 2, 2, 125, 2, 2, 2, 2, 2,+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 122,+ 2, 126, 2, 2, 2, 2, 2, 2, 2, 2,+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,+ 2, 127, 2, 2, 2, 2, 2, 2, 2, 2,+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,+ 2, 2, 2, 2, 2, 2, 1, 2, 3, 4,+ 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,+ 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,+ 25, 26, 27, 28, 29, 30, 31, 32, 33, 34,+ 35, 36, 37, 38, 39, 40, 41, 42, 43, 44,+ 45, 46, 47, 48, 49, 50, 51, 52, 53, 54,+ 55, 56, 57, 58, 59, 60, 61, 62, 63, 64,+ 65, 66, 67, 68, 69, 70, 71, 72, 73, 74,+ 75, 76, 77, 78, 79, 80, 81, 82, 83, 84,+ 85, 86, 87, 88, 89, 90, 91, 92, 93, 94,+ 95, 96, 97, 98, 99, 100, 101, 102, 103, 104,+ 105, 106, 107, 108, 109, 110, 111, 112, 113, 114,+ 115, 116, 117, 118, 119, 120+};++#if YYDEBUG+ /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */+static const yytype_uint16 yyrline[] =+{+ 0, 347, 347, 353, 354, 357, 361, 370, 374, 378,+ 384, 388, 393, 394, 397, 419, 427, 434, 443, 455,+ 456, 459, 460, 464, 477, 532, 538, 537, 590, 593,+ 597, 604, 610, 613, 642, 646, 652, 660, 661, 663,+ 678, 693, 721, 749, 780, 781, 786, 797, 798, 803,+ 808, 815, 816, 820, 822, 828, 829, 837, 838, 842,+ 843, 853, 855, 857, 859, 861, 863, 865, 867, 869,+ 871, 873, 875, 877, 879, 881, 883, 885, 887, 889,+ 891, 893, 897, 910, 924, 987, 990, 994, 1000, 1004,+ 1010, 1023, 1070, 1082, 1087, 1095, 1100, 1117, 1134, 1137,+ 1151, 1154, 1160, 1167, 1181, 1185, 1191, 1203, 1206, 1221,+ 1238, 1256, 1290, 1552, 1584, 1599, 1606, 1649, 1652, 1658,+ 1673, 1677, 1683, 1709, 1853, 1876, 1894, 1898, 1908, 1920,+ 1984, 2061, 2093, 2106, 2111, 2124, 2131, 2147, 2152, 2160,+ 2162, 2161, 2201, 2205, 2211, 2224, 2233, 2239, 2276, 2280,+ 2284, 2288, 2292, 2296, 2304, 2307, 2315, 2317, 2324, 2328,+ 2332, 2341, 2342, 2343, 2344, 2345, 2346, 2347, 2348, 2349,+ 2350, 2351, 2352, 2353, 2354, 2355, 2356, 2357, 2358, 2359,+ 2360, 2361, 2362, 2363, 2364, 2365, 2366, 2367, 2368, 2369,+ 2370, 2371, 2372, 2373, 2374, 2375, 2376, 2377, 2378, 2379,+ 2380, 2381, 2382, 2383, 2384, 2385, 2386, 2387, 2388, 2389,+ 2390, 2391, 2392, 2393, 2394, 2395, 2396, 2397, 2398, 2399,+ 2400, 2401, 2402, 2403, 2404, 2405, 2406, 2407, 2408, 2409,+ 2410, 2411, 2412, 2413, 2414+};+#endif++#if YYDEBUG || YYERROR_VERBOSE || 0+/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.+ First, the terminals, then, starting at YYNTOKENS, nonterminals. */+static const char *const yytname[] =+{+ "$end", "error", "$undefined", "IDENT", "FCONST", "SCONST", "BCONST",+ "XCONST", "Op", "ICONST", "PARAM", "TYPECAST", "DOT_DOT", "COLON_EQUALS",+ "EQUALS_GREATER", "LESS_EQUALS", "GREATER_EQUALS", "NOT_EQUALS",+ "T_WORD", "T_CWORD", "T_DATUM", "LESS_LESS", "GREATER_GREATER",+ "K_ABSOLUTE", "K_ALIAS", "K_ALL", "K_ARRAY", "K_ASSERT", "K_BACKWARD",+ "K_BEGIN", "K_BY", "K_CASE", "K_CLOSE", "K_COLLATE", "K_COLUMN",+ "K_COLUMN_NAME", "K_CONSTANT", "K_CONSTRAINT", "K_CONSTRAINT_NAME",+ "K_CONTINUE", "K_CURRENT", "K_CURSOR", "K_DATATYPE", "K_DEBUG",+ "K_DECLARE", "K_DEFAULT", "K_DETAIL", "K_DIAGNOSTICS", "K_DUMP",+ "K_ELSE", "K_ELSIF", "K_END", "K_ERRCODE", "K_ERROR", "K_EXCEPTION",+ "K_EXECUTE", "K_EXIT", "K_FETCH", "K_FIRST", "K_FOR", "K_FOREACH",+ "K_FORWARD", "K_FROM", "K_GET", "K_HINT", "K_IF", "K_IN", "K_INFO",+ "K_INSERT", "K_INTO", "K_IS", "K_LAST", "K_LOG", "K_LOOP", "K_MESSAGE",+ "K_MESSAGE_TEXT", "K_MOVE", "K_NEXT", "K_NO", "K_NOT", "K_NOTICE",+ "K_NULL", "K_OPEN", "K_OPTION", "K_OR", "K_PERFORM", "K_PG_CONTEXT",+ "K_PG_DATATYPE_NAME", "K_PG_EXCEPTION_CONTEXT", "K_PG_EXCEPTION_DETAIL",+ "K_PG_EXCEPTION_HINT", "K_PRINT_STRICT_PARAMS", "K_PRIOR", "K_QUERY",+ "K_RAISE", "K_RELATIVE", "K_RESULT_OID", "K_RETURN",+ "K_RETURNED_SQLSTATE", "K_REVERSE", "K_ROW_COUNT", "K_ROWTYPE",+ "K_SCHEMA", "K_SCHEMA_NAME", "K_SCROLL", "K_SLICE", "K_SQLSTATE",+ "K_STACKED", "K_STRICT", "K_TABLE", "K_TABLE_NAME", "K_THEN", "K_TO",+ "K_TYPE", "K_USE_COLUMN", "K_USE_VARIABLE", "K_USING",+ "K_VARIABLE_CONFLICT", "K_WARNING", "K_WHEN", "K_WHILE", "'#'", "';'",+ "'('", "')'", "','", "'='", "'['", "$accept", "pl_function",+ "comp_options", "comp_option", "option_value", "opt_semi", "pl_block",+ "decl_sect", "decl_start", "decl_stmts", "decl_stmt", "decl_statement",+ "$@1", "opt_scrollable", "decl_cursor_query", "decl_cursor_args",+ "decl_cursor_arglist", "decl_cursor_arg", "decl_is_for",+ "decl_aliasitem", "decl_varname", "decl_const", "decl_datatype",+ "decl_collate", "decl_notnull", "decl_defval", "decl_defkey",+ "assign_operator", "proc_sect", "proc_stmt", "stmt_perform",+ "stmt_assign", "stmt_getdiag", "getdiag_area_opt", "getdiag_list",+ "getdiag_list_item", "getdiag_item", "getdiag_target", "assign_var",+ "stmt_if", "stmt_elsifs", "stmt_else", "stmt_case",+ "opt_expr_until_when", "case_when_list", "case_when", "opt_case_else",+ "stmt_loop", "stmt_while", "stmt_for", "for_control", "for_variable",+ "stmt_foreach_a", "foreach_slice", "stmt_exit", "exit_type",+ "stmt_return", "stmt_raise", "stmt_assert", "loop_body", "stmt_execsql",+ "stmt_dynexecute", "stmt_open", "stmt_fetch", "stmt_move",+ "opt_fetch_direction", "stmt_close", "stmt_null", "cursor_variable",+ "exception_sect", "@2", "proc_exceptions", "proc_exception",+ "proc_conditions", "proc_condition", "expr_until_semi",+ "expr_until_rightbracket", "expr_until_then", "expr_until_loop",+ "opt_block_label", "opt_label", "opt_exitcond", "any_identifier",+ "unreserved_keyword", YY_NULLPTR+};+#endif++# ifdef YYPRINT+/* YYTOKNUM[NUM] -- (External) token number corresponding to the+ (internal) symbol number NUM (which must be that of a token). */+static const yytype_uint16 yytoknum[] =+{+ 0, 256, 257, 258, 259, 260, 261, 262, 263, 264,+ 265, 266, 267, 268, 269, 270, 271, 272, 273, 274,+ 275, 276, 277, 278, 279, 280, 281, 282, 283, 284,+ 285, 286, 287, 288, 289, 290, 291, 292, 293, 294,+ 295, 296, 297, 298, 299, 300, 301, 302, 303, 304,+ 305, 306, 307, 308, 309, 310, 311, 312, 313, 314,+ 315, 316, 317, 318, 319, 320, 321, 322, 323, 324,+ 325, 326, 327, 328, 329, 330, 331, 332, 333, 334,+ 335, 336, 337, 338, 339, 340, 341, 342, 343, 344,+ 345, 346, 347, 348, 349, 350, 351, 352, 353, 354,+ 355, 356, 357, 358, 359, 360, 361, 362, 363, 364,+ 365, 366, 367, 368, 369, 370, 371, 372, 373, 374,+ 375, 35, 59, 40, 41, 44, 61, 91+};+# endif++#define YYPACT_NINF -234++#define yypact_value_is_default(Yystate) \+ (!!((Yystate) == (-234)))++#define YYTABLE_NINF -145++#define yytable_value_is_error(Yytable_value) \+ 0++ /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing+ STATE-NUM. */+static const yytype_int16 yypact[] =+{+ -234, 40, -18, -234, 283, -55, -234, -80, 21, 10,+ -234, -234, -234, -234, -234, -234, -234, -234, -234, -234,+ -234, -234, -234, -234, -234, -234, -234, -234, -234, -234,+ -234, -234, -234, -234, -234, -234, -234, -234, -234, -234,+ -234, -234, -234, -234, -234, -234, -234, -234, -234, -234,+ -234, -234, -234, -234, -234, -234, -234, -234, -234, -234,+ -234, -234, -234, -234, -234, -234, -234, -234, -234, -234,+ -234, -234, -234, -234, -234, -234, -234, -234, -234, -234,+ -234, -234, -234, -234, -234, -234, 34, -234, 17, 583,+ -37, -234, -234, -234, -234, 182, -234, -234, -234, -234,+ -234, -234, -234, -234, 886, -234, 283, -234, 182, -234,+ -234, -9, -234, -234, -234, -234, -234, -234, 15, -234,+ -234, -234, -234, -234, -26, -234, -234, -234, -52, 15,+ -234, -234, -234, -46, -234, -234, -234, -234, -11, -234,+ -234, -234, -234, -234, -234, -234, 283, -234, -234, -234,+ -234, -234, -234, -234, -234, -234, -234, 12, 0, 45,+ -234, 26, -234, -24, -234, 49, -234, -20, -234, -234,+ -234, -16, -6, 15, -234, -234, 61, -234, 15, -234,+ -234, -234, -234, -234, -234, -234, -234, -71, -234, 283,+ 78, 78, -234, -234, -234, 384, -234, -234, 77, -234,+ -30, -234, -234, 283, -6, -234, 48, 103, 782, 5,+ -234, -234, -234, -234, -234, -234, -234, -234, -234, -234,+ 65, 27, 938, -234, -234, -234, -234, 11, -234, 14,+ 485, 55, -234, -234, -234, 84, -59, -234, -234, -234,+ -234, -234, -234, -234, -61, -234, -7, 33, -234, -234,+ -234, -234, 130, 74, 72, -234, -234, 681, -21, -234,+ -234, -234, 66, -8, -10, 990, 115, 283, -234, -234,+ 103, -234, -234, -234, 97, -234, 124, 283, 1, -234,+ -234, -234, -234, -234, -234, -234, -234, -234, -234, -234,+ 29, -234, 73, -234, -234, 1042, -234, 87, -234, 31,+ -234, 681, -234, -234, -234, 834, 35, -234, -234, -234,+ -234, -234+};++ /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.+ Performed when YYTABLE does not specify something else to do. Zero+ means the default is an error. */+static const yytype_uint8 yydefact[] =+{+ 3, 0, 152, 1, 0, 0, 4, 12, 0, 15,+ 158, 160, 161, 162, 163, 164, 165, 166, 167, 168,+ 169, 170, 171, 172, 173, 174, 175, 176, 177, 178,+ 179, 180, 181, 182, 183, 184, 185, 186, 187, 188,+ 189, 190, 191, 192, 193, 194, 195, 196, 197, 198,+ 199, 200, 201, 202, 203, 204, 205, 206, 207, 208,+ 209, 210, 211, 212, 213, 214, 215, 216, 217, 218,+ 219, 220, 221, 222, 223, 224, 225, 226, 227, 228,+ 229, 230, 231, 232, 233, 234, 0, 159, 0, 0,+ 0, 13, 2, 59, 18, 16, 153, 5, 10, 6,+ 11, 7, 9, 8, 152, 42, 0, 22, 17, 20,+ 21, 44, 43, 127, 128, 95, 124, 103, 0, 121,+ 140, 129, 120, 133, 85, 150, 126, 133, 0, 0,+ 148, 123, 122, 0, 60, 75, 62, 76, 0, 63,+ 64, 65, 66, 67, 68, 69, 154, 70, 71, 72,+ 73, 74, 77, 78, 79, 80, 81, 0, 15, 0,+ 19, 0, 45, 0, 30, 0, 46, 0, 137, 138,+ 136, 0, 0, 0, 86, 87, 0, 59, 0, 135,+ 130, 82, 61, 58, 57, 149, 148, 0, 155, 154,+ 0, 0, 59, 151, 23, 0, 29, 26, 47, 150,+ 107, 105, 134, 0, 141, 143, 0, 0, 152, 0,+ 96, 83, 148, 156, 119, 14, 114, 115, 113, 59,+ 0, 117, 152, 109, 59, 39, 41, 0, 40, 32,+ 0, 51, 59, 59, 104, 0, 0, 146, 147, 142,+ 131, 93, 94, 92, 0, 89, 0, 100, 132, 157,+ 111, 112, 0, 0, 0, 110, 25, 0, 0, 48,+ 50, 49, 0, 0, 152, 152, 0, 0, 59, 84,+ 0, 91, 59, 150, 0, 118, 0, 154, 0, 34,+ 46, 38, 37, 31, 52, 56, 53, 24, 54, 55,+ 0, 145, 152, 88, 90, 152, 59, 0, 151, 0,+ 33, 0, 36, 27, 102, 152, 0, 59, 125, 35,+ 97, 116+};++ /* YYPGOTO[NTERM-NUM]. */+static const yytype_int16 yypgoto[] =+{+ -234, -234, -234, -234, -234, -234, 154, -234, -234, -234,+ 51, -234, -234, -234, -234, -234, -234, -141, -234, -234,+ -233, -234, -119, -234, -234, -234, -234, -220, -89, -234,+ -234, -234, -234, -234, -234, -108, -234, -234, -234, -234,+ -234, -234, -234, -234, -234, -36, -234, -234, -234, -234,+ -234, -28, -234, -234, -234, -234, -234, -234, -234, -206,+ -234, -234, -234, -234, -234, 38, -234, -234, -99, -234,+ -234, -234, -38, -234, -96, -155, -234, -187, -130, 170,+ -166, -234, -4, -88+};++ /* YYDEFGOTO[NTERM-NUM]. */+static const yytype_int16 yydefgoto[] =+{+ -1, 1, 2, 6, 99, 92, 133, 8, 95, 108,+ 109, 110, 229, 165, 303, 258, 278, 279, 283, 227,+ 111, 166, 198, 231, 263, 287, 288, 186, 222, 134,+ 135, 136, 137, 176, 244, 245, 294, 246, 138, 139,+ 247, 274, 140, 167, 200, 201, 235, 141, 142, 143,+ 219, 220, 144, 253, 145, 146, 147, 148, 149, 223,+ 150, 151, 152, 153, 154, 173, 155, 156, 171, 157,+ 172, 204, 205, 236, 237, 181, 210, 177, 224, 158,+ 187, 214, 188, 87+};++ /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If+ positive, shift that token. If negative, reduce the rule whose+ number is the opposite. If YYTABLE_NINF, syntax error. */+static const yytype_int16 yytable[] =+{+ 86, 100, 183, 4, 104, 183, 183, 112, 113, 114,+ 115, 4, 232, 250, 174, 161, 101, 116, 255, 233,+ 112, 117, 118, 215, 280, 267, 271, 162, 88, 119,+ 180, 211, -28, 168, 169, 170, 89, 285, 281, -106,+ 3, -106, 91, 289, 94, 121, 122, 123, 212, 282,+ 93, 213, 268, 124, 94, 125, 96, 249, 126, 190,+ 191, 269, 90, 189, 270, 97, 127, 194, 280, 163,+ 179, 128, 129, 192, 206, 130, 182, 102, 103, 209,+ 196, 175, 272, 273, 131, 195, 296, 132, 208, 199,+ 197, 113, 114, 115, 4, 164, 216, 217, 218, 199,+ 116, 311, 159, 5, 117, 118, 202, 228, 207, -106,+ 230, 299, 119, 203, 286, 184, 185, 240, 184, 184,+ 193, 241, 242, 243, -144, 300, 301, 248, 121, 122,+ 123, 251, 252, 256, 262, 266, 124, 257, 125, 275,+ 276, 126, 261, 264, 265, 277, 290, 284, 297, 127,+ 298, 304, 306, 308, 128, 129, 7, 310, 130, 160,+ 309, 302, 293, 221, 234, 178, 239, 131, 307, 112,+ 132, 291, 9, 0, 0, 0, 0, 0, 0, 292,+ 0, 0, 0, 295, 0, 0, 0, 0, 0, 0,+ 0, 0, -144, 0, 0, 0, 0, 0, 0, 238,+ 105, 0, 0, 106, 0, 12, 13, 305, 14, 15,+ 16, 0, 0, 112, 17, 18, 19, 20, 21, 22,+ 23, 24, 25, 26, 27, 28, 107, 29, 30, 31,+ 32, 0, 33, 0, 34, 35, 36, 0, 37, 38,+ 39, 0, 0, 40, 0, 41, 42, 0, 0, 43,+ 44, 0, 45, 46, 47, 0, 48, 49, 50, 51,+ 52, 0, 53, 238, 54, 55, 0, 56, 57, 58,+ 59, 60, 61, 62, 63, 64, 65, 66, 67, 68,+ 69, 70, 71, 72, 73, 74, 75, 76, 77, 78,+ 0, 79, 80, 0, 0, 81, 82, 83, 0, 84,+ 85, 10, 0, 11, 0, 0, 12, 13, 0, 14,+ 15, 16, 0, 0, 0, 17, 18, 19, 20, 21,+ 22, 23, 24, 25, 26, 27, 28, 0, 29, 30,+ 31, 32, 0, 33, 0, 34, 35, 36, 0, 37,+ 38, 39, 0, 0, 40, 0, 41, 42, 0, 0,+ 43, 44, 0, 45, 46, 47, 0, 48, 49, 50,+ 51, 52, 0, 53, 0, 54, 55, 0, 56, 57,+ 58, 59, 60, 61, 62, 63, 64, 65, 66, 67,+ 68, 69, 70, 71, 72, 73, 74, 75, 76, 77,+ 78, 0, 79, 80, 0, 0, 81, 82, 83, 0,+ 84, 85, 225, 226, 0, 0, 0, 12, 13, 0,+ 14, 15, 16, 0, 0, 0, 17, 18, 19, 20,+ 21, 22, 23, 24, 25, 26, 27, 28, 0, 29,+ 30, 31, 32, 0, 33, 0, 34, 35, 36, 0,+ 37, 38, 39, 0, 0, 40, 0, 41, 42, 0,+ 0, 43, 44, 0, 45, 46, 47, 0, 48, 49,+ 50, 51, 52, 0, 53, 0, 54, 55, 0, 56,+ 57, 58, 59, 60, 61, 62, 63, 64, 65, 66,+ 67, 68, 69, 70, 71, 72, 73, 74, 75, 76,+ 77, 78, 0, 79, 80, 0, 0, 81, 82, 83,+ 0, 84, 85, 259, 260, 0, 0, 0, 12, 13,+ 0, 14, 15, 16, 0, 0, 0, 17, 18, 19,+ 20, 21, 22, 23, 24, 25, 26, 27, 28, 0,+ 29, 30, 31, 32, 0, 33, 0, 34, 35, 36,+ 0, 37, 38, 39, 0, 0, 40, 0, 41, 42,+ 0, 0, 43, 44, 0, 45, 46, 47, 0, 48,+ 49, 50, 51, 52, 0, 53, 0, 54, 55, 0,+ 56, 57, 58, 59, 60, 61, 62, 63, 64, 65,+ 66, 67, 68, 69, 70, 71, 72, 73, 74, 75,+ 76, 77, 78, 0, 79, 80, 0, 0, 81, 82,+ 83, 98, 84, 85, 0, 0, 12, 13, 0, 14,+ 15, 16, 0, 0, 0, 17, 18, 19, 20, 21,+ 22, 23, 24, 25, 26, 27, 28, 0, 29, 30,+ 31, 32, 0, 33, 0, 34, 35, 36, 0, 37,+ 38, 39, 0, 0, 40, 0, 41, 42, 0, 0,+ 43, 44, 0, 45, 46, 47, 0, 48, 49, 50,+ 51, 52, 0, 53, 0, 54, 55, 0, 56, 57,+ 58, 59, 60, 61, 62, 63, 64, 65, 66, 67,+ 68, 69, 70, 71, 72, 73, 74, 75, 76, 77,+ 78, 0, 79, 80, 0, 0, 81, 82, 83, 105,+ 84, 85, 0, 0, 12, 13, 0, 14, 15, 16,+ 0, 0, 0, 17, 18, 19, 20, 21, 22, 23,+ 24, 25, 26, 27, 28, 0, 29, 30, 31, 32,+ 0, 33, 0, 34, 35, 36, 0, 37, 38, 39,+ 0, 0, 40, 0, 41, 42, 0, 0, 43, 44,+ 0, 45, 46, 47, 0, 48, 49, 50, 51, 52,+ 0, 53, 0, 54, 55, 0, 56, 57, 58, 59,+ 60, 61, 62, 63, 64, 65, 66, 67, 68, 69,+ 70, 71, 72, 73, 74, 75, 76, 77, 78, 0,+ 79, 80, 0, 0, 81, 82, 83, 0, 84, 85,+ 113, 114, 115, 4, 0, 0, 0, 0, 0, 116,+ 0, 0, 0, 117, 118, 0, 0, 0, 0, 0,+ 0, 119, 0, 0, 0, 0, 0, 0, 0, 0,+ 0, -98, -98, -98, 0, 0, 0, 121, 122, 123,+ 0, 0, 0, 0, 0, 124, 0, 125, 0, 0,+ 126, 0, 113, 114, 115, 4, 0, 0, 127, 0,+ 0, 116, 0, 128, 129, 117, 118, 130, 0, 0,+ 0, 0, 0, 119, 0, 0, 131, 0, 0, 132,+ 0, 0, 0, -99, -99, -99, 0, 0, 0, 121,+ 122, 123, 0, 0, 0, 0, 0, 124, 0, 125,+ 0, 0, 126, 0, 113, 114, 115, 4, 0, 0,+ 127, 0, 0, 116, 0, 128, 129, 117, 118, 130,+ 0, 0, 0, 0, 0, 119, 0, 0, 131, 0,+ 0, 132, 0, 0, 0, 0, 0, -139, 0, 0,+ 120, 121, 122, 123, 0, 0, 0, 0, 0, 124,+ 0, 125, 0, 0, 126, 0, 113, 114, 115, 4,+ 0, 0, 127, 0, 0, 116, 0, 128, 129, 117,+ 118, 130, 0, 0, 0, 0, 0, 119, 0, 0,+ 131, 0, 0, 132, 0, 0, 0, 0, 0, 254,+ 0, 0, 0, 121, 122, 123, 0, 0, 0, 0,+ 0, 124, 0, 125, 0, 0, 126, 0, 113, 114,+ 115, 4, 0, 0, 127, 0, 0, 116, 0, 128,+ 129, 117, 118, 130, 0, 0, 0, 0, 0, 119,+ 0, 0, 131, 0, 0, 132, 0, 0, 0, 0,+ 0, -108, 0, 0, 0, 121, 122, 123, 0, 0,+ 0, 0, 0, 124, 0, 125, 0, 0, 126, 0,+ 113, 114, 115, 4, 0, 0, 127, 0, 0, 116,+ 0, 128, 129, 117, 118, 130, 0, 0, 0, 0,+ 0, 119, 0, 0, 131, 0, 0, 132, 0, 0,+ 0, 0, 0, -101, 0, 0, 0, 121, 122, 123,+ 0, 0, 0, 0, 0, 124, 0, 125, 0, 0,+ 126, 0, 0, 0, 0, 0, 0, 0, 127, 0,+ 0, 0, 0, 128, 129, 0, 0, 130, 0, 0,+ 0, 0, 0, 0, 0, 0, 131, 0, 0, 132+};++static const yytype_int16 yycheck[] =+{+ 4, 89, 13, 21, 93, 13, 13, 95, 18, 19,+ 20, 21, 199, 219, 40, 24, 53, 27, 224, 49,+ 108, 31, 32, 189, 257, 84, 246, 36, 83, 39,+ 129, 186, 41, 18, 19, 20, 91, 45, 59, 49,+ 0, 51, 122, 263, 44, 55, 56, 57, 119, 70,+ 29, 122, 111, 63, 44, 65, 22, 212, 68, 59,+ 60, 122, 117, 51, 125, 48, 76, 22, 301, 78,+ 122, 81, 82, 73, 173, 85, 122, 114, 115, 178,+ 104, 107, 49, 50, 94, 59, 273, 97, 177, 119,+ 41, 18, 19, 20, 21, 104, 18, 19, 20, 119,+ 27, 307, 106, 121, 31, 32, 122, 195, 47, 119,+ 33, 277, 39, 119, 122, 126, 127, 69, 126, 126,+ 120, 18, 19, 20, 51, 124, 125, 122, 55, 56,+ 57, 66, 105, 122, 79, 51, 63, 123, 65, 9,+ 66, 68, 230, 232, 233, 73, 31, 81, 51, 76,+ 26, 122, 65, 122, 81, 82, 2, 122, 85, 108,+ 301, 280, 270, 191, 200, 127, 204, 94, 298, 257,+ 97, 267, 2, -1, -1, -1, -1, -1, -1, 268,+ -1, -1, -1, 272, -1, -1, -1, -1, -1, -1,+ -1, -1, 119, -1, -1, -1, -1, -1, -1, 203,+ 18, -1, -1, 21, -1, 23, 24, 296, 26, 27,+ 28, -1, -1, 301, 32, 33, 34, 35, 36, 37,+ 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,+ 48, -1, 50, -1, 52, 53, 54, -1, 56, 57,+ 58, -1, -1, 61, -1, 63, 64, -1, -1, 67,+ 68, -1, 70, 71, 72, -1, 74, 75, 76, 77,+ 78, -1, 80, 267, 82, 83, -1, 85, 86, 87,+ 88, 89, 90, 91, 92, 93, 94, 95, 96, 97,+ 98, 99, 100, 101, 102, 103, 104, 105, 106, 107,+ -1, 109, 110, -1, -1, 113, 114, 115, -1, 117,+ 118, 18, -1, 20, -1, -1, 23, 24, -1, 26,+ 27, 28, -1, -1, -1, 32, 33, 34, 35, 36,+ 37, 38, 39, 40, 41, 42, 43, -1, 45, 46,+ 47, 48, -1, 50, -1, 52, 53, 54, -1, 56,+ 57, 58, -1, -1, 61, -1, 63, 64, -1, -1,+ 67, 68, -1, 70, 71, 72, -1, 74, 75, 76,+ 77, 78, -1, 80, -1, 82, 83, -1, 85, 86,+ 87, 88, 89, 90, 91, 92, 93, 94, 95, 96,+ 97, 98, 99, 100, 101, 102, 103, 104, 105, 106,+ 107, -1, 109, 110, -1, -1, 113, 114, 115, -1,+ 117, 118, 18, 19, -1, -1, -1, 23, 24, -1,+ 26, 27, 28, -1, -1, -1, 32, 33, 34, 35,+ 36, 37, 38, 39, 40, 41, 42, 43, -1, 45,+ 46, 47, 48, -1, 50, -1, 52, 53, 54, -1,+ 56, 57, 58, -1, -1, 61, -1, 63, 64, -1,+ -1, 67, 68, -1, 70, 71, 72, -1, 74, 75,+ 76, 77, 78, -1, 80, -1, 82, 83, -1, 85,+ 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,+ 96, 97, 98, 99, 100, 101, 102, 103, 104, 105,+ 106, 107, -1, 109, 110, -1, -1, 113, 114, 115,+ -1, 117, 118, 18, 19, -1, -1, -1, 23, 24,+ -1, 26, 27, 28, -1, -1, -1, 32, 33, 34,+ 35, 36, 37, 38, 39, 40, 41, 42, 43, -1,+ 45, 46, 47, 48, -1, 50, -1, 52, 53, 54,+ -1, 56, 57, 58, -1, -1, 61, -1, 63, 64,+ -1, -1, 67, 68, -1, 70, 71, 72, -1, 74,+ 75, 76, 77, 78, -1, 80, -1, 82, 83, -1,+ 85, 86, 87, 88, 89, 90, 91, 92, 93, 94,+ 95, 96, 97, 98, 99, 100, 101, 102, 103, 104,+ 105, 106, 107, -1, 109, 110, -1, -1, 113, 114,+ 115, 18, 117, 118, -1, -1, 23, 24, -1, 26,+ 27, 28, -1, -1, -1, 32, 33, 34, 35, 36,+ 37, 38, 39, 40, 41, 42, 43, -1, 45, 46,+ 47, 48, -1, 50, -1, 52, 53, 54, -1, 56,+ 57, 58, -1, -1, 61, -1, 63, 64, -1, -1,+ 67, 68, -1, 70, 71, 72, -1, 74, 75, 76,+ 77, 78, -1, 80, -1, 82, 83, -1, 85, 86,+ 87, 88, 89, 90, 91, 92, 93, 94, 95, 96,+ 97, 98, 99, 100, 101, 102, 103, 104, 105, 106,+ 107, -1, 109, 110, -1, -1, 113, 114, 115, 18,+ 117, 118, -1, -1, 23, 24, -1, 26, 27, 28,+ -1, -1, -1, 32, 33, 34, 35, 36, 37, 38,+ 39, 40, 41, 42, 43, -1, 45, 46, 47, 48,+ -1, 50, -1, 52, 53, 54, -1, 56, 57, 58,+ -1, -1, 61, -1, 63, 64, -1, -1, 67, 68,+ -1, 70, 71, 72, -1, 74, 75, 76, 77, 78,+ -1, 80, -1, 82, 83, -1, 85, 86, 87, 88,+ 89, 90, 91, 92, 93, 94, 95, 96, 97, 98,+ 99, 100, 101, 102, 103, 104, 105, 106, 107, -1,+ 109, 110, -1, -1, 113, 114, 115, -1, 117, 118,+ 18, 19, 20, 21, -1, -1, -1, -1, -1, 27,+ -1, -1, -1, 31, 32, -1, -1, -1, -1, -1,+ -1, 39, -1, -1, -1, -1, -1, -1, -1, -1,+ -1, 49, 50, 51, -1, -1, -1, 55, 56, 57,+ -1, -1, -1, -1, -1, 63, -1, 65, -1, -1,+ 68, -1, 18, 19, 20, 21, -1, -1, 76, -1,+ -1, 27, -1, 81, 82, 31, 32, 85, -1, -1,+ -1, -1, -1, 39, -1, -1, 94, -1, -1, 97,+ -1, -1, -1, 49, 50, 51, -1, -1, -1, 55,+ 56, 57, -1, -1, -1, -1, -1, 63, -1, 65,+ -1, -1, 68, -1, 18, 19, 20, 21, -1, -1,+ 76, -1, -1, 27, -1, 81, 82, 31, 32, 85,+ -1, -1, -1, -1, -1, 39, -1, -1, 94, -1,+ -1, 97, -1, -1, -1, -1, -1, 51, -1, -1,+ 54, 55, 56, 57, -1, -1, -1, -1, -1, 63,+ -1, 65, -1, -1, 68, -1, 18, 19, 20, 21,+ -1, -1, 76, -1, -1, 27, -1, 81, 82, 31,+ 32, 85, -1, -1, -1, -1, -1, 39, -1, -1,+ 94, -1, -1, 97, -1, -1, -1, -1, -1, 51,+ -1, -1, -1, 55, 56, 57, -1, -1, -1, -1,+ -1, 63, -1, 65, -1, -1, 68, -1, 18, 19,+ 20, 21, -1, -1, 76, -1, -1, 27, -1, 81,+ 82, 31, 32, 85, -1, -1, -1, -1, -1, 39,+ -1, -1, 94, -1, -1, 97, -1, -1, -1, -1,+ -1, 51, -1, -1, -1, 55, 56, 57, -1, -1,+ -1, -1, -1, 63, -1, 65, -1, -1, 68, -1,+ 18, 19, 20, 21, -1, -1, 76, -1, -1, 27,+ -1, 81, 82, 31, 32, 85, -1, -1, -1, -1,+ -1, 39, -1, -1, 94, -1, -1, 97, -1, -1,+ -1, -1, -1, 51, -1, -1, -1, 55, 56, 57,+ -1, -1, -1, -1, -1, 63, -1, 65, -1, -1,+ 68, -1, -1, -1, -1, -1, -1, -1, 76, -1,+ -1, -1, -1, 81, 82, -1, -1, 85, -1, -1,+ -1, -1, -1, -1, -1, -1, 94, -1, -1, 97+};++ /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing+ symbol of state STATE-NUM. */+static const yytype_uint8 yystos[] =+{+ 0, 129, 130, 0, 21, 121, 131, 134, 135, 207,+ 18, 20, 23, 24, 26, 27, 28, 32, 33, 34,+ 35, 36, 37, 38, 39, 40, 41, 42, 43, 45,+ 46, 47, 48, 50, 52, 53, 54, 56, 57, 58,+ 61, 63, 64, 67, 68, 70, 71, 72, 74, 75,+ 76, 77, 78, 80, 82, 83, 85, 86, 87, 88,+ 89, 90, 91, 92, 93, 94, 95, 96, 97, 98,+ 99, 100, 101, 102, 103, 104, 105, 106, 107, 109,+ 110, 113, 114, 115, 117, 118, 210, 211, 83, 91,+ 117, 122, 133, 29, 44, 136, 22, 48, 18, 132,+ 211, 53, 114, 115, 156, 18, 21, 44, 137, 138,+ 139, 148, 211, 18, 19, 20, 27, 31, 32, 39,+ 54, 55, 56, 57, 63, 65, 68, 76, 81, 82,+ 85, 94, 97, 134, 157, 158, 159, 160, 166, 167,+ 170, 175, 176, 177, 180, 182, 183, 184, 185, 186,+ 188, 189, 190, 191, 192, 194, 195, 197, 207, 210,+ 138, 24, 36, 78, 104, 141, 149, 171, 18, 19,+ 20, 196, 198, 193, 40, 107, 161, 205, 193, 122,+ 196, 203, 122, 13, 126, 127, 155, 208, 210, 51,+ 59, 60, 73, 120, 22, 59, 104, 41, 150, 119,+ 172, 173, 122, 119, 199, 200, 196, 47, 156, 196,+ 204, 203, 119, 122, 209, 208, 18, 19, 20, 178,+ 179, 179, 156, 187, 206, 18, 19, 147, 211, 140,+ 33, 151, 205, 49, 173, 174, 201, 202, 210, 200,+ 69, 18, 19, 20, 162, 163, 165, 168, 122, 203,+ 187, 66, 105, 181, 51, 187, 122, 123, 143, 18,+ 19, 211, 79, 152, 156, 156, 51, 84, 111, 122,+ 125, 155, 49, 50, 169, 9, 66, 73, 144, 145,+ 148, 59, 70, 146, 81, 45, 122, 153, 154, 155,+ 31, 202, 156, 163, 164, 156, 205, 51, 26, 208,+ 124, 125, 150, 142, 122, 156, 65, 206, 122, 145,+ 122, 187+};++ /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */+static const yytype_uint8 yyr1[] =+{+ 0, 128, 129, 130, 130, 131, 131, 131, 131, 131,+ 132, 132, 133, 133, 134, 135, 135, 135, 136, 137,+ 137, 138, 138, 138, 139, 139, 140, 139, 141, 141,+ 141, 142, 143, 143, 144, 144, 145, 146, 146, 147,+ 147, 147, 148, 148, 149, 149, 150, 151, 151, 151,+ 151, 152, 152, 153, 153, 154, 154, 155, 155, 156,+ 156, 157, 157, 157, 157, 157, 157, 157, 157, 157,+ 157, 157, 157, 157, 157, 157, 157, 157, 157, 157,+ 157, 157, 158, 159, 160, 161, 161, 161, 162, 162,+ 163, 164, 165, 165, 165, 166, 166, 167, 168, 168,+ 169, 169, 170, 171, 172, 172, 173, 174, 174, 175,+ 176, 177, 178, 179, 179, 179, 180, 181, 181, 182,+ 183, 183, 184, 185, 186, 187, 188, 188, 188, 189,+ 190, 191, 192, 193, 194, 195, 196, 196, 196, 197,+ 198, 197, 199, 199, 200, 201, 201, 202, 203, 204,+ 205, 206, 207, 207, 208, 208, 209, 209, 210, 210,+ 210, 211, 211, 211, 211, 211, 211, 211, 211, 211,+ 211, 211, 211, 211, 211, 211, 211, 211, 211, 211,+ 211, 211, 211, 211, 211, 211, 211, 211, 211, 211,+ 211, 211, 211, 211, 211, 211, 211, 211, 211, 211,+ 211, 211, 211, 211, 211, 211, 211, 211, 211, 211,+ 211, 211, 211, 211, 211, 211, 211, 211, 211, 211,+ 211, 211, 211, 211, 211, 211, 211, 211, 211, 211,+ 211, 211, 211, 211, 211+};++ /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. */+static const yytype_uint8 yyr2[] =+{+ 0, 2, 3, 0, 2, 3, 3, 3, 3, 3,+ 1, 1, 0, 1, 6, 1, 2, 3, 1, 2,+ 1, 1, 1, 3, 6, 5, 0, 7, 0, 2,+ 1, 0, 0, 3, 1, 3, 2, 1, 1, 1,+ 1, 1, 1, 1, 0, 1, 0, 0, 2, 2,+ 2, 0, 2, 1, 1, 1, 1, 1, 1, 0,+ 2, 2, 1, 1, 1, 1, 1, 1, 1, 1,+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,+ 1, 1, 2, 3, 5, 0, 1, 1, 3, 1,+ 3, 0, 1, 1, 1, 1, 3, 8, 0, 4,+ 0, 2, 7, 0, 2, 1, 3, 0, 2, 3,+ 4, 4, 2, 1, 1, 1, 8, 0, 2, 3,+ 1, 1, 1, 1, 1, 5, 1, 1, 1, 1,+ 2, 4, 4, 0, 3, 2, 1, 1, 1, 0,+ 0, 3, 2, 1, 4, 3, 1, 1, 0, 0,+ 0, 0, 0, 3, 0, 1, 1, 2, 1, 1,+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,+ 1, 1, 1, 1, 1+};+++#define yyerrok (yyerrstatus = 0)+#define yyclearin (yychar = YYEMPTY)+#define YYEMPTY (-2)+#define YYEOF 0++#define YYACCEPT goto yyacceptlab+#define YYABORT goto yyabortlab+#define YYERROR goto yyerrorlab+++#define YYRECOVERING() (!!yyerrstatus)++#define YYBACKUP(Token, Value) \+do \+ if (yychar == YYEMPTY) \+ { \+ yychar = (Token); \+ yylval = (Value); \+ YYPOPSTACK (yylen); \+ yystate = *yyssp; \+ goto yybackup; \+ } \+ else \+ { \+ yyerror (YY_("syntax error: cannot back up")); \+ YYERROR; \+ } \+while (0)++/* Error token number */+#define YYTERROR 1+#define YYERRCODE 256+++/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].+ If N is 0, then set CURRENT to the empty location which ends+ the previous symbol: RHS[0] (always defined). */++#ifndef YYLLOC_DEFAULT+# define YYLLOC_DEFAULT(Current, Rhs, N) \+ do \+ if (N) \+ { \+ (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \+ (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \+ (Current).last_line = YYRHSLOC (Rhs, N).last_line; \+ (Current).last_column = YYRHSLOC (Rhs, N).last_column; \+ } \+ else \+ { \+ (Current).first_line = (Current).last_line = \+ YYRHSLOC (Rhs, 0).last_line; \+ (Current).first_column = (Current).last_column = \+ YYRHSLOC (Rhs, 0).last_column; \+ } \+ while (0)+#endif++#define YYRHSLOC(Rhs, K) ((Rhs)[K])+++/* Enable debugging if requested. */+#if YYDEBUG++# ifndef YYFPRINTF+# include <stdio.h> /* INFRINGES ON USER NAME SPACE */+# define YYFPRINTF fprintf+# endif++# define YYDPRINTF(Args) \+do { \+ if (yydebug) \+ YYFPRINTF Args; \+} while (0)+++/* YY_LOCATION_PRINT -- Print the location on the stream.+ This macro was not mandated originally: define only if we know+ we won't break user code: when these are the locations we know. */++#ifndef YY_LOCATION_PRINT+# if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL++/* Print *YYLOCP on YYO. Private, do not rely on its existence. */++YY_ATTRIBUTE_UNUSED+static unsigned+yy_location_print_ (FILE *yyo, YYLTYPE const * const yylocp)+{+ unsigned res = 0;+ int end_col = 0 != yylocp->last_column ? yylocp->last_column - 1 : 0;+ if (0 <= yylocp->first_line)+ {+ res += YYFPRINTF (yyo, "%d", yylocp->first_line);+ if (0 <= yylocp->first_column)+ res += YYFPRINTF (yyo, ".%d", yylocp->first_column);+ }+ if (0 <= yylocp->last_line)+ {+ if (yylocp->first_line < yylocp->last_line)+ {+ res += YYFPRINTF (yyo, "-%d", yylocp->last_line);+ if (0 <= end_col)+ res += YYFPRINTF (yyo, ".%d", end_col);+ }+ else if (0 <= end_col && yylocp->first_column < end_col)+ res += YYFPRINTF (yyo, "-%d", end_col);+ }+ return res;+ }++# define YY_LOCATION_PRINT(File, Loc) \+ yy_location_print_ (File, &(Loc))++# else+# define YY_LOCATION_PRINT(File, Loc) ((void) 0)+# endif+#endif+++# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \+do { \+ if (yydebug) \+ { \+ YYFPRINTF (stderr, "%s ", Title); \+ yy_symbol_print (stderr, \+ Type, Value, Location); \+ YYFPRINTF (stderr, "\n"); \+ } \+} while (0)+++/*----------------------------------------.+| Print this symbol's value on YYOUTPUT. |+`----------------------------------------*/++static void+yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, YYLTYPE const * const yylocationp)+{+ FILE *yyo = yyoutput;+ YYUSE (yyo);+ YYUSE (yylocationp);+ if (!yyvaluep)+ return;+# ifdef YYPRINT+ if (yytype < YYNTOKENS)+ YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);+# endif+ YYUSE (yytype);+}+++/*--------------------------------.+| Print this symbol on YYOUTPUT. |+`--------------------------------*/++static void+yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, YYLTYPE const * const yylocationp)+{+ YYFPRINTF (yyoutput, "%s %s (",+ yytype < YYNTOKENS ? "token" : "nterm", yytname[yytype]);++ YY_LOCATION_PRINT (yyoutput, *yylocationp);+ YYFPRINTF (yyoutput, ": ");+ yy_symbol_value_print (yyoutput, yytype, yyvaluep, yylocationp);+ YYFPRINTF (yyoutput, ")");+}++/*------------------------------------------------------------------.+| yy_stack_print -- Print the state stack from its BOTTOM up to its |+| TOP (included). |+`------------------------------------------------------------------*/++static void+yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop)+{+ YYFPRINTF (stderr, "Stack now");+ for (; yybottom <= yytop; yybottom++)+ {+ int yybot = *yybottom;+ YYFPRINTF (stderr, " %d", yybot);+ }+ YYFPRINTF (stderr, "\n");+}++# define YY_STACK_PRINT(Bottom, Top) \+do { \+ if (yydebug) \+ yy_stack_print ((Bottom), (Top)); \+} while (0)+++/*------------------------------------------------.+| Report that the YYRULE is going to be reduced. |+`------------------------------------------------*/++static void+yy_reduce_print (yytype_int16 *yyssp, YYSTYPE *yyvsp, YYLTYPE *yylsp, int yyrule)+{+ unsigned long int yylno = yyrline[yyrule];+ int yynrhs = yyr2[yyrule];+ int yyi;+ YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n",+ yyrule - 1, yylno);+ /* The symbols being reduced. */+ for (yyi = 0; yyi < yynrhs; yyi++)+ {+ YYFPRINTF (stderr, " $%d = ", yyi + 1);+ yy_symbol_print (stderr,+ yystos[yyssp[yyi + 1 - yynrhs]],+ &(yyvsp[(yyi + 1) - (yynrhs)])+ , &(yylsp[(yyi + 1) - (yynrhs)]) );+ YYFPRINTF (stderr, "\n");+ }+}++# define YY_REDUCE_PRINT(Rule) \+do { \+ if (yydebug) \+ yy_reduce_print (yyssp, yyvsp, yylsp, Rule); \+} while (0)++/* Nonzero means print parse trace. It is left uninitialized so that+ multiple parsers can coexist. */+int yydebug;+#else /* !YYDEBUG */+# define YYDPRINTF(Args)+# define YY_SYMBOL_PRINT(Title, Type, Value, Location)+# define YY_STACK_PRINT(Bottom, Top)+# define YY_REDUCE_PRINT(Rule)+#endif /* !YYDEBUG */+++/* YYINITDEPTH -- initial size of the parser's stacks. */+#ifndef YYINITDEPTH+# define YYINITDEPTH 200+#endif++/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only+ if the built-in stack extension method is used).++ Do not make this value too large; the results are undefined if+ YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH)+ evaluated with infinite-precision integer arithmetic. */++#ifndef YYMAXDEPTH+# define YYMAXDEPTH 10000+#endif+++#if YYERROR_VERBOSE++# ifndef yystrlen+# if defined __GLIBC__ && defined _STRING_H+# define yystrlen strlen+# else+/* Return the length of YYSTR. */+static YYSIZE_T+yystrlen (const char *yystr)+{+ YYSIZE_T yylen;+ for (yylen = 0; yystr[yylen]; yylen++)+ continue;+ return yylen;+}+# endif+# endif++# ifndef yystpcpy+# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE+# define yystpcpy stpcpy+# else+/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in+ YYDEST. */+static char *+yystpcpy (char *yydest, const char *yysrc)+{+ char *yyd = yydest;+ const char *yys = yysrc;++ while ((*yyd++ = *yys++) != '\0')+ continue;++ return yyd - 1;+}+# endif+# endif++# ifndef yytnamerr+/* Copy to YYRES the contents of YYSTR after stripping away unnecessary+ quotes and backslashes, so that it's suitable for yyerror. The+ heuristic is that double-quoting is unnecessary unless the string+ contains an apostrophe, a comma, or backslash (other than+ backslash-backslash). YYSTR is taken from yytname. If YYRES is+ null, do not copy; instead, return the length of what the result+ would have been. */+static YYSIZE_T+yytnamerr (char *yyres, const char *yystr)+{+ if (*yystr == '"')+ {+ YYSIZE_T yyn = 0;+ char const *yyp = yystr;++ for (;;)+ switch (*++yyp)+ {+ case '\'':+ case ',':+ goto do_not_strip_quotes;++ case '\\':+ if (*++yyp != '\\')+ goto do_not_strip_quotes;+ /* Fall through. */+ default:+ if (yyres)+ yyres[yyn] = *yyp;+ yyn++;+ break;++ case '"':+ if (yyres)+ yyres[yyn] = '\0';+ return yyn;+ }+ do_not_strip_quotes: ;+ }++ if (! yyres)+ return yystrlen (yystr);++ return yystpcpy (yyres, yystr) - yyres;+}+# endif++/* Copy into *YYMSG, which is of size *YYMSG_ALLOC, an error message+ about the unexpected token YYTOKEN for the state stack whose top is+ YYSSP.++ Return 0 if *YYMSG was successfully written. Return 1 if *YYMSG is+ not large enough to hold the message. In that case, also set+ *YYMSG_ALLOC to the required number of bytes. Return 2 if the+ required number of bytes is too large to store. */+static int+yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg,+ yytype_int16 *yyssp, int yytoken)+{+ YYSIZE_T yysize0 = yytnamerr (YY_NULLPTR, yytname[yytoken]);+ YYSIZE_T yysize = yysize0;+ enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };+ /* Internationalized format string. */+ const char *yyformat = YY_NULLPTR;+ /* Arguments of yyformat. */+ char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];+ /* Number of reported tokens (one for the "unexpected", one per+ "expected"). */+ int yycount = 0;++ /* There are many possibilities here to consider:+ - If this state is a consistent state with a default action, then+ the only way this function was invoked is if the default action+ is an error action. In that case, don't check for expected+ tokens because there are none.+ - The only way there can be no lookahead present (in yychar) is if+ this state is a consistent state with a default action. Thus,+ detecting the absence of a lookahead is sufficient to determine+ that there is no unexpected or expected token to report. In that+ case, just report a simple "syntax error".+ - Don't assume there isn't a lookahead just because this state is a+ consistent state with a default action. There might have been a+ previous inconsistent state, consistent state with a non-default+ action, or user semantic action that manipulated yychar.+ - Of course, the expected token list depends on states to have+ correct lookahead information, and it depends on the parser not+ to perform extra reductions after fetching a lookahead from the+ scanner and before detecting a syntax error. Thus, state merging+ (from LALR or IELR) and default reductions corrupt the expected+ token list. However, the list is correct for canonical LR with+ one exception: it will still contain any token that will not be+ accepted due to an error action in a later state.+ */+ if (yytoken != YYEMPTY)+ {+ int yyn = yypact[*yyssp];+ yyarg[yycount++] = yytname[yytoken];+ if (!yypact_value_is_default (yyn))+ {+ /* Start YYX at -YYN if negative to avoid negative indexes in+ YYCHECK. In other words, skip the first -YYN actions for+ this state because they are default actions. */+ int yyxbegin = yyn < 0 ? -yyn : 0;+ /* Stay within bounds of both yycheck and yytname. */+ int yychecklim = YYLAST - yyn + 1;+ int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;+ int yyx;++ for (yyx = yyxbegin; yyx < yyxend; ++yyx)+ if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR+ && !yytable_value_is_error (yytable[yyx + yyn]))+ {+ if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)+ {+ yycount = 1;+ yysize = yysize0;+ break;+ }+ yyarg[yycount++] = yytname[yyx];+ {+ YYSIZE_T yysize1 = yysize + yytnamerr (YY_NULLPTR, yytname[yyx]);+ if (! (yysize <= yysize1+ && yysize1 <= YYSTACK_ALLOC_MAXIMUM))+ return 2;+ yysize = yysize1;+ }+ }+ }+ }++ switch (yycount)+ {+# define YYCASE_(N, S) \+ case N: \+ yyformat = S; \+ break+ YYCASE_(0, YY_("syntax error"));+ YYCASE_(1, YY_("syntax error, unexpected %s"));+ YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s"));+ YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or %s"));+ YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s or %s"));+ YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"));+# undef YYCASE_+ }++ {+ YYSIZE_T yysize1 = yysize + yystrlen (yyformat);+ if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM))+ return 2;+ yysize = yysize1;+ }++ if (*yymsg_alloc < yysize)+ {+ *yymsg_alloc = 2 * yysize;+ if (! (yysize <= *yymsg_alloc+ && *yymsg_alloc <= YYSTACK_ALLOC_MAXIMUM))+ *yymsg_alloc = YYSTACK_ALLOC_MAXIMUM;+ return 1;+ }++ /* Avoid sprintf, as that infringes on the user's name space.+ Don't have undefined behavior even if the translation+ produced a string with the wrong number of "%s"s. */+ {+ char *yyp = *yymsg;+ int yyi = 0;+ while ((*yyp = *yyformat) != '\0')+ if (*yyp == '%' && yyformat[1] == 's' && yyi < yycount)+ {+ yyp += yytnamerr (yyp, yyarg[yyi++]);+ yyformat += 2;+ }+ else+ {+ yyp++;+ yyformat++;+ }+ }+ return 0;+}+#endif /* YYERROR_VERBOSE */++/*-----------------------------------------------.+| Release the memory associated to this symbol. |+`-----------------------------------------------*/++static void+yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocationp)+{+ YYUSE (yyvaluep);+ YYUSE (yylocationp);+ if (!yymsg)+ yymsg = "Deleting";+ YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);++ YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN+ YYUSE (yytype);+ YY_IGNORE_MAYBE_UNINITIALIZED_END+}+++++/* The lookahead symbol. */+__thread int yychar;+++/* The semantic value of the lookahead symbol. */+__thread YYSTYPE yylval;++/* Location data for the lookahead symbol. */+__thread YYLTYPE yylloc+# if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL+ = { 1, 1, 1, 1 }+# endif+;+/* Number of syntax errors so far. */+__thread int yynerrs;++++/*----------.+| yyparse. |+`----------*/++int+yyparse (void)+{+ int yystate;+ /* Number of tokens to shift before error messages enabled. */+ int yyerrstatus;++ /* The stacks and their tools:+ 'yyss': related to states.+ 'yyvs': related to semantic values.+ 'yyls': related to locations.++ Refer to the stacks through separate pointers, to allow yyoverflow+ to reallocate them elsewhere. */++ /* The state stack. */+ yytype_int16 yyssa[YYINITDEPTH];+ yytype_int16 *yyss;+ yytype_int16 *yyssp;++ /* The semantic value stack. */+ YYSTYPE yyvsa[YYINITDEPTH];+ YYSTYPE *yyvs;+ YYSTYPE *yyvsp;++ /* The location stack. */+ YYLTYPE yylsa[YYINITDEPTH];+ YYLTYPE *yyls;+ YYLTYPE *yylsp;++ /* The locations where the error started and ended. */+ YYLTYPE yyerror_range[3];++ YYSIZE_T yystacksize;++ int yyn;+ int yyresult;+ /* Lookahead token as an internal (translated) token number. */+ int yytoken = 0;+ /* The variables used to return semantic value and location from the+ action routines. */+ YYSTYPE yyval;+ YYLTYPE yyloc;++#if YYERROR_VERBOSE+ /* Buffer for error messages, and its allocated size. */+ char yymsgbuf[128];+ char *yymsg = yymsgbuf;+ YYSIZE_T yymsg_alloc = sizeof yymsgbuf;+#endif++#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N), yylsp -= (N))++ /* The number of symbols on the RHS of the reduced rule.+ Keep to zero when no symbol should be popped. */+ int yylen = 0;++ yyssp = yyss = yyssa;+ yyvsp = yyvs = yyvsa;+ yylsp = yyls = yylsa;+ yystacksize = YYINITDEPTH;++ YYDPRINTF ((stderr, "Starting parse\n"));++ yystate = 0;+ yyerrstatus = 0;+ yynerrs = 0;+ yychar = YYEMPTY; /* Cause a token to be read. */+ yylsp[0] = yylloc;+ goto yysetstate;++/*------------------------------------------------------------.+| yynewstate -- Push a new state, which is found in yystate. |+`------------------------------------------------------------*/+ yynewstate:+ /* In all cases, when you get here, the value and location stacks+ have just been pushed. So pushing a state here evens the stacks. */+ yyssp++;++ yysetstate:+ *yyssp = yystate;++ if (yyss + yystacksize - 1 <= yyssp)+ {+ /* Get the current used size of the three stacks, in elements. */+ YYSIZE_T yysize = yyssp - yyss + 1;++#ifdef yyoverflow+ {+ /* Give user a chance to reallocate the stack. Use copies of+ these so that the &'s don't force the real ones into+ memory. */+ YYSTYPE *yyvs1 = yyvs;+ yytype_int16 *yyss1 = yyss;+ YYLTYPE *yyls1 = yyls;++ /* Each stack pointer address is followed by the size of the+ data in use in that stack, in bytes. This used to be a+ conditional around just the two extra args, but that might+ be undefined if yyoverflow is a macro. */+ yyoverflow (YY_("memory exhausted"),+ &yyss1, yysize * sizeof (*yyssp),+ &yyvs1, yysize * sizeof (*yyvsp),+ &yyls1, yysize * sizeof (*yylsp),+ &yystacksize);++ yyls = yyls1;+ yyss = yyss1;+ yyvs = yyvs1;+ }+#else /* no yyoverflow */+# ifndef YYSTACK_RELOCATE+ goto yyexhaustedlab;+# else+ /* Extend the stack our own way. */+ if (YYMAXDEPTH <= yystacksize)+ goto yyexhaustedlab;+ yystacksize *= 2;+ if (YYMAXDEPTH < yystacksize)+ yystacksize = YYMAXDEPTH;++ {+ yytype_int16 *yyss1 = yyss;+ union yyalloc *yyptr =+ (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));+ if (! yyptr)+ goto yyexhaustedlab;+ YYSTACK_RELOCATE (yyss_alloc, yyss);+ YYSTACK_RELOCATE (yyvs_alloc, yyvs);+ YYSTACK_RELOCATE (yyls_alloc, yyls);+# undef YYSTACK_RELOCATE+ if (yyss1 != yyssa)+ YYSTACK_FREE (yyss1);+ }+# endif+#endif /* no yyoverflow */++ yyssp = yyss + yysize - 1;+ yyvsp = yyvs + yysize - 1;+ yylsp = yyls + yysize - 1;++ YYDPRINTF ((stderr, "Stack size increased to %lu\n",+ (unsigned long int) yystacksize));++ if (yyss + yystacksize - 1 <= yyssp)+ YYABORT;+ }++ YYDPRINTF ((stderr, "Entering state %d\n", yystate));++ if (yystate == YYFINAL)+ YYACCEPT;++ goto yybackup;++/*-----------.+| yybackup. |+`-----------*/+yybackup:++ /* Do appropriate processing given the current state. Read a+ lookahead token if we need one and don't already have one. */++ /* First try to decide what to do without reference to lookahead token. */+ yyn = yypact[yystate];+ if (yypact_value_is_default (yyn))+ goto yydefault;++ /* Not known => get a lookahead token if don't already have one. */++ /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */+ if (yychar == YYEMPTY)+ {+ YYDPRINTF ((stderr, "Reading a token: "));+ yychar = yylex ();+ }++ if (yychar <= YYEOF)+ {+ yychar = yytoken = YYEOF;+ YYDPRINTF ((stderr, "Now at end of input.\n"));+ }+ else+ {+ yytoken = YYTRANSLATE (yychar);+ YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);+ }++ /* If the proper action on seeing token YYTOKEN is to reduce or to+ detect an error, take that action. */+ yyn += yytoken;+ if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)+ goto yydefault;+ yyn = yytable[yyn];+ if (yyn <= 0)+ {+ if (yytable_value_is_error (yyn))+ goto yyerrlab;+ yyn = -yyn;+ goto yyreduce;+ }++ /* Count tokens shifted since error; after three, turn off error+ status. */+ if (yyerrstatus)+ yyerrstatus--;++ /* Shift the lookahead token. */+ YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);++ /* Discard the shifted token. */+ yychar = YYEMPTY;++ yystate = yyn;+ YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN+ *++yyvsp = yylval;+ YY_IGNORE_MAYBE_UNINITIALIZED_END+ *++yylsp = yylloc;+ goto yynewstate;+++/*-----------------------------------------------------------.+| yydefault -- do the default action for the current state. |+`-----------------------------------------------------------*/+yydefault:+ yyn = yydefact[yystate];+ if (yyn == 0)+ goto yyerrlab;+ goto yyreduce;+++/*-----------------------------.+| yyreduce -- Do a reduction. |+`-----------------------------*/+yyreduce:+ /* yyn is the number of a rule to reduce with. */+ yylen = yyr2[yyn];++ /* If YYLEN is nonzero, implement the default value of the action:+ '$$ = $1'.++ Otherwise, the following line sets YYVAL to garbage.+ This behavior is undocumented and Bison+ users should not rely upon it. Assigning to YYVAL+ unconditionally makes the parser a bit smaller, and it avoids a+ GCC warning that YYVAL may be used uninitialized. */+ yyval = yyvsp[1-yylen];++ /* Default location. */+ YYLLOC_DEFAULT (yyloc, (yylsp - yylen), yylen);+ YY_REDUCE_PRINT (yyn);+ switch (yyn)+ {+ case 2:+#line 348 "pl_gram.y" /* yacc.c:1646 */+ {+ plpgsql_parse_result = (PLpgSQL_stmt_block *) (yyvsp[-1].stmt);+ }+#line 2062 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 5:+#line 358 "pl_gram.y" /* yacc.c:1646 */+ {+ plpgsql_DumpExecTree = true;+ }+#line 2070 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 6:+#line 362 "pl_gram.y" /* yacc.c:1646 */+ {+ if (strcmp((yyvsp[0].str), "on") == 0)+ plpgsql_curr_compile->print_strict_params = true;+ else if (strcmp((yyvsp[0].str), "off") == 0)+ plpgsql_curr_compile->print_strict_params = false;+ else+ elog(ERROR, "unrecognized print_strict_params option %s", (yyvsp[0].str));+ }+#line 2083 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 7:+#line 371 "pl_gram.y" /* yacc.c:1646 */+ {+ plpgsql_curr_compile->resolve_option = PLPGSQL_RESOLVE_ERROR;+ }+#line 2091 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 8:+#line 375 "pl_gram.y" /* yacc.c:1646 */+ {+ plpgsql_curr_compile->resolve_option = PLPGSQL_RESOLVE_VARIABLE;+ }+#line 2099 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 9:+#line 379 "pl_gram.y" /* yacc.c:1646 */+ {+ plpgsql_curr_compile->resolve_option = PLPGSQL_RESOLVE_COLUMN;+ }+#line 2107 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 10:+#line 385 "pl_gram.y" /* yacc.c:1646 */+ {+ (yyval.str) = (yyvsp[0].word).ident;+ }+#line 2115 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 11:+#line 389 "pl_gram.y" /* yacc.c:1646 */+ {+ (yyval.str) = pstrdup((yyvsp[0].keyword));+ }+#line 2123 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 14:+#line 398 "pl_gram.y" /* yacc.c:1646 */+ {+ PLpgSQL_stmt_block *new;++ new = palloc0(sizeof(PLpgSQL_stmt_block));++ new->cmd_type = PLPGSQL_STMT_BLOCK;+ new->lineno = plpgsql_location_to_lineno((yylsp[-4]));+ new->label = (yyvsp[-5].declhdr).label;+ new->n_initvars = (yyvsp[-5].declhdr).n_initvars;+ new->initvarnos = (yyvsp[-5].declhdr).initvarnos;+ new->body = (yyvsp[-3].list);+ new->exceptions = (yyvsp[-2].exception_block);++ check_labels((yyvsp[-5].declhdr).label, (yyvsp[0].str), (yylsp[0]));+ plpgsql_ns_pop();++ (yyval.stmt) = (PLpgSQL_stmt *)new;+ }+#line 2146 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 15:+#line 420 "pl_gram.y" /* yacc.c:1646 */+ {+ /* done with decls, so resume identifier lookup */+ plpgsql_IdentifierLookup = IDENTIFIER_LOOKUP_NORMAL;+ (yyval.declhdr).label = (yyvsp[0].str);+ (yyval.declhdr).n_initvars = 0;+ (yyval.declhdr).initvarnos = NULL;+ }+#line 2158 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 16:+#line 428 "pl_gram.y" /* yacc.c:1646 */+ {+ plpgsql_IdentifierLookup = IDENTIFIER_LOOKUP_NORMAL;+ (yyval.declhdr).label = (yyvsp[-1].str);+ (yyval.declhdr).n_initvars = 0;+ (yyval.declhdr).initvarnos = NULL;+ }+#line 2169 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 17:+#line 435 "pl_gram.y" /* yacc.c:1646 */+ {+ plpgsql_IdentifierLookup = IDENTIFIER_LOOKUP_NORMAL;+ (yyval.declhdr).label = (yyvsp[-2].str);+ /* Remember variables declared in decl_stmts */+ (yyval.declhdr).n_initvars = plpgsql_add_initdatums(&((yyval.declhdr).initvarnos));+ }+#line 2180 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 18:+#line 444 "pl_gram.y" /* yacc.c:1646 */+ {+ /* Forget any variables created before block */+ plpgsql_add_initdatums(NULL);+ /*+ * Disable scanner lookup of identifiers while+ * we process the decl_stmts+ */+ plpgsql_IdentifierLookup = IDENTIFIER_LOOKUP_DECLARE;+ }+#line 2194 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 22:+#line 461 "pl_gram.y" /* yacc.c:1646 */+ {+ /* We allow useless extra DECLAREs */+ }+#line 2202 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 23:+#line 465 "pl_gram.y" /* yacc.c:1646 */+ {+ /*+ * Throw a helpful error if user tries to put block+ * label just before BEGIN, instead of before DECLARE.+ */+ ereport(ERROR,+ (errcode(ERRCODE_SYNTAX_ERROR),+ errmsg("block label must be placed before DECLARE, not after"),+ parser_errposition((yylsp[-2]))));+ }+#line 2217 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 24:+#line 478 "pl_gram.y" /* yacc.c:1646 */+ {+ PLpgSQL_variable *var;++ /*+ * If a collation is supplied, insert it into the+ * datatype. We assume decl_datatype always returns+ * a freshly built struct not shared with other+ * variables.+ */+ if (OidIsValid((yyvsp[-2].oid)))+ {+ if (!OidIsValid((yyvsp[-3].dtype)->collation))+ ereport(ERROR,+ (errcode(ERRCODE_DATATYPE_MISMATCH),+ errmsg("collations are not supported by type %s",+ format_type_be((yyvsp[-3].dtype)->typoid)),+ parser_errposition((yylsp[-2]))));+ (yyvsp[-3].dtype)->collation = (yyvsp[-2].oid);+ }++ var = plpgsql_build_variable((yyvsp[-5].varname).name, (yyvsp[-5].varname).lineno,+ (yyvsp[-3].dtype), true);+ if ((yyvsp[-4].boolean))+ {+ if (var->dtype == PLPGSQL_DTYPE_VAR)+ ((PLpgSQL_var *) var)->isconst = (yyvsp[-4].boolean);+ else+ ereport(ERROR,+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),+ errmsg("row or record variable cannot be CONSTANT"),+ parser_errposition((yylsp[-4]))));+ }+ if ((yyvsp[-1].boolean))+ {+ if (var->dtype == PLPGSQL_DTYPE_VAR)+ ((PLpgSQL_var *) var)->notnull = (yyvsp[-1].boolean);+ else+ ereport(ERROR,+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),+ errmsg("row or record variable cannot be NOT NULL"),+ parser_errposition((yylsp[-2]))));++ }+ if ((yyvsp[0].expr) != NULL)+ {+ if (var->dtype == PLPGSQL_DTYPE_VAR)+ ((PLpgSQL_var *) var)->default_val = (yyvsp[0].expr);+ else+ ereport(ERROR,+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),+ errmsg("default value for row or record variable is not supported"),+ parser_errposition((yylsp[-1]))));+ }+ }+#line 2276 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 25:+#line 533 "pl_gram.y" /* yacc.c:1646 */+ {+ plpgsql_ns_additem((yyvsp[-1].nsitem)->itemtype,+ (yyvsp[-1].nsitem)->itemno, (yyvsp[-4].varname).name);+ }+#line 2285 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 26:+#line 538 "pl_gram.y" /* yacc.c:1646 */+ { plpgsql_ns_push((yyvsp[-2].varname).name); }+#line 2291 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 27:+#line 540 "pl_gram.y" /* yacc.c:1646 */+ {+ PLpgSQL_var *new;+ PLpgSQL_expr *curname_def;+ char buf[1024];+ char *cp1;+ char *cp2;++ /* pop local namespace for cursor args */+ plpgsql_ns_pop();++ new = (PLpgSQL_var *)+ plpgsql_build_variable((yyvsp[-6].varname).name, (yyvsp[-6].varname).lineno,+ plpgsql_build_datatype(REFCURSOROID,+ -1,+ InvalidOid),+ true);++ curname_def = palloc0(sizeof(PLpgSQL_expr));++ curname_def->dtype = PLPGSQL_DTYPE_EXPR;+ strcpy(buf, "SELECT ");+ cp1 = new->refname;+ cp2 = buf + strlen(buf);+ /*+ * Don't trust standard_conforming_strings here;+ * it might change before we use the string.+ */+ if (strchr(cp1, '\\') != NULL)+ *cp2++ = ESCAPE_STRING_SYNTAX;+ *cp2++ = '\'';+ while (*cp1)+ {+ if (SQL_STR_DOUBLE(*cp1, true))+ *cp2++ = *cp1;+ *cp2++ = *cp1++;+ }+ strcpy(cp2, "'::pg_catalog.refcursor");+ curname_def->query = pstrdup(buf);+ new->default_val = curname_def;++ new->cursor_explicit_expr = (yyvsp[0].expr);+ if ((yyvsp[-2].datum) == NULL)+ new->cursor_explicit_argrow = -1;+ else+ new->cursor_explicit_argrow = (yyvsp[-2].datum)->dno;+ new->cursor_options = CURSOR_OPT_FAST_PLAN | (yyvsp[-5].ival);+ }+#line 2343 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 28:+#line 590 "pl_gram.y" /* yacc.c:1646 */+ {+ (yyval.ival) = 0;+ }+#line 2351 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 29:+#line 594 "pl_gram.y" /* yacc.c:1646 */+ {+ (yyval.ival) = CURSOR_OPT_NO_SCROLL;+ }+#line 2359 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 30:+#line 598 "pl_gram.y" /* yacc.c:1646 */+ {+ (yyval.ival) = CURSOR_OPT_SCROLL;+ }+#line 2367 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 31:+#line 604 "pl_gram.y" /* yacc.c:1646 */+ {+ (yyval.expr) = read_sql_stmt("");+ }+#line 2375 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 32:+#line 610 "pl_gram.y" /* yacc.c:1646 */+ {+ (yyval.datum) = NULL;+ }+#line 2383 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 33:+#line 614 "pl_gram.y" /* yacc.c:1646 */+ {+ PLpgSQL_row *new;+ int i;+ ListCell *l;++ new = palloc0(sizeof(PLpgSQL_row));+ new->dtype = PLPGSQL_DTYPE_ROW;+ new->lineno = plpgsql_location_to_lineno((yylsp[-2]));+ new->rowtupdesc = NULL;+ new->nfields = list_length((yyvsp[-1].list));+ new->fieldnames = palloc(new->nfields * sizeof(char *));+ new->varnos = palloc(new->nfields * sizeof(int));++ i = 0;+ foreach (l, (yyvsp[-1].list))+ {+ PLpgSQL_variable *arg = (PLpgSQL_variable *) lfirst(l);+ new->fieldnames[i] = arg->refname;+ new->varnos[i] = arg->dno;+ i++;+ }+ list_free((yyvsp[-1].list));++ plpgsql_adddatum((PLpgSQL_datum *) new);+ (yyval.datum) = (PLpgSQL_datum *) new;+ }+#line 2414 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 34:+#line 643 "pl_gram.y" /* yacc.c:1646 */+ {+ (yyval.list) = list_make1((yyvsp[0].datum));+ }+#line 2422 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 35:+#line 647 "pl_gram.y" /* yacc.c:1646 */+ {+ (yyval.list) = lappend((yyvsp[-2].list), (yyvsp[0].datum));+ }+#line 2430 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 36:+#line 653 "pl_gram.y" /* yacc.c:1646 */+ {+ (yyval.datum) = (PLpgSQL_datum *)+ plpgsql_build_variable((yyvsp[-1].varname).name, (yyvsp[-1].varname).lineno,+ (yyvsp[0].dtype), true);+ }+#line 2440 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 39:+#line 664 "pl_gram.y" /* yacc.c:1646 */+ {+ PLpgSQL_nsitem *nsi;++ nsi = plpgsql_ns_lookup(plpgsql_ns_top(), false,+ (yyvsp[0].word).ident, NULL, NULL,+ NULL);+ if (nsi == NULL)+ ereport(ERROR,+ (errcode(ERRCODE_UNDEFINED_OBJECT),+ errmsg("variable \"%s\" does not exist",+ (yyvsp[0].word).ident),+ parser_errposition((yylsp[0]))));+ (yyval.nsitem) = nsi;+ }+#line 2459 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 40:+#line 679 "pl_gram.y" /* yacc.c:1646 */+ {+ PLpgSQL_nsitem *nsi;++ nsi = plpgsql_ns_lookup(plpgsql_ns_top(), false,+ (yyvsp[0].keyword), NULL, NULL,+ NULL);+ if (nsi == NULL)+ ereport(ERROR,+ (errcode(ERRCODE_UNDEFINED_OBJECT),+ errmsg("variable \"%s\" does not exist",+ (yyvsp[0].keyword)),+ parser_errposition((yylsp[0]))));+ (yyval.nsitem) = nsi;+ }+#line 2478 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 41:+#line 694 "pl_gram.y" /* yacc.c:1646 */+ {+ PLpgSQL_nsitem *nsi;++ if (list_length((yyvsp[0].cword).idents) == 2)+ nsi = plpgsql_ns_lookup(plpgsql_ns_top(), false,+ strVal(linitial((yyvsp[0].cword).idents)),+ strVal(lsecond((yyvsp[0].cword).idents)),+ NULL,+ NULL);+ else if (list_length((yyvsp[0].cword).idents) == 3)+ nsi = plpgsql_ns_lookup(plpgsql_ns_top(), false,+ strVal(linitial((yyvsp[0].cword).idents)),+ strVal(lsecond((yyvsp[0].cword).idents)),+ strVal(lthird((yyvsp[0].cword).idents)),+ NULL);+ else+ nsi = NULL;+ if (nsi == NULL)+ ereport(ERROR,+ (errcode(ERRCODE_UNDEFINED_OBJECT),+ errmsg("variable \"%s\" does not exist",+ NameListToString((yyvsp[0].cword).idents)),+ parser_errposition((yylsp[0]))));+ (yyval.nsitem) = nsi;+ }+#line 2508 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 42:+#line 722 "pl_gram.y" /* yacc.c:1646 */+ {+ (yyval.varname).name = (yyvsp[0].word).ident;+ (yyval.varname).lineno = plpgsql_location_to_lineno((yylsp[0]));+ /*+ * Check to make sure name isn't already declared+ * in the current block.+ */+ if (plpgsql_ns_lookup(plpgsql_ns_top(), true,+ (yyvsp[0].word).ident, NULL, NULL,+ NULL) != NULL)+ yyerror("duplicate declaration");++ if (plpgsql_curr_compile->extra_warnings & PLPGSQL_XCHECK_SHADOWVAR ||+ plpgsql_curr_compile->extra_errors & PLPGSQL_XCHECK_SHADOWVAR)+ {+ PLpgSQL_nsitem *nsi;+ nsi = plpgsql_ns_lookup(plpgsql_ns_top(), false,+ (yyvsp[0].word).ident, NULL, NULL, NULL);+ if (nsi != NULL)+ ereport(plpgsql_curr_compile->extra_errors & PLPGSQL_XCHECK_SHADOWVAR ? ERROR : WARNING,+ (errcode(ERRCODE_DUPLICATE_ALIAS),+ errmsg("variable \"%s\" shadows a previously defined variable",+ (yyvsp[0].word).ident),+ parser_errposition((yylsp[0]))));+ }++ }+#line 2540 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 43:+#line 750 "pl_gram.y" /* yacc.c:1646 */+ {+ (yyval.varname).name = pstrdup((yyvsp[0].keyword));+ (yyval.varname).lineno = plpgsql_location_to_lineno((yylsp[0]));+ /*+ * Check to make sure name isn't already declared+ * in the current block.+ */+ if (plpgsql_ns_lookup(plpgsql_ns_top(), true,+ (yyvsp[0].keyword), NULL, NULL,+ NULL) != NULL)+ yyerror("duplicate declaration");++ if (plpgsql_curr_compile->extra_warnings & PLPGSQL_XCHECK_SHADOWVAR ||+ plpgsql_curr_compile->extra_errors & PLPGSQL_XCHECK_SHADOWVAR)+ {+ PLpgSQL_nsitem *nsi;+ nsi = plpgsql_ns_lookup(plpgsql_ns_top(), false,+ (yyvsp[0].keyword), NULL, NULL, NULL);+ if (nsi != NULL)+ ereport(plpgsql_curr_compile->extra_errors & PLPGSQL_XCHECK_SHADOWVAR ? ERROR : WARNING,+ (errcode(ERRCODE_DUPLICATE_ALIAS),+ errmsg("variable \"%s\" shadows a previously defined variable",+ (yyvsp[0].keyword)),+ parser_errposition((yylsp[0]))));+ }++ }+#line 2572 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 44:+#line 780 "pl_gram.y" /* yacc.c:1646 */+ { (yyval.boolean) = false; }+#line 2578 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 45:+#line 782 "pl_gram.y" /* yacc.c:1646 */+ { (yyval.boolean) = true; }+#line 2584 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 46:+#line 786 "pl_gram.y" /* yacc.c:1646 */+ {+ /*+ * If there's a lookahead token, read_datatype+ * should consume it.+ */+ (yyval.dtype) = read_datatype(yychar);+ yyclearin;+ }+#line 2597 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 47:+#line 797 "pl_gram.y" /* yacc.c:1646 */+ { (yyval.oid) = InvalidOid; }+#line 2603 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 48:+#line 799 "pl_gram.y" /* yacc.c:1646 */+ {+ (yyval.oid) = get_collation_oid(list_make1(makeString((yyvsp[0].word).ident)),+ false);+ }+#line 2612 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 49:+#line 804 "pl_gram.y" /* yacc.c:1646 */+ {+ (yyval.oid) = get_collation_oid(list_make1(makeString(pstrdup((yyvsp[0].keyword)))),+ false);+ }+#line 2621 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 50:+#line 809 "pl_gram.y" /* yacc.c:1646 */+ {+ (yyval.oid) = get_collation_oid((yyvsp[0].cword).idents, false);+ }+#line 2629 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 51:+#line 815 "pl_gram.y" /* yacc.c:1646 */+ { (yyval.boolean) = false; }+#line 2635 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 52:+#line 817 "pl_gram.y" /* yacc.c:1646 */+ { (yyval.boolean) = true; }+#line 2641 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 53:+#line 821 "pl_gram.y" /* yacc.c:1646 */+ { (yyval.expr) = NULL; }+#line 2647 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 54:+#line 823 "pl_gram.y" /* yacc.c:1646 */+ {+ (yyval.expr) = read_sql_expression(';', ";");+ }+#line 2655 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 59:+#line 842 "pl_gram.y" /* yacc.c:1646 */+ { (yyval.list) = NIL; }+#line 2661 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 60:+#line 844 "pl_gram.y" /* yacc.c:1646 */+ {+ /* don't bother linking null statements into list */+ if ((yyvsp[0].stmt) == NULL)+ (yyval.list) = (yyvsp[-1].list);+ else+ (yyval.list) = lappend((yyvsp[-1].list), (yyvsp[0].stmt));+ }+#line 2673 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 61:+#line 854 "pl_gram.y" /* yacc.c:1646 */+ { (yyval.stmt) = (yyvsp[-1].stmt); }+#line 2679 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 62:+#line 856 "pl_gram.y" /* yacc.c:1646 */+ { (yyval.stmt) = (yyvsp[0].stmt); }+#line 2685 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 63:+#line 858 "pl_gram.y" /* yacc.c:1646 */+ { (yyval.stmt) = (yyvsp[0].stmt); }+#line 2691 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 64:+#line 860 "pl_gram.y" /* yacc.c:1646 */+ { (yyval.stmt) = (yyvsp[0].stmt); }+#line 2697 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 65:+#line 862 "pl_gram.y" /* yacc.c:1646 */+ { (yyval.stmt) = (yyvsp[0].stmt); }+#line 2703 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 66:+#line 864 "pl_gram.y" /* yacc.c:1646 */+ { (yyval.stmt) = (yyvsp[0].stmt); }+#line 2709 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 67:+#line 866 "pl_gram.y" /* yacc.c:1646 */+ { (yyval.stmt) = (yyvsp[0].stmt); }+#line 2715 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 68:+#line 868 "pl_gram.y" /* yacc.c:1646 */+ { (yyval.stmt) = (yyvsp[0].stmt); }+#line 2721 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 69:+#line 870 "pl_gram.y" /* yacc.c:1646 */+ { (yyval.stmt) = (yyvsp[0].stmt); }+#line 2727 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 70:+#line 872 "pl_gram.y" /* yacc.c:1646 */+ { (yyval.stmt) = (yyvsp[0].stmt); }+#line 2733 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 71:+#line 874 "pl_gram.y" /* yacc.c:1646 */+ { (yyval.stmt) = (yyvsp[0].stmt); }+#line 2739 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 72:+#line 876 "pl_gram.y" /* yacc.c:1646 */+ { (yyval.stmt) = (yyvsp[0].stmt); }+#line 2745 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 73:+#line 878 "pl_gram.y" /* yacc.c:1646 */+ { (yyval.stmt) = (yyvsp[0].stmt); }+#line 2751 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 74:+#line 880 "pl_gram.y" /* yacc.c:1646 */+ { (yyval.stmt) = (yyvsp[0].stmt); }+#line 2757 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 75:+#line 882 "pl_gram.y" /* yacc.c:1646 */+ { (yyval.stmt) = (yyvsp[0].stmt); }+#line 2763 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 76:+#line 884 "pl_gram.y" /* yacc.c:1646 */+ { (yyval.stmt) = (yyvsp[0].stmt); }+#line 2769 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 77:+#line 886 "pl_gram.y" /* yacc.c:1646 */+ { (yyval.stmt) = (yyvsp[0].stmt); }+#line 2775 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 78:+#line 888 "pl_gram.y" /* yacc.c:1646 */+ { (yyval.stmt) = (yyvsp[0].stmt); }+#line 2781 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 79:+#line 890 "pl_gram.y" /* yacc.c:1646 */+ { (yyval.stmt) = (yyvsp[0].stmt); }+#line 2787 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 80:+#line 892 "pl_gram.y" /* yacc.c:1646 */+ { (yyval.stmt) = (yyvsp[0].stmt); }+#line 2793 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 81:+#line 894 "pl_gram.y" /* yacc.c:1646 */+ { (yyval.stmt) = (yyvsp[0].stmt); }+#line 2799 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 82:+#line 898 "pl_gram.y" /* yacc.c:1646 */+ {+ PLpgSQL_stmt_perform *new;++ new = palloc0(sizeof(PLpgSQL_stmt_perform));+ new->cmd_type = PLPGSQL_STMT_PERFORM;+ new->lineno = plpgsql_location_to_lineno((yylsp[-1]));+ new->expr = (yyvsp[0].expr);++ (yyval.stmt) = (PLpgSQL_stmt *)new;+ }+#line 2814 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 83:+#line 911 "pl_gram.y" /* yacc.c:1646 */+ {+ PLpgSQL_stmt_assign *new;++ new = palloc0(sizeof(PLpgSQL_stmt_assign));+ new->cmd_type = PLPGSQL_STMT_ASSIGN;+ new->lineno = plpgsql_location_to_lineno((yylsp[-2]));+ new->varno = (yyvsp[-2].ival);+ new->expr = (yyvsp[0].expr);++ (yyval.stmt) = (PLpgSQL_stmt *)new;+ }+#line 2830 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 84:+#line 925 "pl_gram.y" /* yacc.c:1646 */+ {+ PLpgSQL_stmt_getdiag *new;+ ListCell *lc;++ new = palloc0(sizeof(PLpgSQL_stmt_getdiag));+ new->cmd_type = PLPGSQL_STMT_GETDIAG;+ new->lineno = plpgsql_location_to_lineno((yylsp[-4]));+ new->is_stacked = (yyvsp[-3].boolean);+ new->diag_items = (yyvsp[-1].list);++ /*+ * Check information items are valid for area option.+ */+ foreach(lc, new->diag_items)+ {+ PLpgSQL_diag_item *ditem = (PLpgSQL_diag_item *) lfirst(lc);++ switch (ditem->kind)+ {+ /* these fields are disallowed in stacked case */+ case PLPGSQL_GETDIAG_ROW_COUNT:+ case PLPGSQL_GETDIAG_RESULT_OID:+ if (new->is_stacked)+ ereport(ERROR,+ (errcode(ERRCODE_SYNTAX_ERROR),+ errmsg("diagnostics item %s is not allowed in GET STACKED DIAGNOSTICS",+ plpgsql_getdiag_kindname(ditem->kind)),+ parser_errposition((yylsp[-4]))));+ break;+ /* these fields are disallowed in current case */+ case PLPGSQL_GETDIAG_ERROR_CONTEXT:+ case PLPGSQL_GETDIAG_ERROR_DETAIL:+ case PLPGSQL_GETDIAG_ERROR_HINT:+ case PLPGSQL_GETDIAG_RETURNED_SQLSTATE:+ case PLPGSQL_GETDIAG_COLUMN_NAME:+ case PLPGSQL_GETDIAG_CONSTRAINT_NAME:+ case PLPGSQL_GETDIAG_DATATYPE_NAME:+ case PLPGSQL_GETDIAG_MESSAGE_TEXT:+ case PLPGSQL_GETDIAG_TABLE_NAME:+ case PLPGSQL_GETDIAG_SCHEMA_NAME:+ if (!new->is_stacked)+ ereport(ERROR,+ (errcode(ERRCODE_SYNTAX_ERROR),+ errmsg("diagnostics item %s is not allowed in GET CURRENT DIAGNOSTICS",+ plpgsql_getdiag_kindname(ditem->kind)),+ parser_errposition((yylsp[-4]))));+ break;+ /* these fields are allowed in either case */+ case PLPGSQL_GETDIAG_CONTEXT:+ break;+ default:+ elog(ERROR, "unrecognized diagnostic item kind: %d",+ ditem->kind);+ break;+ }+ }++ (yyval.stmt) = (PLpgSQL_stmt *)new;+ }+#line 2894 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 85:+#line 987 "pl_gram.y" /* yacc.c:1646 */+ {+ (yyval.boolean) = false;+ }+#line 2902 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 86:+#line 991 "pl_gram.y" /* yacc.c:1646 */+ {+ (yyval.boolean) = false;+ }+#line 2910 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 87:+#line 995 "pl_gram.y" /* yacc.c:1646 */+ {+ (yyval.boolean) = true;+ }+#line 2918 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 88:+#line 1001 "pl_gram.y" /* yacc.c:1646 */+ {+ (yyval.list) = lappend((yyvsp[-2].list), (yyvsp[0].diagitem));+ }+#line 2926 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 89:+#line 1005 "pl_gram.y" /* yacc.c:1646 */+ {+ (yyval.list) = list_make1((yyvsp[0].diagitem));+ }+#line 2934 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 90:+#line 1011 "pl_gram.y" /* yacc.c:1646 */+ {+ PLpgSQL_diag_item *new;++ new = palloc(sizeof(PLpgSQL_diag_item));+ new->target = (yyvsp[-2].ival);+ new->kind = (yyvsp[0].ival);++ (yyval.diagitem) = new;+ }+#line 2948 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 91:+#line 1023 "pl_gram.y" /* yacc.c:1646 */+ {+ int tok = yylex();++ if (tok_is_keyword(tok, &yylval,+ K_ROW_COUNT, "row_count"))+ (yyval.ival) = PLPGSQL_GETDIAG_ROW_COUNT;+ else if (tok_is_keyword(tok, &yylval,+ K_RESULT_OID, "result_oid"))+ (yyval.ival) = PLPGSQL_GETDIAG_RESULT_OID;+ else if (tok_is_keyword(tok, &yylval,+ K_PG_CONTEXT, "pg_context"))+ (yyval.ival) = PLPGSQL_GETDIAG_CONTEXT;+ else if (tok_is_keyword(tok, &yylval,+ K_PG_EXCEPTION_DETAIL, "pg_exception_detail"))+ (yyval.ival) = PLPGSQL_GETDIAG_ERROR_DETAIL;+ else if (tok_is_keyword(tok, &yylval,+ K_PG_EXCEPTION_HINT, "pg_exception_hint"))+ (yyval.ival) = PLPGSQL_GETDIAG_ERROR_HINT;+ else if (tok_is_keyword(tok, &yylval,+ K_PG_EXCEPTION_CONTEXT, "pg_exception_context"))+ (yyval.ival) = PLPGSQL_GETDIAG_ERROR_CONTEXT;+ else if (tok_is_keyword(tok, &yylval,+ K_COLUMN_NAME, "column_name"))+ (yyval.ival) = PLPGSQL_GETDIAG_COLUMN_NAME;+ else if (tok_is_keyword(tok, &yylval,+ K_CONSTRAINT_NAME, "constraint_name"))+ (yyval.ival) = PLPGSQL_GETDIAG_CONSTRAINT_NAME;+ else if (tok_is_keyword(tok, &yylval,+ K_PG_DATATYPE_NAME, "pg_datatype_name"))+ (yyval.ival) = PLPGSQL_GETDIAG_DATATYPE_NAME;+ else if (tok_is_keyword(tok, &yylval,+ K_MESSAGE_TEXT, "message_text"))+ (yyval.ival) = PLPGSQL_GETDIAG_MESSAGE_TEXT;+ else if (tok_is_keyword(tok, &yylval,+ K_TABLE_NAME, "table_name"))+ (yyval.ival) = PLPGSQL_GETDIAG_TABLE_NAME;+ else if (tok_is_keyword(tok, &yylval,+ K_SCHEMA_NAME, "schema_name"))+ (yyval.ival) = PLPGSQL_GETDIAG_SCHEMA_NAME;+ else if (tok_is_keyword(tok, &yylval,+ K_RETURNED_SQLSTATE, "returned_sqlstate"))+ (yyval.ival) = PLPGSQL_GETDIAG_RETURNED_SQLSTATE;+ else+ yyerror("unrecognized GET DIAGNOSTICS item");+ }+#line 2998 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 92:+#line 1071 "pl_gram.y" /* yacc.c:1646 */+ {+ check_assignable((yyvsp[0].wdatum).datum, (yylsp[0]));+ if ((yyvsp[0].wdatum).datum->dtype == PLPGSQL_DTYPE_ROW ||+ (yyvsp[0].wdatum).datum->dtype == PLPGSQL_DTYPE_REC)+ ereport(ERROR,+ (errcode(ERRCODE_SYNTAX_ERROR),+ errmsg("\"%s\" is not a scalar variable",+ NameOfDatum(&((yyvsp[0].wdatum)))),+ parser_errposition((yylsp[0]))));+ (yyval.ival) = (yyvsp[0].wdatum).datum->dno;+ }+#line 3014 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 93:+#line 1083 "pl_gram.y" /* yacc.c:1646 */+ {+ /* just to give a better message than "syntax error" */+ word_is_not_variable(&((yyvsp[0].word)), (yylsp[0]));+ }+#line 3023 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 94:+#line 1088 "pl_gram.y" /* yacc.c:1646 */+ {+ /* just to give a better message than "syntax error" */+ cword_is_not_variable(&((yyvsp[0].cword)), (yylsp[0]));+ }+#line 3032 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 95:+#line 1096 "pl_gram.y" /* yacc.c:1646 */+ {+ check_assignable((yyvsp[0].wdatum).datum, (yylsp[0]));+ (yyval.ival) = (yyvsp[0].wdatum).datum->dno;+ }+#line 3041 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 96:+#line 1101 "pl_gram.y" /* yacc.c:1646 */+ {+ PLpgSQL_arrayelem *new;++ new = palloc0(sizeof(PLpgSQL_arrayelem));+ new->dtype = PLPGSQL_DTYPE_ARRAYELEM;+ new->subscript = (yyvsp[0].expr);+ new->arrayparentno = (yyvsp[-2].ival);+ /* initialize cached type data to "not valid" */+ new->parenttypoid = InvalidOid;++ plpgsql_adddatum((PLpgSQL_datum *) new);++ (yyval.ival) = new->dno;+ }+#line 3060 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 97:+#line 1118 "pl_gram.y" /* yacc.c:1646 */+ {+ PLpgSQL_stmt_if *new;++ new = palloc0(sizeof(PLpgSQL_stmt_if));+ new->cmd_type = PLPGSQL_STMT_IF;+ new->lineno = plpgsql_location_to_lineno((yylsp[-7]));+ new->cond = (yyvsp[-6].expr);+ new->then_body = (yyvsp[-5].list);+ new->elsif_list = (yyvsp[-4].list);+ new->else_body = (yyvsp[-3].list);++ (yyval.stmt) = (PLpgSQL_stmt *)new;+ }+#line 3078 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 98:+#line 1134 "pl_gram.y" /* yacc.c:1646 */+ {+ (yyval.list) = NIL;+ }+#line 3086 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 99:+#line 1138 "pl_gram.y" /* yacc.c:1646 */+ {+ PLpgSQL_if_elsif *new;++ new = palloc0(sizeof(PLpgSQL_if_elsif));+ new->lineno = plpgsql_location_to_lineno((yylsp[-2]));+ new->cond = (yyvsp[-1].expr);+ new->stmts = (yyvsp[0].list);++ (yyval.list) = lappend((yyvsp[-3].list), new);+ }+#line 3101 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 100:+#line 1151 "pl_gram.y" /* yacc.c:1646 */+ {+ (yyval.list) = NIL;+ }+#line 3109 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 101:+#line 1155 "pl_gram.y" /* yacc.c:1646 */+ {+ (yyval.list) = (yyvsp[0].list);+ }+#line 3117 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 102:+#line 1161 "pl_gram.y" /* yacc.c:1646 */+ {+ (yyval.stmt) = make_case((yylsp[-6]), (yyvsp[-5].expr), (yyvsp[-4].list), (yyvsp[-3].list));+ }+#line 3125 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 103:+#line 1167 "pl_gram.y" /* yacc.c:1646 */+ {+ PLpgSQL_expr *expr = NULL;+ int tok = yylex();++ if (tok != K_WHEN)+ {+ plpgsql_push_back_token(tok);+ expr = read_sql_expression(K_WHEN, "WHEN");+ }+ plpgsql_push_back_token(K_WHEN);+ (yyval.expr) = expr;+ }+#line 3142 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 104:+#line 1182 "pl_gram.y" /* yacc.c:1646 */+ {+ (yyval.list) = lappend((yyvsp[-1].list), (yyvsp[0].casewhen));+ }+#line 3150 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 105:+#line 1186 "pl_gram.y" /* yacc.c:1646 */+ {+ (yyval.list) = list_make1((yyvsp[0].casewhen));+ }+#line 3158 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 106:+#line 1192 "pl_gram.y" /* yacc.c:1646 */+ {+ PLpgSQL_case_when *new = palloc(sizeof(PLpgSQL_case_when));++ new->lineno = plpgsql_location_to_lineno((yylsp[-2]));+ new->expr = (yyvsp[-1].expr);+ new->stmts = (yyvsp[0].list);+ (yyval.casewhen) = new;+ }+#line 3171 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 107:+#line 1203 "pl_gram.y" /* yacc.c:1646 */+ {+ (yyval.list) = NIL;+ }+#line 3179 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 108:+#line 1207 "pl_gram.y" /* yacc.c:1646 */+ {+ /*+ * proc_sect could return an empty list, but we+ * must distinguish that from not having ELSE at all.+ * Simplest fix is to return a list with one NULL+ * pointer, which make_case() must take care of.+ */+ if ((yyvsp[0].list) != NIL)+ (yyval.list) = (yyvsp[0].list);+ else+ (yyval.list) = list_make1(NULL);+ }+#line 3196 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 109:+#line 1222 "pl_gram.y" /* yacc.c:1646 */+ {+ PLpgSQL_stmt_loop *new;++ new = palloc0(sizeof(PLpgSQL_stmt_loop));+ new->cmd_type = PLPGSQL_STMT_LOOP;+ new->lineno = plpgsql_location_to_lineno((yylsp[-1]));+ new->label = (yyvsp[-2].str);+ new->body = (yyvsp[0].loop_body).stmts;++ check_labels((yyvsp[-2].str), (yyvsp[0].loop_body).end_label, (yyvsp[0].loop_body).end_label_location);+ plpgsql_ns_pop();++ (yyval.stmt) = (PLpgSQL_stmt *)new;+ }+#line 3215 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 110:+#line 1239 "pl_gram.y" /* yacc.c:1646 */+ {+ PLpgSQL_stmt_while *new;++ new = palloc0(sizeof(PLpgSQL_stmt_while));+ new->cmd_type = PLPGSQL_STMT_WHILE;+ new->lineno = plpgsql_location_to_lineno((yylsp[-2]));+ new->label = (yyvsp[-3].str);+ new->cond = (yyvsp[-1].expr);+ new->body = (yyvsp[0].loop_body).stmts;++ check_labels((yyvsp[-3].str), (yyvsp[0].loop_body).end_label, (yyvsp[0].loop_body).end_label_location);+ plpgsql_ns_pop();++ (yyval.stmt) = (PLpgSQL_stmt *)new;+ }+#line 3235 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 111:+#line 1257 "pl_gram.y" /* yacc.c:1646 */+ {+ /* This runs after we've scanned the loop body */+ if ((yyvsp[-1].stmt)->cmd_type == PLPGSQL_STMT_FORI)+ {+ PLpgSQL_stmt_fori *new;++ new = (PLpgSQL_stmt_fori *) (yyvsp[-1].stmt);+ new->lineno = plpgsql_location_to_lineno((yylsp[-2]));+ new->label = (yyvsp[-3].str);+ new->body = (yyvsp[0].loop_body).stmts;+ (yyval.stmt) = (PLpgSQL_stmt *) new;+ }+ else+ {+ PLpgSQL_stmt_forq *new;++ Assert((yyvsp[-1].stmt)->cmd_type == PLPGSQL_STMT_FORS ||+ (yyvsp[-1].stmt)->cmd_type == PLPGSQL_STMT_FORC ||+ (yyvsp[-1].stmt)->cmd_type == PLPGSQL_STMT_DYNFORS);+ /* forq is the common supertype of all three */+ new = (PLpgSQL_stmt_forq *) (yyvsp[-1].stmt);+ new->lineno = plpgsql_location_to_lineno((yylsp[-2]));+ new->label = (yyvsp[-3].str);+ new->body = (yyvsp[0].loop_body).stmts;+ (yyval.stmt) = (PLpgSQL_stmt *) new;+ }++ check_labels((yyvsp[-3].str), (yyvsp[0].loop_body).end_label, (yyvsp[0].loop_body).end_label_location);+ /* close namespace started in opt_block_label */+ plpgsql_ns_pop();+ }+#line 3271 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 112:+#line 1291 "pl_gram.y" /* yacc.c:1646 */+ {+ int tok = yylex();+ int tokloc = yylloc;++ if (tok == K_EXECUTE)+ {+ /* EXECUTE means it's a dynamic FOR loop */+ PLpgSQL_stmt_dynfors *new;+ PLpgSQL_expr *expr;+ int term;++ expr = read_sql_expression2(K_LOOP, K_USING,+ "LOOP or USING",+ &term);++ new = palloc0(sizeof(PLpgSQL_stmt_dynfors));+ new->cmd_type = PLPGSQL_STMT_DYNFORS;+ if ((yyvsp[-1].forvariable).rec)+ {+ new->rec = (yyvsp[-1].forvariable).rec;+ check_assignable((PLpgSQL_datum *) new->rec, (yylsp[-1]));+ }+ else if ((yyvsp[-1].forvariable).row)+ {+ new->row = (yyvsp[-1].forvariable).row;+ check_assignable((PLpgSQL_datum *) new->row, (yylsp[-1]));+ }+ else if ((yyvsp[-1].forvariable).scalar)+ {+ /* convert single scalar to list */+ new->row = make_scalar_list1((yyvsp[-1].forvariable).name, (yyvsp[-1].forvariable).scalar,+ (yyvsp[-1].forvariable).lineno, (yylsp[-1]));+ /* no need for check_assignable */+ }+ else+ {+ ereport(ERROR,+ (errcode(ERRCODE_DATATYPE_MISMATCH),+ errmsg("loop variable of loop over rows must be a record or row variable or list of scalar variables"),+ parser_errposition((yylsp[-1]))));+ }+ new->query = expr;++ if (term == K_USING)+ {+ do+ {+ expr = read_sql_expression2(',', K_LOOP,+ ", or LOOP",+ &term);+ new->params = lappend(new->params, expr);+ } while (term == ',');+ }++ (yyval.stmt) = (PLpgSQL_stmt *) new;+ }+ else if (tok == T_DATUM &&+ yylval.wdatum.datum->dtype == PLPGSQL_DTYPE_VAR &&+ ((PLpgSQL_var *) yylval.wdatum.datum)->datatype->typoid == REFCURSOROID)+ {+ /* It's FOR var IN cursor */+ PLpgSQL_stmt_forc *new;+ PLpgSQL_var *cursor = (PLpgSQL_var *) yylval.wdatum.datum;++ new = (PLpgSQL_stmt_forc *) palloc0(sizeof(PLpgSQL_stmt_forc));+ new->cmd_type = PLPGSQL_STMT_FORC;+ new->curvar = cursor->dno;++ /* Should have had a single variable name */+ if ((yyvsp[-1].forvariable).scalar && (yyvsp[-1].forvariable).row)+ ereport(ERROR,+ (errcode(ERRCODE_SYNTAX_ERROR),+ errmsg("cursor FOR loop must have only one target variable"),+ parser_errposition((yylsp[-1]))));++ /* can't use an unbound cursor this way */+ if (cursor->cursor_explicit_expr == NULL)+ ereport(ERROR,+ (errcode(ERRCODE_SYNTAX_ERROR),+ errmsg("cursor FOR loop must use a bound cursor variable"),+ parser_errposition(tokloc)));++ /* collect cursor's parameters if any */+ new->argquery = read_cursor_args(cursor,+ K_LOOP,+ "LOOP");++ /* create loop's private RECORD variable */+ new->rec = plpgsql_build_record((yyvsp[-1].forvariable).name,+ (yyvsp[-1].forvariable).lineno,+ true);++ (yyval.stmt) = (PLpgSQL_stmt *) new;+ }+ else+ {+ PLpgSQL_expr *expr1;+ int expr1loc;+ bool reverse = false;++ /*+ * We have to distinguish between two+ * alternatives: FOR var IN a .. b and FOR+ * var IN query. Unfortunately this is+ * tricky, since the query in the second+ * form needn't start with a SELECT+ * keyword. We use the ugly hack of+ * looking for two periods after the first+ * token. We also check for the REVERSE+ * keyword, which means it must be an+ * integer loop.+ */+ if (tok_is_keyword(tok, &yylval,+ K_REVERSE, "reverse"))+ reverse = true;+ else+ plpgsql_push_back_token(tok);++ /*+ * Read tokens until we see either a ".."+ * or a LOOP. The text we read may not+ * necessarily be a well-formed SQL+ * statement, so we need to invoke+ * read_sql_construct directly.+ */+ expr1 = read_sql_construct(DOT_DOT,+ K_LOOP,+ 0,+ "LOOP",+ "SELECT ",+ true,+ false,+ true,+ &expr1loc,+ &tok);++ if (tok == DOT_DOT)+ {+ /* Saw "..", so it must be an integer loop */+ PLpgSQL_expr *expr2;+ PLpgSQL_expr *expr_by;+ PLpgSQL_var *fvar;+ PLpgSQL_stmt_fori *new;++ /* Check first expression is well-formed */+ check_sql_expr(expr1->query, expr1loc, 7);++ /* Read and check the second one */+ expr2 = read_sql_expression2(K_LOOP, K_BY,+ "LOOP",+ &tok);++ /* Get the BY clause if any */+ if (tok == K_BY)+ expr_by = read_sql_expression(K_LOOP,+ "LOOP");+ else+ expr_by = NULL;++ /* Should have had a single variable name */+ if ((yyvsp[-1].forvariable).scalar && (yyvsp[-1].forvariable).row)+ ereport(ERROR,+ (errcode(ERRCODE_SYNTAX_ERROR),+ errmsg("integer FOR loop must have only one target variable"),+ parser_errposition((yylsp[-1]))));++ /* create loop's private variable */+ fvar = (PLpgSQL_var *)+ plpgsql_build_variable((yyvsp[-1].forvariable).name,+ (yyvsp[-1].forvariable).lineno,+ plpgsql_build_datatype(INT4OID,+ -1,+ InvalidOid),+ true);++ new = palloc0(sizeof(PLpgSQL_stmt_fori));+ new->cmd_type = PLPGSQL_STMT_FORI;+ new->var = fvar;+ new->reverse = reverse;+ new->lower = expr1;+ new->upper = expr2;+ new->step = expr_by;++ (yyval.stmt) = (PLpgSQL_stmt *) new;+ }+ else+ {+ /*+ * No "..", so it must be a query loop. We've+ * prefixed an extra SELECT to the query text,+ * so we need to remove that before performing+ * syntax checking.+ */+ char *tmp_query;+ PLpgSQL_stmt_fors *new;++ if (reverse)+ ereport(ERROR,+ (errcode(ERRCODE_SYNTAX_ERROR),+ errmsg("cannot specify REVERSE in query FOR loop"),+ parser_errposition(tokloc)));++ Assert(strncmp(expr1->query, "SELECT ", 7) == 0);+ tmp_query = pstrdup(expr1->query + 7);+ pfree(expr1->query);+ expr1->query = tmp_query;++ check_sql_expr(expr1->query, expr1loc, 0);++ new = palloc0(sizeof(PLpgSQL_stmt_fors));+ new->cmd_type = PLPGSQL_STMT_FORS;+ if ((yyvsp[-1].forvariable).rec)+ {+ new->rec = (yyvsp[-1].forvariable).rec;+ check_assignable((PLpgSQL_datum *) new->rec, (yylsp[-1]));+ }+ else if ((yyvsp[-1].forvariable).row)+ {+ new->row = (yyvsp[-1].forvariable).row;+ check_assignable((PLpgSQL_datum *) new->row, (yylsp[-1]));+ }+ else if ((yyvsp[-1].forvariable).scalar)+ {+ /* convert single scalar to list */+ new->row = make_scalar_list1((yyvsp[-1].forvariable).name, (yyvsp[-1].forvariable).scalar,+ (yyvsp[-1].forvariable).lineno, (yylsp[-1]));+ /* no need for check_assignable */+ }+ else+ {+ ereport(ERROR,+ (errcode(ERRCODE_SYNTAX_ERROR),+ errmsg("loop variable of loop over rows must be a record or row variable or list of scalar variables"),+ parser_errposition((yylsp[-1]))));+ }++ new->query = expr1;+ (yyval.stmt) = (PLpgSQL_stmt *) new;+ }+ }+ }+#line 3517 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 113:+#line 1553 "pl_gram.y" /* yacc.c:1646 */+ {+ (yyval.forvariable).name = NameOfDatum(&((yyvsp[0].wdatum)));+ (yyval.forvariable).lineno = plpgsql_location_to_lineno((yylsp[0]));+ if ((yyvsp[0].wdatum).datum->dtype == PLPGSQL_DTYPE_ROW)+ {+ (yyval.forvariable).scalar = NULL;+ (yyval.forvariable).rec = NULL;+ (yyval.forvariable).row = (PLpgSQL_row *) (yyvsp[0].wdatum).datum;+ }+ else if ((yyvsp[0].wdatum).datum->dtype == PLPGSQL_DTYPE_REC)+ {+ (yyval.forvariable).scalar = NULL;+ (yyval.forvariable).rec = (PLpgSQL_rec *) (yyvsp[0].wdatum).datum;+ (yyval.forvariable).row = NULL;+ }+ else+ {+ int tok;++ (yyval.forvariable).scalar = (yyvsp[0].wdatum).datum;+ (yyval.forvariable).rec = NULL;+ (yyval.forvariable).row = NULL;+ /* check for comma-separated list */+ tok = yylex();+ plpgsql_push_back_token(tok);+ if (tok == ',')+ (yyval.forvariable).row = read_into_scalar_list((yyval.forvariable).name,+ (yyval.forvariable).scalar,+ (yylsp[0]));+ }+ }+#line 3553 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 114:+#line 1585 "pl_gram.y" /* yacc.c:1646 */+ {+ int tok;++ (yyval.forvariable).name = (yyvsp[0].word).ident;+ (yyval.forvariable).lineno = plpgsql_location_to_lineno((yylsp[0]));+ (yyval.forvariable).scalar = NULL;+ (yyval.forvariable).rec = NULL;+ (yyval.forvariable).row = NULL;+ /* check for comma-separated list */+ tok = yylex();+ plpgsql_push_back_token(tok);+ if (tok == ',')+ word_is_not_variable(&((yyvsp[0].word)), (yylsp[0]));+ }+#line 3572 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 115:+#line 1600 "pl_gram.y" /* yacc.c:1646 */+ {+ /* just to give a better message than "syntax error" */+ cword_is_not_variable(&((yyvsp[0].cword)), (yylsp[0]));+ }+#line 3581 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 116:+#line 1607 "pl_gram.y" /* yacc.c:1646 */+ {+ PLpgSQL_stmt_foreach_a *new;++ new = palloc0(sizeof(PLpgSQL_stmt_foreach_a));+ new->cmd_type = PLPGSQL_STMT_FOREACH_A;+ new->lineno = plpgsql_location_to_lineno((yylsp[-6]));+ new->label = (yyvsp[-7].str);+ new->slice = (yyvsp[-4].ival);+ new->expr = (yyvsp[-1].expr);+ new->body = (yyvsp[0].loop_body).stmts;++ if ((yyvsp[-5].forvariable).rec)+ {+ new->varno = (yyvsp[-5].forvariable).rec->dno;+ check_assignable((PLpgSQL_datum *) (yyvsp[-5].forvariable).rec, (yylsp[-5]));+ }+ else if ((yyvsp[-5].forvariable).row)+ {+ new->varno = (yyvsp[-5].forvariable).row->dno;+ check_assignable((PLpgSQL_datum *) (yyvsp[-5].forvariable).row, (yylsp[-5]));+ }+ else if ((yyvsp[-5].forvariable).scalar)+ {+ new->varno = (yyvsp[-5].forvariable).scalar->dno;+ check_assignable((yyvsp[-5].forvariable).scalar, (yylsp[-5]));+ }+ else+ {+ ereport(ERROR,+ (errcode(ERRCODE_SYNTAX_ERROR),+ errmsg("loop variable of FOREACH must be a known variable or list of variables"),+ parser_errposition((yylsp[-5]))));+ }++ check_labels((yyvsp[-7].str), (yyvsp[0].loop_body).end_label, (yyvsp[0].loop_body).end_label_location);+ plpgsql_ns_pop();++ (yyval.stmt) = (PLpgSQL_stmt *) new;+ }+#line 3625 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 117:+#line 1649 "pl_gram.y" /* yacc.c:1646 */+ {+ (yyval.ival) = 0;+ }+#line 3633 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 118:+#line 1653 "pl_gram.y" /* yacc.c:1646 */+ {+ (yyval.ival) = (yyvsp[0].ival);+ }+#line 3641 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 119:+#line 1659 "pl_gram.y" /* yacc.c:1646 */+ {+ PLpgSQL_stmt_exit *new;++ new = palloc0(sizeof(PLpgSQL_stmt_exit));+ new->cmd_type = PLPGSQL_STMT_EXIT;+ new->is_exit = (yyvsp[-2].boolean);+ new->lineno = plpgsql_location_to_lineno((yylsp[-2]));+ new->label = (yyvsp[-1].str);+ new->cond = (yyvsp[0].expr);++ (yyval.stmt) = (PLpgSQL_stmt *)new;+ }+#line 3658 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 120:+#line 1674 "pl_gram.y" /* yacc.c:1646 */+ {+ (yyval.boolean) = true;+ }+#line 3666 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 121:+#line 1678 "pl_gram.y" /* yacc.c:1646 */+ {+ (yyval.boolean) = false;+ }+#line 3674 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 122:+#line 1684 "pl_gram.y" /* yacc.c:1646 */+ {+ int tok;++ tok = yylex();+ if (tok == 0)+ yyerror("unexpected end of function definition");++ if (tok_is_keyword(tok, &yylval,+ K_NEXT, "next"))+ {+ (yyval.stmt) = make_return_next_stmt((yylsp[0]));+ }+ else if (tok_is_keyword(tok, &yylval,+ K_QUERY, "query"))+ {+ (yyval.stmt) = make_return_query_stmt((yylsp[0]));+ }+ else+ {+ plpgsql_push_back_token(tok);+ (yyval.stmt) = make_return_stmt((yylsp[0]));+ }+ }+#line 3702 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 123:+#line 1710 "pl_gram.y" /* yacc.c:1646 */+ {+ PLpgSQL_stmt_raise *new;+ int tok;++ new = palloc(sizeof(PLpgSQL_stmt_raise));++ new->cmd_type = PLPGSQL_STMT_RAISE;+ new->lineno = plpgsql_location_to_lineno((yylsp[0]));+ new->elog_level = ERROR; /* default */+ new->condname = NULL;+ new->message = NULL;+ new->params = NIL;+ new->options = NIL;++ tok = yylex();+ if (tok == 0)+ yyerror("unexpected end of function definition");++ /*+ * We could have just RAISE, meaning to re-throw+ * the current error.+ */+ if (tok != ';')+ {+ /*+ * First is an optional elog severity level.+ */+ if (tok_is_keyword(tok, &yylval,+ K_EXCEPTION, "exception"))+ {+ new->elog_level = ERROR;+ tok = yylex();+ }+ else if (tok_is_keyword(tok, &yylval,+ K_WARNING, "warning"))+ {+ new->elog_level = WARNING;+ tok = yylex();+ }+ else if (tok_is_keyword(tok, &yylval,+ K_NOTICE, "notice"))+ {+ new->elog_level = NOTICE;+ tok = yylex();+ }+ else if (tok_is_keyword(tok, &yylval,+ K_INFO, "info"))+ {+ new->elog_level = INFO;+ tok = yylex();+ }+ else if (tok_is_keyword(tok, &yylval,+ K_LOG, "log"))+ {+ new->elog_level = LOG;+ tok = yylex();+ }+ else if (tok_is_keyword(tok, &yylval,+ K_DEBUG, "debug"))+ {+ new->elog_level = DEBUG1;+ tok = yylex();+ }+ if (tok == 0)+ yyerror("unexpected end of function definition");++ /*+ * Next we can have a condition name, or+ * equivalently SQLSTATE 'xxxxx', or a string+ * literal that is the old-style message format,+ * or USING to start the option list immediately.+ */+ if (tok == SCONST)+ {+ /* old style message and parameters */+ new->message = yylval.str;+ /*+ * We expect either a semi-colon, which+ * indicates no parameters, or a comma that+ * begins the list of parameter expressions,+ * or USING to begin the options list.+ */+ tok = yylex();+ if (tok != ',' && tok != ';' && tok != K_USING)+ yyerror("syntax error");++ while (tok == ',')+ {+ PLpgSQL_expr *expr;++ expr = read_sql_construct(',', ';', K_USING,+ ", or ; or USING",+ "SELECT ",+ true, true, true,+ NULL, &tok);+ new->params = lappend(new->params, expr);+ }+ }+ else if (tok != K_USING)+ {+ /* must be condition name or SQLSTATE */+ if (tok_is_keyword(tok, &yylval,+ K_SQLSTATE, "sqlstate"))+ {+ /* next token should be a string literal */+ char *sqlstatestr;++ if (yylex() != SCONST)+ yyerror("syntax error");+ sqlstatestr = yylval.str;++ if (strlen(sqlstatestr) != 5)+ yyerror("invalid SQLSTATE code");+ if (strspn(sqlstatestr, "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ") != 5)+ yyerror("invalid SQLSTATE code");+ new->condname = sqlstatestr;+ }+ else+ {+ if (tok == T_WORD)+ new->condname = yylval.word.ident;+ else if (plpgsql_token_is_unreserved_keyword(tok))+ new->condname = pstrdup(yylval.keyword);+ else+ yyerror("syntax error");+ plpgsql_recognize_err_condition(new->condname,+ false);+ }+ tok = yylex();+ if (tok != ';' && tok != K_USING)+ yyerror("syntax error");+ }++ if (tok == K_USING)+ new->options = read_raise_options();+ }++ check_raise_parameters(new);++ (yyval.stmt) = (PLpgSQL_stmt *)new;+ }+#line 3848 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 124:+#line 1854 "pl_gram.y" /* yacc.c:1646 */+ {+ PLpgSQL_stmt_assert *new;+ int tok;++ new = palloc(sizeof(PLpgSQL_stmt_assert));++ new->cmd_type = PLPGSQL_STMT_ASSERT;+ new->lineno = plpgsql_location_to_lineno((yylsp[0]));++ new->cond = read_sql_expression2(',', ';',+ ", or ;",+ &tok);++ if (tok == ',')+ new->message = read_sql_expression(';', ";");+ else+ new->message = NULL;++ (yyval.stmt) = (PLpgSQL_stmt *) new;+ }+#line 3873 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 125:+#line 1877 "pl_gram.y" /* yacc.c:1646 */+ {+ (yyval.loop_body).stmts = (yyvsp[-4].list);+ (yyval.loop_body).end_label = (yyvsp[-1].str);+ (yyval.loop_body).end_label_location = (yylsp[-1]);+ }+#line 3883 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 126:+#line 1895 "pl_gram.y" /* yacc.c:1646 */+ {+ (yyval.stmt) = make_execsql_stmt(K_INSERT, (yylsp[0]));+ }+#line 3891 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 127:+#line 1899 "pl_gram.y" /* yacc.c:1646 */+ {+ int tok;++ tok = yylex();+ plpgsql_push_back_token(tok);+ if (tok == '=' || tok == COLON_EQUALS || tok == '[')+ word_is_not_variable(&((yyvsp[0].word)), (yylsp[0]));+ (yyval.stmt) = make_execsql_stmt(T_WORD, (yylsp[0]));+ }+#line 3905 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 128:+#line 1909 "pl_gram.y" /* yacc.c:1646 */+ {+ int tok;++ tok = yylex();+ plpgsql_push_back_token(tok);+ if (tok == '=' || tok == COLON_EQUALS || tok == '[')+ cword_is_not_variable(&((yyvsp[0].cword)), (yylsp[0]));+ (yyval.stmt) = make_execsql_stmt(T_CWORD, (yylsp[0]));+ }+#line 3919 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 129:+#line 1921 "pl_gram.y" /* yacc.c:1646 */+ {+ PLpgSQL_stmt_dynexecute *new;+ PLpgSQL_expr *expr;+ int endtoken;++ expr = read_sql_construct(K_INTO, K_USING, ';',+ "INTO or USING or ;",+ "SELECT ",+ true, true, true,+ NULL, &endtoken);++ new = palloc(sizeof(PLpgSQL_stmt_dynexecute));+ new->cmd_type = PLPGSQL_STMT_DYNEXECUTE;+ new->lineno = plpgsql_location_to_lineno((yylsp[0]));+ new->query = expr;+ new->into = false;+ new->strict = false;+ new->rec = NULL;+ new->row = NULL;+ new->params = NIL;++ /*+ * We loop to allow the INTO and USING clauses to+ * appear in either order, since people easily get+ * that wrong. This coding also prevents "INTO foo"+ * from getting absorbed into a USING expression,+ * which is *really* confusing.+ */+ for (;;)+ {+ if (endtoken == K_INTO)+ {+ if (new->into) /* multiple INTO */+ yyerror("syntax error");+ new->into = true;+ read_into_target(&new->rec, &new->row, &new->strict);+ endtoken = yylex();+ }+ else if (endtoken == K_USING)+ {+ if (new->params) /* multiple USING */+ yyerror("syntax error");+ do+ {+ expr = read_sql_construct(',', ';', K_INTO,+ ", or ; or INTO",+ "SELECT ",+ true, true, true,+ NULL, &endtoken);+ new->params = lappend(new->params, expr);+ } while (endtoken == ',');+ }+ else if (endtoken == ';')+ break;+ else+ yyerror("syntax error");+ }++ (yyval.stmt) = (PLpgSQL_stmt *)new;+ }+#line 3984 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 130:+#line 1985 "pl_gram.y" /* yacc.c:1646 */+ {+ PLpgSQL_stmt_open *new;+ int tok;++ new = palloc0(sizeof(PLpgSQL_stmt_open));+ new->cmd_type = PLPGSQL_STMT_OPEN;+ new->lineno = plpgsql_location_to_lineno((yylsp[-1]));+ new->curvar = (yyvsp[0].var)->dno;+ new->cursor_options = CURSOR_OPT_FAST_PLAN;++ if ((yyvsp[0].var)->cursor_explicit_expr == NULL)+ {+ /* be nice if we could use opt_scrollable here */+ tok = yylex();+ if (tok_is_keyword(tok, &yylval,+ K_NO, "no"))+ {+ tok = yylex();+ if (tok_is_keyword(tok, &yylval,+ K_SCROLL, "scroll"))+ {+ new->cursor_options |= CURSOR_OPT_NO_SCROLL;+ tok = yylex();+ }+ }+ else if (tok_is_keyword(tok, &yylval,+ K_SCROLL, "scroll"))+ {+ new->cursor_options |= CURSOR_OPT_SCROLL;+ tok = yylex();+ }++ if (tok != K_FOR)+ yyerror("syntax error, expected \"FOR\"");++ tok = yylex();+ if (tok == K_EXECUTE)+ {+ int endtoken;++ new->dynquery =+ read_sql_expression2(K_USING, ';',+ "USING or ;",+ &endtoken);++ /* If we found "USING", collect argument(s) */+ if (endtoken == K_USING)+ {+ PLpgSQL_expr *expr;++ do+ {+ expr = read_sql_expression2(',', ';',+ ", or ;",+ &endtoken);+ new->params = lappend(new->params,+ expr);+ } while (endtoken == ',');+ }+ }+ else+ {+ plpgsql_push_back_token(tok);+ new->query = read_sql_stmt("");+ }+ }+ else+ {+ /* predefined cursor query, so read args */+ new->argquery = read_cursor_args((yyvsp[0].var), ';', ";");+ }++ (yyval.stmt) = (PLpgSQL_stmt *)new;+ }+#line 4063 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 131:+#line 2062 "pl_gram.y" /* yacc.c:1646 */+ {+ PLpgSQL_stmt_fetch *fetch = (yyvsp[-2].fetch);+ PLpgSQL_rec *rec;+ PLpgSQL_row *row;++ /* We have already parsed everything through the INTO keyword */+ read_into_target(&rec, &row, NULL);++ if (yylex() != ';')+ yyerror("syntax error");++ /*+ * We don't allow multiple rows in PL/pgSQL's FETCH+ * statement, only in MOVE.+ */+ if (fetch->returns_multiple_rows)+ ereport(ERROR,+ (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),+ errmsg("FETCH statement cannot return multiple rows"),+ parser_errposition((yylsp[-3]))));++ fetch->lineno = plpgsql_location_to_lineno((yylsp[-3]));+ fetch->rec = rec;+ fetch->row = row;+ fetch->curvar = (yyvsp[-1].var)->dno;+ fetch->is_move = false;++ (yyval.stmt) = (PLpgSQL_stmt *)fetch;+ }+#line 4097 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 132:+#line 2094 "pl_gram.y" /* yacc.c:1646 */+ {+ PLpgSQL_stmt_fetch *fetch = (yyvsp[-2].fetch);++ fetch->lineno = plpgsql_location_to_lineno((yylsp[-3]));+ fetch->curvar = (yyvsp[-1].var)->dno;+ fetch->is_move = true;++ (yyval.stmt) = (PLpgSQL_stmt *)fetch;+ }+#line 4111 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 133:+#line 2106 "pl_gram.y" /* yacc.c:1646 */+ {+ (yyval.fetch) = read_fetch_direction();+ }+#line 4119 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 134:+#line 2112 "pl_gram.y" /* yacc.c:1646 */+ {+ PLpgSQL_stmt_close *new;++ new = palloc(sizeof(PLpgSQL_stmt_close));+ new->cmd_type = PLPGSQL_STMT_CLOSE;+ new->lineno = plpgsql_location_to_lineno((yylsp[-2]));+ new->curvar = (yyvsp[-1].var)->dno;++ (yyval.stmt) = (PLpgSQL_stmt *)new;+ }+#line 4134 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 135:+#line 2125 "pl_gram.y" /* yacc.c:1646 */+ {+ /* We do not bother building a node for NULL */+ (yyval.stmt) = NULL;+ }+#line 4143 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 136:+#line 2132 "pl_gram.y" /* yacc.c:1646 */+ {+ if ((yyvsp[0].wdatum).datum->dtype != PLPGSQL_DTYPE_VAR)+ ereport(ERROR,+ (errcode(ERRCODE_DATATYPE_MISMATCH),+ errmsg("cursor variable must be a simple variable"),+ parser_errposition((yylsp[0]))));++ if (((PLpgSQL_var *) (yyvsp[0].wdatum).datum)->datatype->typoid != REFCURSOROID)+ ereport(ERROR,+ (errcode(ERRCODE_DATATYPE_MISMATCH),+ errmsg("variable \"%s\" must be of type cursor or refcursor",+ ((PLpgSQL_var *) (yyvsp[0].wdatum).datum)->refname),+ parser_errposition((yylsp[0]))));+ (yyval.var) = (PLpgSQL_var *) (yyvsp[0].wdatum).datum;+ }+#line 4163 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 137:+#line 2148 "pl_gram.y" /* yacc.c:1646 */+ {+ /* just to give a better message than "syntax error" */+ word_is_not_variable(&((yyvsp[0].word)), (yylsp[0]));+ }+#line 4172 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 138:+#line 2153 "pl_gram.y" /* yacc.c:1646 */+ {+ /* just to give a better message than "syntax error" */+ cword_is_not_variable(&((yyvsp[0].cword)), (yylsp[0]));+ }+#line 4181 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 139:+#line 2160 "pl_gram.y" /* yacc.c:1646 */+ { (yyval.exception_block) = NULL; }+#line 4187 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 140:+#line 2162 "pl_gram.y" /* yacc.c:1646 */+ {+ /*+ * We use a mid-rule action to add these+ * special variables to the namespace before+ * parsing the WHEN clauses themselves. The+ * scope of the names extends to the end of the+ * current block.+ */+ int lineno = plpgsql_location_to_lineno((yylsp[0]));+ PLpgSQL_exception_block *new = palloc(sizeof(PLpgSQL_exception_block));+ PLpgSQL_variable *var;++ var = plpgsql_build_variable("sqlstate", lineno,+ plpgsql_build_datatype(TEXTOID,+ -1,+ plpgsql_curr_compile->fn_input_collation),+ true);+ ((PLpgSQL_var *) var)->isconst = true;+ new->sqlstate_varno = var->dno;++ var = plpgsql_build_variable("sqlerrm", lineno,+ plpgsql_build_datatype(TEXTOID,+ -1,+ plpgsql_curr_compile->fn_input_collation),+ true);+ ((PLpgSQL_var *) var)->isconst = true;+ new->sqlerrm_varno = var->dno;++ (yyval.exception_block) = new;+ }+#line 4222 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 141:+#line 2193 "pl_gram.y" /* yacc.c:1646 */+ {+ PLpgSQL_exception_block *new = (yyvsp[-1].exception_block);+ new->exc_list = (yyvsp[0].list);++ (yyval.exception_block) = new;+ }+#line 4233 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 142:+#line 2202 "pl_gram.y" /* yacc.c:1646 */+ {+ (yyval.list) = lappend((yyvsp[-1].list), (yyvsp[0].exception));+ }+#line 4241 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 143:+#line 2206 "pl_gram.y" /* yacc.c:1646 */+ {+ (yyval.list) = list_make1((yyvsp[0].exception));+ }+#line 4249 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 144:+#line 2212 "pl_gram.y" /* yacc.c:1646 */+ {+ PLpgSQL_exception *new;++ new = palloc0(sizeof(PLpgSQL_exception));+ new->lineno = plpgsql_location_to_lineno((yylsp[-3]));+ new->conditions = (yyvsp[-2].condition);+ new->action = (yyvsp[0].list);++ (yyval.exception) = new;+ }+#line 4264 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 145:+#line 2225 "pl_gram.y" /* yacc.c:1646 */+ {+ PLpgSQL_condition *old;++ for (old = (yyvsp[-2].condition); old->next != NULL; old = old->next)+ /* skip */ ;+ old->next = (yyvsp[0].condition);+ (yyval.condition) = (yyvsp[-2].condition);+ }+#line 4277 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 146:+#line 2234 "pl_gram.y" /* yacc.c:1646 */+ {+ (yyval.condition) = (yyvsp[0].condition);+ }+#line 4285 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 147:+#line 2240 "pl_gram.y" /* yacc.c:1646 */+ {+ if (strcmp((yyvsp[0].str), "sqlstate") != 0)+ {+ (yyval.condition) = plpgsql_parse_err_condition((yyvsp[0].str));+ }+ else+ {+ PLpgSQL_condition *new;+ char *sqlstatestr;++ /* next token should be a string literal */+ if (yylex() != SCONST)+ yyerror("syntax error");+ sqlstatestr = yylval.str;++ if (strlen(sqlstatestr) != 5)+ yyerror("invalid SQLSTATE code");+ if (strspn(sqlstatestr, "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ") != 5)+ yyerror("invalid SQLSTATE code");++ new = palloc(sizeof(PLpgSQL_condition));+ new->sqlerrstate =+ MAKE_SQLSTATE(sqlstatestr[0],+ sqlstatestr[1],+ sqlstatestr[2],+ sqlstatestr[3],+ sqlstatestr[4]);+ new->condname = sqlstatestr;+ new->next = NULL;++ (yyval.condition) = new;+ }+ }+#line 4323 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 148:+#line 2276 "pl_gram.y" /* yacc.c:1646 */+ { (yyval.expr) = read_sql_expression(';', ";"); }+#line 4329 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 149:+#line 2280 "pl_gram.y" /* yacc.c:1646 */+ { (yyval.expr) = read_sql_expression(']', "]"); }+#line 4335 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 150:+#line 2284 "pl_gram.y" /* yacc.c:1646 */+ { (yyval.expr) = read_sql_expression(K_THEN, "THEN"); }+#line 4341 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 151:+#line 2288 "pl_gram.y" /* yacc.c:1646 */+ { (yyval.expr) = read_sql_expression(K_LOOP, "LOOP"); }+#line 4347 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 152:+#line 2292 "pl_gram.y" /* yacc.c:1646 */+ {+ plpgsql_ns_push(NULL);+ (yyval.str) = NULL;+ }+#line 4356 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 153:+#line 2297 "pl_gram.y" /* yacc.c:1646 */+ {+ plpgsql_ns_push((yyvsp[-1].str));+ (yyval.str) = (yyvsp[-1].str);+ }+#line 4365 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 154:+#line 2304 "pl_gram.y" /* yacc.c:1646 */+ {+ (yyval.str) = NULL;+ }+#line 4373 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 155:+#line 2308 "pl_gram.y" /* yacc.c:1646 */+ {+ if (plpgsql_ns_lookup_label(plpgsql_ns_top(), (yyvsp[0].str)) == NULL)+ yyerror("label does not exist");+ (yyval.str) = (yyvsp[0].str);+ }+#line 4383 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 156:+#line 2316 "pl_gram.y" /* yacc.c:1646 */+ { (yyval.expr) = NULL; }+#line 4389 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 157:+#line 2318 "pl_gram.y" /* yacc.c:1646 */+ { (yyval.expr) = (yyvsp[0].expr); }+#line 4395 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 158:+#line 2325 "pl_gram.y" /* yacc.c:1646 */+ {+ (yyval.str) = (yyvsp[0].word).ident;+ }+#line 4403 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 159:+#line 2329 "pl_gram.y" /* yacc.c:1646 */+ {+ (yyval.str) = pstrdup((yyvsp[0].keyword));+ }+#line 4411 "pl_gram.c" /* yacc.c:1646 */+ break;++ case 160:+#line 2333 "pl_gram.y" /* yacc.c:1646 */+ {+ if ((yyvsp[0].wdatum).ident == NULL) /* composite name not OK */+ yyerror("syntax error");+ (yyval.str) = (yyvsp[0].wdatum).ident;+ }+#line 4421 "pl_gram.c" /* yacc.c:1646 */+ break;+++#line 4425 "pl_gram.c" /* yacc.c:1646 */+ default: break;+ }+ /* User semantic actions sometimes alter yychar, and that requires+ that yytoken be updated with the new translation. We take the+ approach of translating immediately before every use of yytoken.+ One alternative is translating here after every semantic action,+ but that translation would be missed if the semantic action invokes+ YYABORT, YYACCEPT, or YYERROR immediately after altering yychar or+ if it invokes YYBACKUP. In the case of YYABORT or YYACCEPT, an+ incorrect destructor might then be invoked immediately. In the+ case of YYERROR or YYBACKUP, subsequent parser actions might lead+ to an incorrect destructor call or verbose syntax error message+ before the lookahead is translated. */+ YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);++ YYPOPSTACK (yylen);+ yylen = 0;+ YY_STACK_PRINT (yyss, yyssp);++ *++yyvsp = yyval;+ *++yylsp = yyloc;++ /* Now 'shift' the result of the reduction. Determine what state+ that goes to, based on the state we popped back to and the rule+ number reduced by. */++ yyn = yyr1[yyn];++ yystate = yypgoto[yyn - YYNTOKENS] + *yyssp;+ if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp)+ yystate = yytable[yystate];+ else+ yystate = yydefgoto[yyn - YYNTOKENS];++ goto yynewstate;+++/*--------------------------------------.+| yyerrlab -- here on detecting error. |+`--------------------------------------*/+yyerrlab:+ /* Make sure we have latest lookahead translation. See comments at+ user semantic actions for why this is necessary. */+ yytoken = yychar == YYEMPTY ? YYEMPTY : YYTRANSLATE (yychar);++ /* If not already recovering from an error, report this error. */+ if (!yyerrstatus)+ {+ ++yynerrs;+#if ! YYERROR_VERBOSE+ yyerror (YY_("syntax error"));+#else+# define YYSYNTAX_ERROR yysyntax_error (&yymsg_alloc, &yymsg, \+ yyssp, yytoken)+ {+ char const *yymsgp = YY_("syntax error");+ int yysyntax_error_status;+ yysyntax_error_status = YYSYNTAX_ERROR;+ if (yysyntax_error_status == 0)+ yymsgp = yymsg;+ else if (yysyntax_error_status == 1)+ {+ if (yymsg != yymsgbuf)+ YYSTACK_FREE (yymsg);+ yymsg = (char *) YYSTACK_ALLOC (yymsg_alloc);+ if (!yymsg)+ {+ yymsg = yymsgbuf;+ yymsg_alloc = sizeof yymsgbuf;+ yysyntax_error_status = 2;+ }+ else+ {+ yysyntax_error_status = YYSYNTAX_ERROR;+ yymsgp = yymsg;+ }+ }+ yyerror (yymsgp);+ if (yysyntax_error_status == 2)+ goto yyexhaustedlab;+ }+# undef YYSYNTAX_ERROR+#endif+ }++ yyerror_range[1] = yylloc;++ if (yyerrstatus == 3)+ {+ /* If just tried and failed to reuse lookahead token after an+ error, discard it. */++ if (yychar <= YYEOF)+ {+ /* Return failure if at end of input. */+ if (yychar == YYEOF)+ YYABORT;+ }+ else+ {+ yydestruct ("Error: discarding",+ yytoken, &yylval, &yylloc);+ yychar = YYEMPTY;+ }+ }++ /* Else will try to reuse lookahead token after shifting the error+ token. */+ goto yyerrlab1;+++/*---------------------------------------------------.+| yyerrorlab -- error raised explicitly by YYERROR. |+`---------------------------------------------------*/+yyerrorlab:++ /* Pacify compilers like GCC when the user code never invokes+ YYERROR and the label yyerrorlab therefore never appears in user+ code. */+ if (/*CONSTCOND*/ 0)+ goto yyerrorlab;++ yyerror_range[1] = yylsp[1-yylen];+ /* Do not reclaim the symbols of the rule whose action triggered+ this YYERROR. */+ YYPOPSTACK (yylen);+ yylen = 0;+ YY_STACK_PRINT (yyss, yyssp);+ yystate = *yyssp;+ goto yyerrlab1;+++/*-------------------------------------------------------------.+| yyerrlab1 -- common code for both syntax error and YYERROR. |+`-------------------------------------------------------------*/+yyerrlab1:+ yyerrstatus = 3; /* Each real token shifted decrements this. */++ for (;;)+ {+ yyn = yypact[yystate];+ if (!yypact_value_is_default (yyn))+ {+ yyn += YYTERROR;+ if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)+ {+ yyn = yytable[yyn];+ if (0 < yyn)+ break;+ }+ }++ /* Pop the current state because it cannot handle the error token. */+ if (yyssp == yyss)+ YYABORT;++ yyerror_range[1] = *yylsp;+ yydestruct ("Error: popping",+ yystos[yystate], yyvsp, yylsp);+ YYPOPSTACK (1);+ yystate = *yyssp;+ YY_STACK_PRINT (yyss, yyssp);+ }++ YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN+ *++yyvsp = yylval;+ YY_IGNORE_MAYBE_UNINITIALIZED_END++ yyerror_range[2] = yylloc;+ /* Using YYLLOC is tempting, but would change the location of+ the lookahead. YYLOC is available though. */+ YYLLOC_DEFAULT (yyloc, yyerror_range, 2);+ *++yylsp = yyloc;++ /* Shift the error token. */+ YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp);++ yystate = yyn;+ goto yynewstate;+++/*-------------------------------------.+| yyacceptlab -- YYACCEPT comes here. |+`-------------------------------------*/+yyacceptlab:+ yyresult = 0;+ goto yyreturn;++/*-----------------------------------.+| yyabortlab -- YYABORT comes here. |+`-----------------------------------*/+yyabortlab:+ yyresult = 1;+ goto yyreturn;++#if !defined yyoverflow || YYERROR_VERBOSE+/*-------------------------------------------------.+| yyexhaustedlab -- memory exhaustion comes here. |+`-------------------------------------------------*/+yyexhaustedlab:+ yyerror (YY_("memory exhausted"));+ yyresult = 2;+ /* Fall through. */+#endif++yyreturn:+ if (yychar != YYEMPTY)+ {+ /* Make sure we have latest lookahead translation. See comments at+ user semantic actions for why this is necessary. */+ yytoken = YYTRANSLATE (yychar);+ yydestruct ("Cleanup: discarding lookahead",+ yytoken, &yylval, &yylloc);+ }+ /* Do not reclaim the symbols of the rule whose action triggered+ this YYABORT or YYACCEPT. */+ YYPOPSTACK (yylen);+ YY_STACK_PRINT (yyss, yyssp);+ while (yyssp != yyss)+ {+ yydestruct ("Cleanup: popping",+ yystos[*yyssp], yyvsp, yylsp);+ YYPOPSTACK (1);+ }+#ifndef yyoverflow+ if (yyss != yyssa)+ YYSTACK_FREE (yyss);+#endif+#if YYERROR_VERBOSE+ if (yymsg != yymsgbuf)+ YYSTACK_FREE (yymsg);+#endif+ return yyresult;+}+#line 2417 "pl_gram.y" /* yacc.c:1906 */+++/*+ * Check whether a token represents an "unreserved keyword".+ * We have various places where we want to recognize a keyword in preference+ * to a variable name, but not reserve that keyword in other contexts.+ * Hence, this kluge.+ */+static bool+tok_is_keyword(int token, union YYSTYPE *lval,+ int kw_token, const char *kw_str)+{+ if (token == kw_token)+ {+ /* Normal case, was recognized by scanner (no conflicting variable) */+ return true;+ }+ else if (token == T_DATUM)+ {+ /*+ * It's a variable, so recheck the string name. Note we will not+ * match composite names (hence an unreserved word followed by "."+ * will not be recognized).+ */+ if (!lval->wdatum.quoted && lval->wdatum.ident != NULL &&+ strcmp(lval->wdatum.ident, kw_str) == 0)+ return true;+ }+ return false; /* not the keyword */+}++/*+ * Convenience routine to complain when we expected T_DATUM and got T_WORD,+ * ie, unrecognized variable.+ */+static void+word_is_not_variable(PLword *word, int location)+{+ ereport(ERROR,+ (errcode(ERRCODE_SYNTAX_ERROR),+ errmsg("\"%s\" is not a known variable",+ word->ident),+ parser_errposition(location)));+}++/* Same, for a CWORD */+static void+cword_is_not_variable(PLcword *cword, int location)+{+ ereport(ERROR,+ (errcode(ERRCODE_SYNTAX_ERROR),+ errmsg("\"%s\" is not a known variable",+ NameListToString(cword->idents)),+ parser_errposition(location)));+}++/*+ * Convenience routine to complain when we expected T_DATUM and got+ * something else. "tok" must be the current token, since we also+ * look at yylval and yylloc.+ */+static void+current_token_is_not_variable(int tok)+{+ if (tok == T_WORD)+ word_is_not_variable(&(yylval.word), yylloc);+ else if (tok == T_CWORD)+ cword_is_not_variable(&(yylval.cword), yylloc);+ else+ yyerror("syntax error");+}++/* Convenience routine to read an expression with one possible terminator */+static PLpgSQL_expr *+read_sql_expression(int until, const char *expected)+{+ return read_sql_construct(until, 0, 0, expected,+ "SELECT ", true, true, true, NULL, NULL);+}++/* Convenience routine to read an expression with two possible terminators */+static PLpgSQL_expr *+read_sql_expression2(int until, int until2, const char *expected,+ int *endtoken)+{+ return read_sql_construct(until, until2, 0, expected,+ "SELECT ", true, true, true, NULL, endtoken);+}++/* Convenience routine to read a SQL statement that must end with ';' */+static PLpgSQL_expr *+read_sql_stmt(const char *sqlstart)+{+ return read_sql_construct(';', 0, 0, ";",+ sqlstart, false, true, true, NULL, NULL);+}++/*+ * Read a SQL construct and build a PLpgSQL_expr for it.+ *+ * until: token code for expected terminator+ * until2: token code for alternate terminator (pass 0 if none)+ * until3: token code for another alternate terminator (pass 0 if none)+ * expected: text to use in complaining that terminator was not found+ * sqlstart: text to prefix to the accumulated SQL text+ * isexpression: whether to say we're reading an "expression" or a "statement"+ * valid_sql: whether to check the syntax of the expr (prefixed with sqlstart)+ * trim: trim trailing whitespace+ * startloc: if not NULL, location of first token is stored at *startloc+ * endtoken: if not NULL, ending token is stored at *endtoken+ * (this is only interesting if until2 or until3 isn't zero)+ */+static PLpgSQL_expr *+read_sql_construct(int until,+ int until2,+ int until3,+ const char *expected,+ const char *sqlstart,+ bool isexpression,+ bool valid_sql,+ bool trim,+ int *startloc,+ int *endtoken)+{+ int tok;+ StringInfoData ds;+ IdentifierLookup save_IdentifierLookup;+ int startlocation = -1;+ int parenlevel = 0;+ PLpgSQL_expr *expr;++ initStringInfo(&ds);+ appendStringInfoString(&ds, sqlstart);++ /* special lookup mode for identifiers within the SQL text */+ save_IdentifierLookup = plpgsql_IdentifierLookup;+ plpgsql_IdentifierLookup = IDENTIFIER_LOOKUP_EXPR;++ for (;;)+ {+ tok = yylex();+ if (startlocation < 0) /* remember loc of first token */+ startlocation = yylloc;+ if (tok == until && parenlevel == 0)+ break;+ if (tok == until2 && parenlevel == 0)+ break;+ if (tok == until3 && parenlevel == 0)+ break;+ if (tok == '(' || tok == '[')+ parenlevel++;+ else if (tok == ')' || tok == ']')+ {+ parenlevel--;+ if (parenlevel < 0)+ yyerror("mismatched parentheses");+ }+ /*+ * End of function definition is an error, and we don't expect to+ * hit a semicolon either (unless it's the until symbol, in which+ * case we should have fallen out above).+ */+ if (tok == 0 || tok == ';')+ {+ if (parenlevel != 0)+ yyerror("mismatched parentheses");+ if (isexpression)+ ereport(ERROR,+ (errcode(ERRCODE_SYNTAX_ERROR),+ errmsg("missing \"%s\" at end of SQL expression",+ expected),+ parser_errposition(yylloc)));+ else+ ereport(ERROR,+ (errcode(ERRCODE_SYNTAX_ERROR),+ errmsg("missing \"%s\" at end of SQL statement",+ expected),+ parser_errposition(yylloc)));+ }+ }++ plpgsql_IdentifierLookup = save_IdentifierLookup;++ if (startloc)+ *startloc = startlocation;+ if (endtoken)+ *endtoken = tok;++ /* give helpful complaint about empty input */+ if (startlocation >= yylloc)+ {+ if (isexpression)+ yyerror("missing expression");+ else+ yyerror("missing SQL statement");+ }++ plpgsql_append_source_text(&ds, startlocation, yylloc);++ /* trim any trailing whitespace, for neatness */+ if (trim)+ {+ while (ds.len > 0 && scanner_isspace(ds.data[ds.len - 1]))+ ds.data[--ds.len] = '\0';+ }++ expr = palloc0(sizeof(PLpgSQL_expr));+ expr->dtype = PLPGSQL_DTYPE_EXPR;+ expr->query = pstrdup(ds.data);+ expr->plan = NULL;+ expr->paramnos = NULL;+ expr->rwparam = -1;+ expr->ns = plpgsql_ns_top();+ pfree(ds.data);++ if (valid_sql)+ check_sql_expr(expr->query, startlocation, strlen(sqlstart));++ return expr;+}++static PLpgSQL_type *+read_datatype(int tok)+{+ StringInfoData ds;+ char *type_name;+ int startlocation;+ PLpgSQL_type *result;+ int parenlevel = 0;++ /* Should only be called while parsing DECLARE sections */+ Assert(plpgsql_IdentifierLookup == IDENTIFIER_LOOKUP_DECLARE);++ /* Often there will be a lookahead token, but if not, get one */+ if (tok == YYEMPTY)+ tok = yylex();++ startlocation = yylloc;++ /*+ * If we have a simple or composite identifier, check for %TYPE+ * and %ROWTYPE constructs.+ */+ if (tok == T_WORD)+ {+ char *dtname = yylval.word.ident;++ tok = yylex();+ if (tok == '%')+ {+ tok = yylex();+ if (tok_is_keyword(tok, &yylval,+ K_TYPE, "type"))+ {+ result = plpgsql_parse_wordtype(dtname);+ if (result)+ return result;+ }+ else if (tok_is_keyword(tok, &yylval,+ K_ROWTYPE, "rowtype"))+ {+ result = plpgsql_parse_wordrowtype(dtname);+ if (result)+ return result;+ }+ }+ }+ else if (plpgsql_token_is_unreserved_keyword(tok))+ {+ char *dtname = pstrdup(yylval.keyword);++ tok = yylex();+ if (tok == '%')+ {+ tok = yylex();+ if (tok_is_keyword(tok, &yylval,+ K_TYPE, "type"))+ {+ result = plpgsql_parse_wordtype(dtname);+ if (result)+ return result;+ }+ else if (tok_is_keyword(tok, &yylval,+ K_ROWTYPE, "rowtype"))+ {+ result = plpgsql_parse_wordrowtype(dtname);+ if (result)+ return result;+ }+ }+ }+ else if (tok == T_CWORD)+ {+ List *dtnames = yylval.cword.idents;++ tok = yylex();+ if (tok == '%')+ {+ tok = yylex();+ if (tok_is_keyword(tok, &yylval,+ K_TYPE, "type"))+ {+ result = plpgsql_parse_cwordtype(dtnames);+ if (result)+ return result;+ }+ else if (tok_is_keyword(tok, &yylval,+ K_ROWTYPE, "rowtype"))+ {+ result = plpgsql_parse_cwordrowtype(dtnames);+ if (result)+ return result;+ }+ }+ }++ while (tok != ';')+ {+ if (tok == 0)+ {+ if (parenlevel != 0)+ yyerror("mismatched parentheses");+ else+ yyerror("incomplete data type declaration");+ }+ /* Possible followers for datatype in a declaration */+ if (tok == K_COLLATE || tok == K_NOT ||+ tok == '=' || tok == COLON_EQUALS || tok == K_DEFAULT)+ break;+ /* Possible followers for datatype in a cursor_arg list */+ if ((tok == ',' || tok == ')') && parenlevel == 0)+ break;+ if (tok == '(')+ parenlevel++;+ else if (tok == ')')+ parenlevel--;++ tok = yylex();+ }++ /* set up ds to contain complete typename text */+ initStringInfo(&ds);+ plpgsql_append_source_text(&ds, startlocation, yylloc);+ type_name = ds.data;++ if (type_name[0] == '\0')+ yyerror("missing data type declaration");++ result = parse_datatype(type_name, startlocation);++ pfree(ds.data);++ plpgsql_push_back_token(tok);++ return result;+}++static PLpgSQL_stmt *+make_execsql_stmt(int firsttoken, int location)+{+ StringInfoData ds;+ IdentifierLookup save_IdentifierLookup;+ PLpgSQL_stmt_execsql *execsql;+ PLpgSQL_expr *expr;+ PLpgSQL_row *row = NULL;+ PLpgSQL_rec *rec = NULL;+ int tok;+ int prev_tok;+ bool have_into = false;+ bool have_strict = false;+ int into_start_loc = -1;+ int into_end_loc = -1;++ initStringInfo(&ds);++ /* special lookup mode for identifiers within the SQL text */+ save_IdentifierLookup = plpgsql_IdentifierLookup;+ plpgsql_IdentifierLookup = IDENTIFIER_LOOKUP_EXPR;++ /*+ * We have to special-case the sequence INSERT INTO, because we don't want+ * that to be taken as an INTO-variables clause. Fortunately, this is the+ * only valid use of INTO in a pl/pgsql SQL command, and INTO is already a+ * fully reserved word in the main grammar. We have to treat it that way+ * anywhere in the string, not only at the start; consider CREATE RULE+ * containing an INSERT statement.+ */+ tok = firsttoken;+ for (;;)+ {+ prev_tok = tok;+ tok = yylex();+ if (have_into && into_end_loc < 0)+ into_end_loc = yylloc; /* token after the INTO part */+ if (tok == ';')+ break;+ if (tok == 0)+ yyerror("unexpected end of function definition");++ if (tok == K_INTO && prev_tok != K_INSERT)+ {+ if (have_into)+ yyerror("INTO specified more than once");+ have_into = true;+ into_start_loc = yylloc;+ plpgsql_IdentifierLookup = IDENTIFIER_LOOKUP_NORMAL;+ read_into_target(&rec, &row, &have_strict);+ plpgsql_IdentifierLookup = IDENTIFIER_LOOKUP_EXPR;+ }+ }++ plpgsql_IdentifierLookup = save_IdentifierLookup;++ if (have_into)+ {+ /*+ * Insert an appropriate number of spaces corresponding to the+ * INTO text, so that locations within the redacted SQL statement+ * still line up with those in the original source text.+ */+ plpgsql_append_source_text(&ds, location, into_start_loc);+ appendStringInfoSpaces(&ds, into_end_loc - into_start_loc);+ plpgsql_append_source_text(&ds, into_end_loc, yylloc);+ }+ else+ plpgsql_append_source_text(&ds, location, yylloc);++ /* trim any trailing whitespace, for neatness */+ while (ds.len > 0 && scanner_isspace(ds.data[ds.len - 1]))+ ds.data[--ds.len] = '\0';++ expr = palloc0(sizeof(PLpgSQL_expr));+ expr->dtype = PLPGSQL_DTYPE_EXPR;+ expr->query = pstrdup(ds.data);+ expr->plan = NULL;+ expr->paramnos = NULL;+ expr->rwparam = -1;+ expr->ns = plpgsql_ns_top();+ pfree(ds.data);++ check_sql_expr(expr->query, location, 0);++ execsql = palloc(sizeof(PLpgSQL_stmt_execsql));+ execsql->cmd_type = PLPGSQL_STMT_EXECSQL;+ execsql->lineno = plpgsql_location_to_lineno(location);+ execsql->sqlstmt = expr;+ execsql->into = have_into;+ execsql->strict = have_strict;+ execsql->rec = rec;+ execsql->row = row;++ return (PLpgSQL_stmt *) execsql;+}+++/*+ * Read FETCH or MOVE direction clause (everything through FROM/IN).+ */+static PLpgSQL_stmt_fetch *+read_fetch_direction(void)+{+ PLpgSQL_stmt_fetch *fetch;+ int tok;+ bool check_FROM = true;++ /*+ * We create the PLpgSQL_stmt_fetch struct here, but only fill in+ * the fields arising from the optional direction clause+ */+ fetch = (PLpgSQL_stmt_fetch *) palloc0(sizeof(PLpgSQL_stmt_fetch));+ fetch->cmd_type = PLPGSQL_STMT_FETCH;+ /* set direction defaults: */+ fetch->direction = FETCH_FORWARD;+ fetch->how_many = 1;+ fetch->expr = NULL;+ fetch->returns_multiple_rows = false;++ tok = yylex();+ if (tok == 0)+ yyerror("unexpected end of function definition");++ if (tok_is_keyword(tok, &yylval,+ K_NEXT, "next"))+ {+ /* use defaults */+ }+ else if (tok_is_keyword(tok, &yylval,+ K_PRIOR, "prior"))+ {+ fetch->direction = FETCH_BACKWARD;+ }+ else if (tok_is_keyword(tok, &yylval,+ K_FIRST, "first"))+ {+ fetch->direction = FETCH_ABSOLUTE;+ }+ else if (tok_is_keyword(tok, &yylval,+ K_LAST, "last"))+ {+ fetch->direction = FETCH_ABSOLUTE;+ fetch->how_many = -1;+ }+ else if (tok_is_keyword(tok, &yylval,+ K_ABSOLUTE, "absolute"))+ {+ fetch->direction = FETCH_ABSOLUTE;+ fetch->expr = read_sql_expression2(K_FROM, K_IN,+ "FROM or IN",+ NULL);+ check_FROM = false;+ }+ else if (tok_is_keyword(tok, &yylval,+ K_RELATIVE, "relative"))+ {+ fetch->direction = FETCH_RELATIVE;+ fetch->expr = read_sql_expression2(K_FROM, K_IN,+ "FROM or IN",+ NULL);+ check_FROM = false;+ }+ else if (tok_is_keyword(tok, &yylval,+ K_ALL, "all"))+ {+ fetch->how_many = FETCH_ALL;+ fetch->returns_multiple_rows = true;+ }+ else if (tok_is_keyword(tok, &yylval,+ K_FORWARD, "forward"))+ {+ complete_direction(fetch, &check_FROM);+ }+ else if (tok_is_keyword(tok, &yylval,+ K_BACKWARD, "backward"))+ {+ fetch->direction = FETCH_BACKWARD;+ complete_direction(fetch, &check_FROM);+ }+ else if (tok == K_FROM || tok == K_IN)+ {+ /* empty direction */+ check_FROM = false;+ }+ else if (tok == T_DATUM)+ {+ /* Assume there's no direction clause and tok is a cursor name */+ plpgsql_push_back_token(tok);+ check_FROM = false;+ }+ else+ {+ /*+ * Assume it's a count expression with no preceding keyword.+ * Note: we allow this syntax because core SQL does, but we don't+ * document it because of the ambiguity with the omitted-direction+ * case. For instance, "MOVE n IN c" will fail if n is a variable.+ * Perhaps this can be improved someday, but it's hardly worth a+ * lot of work.+ */+ plpgsql_push_back_token(tok);+ fetch->expr = read_sql_expression2(K_FROM, K_IN,+ "FROM or IN",+ NULL);+ fetch->returns_multiple_rows = true;+ check_FROM = false;+ }++ /* check FROM or IN keyword after direction's specification */+ if (check_FROM)+ {+ tok = yylex();+ if (tok != K_FROM && tok != K_IN)+ yyerror("expected FROM or IN");+ }++ return fetch;+}++/*+ * Process remainder of FETCH/MOVE direction after FORWARD or BACKWARD.+ * Allows these cases:+ * FORWARD expr, FORWARD ALL, FORWARD+ * BACKWARD expr, BACKWARD ALL, BACKWARD+ */+static void+complete_direction(PLpgSQL_stmt_fetch *fetch, bool *check_FROM)+{+ int tok;++ tok = yylex();+ if (tok == 0)+ yyerror("unexpected end of function definition");++ if (tok == K_FROM || tok == K_IN)+ {+ *check_FROM = false;+ return;+ }++ if (tok == K_ALL)+ {+ fetch->how_many = FETCH_ALL;+ fetch->returns_multiple_rows = true;+ *check_FROM = true;+ return;+ }++ plpgsql_push_back_token(tok);+ fetch->expr = read_sql_expression2(K_FROM, K_IN,+ "FROM or IN",+ NULL);+ fetch->returns_multiple_rows = true;+ *check_FROM = false;+}++++static PLpgSQL_stmt *+make_return_stmt(int location)+{+ PLpgSQL_stmt_return *new;++ Assert(plpgsql_curr_compile->fn_rettype == VOIDOID);++ new = palloc0(sizeof(PLpgSQL_stmt_return));+ new->cmd_type = PLPGSQL_STMT_RETURN;+ new->lineno = plpgsql_location_to_lineno(location);+ new->expr = NULL;+ new->retvarno = -1;++ int tok = yylex();++ if (tok != ';')+ {+ plpgsql_push_back_token(tok);+ new->expr = read_sql_expression(';', ";");+ }++ return (PLpgSQL_stmt *) new;+}+++++static PLpgSQL_stmt *+make_return_next_stmt(int location)+{+ PLpgSQL_stmt_return_next *new;++ if (!plpgsql_curr_compile->fn_retset)+ ereport(ERROR,+ (errcode(ERRCODE_DATATYPE_MISMATCH),+ errmsg("cannot use RETURN NEXT in a non-SETOF function"),+ parser_errposition(location)));++ new = palloc0(sizeof(PLpgSQL_stmt_return_next));+ new->cmd_type = PLPGSQL_STMT_RETURN_NEXT;+ new->lineno = plpgsql_location_to_lineno(location);+ new->expr = NULL;+ new->retvarno = -1;++ if (plpgsql_curr_compile->out_param_varno >= 0)+ {+ if (yylex() != ';')+ ereport(ERROR,+ (errcode(ERRCODE_DATATYPE_MISMATCH),+ errmsg("RETURN NEXT cannot have a parameter in function with OUT parameters"),+ parser_errposition(yylloc)));+ new->retvarno = plpgsql_curr_compile->out_param_varno;+ }+ else+ {+ /*+ * We want to special-case simple variable references for efficiency.+ * So peek ahead to see if that's what we have.+ */+ int tok = yylex();++ if (tok == T_DATUM && plpgsql_peek() == ';' &&+ (yylval.wdatum.datum->dtype == PLPGSQL_DTYPE_VAR ||+ yylval.wdatum.datum->dtype == PLPGSQL_DTYPE_ROW ||+ yylval.wdatum.datum->dtype == PLPGSQL_DTYPE_REC))+ {+ new->retvarno = yylval.wdatum.datum->dno;+ /* eat the semicolon token that we only peeked at above */+ tok = yylex();+ Assert(tok == ';');+ }+ else+ {+ /*+ * Not (just) a variable name, so treat as expression.+ *+ * Note that a well-formed expression is _required_ here;+ * anything else is a compile-time error.+ */+ plpgsql_push_back_token(tok);+ new->expr = read_sql_expression(';', ";");+ }+ }++ return (PLpgSQL_stmt *) new;+}+++static PLpgSQL_stmt *+make_return_query_stmt(int location)+{+ PLpgSQL_stmt_return_query *new;+ int tok;++ if (!plpgsql_curr_compile->fn_retset)+ ereport(ERROR,+ (errcode(ERRCODE_DATATYPE_MISMATCH),+ errmsg("cannot use RETURN QUERY in a non-SETOF function"),+ parser_errposition(location)));++ new = palloc0(sizeof(PLpgSQL_stmt_return_query));+ new->cmd_type = PLPGSQL_STMT_RETURN_QUERY;+ new->lineno = plpgsql_location_to_lineno(location);++ /* check for RETURN QUERY EXECUTE */+ if ((tok = yylex()) != K_EXECUTE)+ {+ /* ordinary static query */+ plpgsql_push_back_token(tok);+ new->query = read_sql_stmt("");+ }+ else+ {+ /* dynamic SQL */+ int term;++ new->dynquery = read_sql_expression2(';', K_USING, "; or USING",+ &term);+ if (term == K_USING)+ {+ do+ {+ PLpgSQL_expr *expr;++ expr = read_sql_expression2(',', ';', ", or ;", &term);+ new->params = lappend(new->params, expr);+ } while (term == ',');+ }+ }++ return (PLpgSQL_stmt *) new;+}+++/* convenience routine to fetch the name of a T_DATUM */+static char *+NameOfDatum(PLwdatum *wdatum)+{+ if (wdatum->ident)+ return wdatum->ident;+ Assert(wdatum->idents != NIL);+ return NameListToString(wdatum->idents);+}++static void+check_assignable(PLpgSQL_datum *datum, int location)+{+ switch (datum->dtype)+ {+ case PLPGSQL_DTYPE_VAR:+ if (((PLpgSQL_var *) datum)->isconst)+ ereport(ERROR,+ (errcode(ERRCODE_ERROR_IN_ASSIGNMENT),+ errmsg("\"%s\" is declared CONSTANT",+ ((PLpgSQL_var *) datum)->refname),+ parser_errposition(location)));+ break;+ case PLPGSQL_DTYPE_ROW:+ /* always assignable? */+ break;+ case PLPGSQL_DTYPE_REC:+ /* always assignable? What about NEW/OLD? */+ break;+ case PLPGSQL_DTYPE_RECFIELD:+ /* always assignable? */+ break;+ case PLPGSQL_DTYPE_ARRAYELEM:+ /* always assignable? */+ break;+ default:+ elog(ERROR, "unrecognized dtype: %d", datum->dtype);+ break;+ }+}++/*+ * Read the argument of an INTO clause. On entry, we have just read the+ * INTO keyword.+ */+static void+read_into_target(PLpgSQL_rec **rec, PLpgSQL_row **row, bool *strict)+{+ int tok;++ /* Set default results */+ *rec = NULL;+ *row = NULL;+ if (strict)+ *strict = false;++ tok = yylex();+ if (strict && tok == K_STRICT)+ {+ *strict = true;+ tok = yylex();+ }++ /*+ * Currently, a row or record variable can be the single INTO target,+ * but not a member of a multi-target list. So we throw error if there+ * is a comma after it, because that probably means the user tried to+ * write a multi-target list. If this ever gets generalized, we should+ * probably refactor read_into_scalar_list so it handles all cases.+ */+ switch (tok)+ {+ case T_DATUM:+ if (yylval.wdatum.datum->dtype == PLPGSQL_DTYPE_ROW)+ {+ check_assignable(yylval.wdatum.datum, yylloc);+ *row = (PLpgSQL_row *) yylval.wdatum.datum;++ if ((tok = yylex()) == ',')+ ereport(ERROR,+ (errcode(ERRCODE_SYNTAX_ERROR),+ errmsg("record or row variable cannot be part of multiple-item INTO list"),+ parser_errposition(yylloc)));+ plpgsql_push_back_token(tok);+ }+ else if (yylval.wdatum.datum->dtype == PLPGSQL_DTYPE_REC)+ {+ check_assignable(yylval.wdatum.datum, yylloc);+ *rec = (PLpgSQL_rec *) yylval.wdatum.datum;++ if ((tok = yylex()) == ',')+ ereport(ERROR,+ (errcode(ERRCODE_SYNTAX_ERROR),+ errmsg("record or row variable cannot be part of multiple-item INTO list"),+ parser_errposition(yylloc)));+ plpgsql_push_back_token(tok);+ }+ else+ {+ *row = read_into_scalar_list(NameOfDatum(&(yylval.wdatum)),+ yylval.wdatum.datum, yylloc);+ }+ break;++ default:+ /* just to give a better message than "syntax error" */+ current_token_is_not_variable(tok);+ }+}++/*+ * Given the first datum and name in the INTO list, continue to read+ * comma-separated scalar variables until we run out. Then construct+ * and return a fake "row" variable that represents the list of+ * scalars.+ */+static PLpgSQL_row *+read_into_scalar_list(char *initial_name,+ PLpgSQL_datum *initial_datum,+ int initial_location)+{+ int nfields;+ char *fieldnames[1024];+ int varnos[1024];+ PLpgSQL_row *row;+ int tok;++ check_assignable(initial_datum, initial_location);+ fieldnames[0] = initial_name;+ varnos[0] = initial_datum->dno;+ nfields = 1;++ while ((tok = yylex()) == ',')+ {+ /* Check for array overflow */+ if (nfields >= 1024)+ ereport(ERROR,+ (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),+ errmsg("too many INTO variables specified"),+ parser_errposition(yylloc)));++ tok = yylex();+ switch (tok)+ {+ case T_DATUM:+ check_assignable(yylval.wdatum.datum, yylloc);+ if (yylval.wdatum.datum->dtype == PLPGSQL_DTYPE_ROW ||+ yylval.wdatum.datum->dtype == PLPGSQL_DTYPE_REC)+ ereport(ERROR,+ (errcode(ERRCODE_SYNTAX_ERROR),+ errmsg("\"%s\" is not a scalar variable",+ NameOfDatum(&(yylval.wdatum))),+ parser_errposition(yylloc)));+ fieldnames[nfields] = NameOfDatum(&(yylval.wdatum));+ varnos[nfields++] = yylval.wdatum.datum->dno;+ break;++ default:+ /* just to give a better message than "syntax error" */+ current_token_is_not_variable(tok);+ }+ }++ /*+ * We read an extra, non-comma token from yylex(), so push it+ * back onto the input stream+ */+ plpgsql_push_back_token(tok);++ row = palloc(sizeof(PLpgSQL_row));+ row->dtype = PLPGSQL_DTYPE_ROW;+ row->refname = pstrdup("*internal*");+ row->lineno = plpgsql_location_to_lineno(initial_location);+ row->rowtupdesc = NULL;+ row->nfields = nfields;+ row->fieldnames = palloc(sizeof(char *) * nfields);+ row->varnos = palloc(sizeof(int) * nfields);+ while (--nfields >= 0)+ {+ row->fieldnames[nfields] = fieldnames[nfields];+ row->varnos[nfields] = varnos[nfields];+ }++ plpgsql_adddatum((PLpgSQL_datum *)row);++ return row;+}++/*+ * Convert a single scalar into a "row" list. This is exactly+ * like read_into_scalar_list except we never consume any input.+ *+ * Note: lineno could be computed from location, but since callers+ * have it at hand already, we may as well pass it in.+ */+static PLpgSQL_row *+make_scalar_list1(char *initial_name,+ PLpgSQL_datum *initial_datum,+ int lineno, int location)+{+ PLpgSQL_row *row;++ check_assignable(initial_datum, location);++ row = palloc(sizeof(PLpgSQL_row));+ row->dtype = PLPGSQL_DTYPE_ROW;+ row->refname = pstrdup("*internal*");+ row->lineno = lineno;+ row->rowtupdesc = NULL;+ row->nfields = 1;+ row->fieldnames = palloc(sizeof(char *));+ row->varnos = palloc(sizeof(int));+ row->fieldnames[0] = initial_name;+ row->varnos[0] = initial_datum->dno;++ plpgsql_adddatum((PLpgSQL_datum *)row);++ return row;+}++/*+ * When the PL/pgSQL parser expects to see a SQL statement, it is very+ * liberal in what it accepts; for example, we often assume an+ * unrecognized keyword is the beginning of a SQL statement. This+ * avoids the need to duplicate parts of the SQL grammar in the+ * PL/pgSQL grammar, but it means we can accept wildly malformed+ * input. To try and catch some of the more obviously invalid input,+ * we run the strings we expect to be SQL statements through the main+ * SQL parser.+ *+ * We only invoke the raw parser (not the analyzer); this doesn't do+ * any database access and does not check any semantic rules, it just+ * checks for basic syntactic correctness. We do this here, rather+ * than after parsing has finished, because a malformed SQL statement+ * may cause the PL/pgSQL parser to become confused about statement+ * borders. So it is best to bail out as early as we can.+ *+ * It is assumed that "stmt" represents a copy of the function source text+ * beginning at offset "location", with leader text of length "leaderlen"+ * (typically "SELECT ") prefixed to the source text. We use this assumption+ * to transpose any error cursor position back to the function source text.+ * If no error cursor is provided, we'll just point at "location".+ */+static void+check_sql_expr(const char *stmt, int location, int leaderlen)+{+ sql_error_callback_arg cbarg;+ ErrorContextCallback syntax_errcontext;+ MemoryContext oldCxt;++ if (!plpgsql_check_syntax)+ return;++ cbarg.location = location;+ cbarg.leaderlen = leaderlen;++ syntax_errcontext.callback = plpgsql_sql_error_callback;+ syntax_errcontext.arg = &cbarg;+ syntax_errcontext.previous = error_context_stack;+ error_context_stack = &syntax_errcontext;++ oldCxt = MemoryContextSwitchTo(compile_tmp_cxt);+ (void) raw_parser(stmt);+ MemoryContextSwitchTo(oldCxt);++ /* Restore former ereport callback */+ error_context_stack = syntax_errcontext.previous;+}++static void+plpgsql_sql_error_callback(void *arg)+{+ sql_error_callback_arg *cbarg = (sql_error_callback_arg *) arg;+ int errpos;++ /*+ * First, set up internalerrposition to point to the start of the+ * statement text within the function text. Note this converts+ * location (a byte offset) to a character number.+ */+ parser_errposition(cbarg->location);++ /*+ * If the core parser provided an error position, transpose it.+ * Note we are dealing with 1-based character numbers at this point.+ */+ errpos = geterrposition();+ if (errpos > cbarg->leaderlen)+ {+ int myerrpos = getinternalerrposition();++ if (myerrpos > 0) /* safety check */+ internalerrposition(myerrpos + errpos - cbarg->leaderlen - 1);+ }++ /* In any case, flush errposition --- we want internalerrpos only */+ errposition(0);+}++/*+ * Parse a SQL datatype name and produce a PLpgSQL_type structure.+ *+ * The heavy lifting is done elsewhere. Here we are only concerned+ * with setting up an errcontext link that will let us give an error+ * cursor pointing into the plpgsql function source, if necessary.+ * This is handled the same as in check_sql_expr(), and we likewise+ * expect that the given string is a copy from the source text.+ */+static PLpgSQL_type * parse_datatype(const char *string, int location) { PLpgSQL_type *typ; typ = (PLpgSQL_type *) palloc0(sizeof(PLpgSQL_type)); typ->typname = pstrdup(string); typ->ttype = PLPGSQL_TTYPE_SCALAR; return typ; }+++/*+ * Check block starting and ending labels match.+ */+static void+check_labels(const char *start_label, const char *end_label, int end_location)+{+ if (end_label)+ {+ if (!start_label)+ ereport(ERROR,+ (errcode(ERRCODE_SYNTAX_ERROR),+ errmsg("end label \"%s\" specified for unlabelled block",+ end_label),+ parser_errposition(end_location)));++ if (strcmp(start_label, end_label) != 0)+ ereport(ERROR,+ (errcode(ERRCODE_SYNTAX_ERROR),+ errmsg("end label \"%s\" differs from block's label \"%s\"",+ end_label, start_label),+ parser_errposition(end_location)));+ }+}++/*+ * Read the arguments (if any) for a cursor, followed by the until token+ *+ * If cursor has no args, just swallow the until token and return NULL.+ * If it does have args, we expect to see "( arg [, arg ...] )" followed+ * by the until token, where arg may be a plain expression, or a named+ * parameter assignment of the form argname := expr. Consume all that and+ * return a SELECT query that evaluates the expression(s) (without the outer+ * parens).+ */+static PLpgSQL_expr *+read_cursor_args(PLpgSQL_var *cursor, int until, const char *expected)+{+ PLpgSQL_expr *expr;+ PLpgSQL_row *row;+ int tok;+ int argc;+ char **argv;+ StringInfoData ds;+ char *sqlstart = "SELECT ";+ bool any_named = false;++ tok = yylex();+ if (cursor->cursor_explicit_argrow < 0)+ {+ /* No arguments expected */+ if (tok == '(')+ ereport(ERROR,+ (errcode(ERRCODE_SYNTAX_ERROR),+ errmsg("cursor \"%s\" has no arguments",+ cursor->refname),+ parser_errposition(yylloc)));++ if (tok != until)+ yyerror("syntax error");++ return NULL;+ }++ /* Else better provide arguments */+ if (tok != '(')+ ereport(ERROR,+ (errcode(ERRCODE_SYNTAX_ERROR),+ errmsg("cursor \"%s\" has arguments",+ cursor->refname),+ parser_errposition(yylloc)));++ /*+ * Read the arguments, one by one.+ */+ row = (PLpgSQL_row *) plpgsql_Datums[cursor->cursor_explicit_argrow];+ argv = (char **) palloc0(row->nfields * sizeof(char *));++ for (argc = 0; argc < row->nfields; argc++)+ {+ PLpgSQL_expr *item;+ int endtoken;+ int argpos;+ int tok1,+ tok2;+ int arglocation;++ /* Check if it's a named parameter: "param := value" */+ plpgsql_peek2(&tok1, &tok2, &arglocation, NULL);+ if (tok1 == IDENT && tok2 == COLON_EQUALS)+ {+ char *argname;+ IdentifierLookup save_IdentifierLookup;++ /* Read the argument name, ignoring any matching variable */+ save_IdentifierLookup = plpgsql_IdentifierLookup;+ plpgsql_IdentifierLookup = IDENTIFIER_LOOKUP_DECLARE;+ yylex();+ argname = yylval.str;+ plpgsql_IdentifierLookup = save_IdentifierLookup;++ /* Match argument name to cursor arguments */+ for (argpos = 0; argpos < row->nfields; argpos++)+ {+ if (strcmp(row->fieldnames[argpos], argname) == 0)+ break;+ }+ if (argpos == row->nfields)+ ereport(ERROR,+ (errcode(ERRCODE_SYNTAX_ERROR),+ errmsg("cursor \"%s\" has no argument named \"%s\"",+ cursor->refname, argname),+ parser_errposition(yylloc)));++ /*+ * Eat the ":=". We already peeked, so the error should never+ * happen.+ */+ tok2 = yylex();+ if (tok2 != COLON_EQUALS)+ yyerror("syntax error");++ any_named = true;+ }+ else+ argpos = argc;++ if (argv[argpos] != NULL)+ ereport(ERROR,+ (errcode(ERRCODE_SYNTAX_ERROR),+ errmsg("value for parameter \"%s\" of cursor \"%s\" specified more than once",+ row->fieldnames[argpos], cursor->refname),+ parser_errposition(arglocation)));++ /*+ * Read the value expression. To provide the user with meaningful+ * parse error positions, we check the syntax immediately, instead of+ * checking the final expression that may have the arguments+ * reordered. Trailing whitespace must not be trimmed, because+ * otherwise input of the form (param -- comment\n, param) would be+ * translated into a form where the second parameter is commented+ * out.+ */+ item = read_sql_construct(',', ')', 0,+ ",\" or \")",+ sqlstart,+ true, true,+ false, /* do not trim */+ NULL, &endtoken);++ argv[argpos] = item->query + strlen(sqlstart);++ if (endtoken == ')' && !(argc == row->nfields - 1))+ ereport(ERROR,+ (errcode(ERRCODE_SYNTAX_ERROR),+ errmsg("not enough arguments for cursor \"%s\"",+ cursor->refname),+ parser_errposition(yylloc)));++ if (endtoken == ',' && (argc == row->nfields - 1))+ ereport(ERROR,+ (errcode(ERRCODE_SYNTAX_ERROR),+ errmsg("too many arguments for cursor \"%s\"",+ cursor->refname),+ parser_errposition(yylloc)));+ }++ /* Make positional argument list */+ initStringInfo(&ds);+ appendStringInfoString(&ds, sqlstart);+ for (argc = 0; argc < row->nfields; argc++)+ {+ Assert(argv[argc] != NULL);++ /*+ * Because named notation allows permutated argument lists, include+ * the parameter name for meaningful runtime errors.+ */+ appendStringInfoString(&ds, argv[argc]);+ if (any_named)+ appendStringInfo(&ds, " AS %s",+ quote_identifier(row->fieldnames[argc]));+ if (argc < row->nfields - 1)+ appendStringInfoString(&ds, ", ");+ }+ appendStringInfoChar(&ds, ';');++ expr = palloc0(sizeof(PLpgSQL_expr));+ expr->dtype = PLPGSQL_DTYPE_EXPR;+ expr->query = pstrdup(ds.data);+ expr->plan = NULL;+ expr->paramnos = NULL;+ expr->rwparam = -1;+ expr->ns = plpgsql_ns_top();+ pfree(ds.data);++ /* Next we'd better find the until token */+ tok = yylex();+ if (tok != until)+ yyerror("syntax error");++ return expr;+}++/*+ * Parse RAISE ... USING options+ */+static List *+read_raise_options(void)+{+ List *result = NIL;++ for (;;)+ {+ PLpgSQL_raise_option *opt;+ int tok;++ if ((tok = yylex()) == 0)+ yyerror("unexpected end of function definition");++ opt = (PLpgSQL_raise_option *) palloc(sizeof(PLpgSQL_raise_option));++ if (tok_is_keyword(tok, &yylval,+ K_ERRCODE, "errcode"))+ opt->opt_type = PLPGSQL_RAISEOPTION_ERRCODE;+ else if (tok_is_keyword(tok, &yylval,+ K_MESSAGE, "message"))+ opt->opt_type = PLPGSQL_RAISEOPTION_MESSAGE;+ else if (tok_is_keyword(tok, &yylval,+ K_DETAIL, "detail"))+ opt->opt_type = PLPGSQL_RAISEOPTION_DETAIL;+ else if (tok_is_keyword(tok, &yylval,+ K_HINT, "hint"))+ opt->opt_type = PLPGSQL_RAISEOPTION_HINT;+ else if (tok_is_keyword(tok, &yylval,+ K_COLUMN, "column"))+ opt->opt_type = PLPGSQL_RAISEOPTION_COLUMN;+ else if (tok_is_keyword(tok, &yylval,+ K_CONSTRAINT, "constraint"))+ opt->opt_type = PLPGSQL_RAISEOPTION_CONSTRAINT;+ else if (tok_is_keyword(tok, &yylval,+ K_DATATYPE, "datatype"))+ opt->opt_type = PLPGSQL_RAISEOPTION_DATATYPE;+ else if (tok_is_keyword(tok, &yylval,+ K_TABLE, "table"))+ opt->opt_type = PLPGSQL_RAISEOPTION_TABLE;+ else if (tok_is_keyword(tok, &yylval,+ K_SCHEMA, "schema"))+ opt->opt_type = PLPGSQL_RAISEOPTION_SCHEMA;+ else+ yyerror("unrecognized RAISE statement option");++ tok = yylex();+ if (tok != '=' && tok != COLON_EQUALS)+ yyerror("syntax error, expected \"=\"");++ opt->expr = read_sql_expression2(',', ';', ", or ;", &tok);++ result = lappend(result, opt);++ if (tok == ';')+ break;+ }++ return result;+}++/*+ * Check that the number of parameter placeholders in the message matches the+ * number of parameters passed to it, if a message was given.+ */+static void+check_raise_parameters(PLpgSQL_stmt_raise *stmt)+{+ char *cp;+ int expected_nparams = 0;++ if (stmt->message == NULL)+ return;++ for (cp = stmt->message; *cp; cp++)+ {+ if (cp[0] == '%')+ {+ /* ignore literal % characters */+ if (cp[1] == '%')+ cp++;+ else+ expected_nparams++;+ }+ }++ if (expected_nparams < list_length(stmt->params))+ ereport(ERROR,+ (errcode(ERRCODE_SYNTAX_ERROR),+ errmsg("too many parameters specified for RAISE")));+ if (expected_nparams > list_length(stmt->params))+ ereport(ERROR,+ (errcode(ERRCODE_SYNTAX_ERROR),+ errmsg("too few parameters specified for RAISE")));+}++/*+ * Fix up CASE statement+ */+static PLpgSQL_stmt *+make_case(int location, PLpgSQL_expr *t_expr,+ List *case_when_list, List *else_stmts)+{+ PLpgSQL_stmt_case *new;++ new = palloc(sizeof(PLpgSQL_stmt_case));+ new->cmd_type = PLPGSQL_STMT_CASE;+ new->lineno = plpgsql_location_to_lineno(location);+ new->t_expr = t_expr;+ new->t_varno = 0;+ new->case_when_list = case_when_list;+ new->have_else = (else_stmts != NIL);+ /* Get rid of list-with-NULL hack */+ if (list_length(else_stmts) == 1 && linitial(else_stmts) == NULL)+ new->else_stmts = NIL;+ else+ new->else_stmts = else_stmts;++ /*+ * When test expression is present, we create a var for it and then+ * convert all the WHEN expressions to "VAR IN (original_expression)".+ * This is a bit klugy, but okay since we haven't yet done more than+ * read the expressions as text. (Note that previous parsing won't+ * have complained if the WHEN ... THEN expression contained multiple+ * comma-separated values.)+ */+ if (t_expr)+ {+ char varname[32];+ PLpgSQL_var *t_var;+ ListCell *l;++ /* use a name unlikely to collide with any user names */+ snprintf(varname, sizeof(varname), "__Case__Variable_%d__",+ plpgsql_nDatums);++ /*+ * We don't yet know the result datatype of t_expr. Build the+ * variable as if it were INT4; we'll fix this at runtime if needed.+ */+ t_var = (PLpgSQL_var *)+ plpgsql_build_variable(varname, new->lineno,+ plpgsql_build_datatype(INT4OID,+ -1,+ InvalidOid),+ true);+ new->t_varno = t_var->dno;++ foreach(l, case_when_list)+ {+ PLpgSQL_case_when *cwt = (PLpgSQL_case_when *) lfirst(l);+ PLpgSQL_expr *expr = cwt->expr;+ StringInfoData ds;++ /* copy expression query without SELECT keyword (expr->query + 7) */+ Assert(strncmp(expr->query, "SELECT ", 7) == 0);++ /* And do the string hacking */+ initStringInfo(&ds);++ appendStringInfo(&ds, "SELECT \"%s\" IN (%s)",+ varname, expr->query + 7);++ pfree(expr->query);+ expr->query = pstrdup(ds.data);+ /* Adjust expr's namespace to include the case variable */+ expr->ns = plpgsql_ns_top();++ pfree(ds.data);+ }+ }++ return (PLpgSQL_stmt *) new;+}
+ foreign/libpg_query/src/postgres/src_pl_plpgsql_src_pl_handler.c view
@@ -0,0 +1,106 @@+/*--------------------------------------------------------------------+ * Symbols referenced in this file:+ * - plpgsql_variable_conflict+ * - plpgsql_print_strict_params+ *--------------------------------------------------------------------+ */++/*-------------------------------------------------------------------------+ *+ * pl_handler.c - Handler for the PL/pgSQL+ * procedural language+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ *+ * IDENTIFICATION+ * src/pl/plpgsql/src/pl_handler.c+ *+ *-------------------------------------------------------------------------+ */++#include "plpgsql.h"++#include "access/htup_details.h"+#include "catalog/pg_proc.h"+#include "catalog/pg_type.h"+#include "funcapi.h"+#include "miscadmin.h"+#include "utils/builtins.h"+#include "utils/guc.h"+#include "utils/lsyscache.h"+#include "utils/syscache.h"+++static bool plpgsql_extra_checks_check_hook(char **newvalue, void **extra, GucSource source);+static void plpgsql_extra_warnings_assign_hook(const char *newvalue, void *extra);+static void plpgsql_extra_errors_assign_hook(const char *newvalue, void *extra);++;++/* Custom GUC variable */+++__thread int plpgsql_variable_conflict = PLPGSQL_RESOLVE_ERROR;+++__thread bool plpgsql_print_strict_params = false;++++++++++/* Hook for plugins */+++++++++++/*+ * _PG_init() - library load-time initialization+ *+ * DO NOT make this static nor change its name!+ */+++/* ----------+ * plpgsql_call_handler+ *+ * The PostgreSQL function manager and trigger manager+ * call this function for execution of PL/pgSQL procedures.+ * ----------+ */+;++++/* ----------+ * plpgsql_inline_handler+ *+ * Called by PostgreSQL to execute an anonymous code block+ * ----------+ */+;++++/* ----------+ * plpgsql_validator+ *+ * This function attempts to validate a PL/pgSQL function at+ * CREATE FUNCTION time.+ * ----------+ */+;++
+ foreign/libpg_query/src/postgres/src_pl_plpgsql_src_pl_scanner.c view
@@ -0,0 +1,770 @@+/*--------------------------------------------------------------------+ * Symbols referenced in this file:+ * - plpgsql_scanner_init+ * - plpgsql_IdentifierLookup+ * - yyscanner+ * - core_yy+ * - reserved_keywords+ * - num_reserved_keywords+ * - scanorig+ * - plpgsql_yytoken+ * - num_pushbacks+ * - location_lineno_init+ * - cur_line_start+ * - cur_line_num+ * - cur_line_end+ * - plpgsql_yylex+ * - internal_yylex+ * - pushback_token+ * - pushback_auxdata+ * - push_back_token+ * - unreserved_keywords+ * - num_unreserved_keywords+ * - plpgsql_yyleng+ * - plpgsql_location_to_lineno+ * - plpgsql_scanner_errposition+ * - plpgsql_yyerror+ * - plpgsql_push_back_token+ * - plpgsql_token_is_unreserved_keyword+ * - plpgsql_append_source_text+ * - plpgsql_peek2+ * - plpgsql_peek+ * - plpgsql_scanner_finish+ * - plpgsql_latest_lineno+ *--------------------------------------------------------------------+ */++/*-------------------------------------------------------------------------+ *+ * pl_scanner.c+ * lexical scanning for PL/pgSQL+ *+ *+ * Portions Copyright (c) 1996-2015, PostgreSQL Global Development Group+ * Portions Copyright (c) 1994, Regents of the University of California+ *+ *+ * IDENTIFICATION+ * src/pl/plpgsql/src/pl_scanner.c+ *+ *-------------------------------------------------------------------------+ */+#include "plpgsql.h"++#include "mb/pg_wchar.h"+#include "parser/scanner.h"++#include "pl_gram.h" /* must be after parser/scanner.h */++#define PG_KEYWORD(a,b,c) {a,b,c},+++/* Klugy flag to tell scanner how to look up identifiers */+__thread IdentifierLookup plpgsql_IdentifierLookup = IDENTIFIER_LOOKUP_NORMAL;+++/*+ * A word about keywords:+ *+ * We keep reserved and unreserved keywords in separate arrays. The+ * reserved keywords are passed to the core scanner, so they will be+ * recognized before (and instead of) any variable name. Unreserved words+ * are checked for separately, usually after determining that the identifier+ * isn't a known variable name. If plpgsql_IdentifierLookup is DECLARE then+ * no variable names will be recognized, so the unreserved words always work.+ * (Note in particular that this helps us avoid reserving keywords that are+ * only needed in DECLARE sections.)+ *+ * In certain contexts it is desirable to prefer recognizing an unreserved+ * keyword over recognizing a variable name. In particular, at the start+ * of a statement we should prefer unreserved keywords unless the statement+ * looks like an assignment (i.e., first token is followed by ':=' or '[').+ * This rule allows most statement-introducing keywords to be kept unreserved.+ * (We still have to reserve initial keywords that might follow a block+ * label, unfortunately, since the method used to determine if we are at+ * start of statement doesn't recognize such cases. We'd also have to+ * reserve any keyword that could legitimately be followed by ':=' or '['.)+ * Some additional cases are handled in pl_gram.y using tok_is_keyword().+ *+ * We try to avoid reserving more keywords than we have to; but there's+ * little point in not reserving a word if it's reserved in the core grammar.+ * Currently, the following words are reserved here but not in the core:+ * BEGIN BY DECLARE EXECUTE FOREACH IF LOOP STRICT WHILE+ */++/*+ * Lists of keyword (name, token-value, category) entries.+ *+ * !!WARNING!!: These lists must be sorted by ASCII name, because binary+ * search is used to locate entries.+ *+ * Be careful not to put the same word in both lists. Also be sure that+ * pl_gram.y's unreserved_keyword production agrees with the second list.+ */++static const ScanKeyword reserved_keywords[] = {+ PG_KEYWORD("all", K_ALL, RESERVED_KEYWORD)+ PG_KEYWORD("begin", K_BEGIN, RESERVED_KEYWORD)+ PG_KEYWORD("by", K_BY, RESERVED_KEYWORD)+ PG_KEYWORD("case", K_CASE, RESERVED_KEYWORD)+ PG_KEYWORD("declare", K_DECLARE, RESERVED_KEYWORD)+ PG_KEYWORD("else", K_ELSE, RESERVED_KEYWORD)+ PG_KEYWORD("end", K_END, RESERVED_KEYWORD)+ PG_KEYWORD("execute", K_EXECUTE, RESERVED_KEYWORD)+ PG_KEYWORD("for", K_FOR, RESERVED_KEYWORD)+ PG_KEYWORD("foreach", K_FOREACH, RESERVED_KEYWORD)+ PG_KEYWORD("from", K_FROM, RESERVED_KEYWORD)+ PG_KEYWORD("if", K_IF, RESERVED_KEYWORD)+ PG_KEYWORD("in", K_IN, RESERVED_KEYWORD)+ PG_KEYWORD("into", K_INTO, RESERVED_KEYWORD)+ PG_KEYWORD("loop", K_LOOP, RESERVED_KEYWORD)+ PG_KEYWORD("not", K_NOT, RESERVED_KEYWORD)+ PG_KEYWORD("null", K_NULL, RESERVED_KEYWORD)+ PG_KEYWORD("or", K_OR, RESERVED_KEYWORD)+ PG_KEYWORD("strict", K_STRICT, RESERVED_KEYWORD)+ PG_KEYWORD("then", K_THEN, RESERVED_KEYWORD)+ PG_KEYWORD("to", K_TO, RESERVED_KEYWORD)+ PG_KEYWORD("using", K_USING, RESERVED_KEYWORD)+ PG_KEYWORD("when", K_WHEN, RESERVED_KEYWORD)+ PG_KEYWORD("while", K_WHILE, RESERVED_KEYWORD)+};++static const int num_reserved_keywords = lengthof(reserved_keywords);++static const ScanKeyword unreserved_keywords[] = {+ PG_KEYWORD("absolute", K_ABSOLUTE, UNRESERVED_KEYWORD)+ PG_KEYWORD("alias", K_ALIAS, UNRESERVED_KEYWORD)+ PG_KEYWORD("array", K_ARRAY, UNRESERVED_KEYWORD)+ PG_KEYWORD("assert", K_ASSERT, UNRESERVED_KEYWORD)+ PG_KEYWORD("backward", K_BACKWARD, UNRESERVED_KEYWORD)+ PG_KEYWORD("close", K_CLOSE, UNRESERVED_KEYWORD)+ PG_KEYWORD("collate", K_COLLATE, UNRESERVED_KEYWORD)+ PG_KEYWORD("column", K_COLUMN, UNRESERVED_KEYWORD)+ PG_KEYWORD("column_name", K_COLUMN_NAME, UNRESERVED_KEYWORD)+ PG_KEYWORD("constant", K_CONSTANT, UNRESERVED_KEYWORD)+ PG_KEYWORD("constraint", K_CONSTRAINT, UNRESERVED_KEYWORD)+ PG_KEYWORD("constraint_name", K_CONSTRAINT_NAME, UNRESERVED_KEYWORD)+ PG_KEYWORD("continue", K_CONTINUE, UNRESERVED_KEYWORD)+ PG_KEYWORD("current", K_CURRENT, UNRESERVED_KEYWORD)+ PG_KEYWORD("cursor", K_CURSOR, UNRESERVED_KEYWORD)+ PG_KEYWORD("datatype", K_DATATYPE, UNRESERVED_KEYWORD)+ PG_KEYWORD("debug", K_DEBUG, UNRESERVED_KEYWORD)+ PG_KEYWORD("default", K_DEFAULT, UNRESERVED_KEYWORD)+ PG_KEYWORD("detail", K_DETAIL, UNRESERVED_KEYWORD)+ PG_KEYWORD("diagnostics", K_DIAGNOSTICS, UNRESERVED_KEYWORD)+ PG_KEYWORD("dump", K_DUMP, UNRESERVED_KEYWORD)+ PG_KEYWORD("elseif", K_ELSIF, UNRESERVED_KEYWORD)+ PG_KEYWORD("elsif", K_ELSIF, UNRESERVED_KEYWORD)+ PG_KEYWORD("errcode", K_ERRCODE, UNRESERVED_KEYWORD)+ PG_KEYWORD("error", K_ERROR, UNRESERVED_KEYWORD)+ PG_KEYWORD("exception", K_EXCEPTION, UNRESERVED_KEYWORD)+ PG_KEYWORD("exit", K_EXIT, UNRESERVED_KEYWORD)+ PG_KEYWORD("fetch", K_FETCH, UNRESERVED_KEYWORD)+ PG_KEYWORD("first", K_FIRST, UNRESERVED_KEYWORD)+ PG_KEYWORD("forward", K_FORWARD, UNRESERVED_KEYWORD)+ PG_KEYWORD("get", K_GET, UNRESERVED_KEYWORD)+ PG_KEYWORD("hint", K_HINT, UNRESERVED_KEYWORD)+ PG_KEYWORD("info", K_INFO, UNRESERVED_KEYWORD)+ PG_KEYWORD("insert", K_INSERT, UNRESERVED_KEYWORD)+ PG_KEYWORD("is", K_IS, UNRESERVED_KEYWORD)+ PG_KEYWORD("last", K_LAST, UNRESERVED_KEYWORD)+ PG_KEYWORD("log", K_LOG, UNRESERVED_KEYWORD)+ PG_KEYWORD("message", K_MESSAGE, UNRESERVED_KEYWORD)+ PG_KEYWORD("message_text", K_MESSAGE_TEXT, UNRESERVED_KEYWORD)+ PG_KEYWORD("move", K_MOVE, UNRESERVED_KEYWORD)+ PG_KEYWORD("next", K_NEXT, UNRESERVED_KEYWORD)+ PG_KEYWORD("no", K_NO, UNRESERVED_KEYWORD)+ PG_KEYWORD("notice", K_NOTICE, UNRESERVED_KEYWORD)+ PG_KEYWORD("open", K_OPEN, UNRESERVED_KEYWORD)+ PG_KEYWORD("option", K_OPTION, UNRESERVED_KEYWORD)+ PG_KEYWORD("perform", K_PERFORM, UNRESERVED_KEYWORD)+ PG_KEYWORD("pg_context", K_PG_CONTEXT, UNRESERVED_KEYWORD)+ PG_KEYWORD("pg_datatype_name", K_PG_DATATYPE_NAME, UNRESERVED_KEYWORD)+ PG_KEYWORD("pg_exception_context", K_PG_EXCEPTION_CONTEXT, UNRESERVED_KEYWORD)+ PG_KEYWORD("pg_exception_detail", K_PG_EXCEPTION_DETAIL, UNRESERVED_KEYWORD)+ PG_KEYWORD("pg_exception_hint", K_PG_EXCEPTION_HINT, UNRESERVED_KEYWORD)+ PG_KEYWORD("print_strict_params", K_PRINT_STRICT_PARAMS, UNRESERVED_KEYWORD)+ PG_KEYWORD("prior", K_PRIOR, UNRESERVED_KEYWORD)+ PG_KEYWORD("query", K_QUERY, UNRESERVED_KEYWORD)+ PG_KEYWORD("raise", K_RAISE, UNRESERVED_KEYWORD)+ PG_KEYWORD("relative", K_RELATIVE, UNRESERVED_KEYWORD)+ PG_KEYWORD("result_oid", K_RESULT_OID, UNRESERVED_KEYWORD)+ PG_KEYWORD("return", K_RETURN, UNRESERVED_KEYWORD)+ PG_KEYWORD("returned_sqlstate", K_RETURNED_SQLSTATE, UNRESERVED_KEYWORD)+ PG_KEYWORD("reverse", K_REVERSE, UNRESERVED_KEYWORD)+ PG_KEYWORD("row_count", K_ROW_COUNT, UNRESERVED_KEYWORD)+ PG_KEYWORD("rowtype", K_ROWTYPE, UNRESERVED_KEYWORD)+ PG_KEYWORD("schema", K_SCHEMA, UNRESERVED_KEYWORD)+ PG_KEYWORD("schema_name", K_SCHEMA_NAME, UNRESERVED_KEYWORD)+ PG_KEYWORD("scroll", K_SCROLL, UNRESERVED_KEYWORD)+ PG_KEYWORD("slice", K_SLICE, UNRESERVED_KEYWORD)+ PG_KEYWORD("sqlstate", K_SQLSTATE, UNRESERVED_KEYWORD)+ PG_KEYWORD("stacked", K_STACKED, UNRESERVED_KEYWORD)+ PG_KEYWORD("table", K_TABLE, UNRESERVED_KEYWORD)+ PG_KEYWORD("table_name", K_TABLE_NAME, UNRESERVED_KEYWORD)+ PG_KEYWORD("type", K_TYPE, UNRESERVED_KEYWORD)+ PG_KEYWORD("use_column", K_USE_COLUMN, UNRESERVED_KEYWORD)+ PG_KEYWORD("use_variable", K_USE_VARIABLE, UNRESERVED_KEYWORD)+ PG_KEYWORD("variable_conflict", K_VARIABLE_CONFLICT, UNRESERVED_KEYWORD)+ PG_KEYWORD("warning", K_WARNING, UNRESERVED_KEYWORD)+};++static const int num_unreserved_keywords = lengthof(unreserved_keywords);++/*+ * This macro must recognize all tokens that can immediately precede a+ * PL/pgSQL executable statement (that is, proc_sect or proc_stmt in the+ * grammar). Fortunately, there are not very many, so hard-coding in this+ * fashion seems sufficient.+ */+#define AT_STMT_START(prev_token) \+ ((prev_token) == ';' || \+ (prev_token) == K_BEGIN || \+ (prev_token) == K_THEN || \+ (prev_token) == K_ELSE || \+ (prev_token) == K_LOOP)+++/* Auxiliary data about a token (other than the token type) */+typedef struct+{+ YYSTYPE lval; /* semantic information */+ YYLTYPE lloc; /* offset in scanbuf */+ int leng; /* length in bytes */+} TokenAuxData;++/*+ * Scanner working state. At some point we might wish to fold all this+ * into a YY_EXTRA struct. For the moment, there is no need for plpgsql's+ * lexer to be re-entrant, and the notational burden of passing a yyscanner+ * pointer around is great enough to not want to do it without need.+ */++/* The stuff the core lexer needs */+static core_yyscan_t yyscanner = NULL;+static core_yy_extra_type core_yy;++/* The original input string */+static const char *scanorig;++/* Current token's length (corresponds to plpgsql_yylval and plpgsql_yylloc) */+static int plpgsql_yyleng;++/* Current token's code (corresponds to plpgsql_yylval and plpgsql_yylloc) */+static int plpgsql_yytoken;++/* Token pushback stack */+#define MAX_PUSHBACKS 4++static int num_pushbacks;+static int pushback_token[MAX_PUSHBACKS];+static TokenAuxData pushback_auxdata[MAX_PUSHBACKS];++/* State for plpgsql_location_to_lineno() */+static const char *cur_line_start;+static const char *cur_line_end;+static int cur_line_num;++/* Internal functions */+static int internal_yylex(TokenAuxData *auxdata);+static void push_back_token(int token, TokenAuxData *auxdata);+static void location_lineno_init(void);+++/*+ * This is the yylex routine called from the PL/pgSQL grammar.+ * It is a wrapper around the core lexer, with the ability to recognize+ * PL/pgSQL variables and return them as special T_DATUM tokens. If a+ * word or compound word does not match any variable name, or if matching+ * is turned off by plpgsql_IdentifierLookup, it is returned as+ * T_WORD or T_CWORD respectively, or as an unreserved keyword if it+ * matches one of those.+ */+int+plpgsql_yylex(void)+{+ int tok1;+ TokenAuxData aux1;+ const ScanKeyword *kw;++ tok1 = internal_yylex(&aux1);+ if (tok1 == IDENT || tok1 == PARAM)+ {+ int tok2;+ TokenAuxData aux2;++ tok2 = internal_yylex(&aux2);+ if (tok2 == '.')+ {+ int tok3;+ TokenAuxData aux3;++ tok3 = internal_yylex(&aux3);+ if (tok3 == IDENT)+ {+ int tok4;+ TokenAuxData aux4;++ tok4 = internal_yylex(&aux4);+ if (tok4 == '.')+ {+ int tok5;+ TokenAuxData aux5;++ tok5 = internal_yylex(&aux5);+ if (tok5 == IDENT)+ {+ if (plpgsql_parse_tripword(aux1.lval.str,+ aux3.lval.str,+ aux5.lval.str,+ &aux1.lval.wdatum,+ &aux1.lval.cword))+ tok1 = T_DATUM;+ else+ tok1 = T_CWORD;+ }+ else+ {+ /* not A.B.C, so just process A.B */+ push_back_token(tok5, &aux5);+ push_back_token(tok4, &aux4);+ if (plpgsql_parse_dblword(aux1.lval.str,+ aux3.lval.str,+ &aux1.lval.wdatum,+ &aux1.lval.cword))+ tok1 = T_DATUM;+ else+ tok1 = T_CWORD;+ }+ }+ else+ {+ /* not A.B.C, so just process A.B */+ push_back_token(tok4, &aux4);+ if (plpgsql_parse_dblword(aux1.lval.str,+ aux3.lval.str,+ &aux1.lval.wdatum,+ &aux1.lval.cword))+ tok1 = T_DATUM;+ else+ tok1 = T_CWORD;+ }+ }+ else+ {+ /* not A.B, so just process A */+ push_back_token(tok3, &aux3);+ push_back_token(tok2, &aux2);+ if (plpgsql_parse_word(aux1.lval.str,+ core_yy.scanbuf + aux1.lloc,+ &aux1.lval.wdatum,+ &aux1.lval.word))+ tok1 = T_DATUM;+ else if (!aux1.lval.word.quoted &&+ (kw = ScanKeywordLookup(aux1.lval.word.ident,+ unreserved_keywords,+ num_unreserved_keywords)))+ {+ aux1.lval.keyword = kw->name;+ tok1 = kw->value;+ }+ else+ tok1 = T_WORD;+ }+ }+ else+ {+ /* not A.B, so just process A */+ push_back_token(tok2, &aux2);++ /*+ * If we are at start of statement, prefer unreserved keywords+ * over variable names, unless the next token is assignment or+ * '[', in which case prefer variable names. (Note we need not+ * consider '.' as the next token; that case was handled above,+ * and we always prefer variable names in that case.) If we are+ * not at start of statement, always prefer variable names over+ * unreserved keywords.+ */+ if (AT_STMT_START(plpgsql_yytoken) &&+ !(tok2 == '=' || tok2 == COLON_EQUALS || tok2 == '['))+ {+ /* try for unreserved keyword, then for variable name */+ if (core_yy.scanbuf[aux1.lloc] != '"' &&+ (kw = ScanKeywordLookup(aux1.lval.str,+ unreserved_keywords,+ num_unreserved_keywords)))+ {+ aux1.lval.keyword = kw->name;+ tok1 = kw->value;+ }+ else if (plpgsql_parse_word(aux1.lval.str,+ core_yy.scanbuf + aux1.lloc,+ &aux1.lval.wdatum,+ &aux1.lval.word))+ tok1 = T_DATUM;+ else+ tok1 = T_WORD;+ }+ else+ {+ /* try for variable name, then for unreserved keyword */+ if (plpgsql_parse_word(aux1.lval.str,+ core_yy.scanbuf + aux1.lloc,+ &aux1.lval.wdatum,+ &aux1.lval.word))+ tok1 = T_DATUM;+ else if (!aux1.lval.word.quoted &&+ (kw = ScanKeywordLookup(aux1.lval.word.ident,+ unreserved_keywords,+ num_unreserved_keywords)))+ {+ aux1.lval.keyword = kw->name;+ tok1 = kw->value;+ }+ else+ tok1 = T_WORD;+ }+ }+ }+ else+ {+ /*+ * Not a potential plpgsql variable name, just return the data.+ *+ * Note that we also come through here if the grammar pushed back a+ * T_DATUM, T_CWORD, T_WORD, or unreserved-keyword token returned by a+ * previous lookup cycle; thus, pushbacks do not incur extra lookup+ * work, since we'll never do the above code twice for the same token.+ * This property also makes it safe to rely on the old value of+ * plpgsql_yytoken in the is-this-start-of-statement test above.+ */+ }++ plpgsql_yylval = aux1.lval;+ plpgsql_yylloc = aux1.lloc;+ plpgsql_yyleng = aux1.leng;+ plpgsql_yytoken = tok1;+ return tok1;+}++/*+ * Internal yylex function. This wraps the core lexer and adds one feature:+ * a token pushback stack. We also make a couple of trivial single-token+ * translations from what the core lexer does to what we want, in particular+ * interfacing from the core_YYSTYPE to YYSTYPE union.+ */+static int+internal_yylex(TokenAuxData *auxdata)+{+ int token;+ const char *yytext;++ if (num_pushbacks > 0)+ {+ num_pushbacks--;+ token = pushback_token[num_pushbacks];+ *auxdata = pushback_auxdata[num_pushbacks];+ }+ else+ {+ token = core_yylex(&auxdata->lval.core_yystype,+ &auxdata->lloc,+ yyscanner);++ /* remember the length of yytext before it gets changed */+ yytext = core_yy.scanbuf + auxdata->lloc;+ auxdata->leng = strlen(yytext);++ /* Check for << >> and #, which the core considers operators */+ if (token == Op)+ {+ if (strcmp(auxdata->lval.str, "<<") == 0)+ token = LESS_LESS;+ else if (strcmp(auxdata->lval.str, ">>") == 0)+ token = GREATER_GREATER;+ else if (strcmp(auxdata->lval.str, "#") == 0)+ token = '#';+ }++ /* The core returns PARAM as ival, but we treat it like IDENT */+ else if (token == PARAM)+ {+ auxdata->lval.str = pstrdup(yytext);+ }+ }++ return token;+}++/*+ * Push back a token to be re-read by next internal_yylex() call.+ */+static void+push_back_token(int token, TokenAuxData *auxdata)+{+ if (num_pushbacks >= MAX_PUSHBACKS)+ elog(ERROR, "too many tokens pushed back");+ pushback_token[num_pushbacks] = token;+ pushback_auxdata[num_pushbacks] = *auxdata;+ num_pushbacks++;+}++/*+ * Push back a single token to be re-read by next plpgsql_yylex() call.+ *+ * NOTE: this does not cause yylval or yylloc to "back up". Also, it+ * is not a good idea to push back a token code other than what you read.+ */+void+plpgsql_push_back_token(int token)+{+ TokenAuxData auxdata;++ auxdata.lval = plpgsql_yylval;+ auxdata.lloc = plpgsql_yylloc;+ auxdata.leng = plpgsql_yyleng;+ push_back_token(token, &auxdata);+}++/*+ * Tell whether a token is an unreserved keyword.+ *+ * (If it is, its lowercased form was returned as the token value, so we+ * do not need to offer that data here.)+ */+bool+plpgsql_token_is_unreserved_keyword(int token)+{+ int i;++ for (i = 0; i < num_unreserved_keywords; i++)+ {+ if (unreserved_keywords[i].value == token)+ return true;+ }+ return false;+}++/*+ * Append the function text starting at startlocation and extending to+ * (not including) endlocation onto the existing contents of "buf".+ */+void+plpgsql_append_source_text(StringInfo buf,+ int startlocation, int endlocation)+{+ Assert(startlocation <= endlocation);+ appendBinaryStringInfo(buf, scanorig + startlocation,+ endlocation - startlocation);+}++/*+ * Peek one token ahead in the input stream. Only the token code is+ * made available, not any of the auxiliary info such as location.+ *+ * NB: no variable or unreserved keyword lookup is performed here, they will+ * be returned as IDENT. Reserved keywords are resolved as usual.+ */+int+plpgsql_peek(void)+{+ int tok1;+ TokenAuxData aux1;++ tok1 = internal_yylex(&aux1);+ push_back_token(tok1, &aux1);+ return tok1;+}++/*+ * Peek two tokens ahead in the input stream. The first token and its+ * location in the query are returned in *tok1_p and *tok1_loc, second token+ * and its location in *tok2_p and *tok2_loc.+ *+ * NB: no variable or unreserved keyword lookup is performed here, they will+ * be returned as IDENT. Reserved keywords are resolved as usual.+ */+void+plpgsql_peek2(int *tok1_p, int *tok2_p, int *tok1_loc, int *tok2_loc)+{+ int tok1,+ tok2;+ TokenAuxData aux1,+ aux2;++ tok1 = internal_yylex(&aux1);+ tok2 = internal_yylex(&aux2);++ *tok1_p = tok1;+ if (tok1_loc)+ *tok1_loc = aux1.lloc;+ *tok2_p = tok2;+ if (tok2_loc)+ *tok2_loc = aux2.lloc;++ push_back_token(tok2, &aux2);+ push_back_token(tok1, &aux1);+}++/*+ * plpgsql_scanner_errposition+ * Report an error cursor position, if possible.+ *+ * This is expected to be used within an ereport() call. The return value+ * is a dummy (always 0, in fact).+ *+ * Note that this can only be used for messages emitted during initial+ * parsing of a plpgsql function, since it requires the scanorig string+ * to still be available.+ */+int+plpgsql_scanner_errposition(int location)+{+ int pos;++ if (location < 0 || scanorig == NULL)+ return 0; /* no-op if location is unknown */++ /* Convert byte offset to character number */+ pos = pg_mbstrlen_with_len(scanorig, location) + 1;+ /* And pass it to the ereport mechanism */+ (void) internalerrposition(pos);+ /* Also pass the function body string */+ return internalerrquery(scanorig);+}++/*+ * plpgsql_yyerror+ * Report a lexer or grammar error.+ *+ * The message's cursor position refers to the current token (the one+ * last returned by plpgsql_yylex()).+ * This is OK for syntax error messages from the Bison parser, because Bison+ * parsers report error as soon as the first unparsable token is reached.+ * Beware of using yyerror for other purposes, as the cursor position might+ * be misleading!+ */+void+plpgsql_yyerror(const char *message)+{+ char *yytext = core_yy.scanbuf + plpgsql_yylloc;++ if (*yytext == '\0')+ {+ ereport(ERROR,+ (errcode(ERRCODE_SYNTAX_ERROR),+ /* translator: %s is typically the translation of "syntax error" */+ errmsg("%s at end of input", _(message)),+ plpgsql_scanner_errposition(plpgsql_yylloc)));+ }+ else+ {+ /*+ * If we have done any lookahead then flex will have restored the+ * character after the end-of-token. Zap it again so that we report+ * only the single token here. This modifies scanbuf but we no longer+ * care about that.+ */+ yytext[plpgsql_yyleng] = '\0';++ ereport(ERROR,+ (errcode(ERRCODE_SYNTAX_ERROR),+ /* translator: first %s is typically the translation of "syntax error" */+ errmsg("%s at or near \"%s\"", _(message), yytext),+ plpgsql_scanner_errposition(plpgsql_yylloc)));+ }+}++/*+ * Given a location (a byte offset in the function source text),+ * return a line number.+ *+ * We expect that this is typically called for a sequence of increasing+ * location values, so optimize accordingly by tracking the endpoints+ * of the "current" line.+ */+int+plpgsql_location_to_lineno(int location)+{+ const char *loc;++ if (location < 0 || scanorig == NULL)+ return 0; /* garbage in, garbage out */+ loc = scanorig + location;++ /* be correct, but not fast, if input location goes backwards */+ if (loc < cur_line_start)+ location_lineno_init();++ while (cur_line_end != NULL && loc > cur_line_end)+ {+ cur_line_start = cur_line_end + 1;+ cur_line_num++;+ cur_line_end = strchr(cur_line_start, '\n');+ }++ return cur_line_num;+}++/* initialize or reset the state for plpgsql_location_to_lineno */+static void+location_lineno_init(void)+{+ cur_line_start = scanorig;+ cur_line_num = 1;++ cur_line_end = strchr(cur_line_start, '\n');+}++/* return the most recently computed lineno */+int+plpgsql_latest_lineno(void)+{+ return cur_line_num;+}+++/*+ * Called before any actual parsing is done+ *+ * Note: the passed "str" must remain valid until plpgsql_scanner_finish().+ * Although it is not fed directly to flex, we need the original string+ * to cite in error messages.+ */+void+plpgsql_scanner_init(const char *str)+{+ /* Start up the core scanner */+ yyscanner = scanner_init(str, &core_yy,+ reserved_keywords, num_reserved_keywords);++ /*+ * scanorig points to the original string, which unlike the scanner's+ * scanbuf won't be modified on-the-fly by flex. Notice that although+ * yytext points into scanbuf, we rely on being able to apply locations+ * (offsets from string start) to scanorig as well.+ */+ scanorig = str;++ /* Other setup */+ plpgsql_IdentifierLookup = IDENTIFIER_LOOKUP_NORMAL;+ plpgsql_yytoken = 0;++ num_pushbacks = 0;++ location_lineno_init();+}++/*+ * Called after parsing is done to clean up after plpgsql_scanner_init()+ */+void+plpgsql_scanner_finish(void)+{+ /* release storage */+ scanner_finish(yyscanner);+ /* avoid leaving any dangling pointers */+ yyscanner = NULL;+ scanorig = NULL;+}
+ foreign/libpg_query/src/postgres/src_port_qsort.c view
@@ -0,0 +1,240 @@+/*--------------------------------------------------------------------+ * Symbols referenced in this file:+ * - pg_qsort+ * - pg_qsort+ * - swapfunc+ * - med3+ *--------------------------------------------------------------------+ */++/*+ * qsort.c: standard quicksort algorithm+ *+ * Modifications from vanilla NetBSD source:+ * Add do ... while() macro fix+ * Remove __inline, _DIAGASSERTs, __P+ * Remove ill-considered "swap_cnt" switch to insertion sort,+ * in favor of a simple check for presorted input.+ * Take care to recurse on the smaller partition, to bound stack usage.+ *+ * CAUTION: if you change this file, see also qsort_arg.c, gen_qsort_tuple.pl+ *+ * src/port/qsort.c+ */++/* $NetBSD: qsort.c,v 1.13 2003/08/07 16:43:42 agc Exp $ */++/*-+ * Copyright (c) 1992, 1993+ * The Regents of the University of California. All rights reserved.+ *+ * Redistribution and use in source and binary forms, with or without+ * modification, are permitted provided that the following conditions+ * are met:+ * 1. Redistributions of source code must retain the above copyright+ * notice, this list of conditions and the following disclaimer.+ * 2. Redistributions in binary form must reproduce the above copyright+ * notice, this list of conditions and the following disclaimer in the+ * documentation and/or other materials provided with the distribution.+ * 3. Neither the name of the University nor the names of its contributors+ * may be used to endorse or promote products derived from this software+ * without specific prior written permission.+ *+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF+ * SUCH DAMAGE.+ */++#include "c.h"+++static char *med3(char *a, char *b, char *c,+ int (*cmp) (const void *, const void *));+static void swapfunc(char *, char *, size_t, int);++/*+ * Qsort routine based on J. L. Bentley and M. D. McIlroy,+ * "Engineering a sort function",+ * Software--Practice and Experience 23 (1993) 1249-1265.+ *+ * We have modified their original by adding a check for already-sorted input,+ * which seems to be a win per discussions on pgsql-hackers around 2006-03-21.+ *+ * Also, we recurse on the smaller partition and iterate on the larger one,+ * which ensures we cannot recurse more than log(N) levels (since the+ * partition recursed to is surely no more than half of the input). Bentley+ * and McIlroy explicitly rejected doing this on the grounds that it's "not+ * worth the effort", but we have seen crashes in the field due to stack+ * overrun, so that judgment seems wrong.+ */++#define swapcode(TYPE, parmi, parmj, n) \+do { \+ size_t i = (n) / sizeof (TYPE); \+ TYPE *pi = (TYPE *)(void *)(parmi); \+ TYPE *pj = (TYPE *)(void *)(parmj); \+ do { \+ TYPE t = *pi; \+ *pi++ = *pj; \+ *pj++ = t; \+ } while (--i > 0); \+} while (0)++#define SWAPINIT(a, es) swaptype = ((char *)(a) - (char *)0) % sizeof(long) || \+ (es) % sizeof(long) ? 2 : (es) == sizeof(long)? 0 : 1;++static void+swapfunc(char *a, char *b, size_t n, int swaptype)+{+ if (swaptype <= 1)+ swapcode(long, a, b, n);+ else+ swapcode(char, a, b, n);+}++#define swap(a, b) \+ if (swaptype == 0) { \+ long t = *(long *)(void *)(a); \+ *(long *)(void *)(a) = *(long *)(void *)(b); \+ *(long *)(void *)(b) = t; \+ } else \+ swapfunc(a, b, es, swaptype)++#define vecswap(a, b, n) if ((n) > 0) swapfunc(a, b, n, swaptype)++static char *+med3(char *a, char *b, char *c, int (*cmp) (const void *, const void *))+{+ return cmp(a, b) < 0 ?+ (cmp(b, c) < 0 ? b : (cmp(a, c) < 0 ? c : a))+ : (cmp(b, c) > 0 ? b : (cmp(a, c) < 0 ? a : c));+}++void+pg_qsort(void *a, size_t n, size_t es, int (*cmp) (const void *, const void *))+{+ char *pa,+ *pb,+ *pc,+ *pd,+ *pl,+ *pm,+ *pn;+ size_t d1,+ d2;+ int r,+ swaptype,+ presorted;++loop:SWAPINIT(a, es);+ if (n < 7)+ {+ for (pm = (char *) a + es; pm < (char *) a + n * es; pm += es)+ for (pl = pm; pl > (char *) a && cmp(pl - es, pl) > 0;+ pl -= es)+ swap(pl, pl - es);+ return;+ }+ presorted = 1;+ for (pm = (char *) a + es; pm < (char *) a + n * es; pm += es)+ {+ if (cmp(pm - es, pm) > 0)+ {+ presorted = 0;+ break;+ }+ }+ if (presorted)+ return;+ pm = (char *) a + (n / 2) * es;+ if (n > 7)+ {+ pl = (char *) a;+ pn = (char *) a + (n - 1) * es;+ if (n > 40)+ {+ size_t d = (n / 8) * es;++ pl = med3(pl, pl + d, pl + 2 * d, cmp);+ pm = med3(pm - d, pm, pm + d, cmp);+ pn = med3(pn - 2 * d, pn - d, pn, cmp);+ }+ pm = med3(pl, pm, pn, cmp);+ }+ swap(a, pm);+ pa = pb = (char *) a + es;+ pc = pd = (char *) a + (n - 1) * es;+ for (;;)+ {+ while (pb <= pc && (r = cmp(pb, a)) <= 0)+ {+ if (r == 0)+ {+ swap(pa, pb);+ pa += es;+ }+ pb += es;+ }+ while (pb <= pc && (r = cmp(pc, a)) >= 0)+ {+ if (r == 0)+ {+ swap(pc, pd);+ pd -= es;+ }+ pc -= es;+ }+ if (pb > pc)+ break;+ swap(pb, pc);+ pb += es;+ pc -= es;+ }+ pn = (char *) a + n * es;+ d1 = Min(pa - (char *) a, pb - pa);+ vecswap(a, pb - d1, d1);+ d1 = Min(pd - pc, pn - pd - es);+ vecswap(pb, pn - d1, d1);+ d1 = pb - pa;+ d2 = pd - pc;+ if (d1 <= d2)+ {+ /* Recurse on left partition, then iterate on right partition */+ if (d1 > es)+ pg_qsort(a, d1 / es, es, cmp);+ if (d2 > es)+ {+ /* Iterate rather than recurse to save stack space */+ /* pg_qsort(pn - d2, d2 / es, es, cmp); */+ a = pn - d2;+ n = d2 / es;+ goto loop;+ }+ }+ else+ {+ /* Recurse on right partition, then iterate on left partition */+ if (d2 > es)+ pg_qsort(pn - d2, d2 / es, es, cmp);+ if (d1 > es)+ {+ /* Iterate rather than recurse to save stack space */+ /* pg_qsort(a, d1 / es, es, cmp); */+ n = d1 / es;+ goto loop;+ }+ }+}++/*+ * qsort comparator wrapper for strcmp.+ */+
+ library/PostgreSQL/Syntax.hs view
@@ -0,0 +1,30 @@+module PostgreSQL.Syntax+where++import PostgreSQL.Syntax.Prelude+import qualified PostgreSQL.Syntax.Foreign as A+import qualified PostgreSQL.Syntax.Pointers as B+import qualified Data.ByteString.Unsafe as C+import qualified Data.ByteString.Internal as D+import qualified Data.Text.Encoding as E+++-- |+-- Find an error in the SQL string.+-- +-- The string is allowed to contain placeholders.+validate :: ByteString -> Maybe Text +validate sql =+ unsafeDupablePerformIO $ do+ statusRef <- newIORef 1+ messageBytes <- + C.unsafeUseAsCString sql $ \sqlPtr -> D.createAndTrim 1000 $ \messagePtr -> do+ status <- A.validate sqlPtr (castPtr messagePtr)+ writeIORef statusRef status+ case status of+ 0 -> return 0+ 1 -> fmap fromIntegral (D.c_strlen (castPtr messagePtr))+ status <- readIORef statusRef+ case status of+ 0 -> return Nothing+ 1 -> return (Just (E.decodeUtf8 messageBytes))
+ library/PostgreSQL/Syntax/Foreign.hs view
@@ -0,0 +1,9 @@+module PostgreSQL.Syntax.Foreign+where+++import PostgreSQL.Syntax.Prelude+++foreign import ccall unsafe "validate"+ validate :: Ptr CChar -> Ptr CChar -> IO CInt
+ library/PostgreSQL/Syntax/Pointers.hs view
@@ -0,0 +1,22 @@+module PostgreSQL.Syntax.Pointers+where++import PostgreSQL.Syntax.Prelude+import qualified Data.ByteString.Short as B+import qualified Data.ByteString.Short.Internal as A+import qualified Data.ByteString.Unsafe as C+import qualified Data.ByteString.Internal as D+++{-# INLINE withModifyingPtrOfBytes #-}+withModifyingPtrOfBytes :: ByteString -> (Ptr Word8 -> IO a) -> IO a+withModifyingPtrOfBytes bytes ptrAction =+ C.unsafeUseAsCString bytes (ptrAction . (castPtr :: Ptr CChar -> Ptr Word8))++{-# INLINE createBytesAndMap #-}+createBytesAndMap :: Int -> (Ptr Word8 -> IO (ByteString -> a)) -> IO a+createBytesAndMap l f =+ do+ fp <- D.mallocByteString l+ postprocess <- withForeignPtr fp $ \p -> f p+ return $! postprocess $! D.PS fp 0 l
+ library/PostgreSQL/Syntax/Prelude.hs view
@@ -0,0 +1,26 @@+module PostgreSQL.Syntax.Prelude+( + module Exports,+)+where+++-- base-prelude+-------------------------+import BasePrelude as Exports++-- base+-------------------------+import Foreign.C as Exports+import Foreign.Ptr as Exports+import Foreign.ForeignPtr as Exports+import Foreign.Marshal.Alloc as Exports+import Foreign.Storable as Exports++-- bytestring+-------------------------+import Data.ByteString as Exports (ByteString)++-- text+-------------------------+import Data.Text as Exports (Text)
+ postgresql-syntax.cabal view
@@ -0,0 +1,128 @@+name:+ postgresql-syntax+version:+ 0.1+category:+ Database, PostgreSQL+synopsis:+ PostgreSQL SQL syntax utilities+description:+ Currently this library only provides an SQL syntax validator.+ .+ This library wraps the \"libpq_query\" C library,+ which is an SQL parser based on the source code of the Postgres server.+ IOW, it uses the same parser as Postgres itself+ and hence supports all of its syntax.+ .+ So far this package has only been tested to work on the *nix systems (Mac OS including).+homepage:+ https://github.com/nikita-volkov/postgresql-syntax+bug-reports:+ https://github.com/nikita-volkov/postgresql-syntax/issues+author:+ Nikita Volkov <nikita.y.volkov@mail.ru>+maintainer:+ Nikita Volkov <nikita.y.volkov@mail.ru>+copyright:+ (c) 2017, Nikita Volkov+license:+ MIT+license-file:+ LICENSE+build-type:+ Custom+extra-source-files:+ foreign/ffi/*.c+ foreign/libpg_query/LICENSE+ foreign/libpg_query/Makefile+ foreign/libpg_query/src/*.c+ foreign/libpg_query/src/postgres/*.c+ foreign/libpg_query/*.h+ foreign/libpg_query/src/*.h+ foreign/libpg_query/src/postgres/include/*.h+ foreign/libpg_query/src/postgres/include/access/*.h+ foreign/libpg_query/src/postgres/include/bootstrap/*.h+ foreign/libpg_query/src/postgres/include/catalog/*.h+ foreign/libpg_query/src/postgres/include/commands/*.h+ foreign/libpg_query/src/postgres/include/common/*.h+ foreign/libpg_query/src/postgres/include/datatype/*.h+ foreign/libpg_query/src/postgres/include/executor/*.h+ foreign/libpg_query/src/postgres/include/lib/*.h+ foreign/libpg_query/src/postgres/include/libpq/*.h+ foreign/libpg_query/src/postgres/include/mb/*.h+ foreign/libpg_query/src/postgres/include/nodes/*.h+ foreign/libpg_query/src/postgres/include/optimizer/*.h+ foreign/libpg_query/src/postgres/include/parser/*.h+ foreign/libpg_query/src/postgres/include/port/atomics/*.h+ foreign/libpg_query/src/postgres/include/port/*.h+ foreign/libpg_query/src/postgres/include/port/*.h+ foreign/libpg_query/src/postgres/include/portability/*.h+ foreign/libpg_query/src/postgres/include/postmaster/*.h+ foreign/libpg_query/src/postgres/include/regex/*.h+ foreign/libpg_query/src/postgres/include/replication/*.h+ foreign/libpg_query/src/postgres/include/rewrite/*.h+ foreign/libpg_query/src/postgres/include/storage/*.h+ foreign/libpg_query/src/postgres/include/tcop/*.h+ foreign/libpg_query/src/postgres/include/tsearch/*.h+ foreign/libpg_query/src/postgres/include/utils/*.h+cabal-version:+ >=1.10++source-repository head+ type:+ git+ location:+ git://github.com/nikita-volkov/postgresql-syntax.git++library+ hs-source-dirs:+ library+ exposed-modules:+ PostgreSQL.Syntax+ other-modules:+ PostgreSQL.Syntax.Pointers+ PostgreSQL.Syntax.Foreign+ PostgreSQL.Syntax.Prelude+ c-sources:+ foreign/ffi/validation.c+ include-dirs:+ foreign/libpg_query+ includes:+ pg_query.h+ extra-libraries:+ pg_query+ default-extensions:+ Arrows, BangPatterns, ConstraintKinds, DataKinds, DefaultSignatures, DeriveDataTypeable, DeriveFoldable, DeriveFunctor, DeriveGeneric, DeriveTraversable, EmptyDataDecls, FlexibleContexts, FlexibleInstances, FunctionalDependencies, GADTs, GeneralizedNewtypeDeriving, LambdaCase, LiberalTypeSynonyms, MagicHash, MultiParamTypeClasses, MultiWayIf, NoImplicitPrelude, NoMonomorphismRestriction, OverloadedStrings, PatternGuards, ParallelListComp, QuasiQuotes, RankNTypes, RecordWildCards, ScopedTypeVariables, StandaloneDeriving, TemplateHaskell, TupleSections, TypeFamilies, TypeOperators, UnboxedTuples+ default-language:+ Haskell2010+ build-depends:+ -- + text >= 1 && < 2,+ bytestring >= 0.10.8 && < 0.11,+ --+ base-prelude < 2,+ base < 5++test-suite demo+ type:+ exitcode-stdio-1.0+ hs-source-dirs:+ demo+ main-is:+ Main.hs+ ghc-options:+ -O2+ -threaded+ "-with-rtsopts=-N"+ ghc-prof-options:+ -O2+ -threaded+ -fprof-auto+ "-with-rtsopts=-N -p -s -h -i0.1"+ default-extensions:+ Arrows, BangPatterns, ConstraintKinds, DataKinds, DefaultSignatures, DeriveDataTypeable, DeriveFoldable, DeriveFunctor, DeriveGeneric, DeriveTraversable, EmptyDataDecls, FlexibleContexts, FlexibleInstances, FunctionalDependencies, GADTs, GeneralizedNewtypeDeriving, LambdaCase, LiberalTypeSynonyms, MagicHash, MultiParamTypeClasses, MultiWayIf, NoImplicitPrelude, NoMonomorphismRestriction, OverloadedStrings, PatternGuards, ParallelListComp, QuasiQuotes, RankNTypes, RecordWildCards, ScopedTypeVariables, StandaloneDeriving, TemplateHaskell, TupleSections, TypeFamilies, TypeOperators, UnboxedTuples+ default-language:+ Haskell2010+ build-depends:+ postgresql-syntax,+ rerebase == 1.*