Merge ~sergiodj/ubuntu/+source/postgresql-12:update-12.11-focal into ubuntu/+source/postgresql-12:ubuntu/focal-devel

Proposed by Sergio Durigan Junior
Status: Merged
Merge reported by: Sergio Durigan Junior
Merged at revision: dd69953e514c2da5193273687fbd5fc42aecc993
Proposed branch: ~sergiodj/ubuntu/+source/postgresql-12:update-12.11-focal
Merge into: ubuntu/+source/postgresql-12:ubuntu/focal-devel
Diff against target: 160475 lines (+45219/-40531)
1638 files modified
.gitrevision (+1/-1)
INSTALL (+10/-19)
config/c-compiler.m4 (+22/-0)
configure (+64/-21)
configure.in (+8/-2)
contrib/amcheck/expected/check_btree.out (+23/-0)
contrib/amcheck/sql/check_btree.sql (+21/-0)
contrib/amcheck/t/002_cic.pl (+2/-1)
contrib/amcheck/t/003_cic_2pc.pl (+10/-7)
contrib/amcheck/verify_nbtree.c (+27/-0)
contrib/bloom/t/001_wal.pl (+12/-1)
contrib/cube/cubeparse.c (+362/-490)
contrib/pageinspect/brinfuncs.c (+53/-23)
contrib/pageinspect/btreefuncs.c (+33/-15)
contrib/pageinspect/expected/brin.out (+39/-0)
contrib/pageinspect/expected/btree.out (+37/-2)
contrib/pageinspect/expected/gin.out (+33/-0)
contrib/pageinspect/expected/hash.out (+39/-0)
contrib/pageinspect/expected/page.out (+31/-0)
contrib/pageinspect/fsmfuncs.c (+7/-1)
contrib/pageinspect/ginfuncs.c (+31/-3)
contrib/pageinspect/hashfuncs.c (+11/-6)
contrib/pageinspect/rawpage.c (+5/-25)
contrib/pageinspect/sql/brin.sql (+19/-0)
contrib/pageinspect/sql/btree.sql (+29/-2)
contrib/pageinspect/sql/gin.sql (+20/-0)
contrib/pageinspect/sql/hash.sql (+26/-0)
contrib/pageinspect/sql/page.sql (+15/-0)
contrib/pgcrypto/px.c (+1/-1)
contrib/postgres_fdw/deparse.c (+119/-47)
contrib/postgres_fdw/expected/postgres_fdw.out (+23/-0)
contrib/postgres_fdw/postgres_fdw.c (+63/-45)
contrib/postgres_fdw/postgres_fdw.h (+9/-4)
contrib/postgres_fdw/sql/postgres_fdw.sql (+8/-0)
contrib/seg/segparse.c (+359/-490)
contrib/test_decoding/expected/toast.out (+1/-1)
debian/changelog (+29/-0)
doc/src/sgml/event-trigger.sgml (+16/-0)
doc/src/sgml/html/acronyms.html (+3/-3)
doc/src/sgml/html/admin.html (+2/-2)
doc/src/sgml/html/adminpack.html (+2/-2)
doc/src/sgml/html/amcheck.html (+2/-2)
doc/src/sgml/html/app-clusterdb.html (+2/-2)
doc/src/sgml/html/app-createdb.html (+2/-2)
doc/src/sgml/html/app-createuser.html (+2/-2)
doc/src/sgml/html/app-dropdb.html (+2/-2)
doc/src/sgml/html/app-dropuser.html (+2/-2)
doc/src/sgml/html/app-ecpg.html (+2/-2)
doc/src/sgml/html/app-initdb.html (+2/-2)
doc/src/sgml/html/app-pg-ctl.html (+2/-2)
doc/src/sgml/html/app-pg-dumpall.html (+2/-2)
doc/src/sgml/html/app-pg-isready.html (+2/-2)
doc/src/sgml/html/app-pgbasebackup.html (+2/-2)
doc/src/sgml/html/app-pgchecksums.html (+2/-2)
doc/src/sgml/html/app-pgconfig.html (+2/-2)
doc/src/sgml/html/app-pgcontroldata.html (+2/-2)
doc/src/sgml/html/app-pgdump.html (+2/-2)
doc/src/sgml/html/app-pgreceivewal.html (+2/-2)
doc/src/sgml/html/app-pgreceivexlog.html (+3/-3)
doc/src/sgml/html/app-pgrecvlogical.html (+2/-2)
doc/src/sgml/html/app-pgresetwal.html (+2/-2)
doc/src/sgml/html/app-pgresetxlog.html (+3/-3)
doc/src/sgml/html/app-pgrestore.html (+2/-2)
doc/src/sgml/html/app-pgrewind.html (+4/-4)
doc/src/sgml/html/app-postgres.html (+2/-2)
doc/src/sgml/html/app-postmaster.html (+2/-2)
doc/src/sgml/html/app-psql.html (+3/-3)
doc/src/sgml/html/app-reindexdb.html (+2/-2)
doc/src/sgml/html/app-vacuumdb.html (+2/-2)
doc/src/sgml/html/appendix-obsolete.html (+2/-2)
doc/src/sgml/html/appendixes.html (+1/-1)
doc/src/sgml/html/applevel-consistency.html (+2/-2)
doc/src/sgml/html/arrays.html (+2/-2)
doc/src/sgml/html/auth-bsd.html (+2/-2)
doc/src/sgml/html/auth-cert.html (+2/-2)
doc/src/sgml/html/auth-delay.html (+2/-2)
doc/src/sgml/html/auth-ident.html (+2/-2)
doc/src/sgml/html/auth-ldap.html (+2/-2)
doc/src/sgml/html/auth-methods.html (+2/-2)
doc/src/sgml/html/auth-pam.html (+2/-2)
doc/src/sgml/html/auth-password.html (+2/-2)
doc/src/sgml/html/auth-peer.html (+2/-2)
doc/src/sgml/html/auth-pg-hba-conf.html (+2/-2)
doc/src/sgml/html/auth-radius.html (+2/-2)
doc/src/sgml/html/auth-trust.html (+2/-2)
doc/src/sgml/html/auth-username-maps.html (+2/-2)
doc/src/sgml/html/auto-explain.html (+2/-2)
doc/src/sgml/html/backup-dump.html (+2/-2)
doc/src/sgml/html/backup-file.html (+2/-2)
doc/src/sgml/html/backup.html (+2/-2)
doc/src/sgml/html/bgworker.html (+2/-2)
doc/src/sgml/html/biblio.html (+2/-2)
doc/src/sgml/html/bki-commands.html (+2/-2)
doc/src/sgml/html/bki-example.html (+2/-2)
doc/src/sgml/html/bki-format.html (+2/-2)
doc/src/sgml/html/bki-structure.html (+2/-2)
doc/src/sgml/html/bki.html (+2/-2)
doc/src/sgml/html/bloom.html (+2/-2)
doc/src/sgml/html/bookindex.html (+11/-11)
doc/src/sgml/html/brin-builtin-opclasses.html (+2/-2)
doc/src/sgml/html/brin-extensibility.html (+2/-2)
doc/src/sgml/html/brin-intro.html (+2/-2)
doc/src/sgml/html/brin.html (+1/-1)
doc/src/sgml/html/btree-behavior.html (+2/-2)
doc/src/sgml/html/btree-gin.html (+2/-2)
doc/src/sgml/html/btree-gist.html (+2/-2)
doc/src/sgml/html/btree-implementation.html (+2/-2)
doc/src/sgml/html/btree-intro.html (+2/-2)
doc/src/sgml/html/btree-support-funcs.html (+2/-2)
doc/src/sgml/html/btree.html (+1/-1)
doc/src/sgml/html/bug-reporting.html (+3/-3)
doc/src/sgml/html/catalog-pg-aggregate.html (+2/-2)
doc/src/sgml/html/catalog-pg-am.html (+2/-2)
doc/src/sgml/html/catalog-pg-amop.html (+2/-2)
doc/src/sgml/html/catalog-pg-amproc.html (+2/-2)
doc/src/sgml/html/catalog-pg-attrdef.html (+2/-2)
doc/src/sgml/html/catalog-pg-attribute.html (+2/-2)
doc/src/sgml/html/catalog-pg-auth-members.html (+2/-2)
doc/src/sgml/html/catalog-pg-authid.html (+2/-2)
doc/src/sgml/html/catalog-pg-cast.html (+2/-2)
doc/src/sgml/html/catalog-pg-class.html (+2/-2)
doc/src/sgml/html/catalog-pg-collation.html (+2/-2)
doc/src/sgml/html/catalog-pg-constraint.html (+2/-2)
doc/src/sgml/html/catalog-pg-conversion.html (+2/-2)
doc/src/sgml/html/catalog-pg-database.html (+2/-2)
doc/src/sgml/html/catalog-pg-db-role-setting.html (+2/-2)
doc/src/sgml/html/catalog-pg-default-acl.html (+2/-2)
doc/src/sgml/html/catalog-pg-depend.html (+2/-2)
doc/src/sgml/html/catalog-pg-description.html (+2/-2)
doc/src/sgml/html/catalog-pg-enum.html (+2/-2)
doc/src/sgml/html/catalog-pg-event-trigger.html (+2/-2)
doc/src/sgml/html/catalog-pg-extension.html (+2/-2)
doc/src/sgml/html/catalog-pg-foreign-data-wrapper.html (+2/-2)
doc/src/sgml/html/catalog-pg-foreign-server.html (+2/-2)
doc/src/sgml/html/catalog-pg-foreign-table.html (+2/-2)
doc/src/sgml/html/catalog-pg-index.html (+2/-2)
doc/src/sgml/html/catalog-pg-inherits.html (+2/-2)
doc/src/sgml/html/catalog-pg-init-privs.html (+2/-2)
doc/src/sgml/html/catalog-pg-language.html (+2/-2)
doc/src/sgml/html/catalog-pg-largeobject-metadata.html (+2/-2)
doc/src/sgml/html/catalog-pg-largeobject.html (+2/-2)
doc/src/sgml/html/catalog-pg-namespace.html (+2/-2)
doc/src/sgml/html/catalog-pg-opclass.html (+2/-2)
doc/src/sgml/html/catalog-pg-operator.html (+2/-2)
doc/src/sgml/html/catalog-pg-opfamily.html (+2/-2)
doc/src/sgml/html/catalog-pg-partitioned-table.html (+2/-2)
doc/src/sgml/html/catalog-pg-pltemplate.html (+2/-2)
doc/src/sgml/html/catalog-pg-policy.html (+2/-2)
doc/src/sgml/html/catalog-pg-proc.html (+2/-2)
doc/src/sgml/html/catalog-pg-publication-rel.html (+2/-2)
doc/src/sgml/html/catalog-pg-publication.html (+2/-2)
doc/src/sgml/html/catalog-pg-range.html (+2/-2)
doc/src/sgml/html/catalog-pg-replication-origin.html (+2/-2)
doc/src/sgml/html/catalog-pg-rewrite.html (+2/-2)
doc/src/sgml/html/catalog-pg-seclabel.html (+2/-2)
doc/src/sgml/html/catalog-pg-sequence.html (+2/-2)
doc/src/sgml/html/catalog-pg-shdepend.html (+2/-2)
doc/src/sgml/html/catalog-pg-shdescription.html (+2/-2)
doc/src/sgml/html/catalog-pg-shseclabel.html (+2/-2)
doc/src/sgml/html/catalog-pg-statistic-ext-data.html (+2/-2)
doc/src/sgml/html/catalog-pg-statistic-ext.html (+2/-2)
doc/src/sgml/html/catalog-pg-statistic.html (+2/-2)
doc/src/sgml/html/catalog-pg-subscription-rel.html (+2/-2)
doc/src/sgml/html/catalog-pg-subscription.html (+2/-2)
doc/src/sgml/html/catalog-pg-tablespace.html (+2/-2)
doc/src/sgml/html/catalog-pg-transform.html (+2/-2)
doc/src/sgml/html/catalog-pg-trigger.html (+2/-2)
doc/src/sgml/html/catalog-pg-ts-config-map.html (+2/-2)
doc/src/sgml/html/catalog-pg-ts-config.html (+2/-2)
doc/src/sgml/html/catalog-pg-ts-dict.html (+2/-2)
doc/src/sgml/html/catalog-pg-ts-parser.html (+2/-2)
doc/src/sgml/html/catalog-pg-ts-template.html (+2/-2)
doc/src/sgml/html/catalog-pg-type.html (+2/-2)
doc/src/sgml/html/catalog-pg-user-mapping.html (+2/-2)
doc/src/sgml/html/catalogs-overview.html (+2/-2)
doc/src/sgml/html/catalogs.html (+2/-2)
doc/src/sgml/html/charset.html (+2/-2)
doc/src/sgml/html/citext.html (+2/-2)
doc/src/sgml/html/client-authentication-problems.html (+2/-2)
doc/src/sgml/html/client-authentication.html (+2/-2)
doc/src/sgml/html/client-interfaces.html (+2/-2)
doc/src/sgml/html/collation.html (+2/-2)
doc/src/sgml/html/config-setting.html (+2/-2)
doc/src/sgml/html/connect-estab.html (+2/-2)
doc/src/sgml/html/continuous-archiving.html (+2/-2)
doc/src/sgml/html/contrib-dblink-build-sql-delete.html (+2/-2)
doc/src/sgml/html/contrib-dblink-build-sql-insert.html (+2/-2)
doc/src/sgml/html/contrib-dblink-build-sql-update.html (+2/-2)
doc/src/sgml/html/contrib-dblink-cancel-query.html (+2/-2)
doc/src/sgml/html/contrib-dblink-close.html (+2/-2)
doc/src/sgml/html/contrib-dblink-connect-u.html (+2/-2)
doc/src/sgml/html/contrib-dblink-connect.html (+2/-2)
doc/src/sgml/html/contrib-dblink-disconnect.html (+2/-2)
doc/src/sgml/html/contrib-dblink-error-message.html (+2/-2)
doc/src/sgml/html/contrib-dblink-exec.html (+2/-2)
doc/src/sgml/html/contrib-dblink-fetch.html (+2/-2)
doc/src/sgml/html/contrib-dblink-function.html (+2/-2)
doc/src/sgml/html/contrib-dblink-get-connections.html (+2/-2)
doc/src/sgml/html/contrib-dblink-get-notify.html (+2/-2)
doc/src/sgml/html/contrib-dblink-get-pkey.html (+2/-2)
doc/src/sgml/html/contrib-dblink-get-result.html (+2/-2)
doc/src/sgml/html/contrib-dblink-is-busy.html (+2/-2)
doc/src/sgml/html/contrib-dblink-open.html (+2/-2)
doc/src/sgml/html/contrib-dblink-send-query.html (+2/-2)
doc/src/sgml/html/contrib-prog-client.html (+2/-2)
doc/src/sgml/html/contrib-prog-server.html (+2/-2)
doc/src/sgml/html/contrib-prog.html (+2/-2)
doc/src/sgml/html/contrib-spi.html (+2/-2)
doc/src/sgml/html/contrib.html (+2/-2)
doc/src/sgml/html/creating-cluster.html (+2/-2)
doc/src/sgml/html/cube.html (+2/-2)
doc/src/sgml/html/custom-scan-execution.html (+2/-2)
doc/src/sgml/html/custom-scan-path.html (+2/-2)
doc/src/sgml/html/custom-scan-plan.html (+2/-2)
doc/src/sgml/html/custom-scan.html (+2/-2)
doc/src/sgml/html/database-roles.html (+2/-2)
doc/src/sgml/html/datatype-binary.html (+2/-2)
doc/src/sgml/html/datatype-bit.html (+2/-2)
doc/src/sgml/html/datatype-boolean.html (+2/-2)
doc/src/sgml/html/datatype-character.html (+2/-2)
doc/src/sgml/html/datatype-datetime.html (+2/-2)
doc/src/sgml/html/datatype-enum.html (+2/-2)
doc/src/sgml/html/datatype-geometric.html (+2/-2)
doc/src/sgml/html/datatype-json.html (+2/-2)
doc/src/sgml/html/datatype-money.html (+2/-2)
doc/src/sgml/html/datatype-net-types.html (+2/-2)
doc/src/sgml/html/datatype-numeric.html (+2/-2)
doc/src/sgml/html/datatype-oid.html (+2/-2)
doc/src/sgml/html/datatype-pg-lsn.html (+2/-2)
doc/src/sgml/html/datatype-pseudo.html (+2/-2)
doc/src/sgml/html/datatype-textsearch.html (+2/-2)
doc/src/sgml/html/datatype-uuid.html (+2/-2)
doc/src/sgml/html/datatype-xml.html (+2/-2)
doc/src/sgml/html/datatype.html (+2/-2)
doc/src/sgml/html/datetime-appendix.html (+2/-2)
doc/src/sgml/html/datetime-config-files.html (+2/-2)
doc/src/sgml/html/datetime-input-rules.html (+2/-2)
doc/src/sgml/html/datetime-invalid-input.html (+2/-2)
doc/src/sgml/html/datetime-julian-dates.html (+2/-2)
doc/src/sgml/html/datetime-keywords.html (+2/-2)
doc/src/sgml/html/datetime-posix-timezone-specs.html (+2/-2)
doc/src/sgml/html/datetime-units-history.html (+2/-2)
doc/src/sgml/html/dblink.html (+2/-2)
doc/src/sgml/html/ddl-alter.html (+2/-2)
doc/src/sgml/html/ddl-basics.html (+2/-2)
doc/src/sgml/html/ddl-constraints.html (+2/-2)
doc/src/sgml/html/ddl-default.html (+2/-2)
doc/src/sgml/html/ddl-depend.html (+2/-2)
doc/src/sgml/html/ddl-foreign-data.html (+2/-2)
doc/src/sgml/html/ddl-generated-columns.html (+2/-2)
doc/src/sgml/html/ddl-inherit.html (+2/-2)
doc/src/sgml/html/ddl-others.html (+2/-2)
doc/src/sgml/html/ddl-partitioning.html (+2/-2)
doc/src/sgml/html/ddl-priv.html (+2/-2)
doc/src/sgml/html/ddl-rowsecurity.html (+2/-2)
doc/src/sgml/html/ddl-schemas.html (+2/-2)
doc/src/sgml/html/ddl-system-columns.html (+2/-2)
doc/src/sgml/html/ddl.html (+2/-2)
doc/src/sgml/html/default-roles.html (+2/-2)
doc/src/sgml/html/dict-int.html (+2/-2)
doc/src/sgml/html/dict-xsyn.html (+2/-2)
doc/src/sgml/html/different-replication-solutions.html (+2/-2)
doc/src/sgml/html/disk-full.html (+2/-2)
doc/src/sgml/html/disk-usage.html (+2/-2)
doc/src/sgml/html/diskusage.html (+2/-2)
doc/src/sgml/html/dml-delete.html (+2/-2)
doc/src/sgml/html/dml-insert.html (+2/-2)
doc/src/sgml/html/dml-returning.html (+2/-2)
doc/src/sgml/html/dml-update.html (+2/-2)
doc/src/sgml/html/dml.html (+2/-2)
doc/src/sgml/html/docguide-authoring.html (+2/-2)
doc/src/sgml/html/docguide-build.html (+2/-2)
doc/src/sgml/html/docguide-docbook.html (+2/-2)
doc/src/sgml/html/docguide-style.html (+2/-2)
doc/src/sgml/html/docguide-toolsets.html (+2/-2)
doc/src/sgml/html/docguide.html (+2/-2)
doc/src/sgml/html/domains.html (+2/-2)
doc/src/sgml/html/dynamic-trace.html (+2/-2)
doc/src/sgml/html/earthdistance.html (+2/-2)
doc/src/sgml/html/ecpg-commands.html (+2/-2)
doc/src/sgml/html/ecpg-concept.html (+2/-2)
doc/src/sgml/html/ecpg-connect.html (+2/-2)
doc/src/sgml/html/ecpg-cpp.html (+2/-2)
doc/src/sgml/html/ecpg-descriptors.html (+2/-2)
doc/src/sgml/html/ecpg-develop.html (+2/-2)
doc/src/sgml/html/ecpg-dynamic.html (+2/-2)
doc/src/sgml/html/ecpg-errors.html (+2/-2)
doc/src/sgml/html/ecpg-informix-compat.html (+2/-2)
doc/src/sgml/html/ecpg-library.html (+2/-2)
doc/src/sgml/html/ecpg-lo.html (+2/-2)
doc/src/sgml/html/ecpg-pgtypes.html (+2/-2)
doc/src/sgml/html/ecpg-preproc.html (+2/-2)
doc/src/sgml/html/ecpg-process.html (+2/-2)
doc/src/sgml/html/ecpg-sql-allocate-descriptor.html (+2/-2)
doc/src/sgml/html/ecpg-sql-commands.html (+2/-2)
doc/src/sgml/html/ecpg-sql-connect.html (+2/-2)
doc/src/sgml/html/ecpg-sql-deallocate-descriptor.html (+2/-2)
doc/src/sgml/html/ecpg-sql-declare.html (+2/-2)
doc/src/sgml/html/ecpg-sql-describe.html (+2/-2)
doc/src/sgml/html/ecpg-sql-disconnect.html (+2/-2)
doc/src/sgml/html/ecpg-sql-execute-immediate.html (+2/-2)
doc/src/sgml/html/ecpg-sql-get-descriptor.html (+2/-2)
doc/src/sgml/html/ecpg-sql-open.html (+2/-2)
doc/src/sgml/html/ecpg-sql-prepare.html (+2/-2)
doc/src/sgml/html/ecpg-sql-set-autocommit.html (+2/-2)
doc/src/sgml/html/ecpg-sql-set-connection.html (+2/-2)
doc/src/sgml/html/ecpg-sql-set-descriptor.html (+2/-2)
doc/src/sgml/html/ecpg-sql-type.html (+2/-2)
doc/src/sgml/html/ecpg-sql-var.html (+2/-2)
doc/src/sgml/html/ecpg-sql-whenever.html (+2/-2)
doc/src/sgml/html/ecpg-variables.html (+2/-2)
doc/src/sgml/html/ecpg.html (+2/-2)
doc/src/sgml/html/encryption-options.html (+2/-2)
doc/src/sgml/html/errcodes-appendix.html (+3/-3)
doc/src/sgml/html/error-message-reporting.html (+2/-2)
doc/src/sgml/html/error-style-guide.html (+2/-2)
doc/src/sgml/html/event-log-registration.html (+2/-2)
doc/src/sgml/html/event-trigger-definition.html (+2/-2)
doc/src/sgml/html/event-trigger-example.html (+2/-2)
doc/src/sgml/html/event-trigger-interface.html (+2/-2)
doc/src/sgml/html/event-trigger-matrix.html (+2/-2)
doc/src/sgml/html/event-trigger-table-rewrite-example.html (+2/-2)
doc/src/sgml/html/event-triggers.html (+2/-2)
doc/src/sgml/html/executor.html (+2/-2)
doc/src/sgml/html/explicit-joins.html (+2/-2)
doc/src/sgml/html/explicit-locking.html (+2/-2)
doc/src/sgml/html/extend-extensions.html (+2/-2)
doc/src/sgml/html/extend-how.html (+2/-2)
doc/src/sgml/html/extend-pgxs.html (+2/-2)
doc/src/sgml/html/extend-type-system.html (+2/-2)
doc/src/sgml/html/extend.html (+2/-2)
doc/src/sgml/html/external-admin-tools.html (+2/-2)
doc/src/sgml/html/external-extensions.html (+2/-2)
doc/src/sgml/html/external-interfaces.html (+2/-2)
doc/src/sgml/html/external-pl.html (+2/-2)
doc/src/sgml/html/external-projects.html (+2/-2)
doc/src/sgml/html/fdw-callbacks.html (+2/-2)
doc/src/sgml/html/fdw-functions.html (+2/-2)
doc/src/sgml/html/fdw-helpers.html (+2/-2)
doc/src/sgml/html/fdw-planning.html (+2/-2)
doc/src/sgml/html/fdw-row-locking.html (+2/-2)
doc/src/sgml/html/fdwhandler.html (+2/-2)
doc/src/sgml/html/features-sql-standard.html (+2/-2)
doc/src/sgml/html/features.html (+2/-2)
doc/src/sgml/html/file-fdw.html (+2/-2)
doc/src/sgml/html/functions-admin.html (+2/-2)
doc/src/sgml/html/functions-aggregate.html (+2/-2)
doc/src/sgml/html/functions-array.html (+2/-2)
doc/src/sgml/html/functions-binarystring.html (+2/-2)
doc/src/sgml/html/functions-bitstring.html (+2/-2)
doc/src/sgml/html/functions-comparison.html (+2/-2)
doc/src/sgml/html/functions-comparisons.html (+2/-2)
doc/src/sgml/html/functions-conditional.html (+2/-2)
doc/src/sgml/html/functions-datetime.html (+2/-2)
doc/src/sgml/html/functions-enum.html (+2/-2)
doc/src/sgml/html/functions-event-triggers.html (+2/-2)
doc/src/sgml/html/functions-formatting.html (+2/-2)
doc/src/sgml/html/functions-geometry.html (+2/-2)
doc/src/sgml/html/functions-info.html (+2/-2)
doc/src/sgml/html/functions-json.html (+2/-2)
doc/src/sgml/html/functions-logical.html (+2/-2)
doc/src/sgml/html/functions-matching.html (+2/-2)
doc/src/sgml/html/functions-math.html (+2/-2)
doc/src/sgml/html/functions-net.html (+2/-2)
doc/src/sgml/html/functions-range.html (+2/-2)
doc/src/sgml/html/functions-sequence.html (+2/-2)
doc/src/sgml/html/functions-srf.html (+2/-2)
doc/src/sgml/html/functions-statistics.html (+2/-2)
doc/src/sgml/html/functions-string.html (+2/-2)
doc/src/sgml/html/functions-subquery.html (+2/-2)
doc/src/sgml/html/functions-textsearch.html (+2/-2)
doc/src/sgml/html/functions-trigger.html (+2/-2)
doc/src/sgml/html/functions-window.html (+2/-2)
doc/src/sgml/html/functions-xml.html (+2/-2)
doc/src/sgml/html/functions.html (+2/-2)
doc/src/sgml/html/fuzzystrmatch.html (+2/-2)
doc/src/sgml/html/generic-wal.html (+2/-2)
doc/src/sgml/html/geqo-biblio.html (+2/-2)
doc/src/sgml/html/geqo-intro.html (+2/-2)
doc/src/sgml/html/geqo-intro2.html (+2/-2)
doc/src/sgml/html/geqo-pg-intro.html (+2/-2)
doc/src/sgml/html/geqo.html (+2/-2)
doc/src/sgml/html/gin-builtin-opclasses.html (+2/-2)
doc/src/sgml/html/gin-examples.html (+2/-2)
doc/src/sgml/html/gin-extensibility.html (+2/-2)
doc/src/sgml/html/gin-implementation.html (+2/-2)
doc/src/sgml/html/gin-intro.html (+2/-2)
doc/src/sgml/html/gin-limit.html (+2/-2)
doc/src/sgml/html/gin-tips.html (+2/-2)
doc/src/sgml/html/gin.html (+1/-1)
doc/src/sgml/html/gist-builtin-opclasses.html (+2/-2)
doc/src/sgml/html/gist-examples.html (+2/-2)
doc/src/sgml/html/gist-extensibility.html (+2/-2)
doc/src/sgml/html/gist-implementation.html (+2/-2)
doc/src/sgml/html/gist-intro.html (+2/-2)
doc/src/sgml/html/gist.html (+1/-1)
doc/src/sgml/html/git.html (+2/-2)
doc/src/sgml/html/gssapi-auth.html (+2/-2)
doc/src/sgml/html/gssapi-enc.html (+2/-2)
doc/src/sgml/html/hash-implementation.html (+2/-2)
doc/src/sgml/html/hash-index.html (+1/-1)
doc/src/sgml/html/hash-intro.html (+2/-2)
doc/src/sgml/html/high-availability.html (+2/-2)
doc/src/sgml/html/history.html (+2/-2)
doc/src/sgml/html/hot-standby.html (+2/-2)
doc/src/sgml/html/how-parallel-query-works.html (+2/-2)
doc/src/sgml/html/hstore.html (+2/-2)
doc/src/sgml/html/index-api.html (+2/-2)
doc/src/sgml/html/index-cost-estimation.html (+2/-2)
doc/src/sgml/html/index-functions.html (+2/-2)
doc/src/sgml/html/index-locking.html (+2/-2)
doc/src/sgml/html/index-scanning.html (+2/-2)
doc/src/sgml/html/index-unique-checks.html (+2/-2)
doc/src/sgml/html/index.html (+1/-1)
doc/src/sgml/html/indexam.html (+2/-2)
doc/src/sgml/html/indexes-bitmap-scans.html (+2/-2)
doc/src/sgml/html/indexes-collations.html (+2/-2)
doc/src/sgml/html/indexes-examine.html (+2/-2)
doc/src/sgml/html/indexes-expressional.html (+2/-2)
doc/src/sgml/html/indexes-index-only-scans.html (+2/-2)
doc/src/sgml/html/indexes-intro.html (+2/-2)
doc/src/sgml/html/indexes-multicolumn.html (+2/-2)
doc/src/sgml/html/indexes-opclass.html (+2/-2)
doc/src/sgml/html/indexes-ordering.html (+2/-2)
doc/src/sgml/html/indexes-partial.html (+2/-2)
doc/src/sgml/html/indexes-types.html (+2/-2)
doc/src/sgml/html/indexes-unique.html (+2/-2)
doc/src/sgml/html/indexes.html (+2/-2)
doc/src/sgml/html/information-schema.html (+2/-2)
doc/src/sgml/html/infoschema-administrable-role-authorizations.html (+2/-2)
doc/src/sgml/html/infoschema-applicable-roles.html (+2/-2)
doc/src/sgml/html/infoschema-attributes.html (+2/-2)
doc/src/sgml/html/infoschema-character-sets.html (+2/-2)
doc/src/sgml/html/infoschema-check-constraint-routine-usage.html (+2/-2)
doc/src/sgml/html/infoschema-check-constraints.html (+2/-2)
doc/src/sgml/html/infoschema-collation-character-set-applicab.html (+2/-2)
doc/src/sgml/html/infoschema-collations.html (+2/-2)
doc/src/sgml/html/infoschema-column-column-usage.html (+2/-2)
doc/src/sgml/html/infoschema-column-domain-usage.html (+2/-2)
doc/src/sgml/html/infoschema-column-options.html (+2/-2)
doc/src/sgml/html/infoschema-column-privileges.html (+2/-2)
doc/src/sgml/html/infoschema-column-udt-usage.html (+2/-2)
doc/src/sgml/html/infoschema-columns.html (+2/-2)
doc/src/sgml/html/infoschema-constraint-column-usage.html (+2/-2)
doc/src/sgml/html/infoschema-constraint-table-usage.html (+2/-2)
doc/src/sgml/html/infoschema-data-type-privileges.html (+2/-2)
doc/src/sgml/html/infoschema-datatypes.html (+2/-2)
doc/src/sgml/html/infoschema-domain-constraints.html (+2/-2)
doc/src/sgml/html/infoschema-domain-udt-usage.html (+2/-2)
doc/src/sgml/html/infoschema-domains.html (+2/-2)
doc/src/sgml/html/infoschema-element-types.html (+2/-2)
doc/src/sgml/html/infoschema-enabled-roles.html (+2/-2)
doc/src/sgml/html/infoschema-foreign-data-wrapper-options.html (+2/-2)
doc/src/sgml/html/infoschema-foreign-data-wrappers.html (+2/-2)
doc/src/sgml/html/infoschema-foreign-server-options.html (+2/-2)
doc/src/sgml/html/infoschema-foreign-servers.html (+2/-2)
doc/src/sgml/html/infoschema-foreign-table-options.html (+2/-2)
doc/src/sgml/html/infoschema-foreign-tables.html (+2/-2)
doc/src/sgml/html/infoschema-information-schema-catalog-name.html (+2/-2)
doc/src/sgml/html/infoschema-key-column-usage.html (+2/-2)
doc/src/sgml/html/infoschema-parameters.html (+2/-2)
doc/src/sgml/html/infoschema-referential-constraints.html (+2/-2)
doc/src/sgml/html/infoschema-role-column-grants.html (+2/-2)
doc/src/sgml/html/infoschema-role-routine-grants.html (+2/-2)
doc/src/sgml/html/infoschema-role-table-grants.html (+2/-2)
doc/src/sgml/html/infoschema-role-udt-grants.html (+2/-2)
doc/src/sgml/html/infoschema-role-usage-grants.html (+2/-2)
doc/src/sgml/html/infoschema-routine-privileges.html (+2/-2)
doc/src/sgml/html/infoschema-routines.html (+2/-2)
doc/src/sgml/html/infoschema-schema.html (+2/-2)
doc/src/sgml/html/infoschema-schemata.html (+2/-2)
doc/src/sgml/html/infoschema-sequences.html (+2/-2)
doc/src/sgml/html/infoschema-sql-features.html (+2/-2)
doc/src/sgml/html/infoschema-sql-implementation-info.html (+2/-2)
doc/src/sgml/html/infoschema-sql-languages.html (+2/-2)
doc/src/sgml/html/infoschema-sql-packages.html (+2/-2)
doc/src/sgml/html/infoschema-sql-parts.html (+2/-2)
doc/src/sgml/html/infoschema-sql-sizing-profiles.html (+2/-2)
doc/src/sgml/html/infoschema-sql-sizing.html (+2/-2)
doc/src/sgml/html/infoschema-table-constraints.html (+2/-2)
doc/src/sgml/html/infoschema-table-privileges.html (+2/-2)
doc/src/sgml/html/infoschema-tables.html (+2/-2)
doc/src/sgml/html/infoschema-transforms.html (+2/-2)
doc/src/sgml/html/infoschema-triggered-update-columns.html (+2/-2)
doc/src/sgml/html/infoschema-triggers.html (+2/-2)
doc/src/sgml/html/infoschema-udt-privileges.html (+2/-2)
doc/src/sgml/html/infoschema-usage-privileges.html (+2/-2)
doc/src/sgml/html/infoschema-user-defined-types.html (+2/-2)
doc/src/sgml/html/infoschema-user-mapping-options.html (+2/-2)
doc/src/sgml/html/infoschema-user-mappings.html (+2/-2)
doc/src/sgml/html/infoschema-view-column-usage.html (+2/-2)
doc/src/sgml/html/infoschema-view-routine-usage.html (+2/-2)
doc/src/sgml/html/infoschema-view-table-usage.html (+2/-2)
doc/src/sgml/html/infoschema-views.html (+2/-2)
doc/src/sgml/html/install-getsource.html (+8/-8)
doc/src/sgml/html/install-post.html (+2/-2)
doc/src/sgml/html/install-procedure.html (+2/-2)
doc/src/sgml/html/install-requirements.html (+2/-2)
doc/src/sgml/html/install-short.html (+2/-2)
doc/src/sgml/html/install-windows-full.html (+3/-3)
doc/src/sgml/html/install-windows.html (+2/-2)
doc/src/sgml/html/installation-platform-notes.html (+2/-2)
doc/src/sgml/html/installation.html (+2/-2)
doc/src/sgml/html/intagg.html (+2/-2)
doc/src/sgml/html/intarray.html (+2/-2)
doc/src/sgml/html/internals.html (+2/-2)
doc/src/sgml/html/intro-whatis.html (+2/-2)
doc/src/sgml/html/isn.html (+2/-2)
doc/src/sgml/html/jit-configuration.html (+2/-2)
doc/src/sgml/html/jit-decision.html (+2/-2)
doc/src/sgml/html/jit-extensibility.html (+2/-2)
doc/src/sgml/html/jit-reason.html (+2/-2)
doc/src/sgml/html/jit.html (+2/-2)
doc/src/sgml/html/kernel-resources.html (+2/-2)
doc/src/sgml/html/largeobjects.html (+2/-2)
doc/src/sgml/html/legalnotice.html (+1/-1)
doc/src/sgml/html/libpq-async.html (+2/-2)
doc/src/sgml/html/libpq-build.html (+2/-2)
doc/src/sgml/html/libpq-cancel.html (+2/-2)
doc/src/sgml/html/libpq-connect.html (+2/-2)
doc/src/sgml/html/libpq-control.html (+2/-2)
doc/src/sgml/html/libpq-copy.html (+2/-2)
doc/src/sgml/html/libpq-envars.html (+2/-2)
doc/src/sgml/html/libpq-events.html (+2/-2)
doc/src/sgml/html/libpq-example.html (+2/-2)
doc/src/sgml/html/libpq-exec.html (+2/-2)
doc/src/sgml/html/libpq-fastpath.html (+2/-2)
doc/src/sgml/html/libpq-ldap.html (+2/-2)
doc/src/sgml/html/libpq-misc.html (+2/-2)
doc/src/sgml/html/libpq-notice-processing.html (+2/-2)
doc/src/sgml/html/libpq-notify.html (+2/-2)
doc/src/sgml/html/libpq-pgpass.html (+2/-2)
doc/src/sgml/html/libpq-pgservice.html (+2/-2)
doc/src/sgml/html/libpq-single-row-mode.html (+2/-2)
doc/src/sgml/html/libpq-ssl.html (+19/-9)
doc/src/sgml/html/libpq-status.html (+2/-2)
doc/src/sgml/html/libpq-threading.html (+2/-2)
doc/src/sgml/html/libpq.html (+2/-2)
doc/src/sgml/html/limits.html (+2/-2)
doc/src/sgml/html/lo-examplesect.html (+2/-2)
doc/src/sgml/html/lo-funcs.html (+2/-2)
doc/src/sgml/html/lo-implementation.html (+2/-2)
doc/src/sgml/html/lo-interfaces.html (+2/-2)
doc/src/sgml/html/lo-intro.html (+2/-2)
doc/src/sgml/html/lo.html (+2/-2)
doc/src/sgml/html/locale.html (+2/-2)
doc/src/sgml/html/locking-indexes.html (+2/-2)
doc/src/sgml/html/log-shipping-alternative.html (+2/-2)
doc/src/sgml/html/logfile-maintenance.html (+2/-2)
doc/src/sgml/html/logical-replication-architecture.html (+2/-2)
doc/src/sgml/html/logical-replication-config.html (+2/-2)
doc/src/sgml/html/logical-replication-conflicts.html (+2/-2)
doc/src/sgml/html/logical-replication-monitoring.html (+2/-2)
doc/src/sgml/html/logical-replication-publication.html (+2/-2)
doc/src/sgml/html/logical-replication-quick-setup.html (+2/-2)
doc/src/sgml/html/logical-replication-restrictions.html (+2/-2)
doc/src/sgml/html/logical-replication-security.html (+2/-2)
doc/src/sgml/html/logical-replication-subscription.html (+2/-2)
doc/src/sgml/html/logical-replication.html (+2/-2)
doc/src/sgml/html/logicaldecoding-catalogs.html (+2/-2)
doc/src/sgml/html/logicaldecoding-example.html (+2/-2)
doc/src/sgml/html/logicaldecoding-explanation.html (+2/-2)
doc/src/sgml/html/logicaldecoding-output-plugin.html (+2/-2)
doc/src/sgml/html/logicaldecoding-sql.html (+2/-2)
doc/src/sgml/html/logicaldecoding-synchronous.html (+2/-2)
doc/src/sgml/html/logicaldecoding-walsender.html (+2/-2)
doc/src/sgml/html/logicaldecoding-writer.html (+2/-2)
doc/src/sgml/html/logicaldecoding.html (+2/-2)
doc/src/sgml/html/ltree.html (+2/-2)
doc/src/sgml/html/maintenance.html (+2/-2)
doc/src/sgml/html/manage-ag-config.html (+2/-2)
doc/src/sgml/html/manage-ag-createdb.html (+2/-2)
doc/src/sgml/html/manage-ag-dropdb.html (+2/-2)
doc/src/sgml/html/manage-ag-overview.html (+2/-2)
doc/src/sgml/html/manage-ag-tablespaces.html (+2/-2)
doc/src/sgml/html/manage-ag-templatedbs.html (+2/-2)
doc/src/sgml/html/managing-databases.html (+2/-2)
doc/src/sgml/html/monitoring-locks.html (+2/-2)
doc/src/sgml/html/monitoring-ps.html (+2/-2)
doc/src/sgml/html/monitoring-stats.html (+4/-3)
doc/src/sgml/html/monitoring.html (+2/-2)
doc/src/sgml/html/multibyte.html (+2/-2)
doc/src/sgml/html/multivariate-statistics-examples.html (+2/-2)
doc/src/sgml/html/mvcc-caveats.html (+2/-2)
doc/src/sgml/html/mvcc-intro.html (+2/-2)
doc/src/sgml/html/mvcc.html (+2/-2)
doc/src/sgml/html/nls-programmer.html (+2/-2)
doc/src/sgml/html/nls-translator.html (+2/-2)
doc/src/sgml/html/nls.html (+1/-1)
doc/src/sgml/html/non-durability.html (+2/-2)
doc/src/sgml/html/notation.html (+2/-2)
doc/src/sgml/html/oid2name.html (+2/-2)
doc/src/sgml/html/overview.html (+2/-2)
doc/src/sgml/html/pageinspect.html (+2/-2)
doc/src/sgml/html/parallel-plans.html (+2/-2)
doc/src/sgml/html/parallel-query.html (+2/-2)
doc/src/sgml/html/parallel-safety.html (+2/-2)
doc/src/sgml/html/parser-stage.html (+2/-2)
doc/src/sgml/html/passwordcheck.html (+2/-2)
doc/src/sgml/html/performance-tips.html (+2/-2)
doc/src/sgml/html/perm-functions.html (+2/-2)
doc/src/sgml/html/pgarchivecleanup.html (+2/-2)
doc/src/sgml/html/pgbench.html (+2/-2)
doc/src/sgml/html/pgbuffercache.html (+2/-2)
doc/src/sgml/html/pgcrypto.html (+2/-2)
doc/src/sgml/html/pgfreespacemap.html (+2/-2)
doc/src/sgml/html/pgprewarm.html (+2/-2)
doc/src/sgml/html/pgrowlocks.html (+2/-2)
doc/src/sgml/html/pgstandby.html (+2/-2)
doc/src/sgml/html/pgstatstatements.html (+2/-2)
doc/src/sgml/html/pgstattuple.html (+2/-2)
doc/src/sgml/html/pgtestfsync.html (+2/-2)
doc/src/sgml/html/pgtesttiming.html (+2/-2)
doc/src/sgml/html/pgtrgm.html (+2/-2)
doc/src/sgml/html/pgupgrade.html (+2/-2)
doc/src/sgml/html/pgvisibility.html (+2/-2)
doc/src/sgml/html/pgwaldump.html (+2/-2)
doc/src/sgml/html/pgxlogdump.html (+3/-3)
doc/src/sgml/html/planner-optimizer.html (+2/-2)
doc/src/sgml/html/planner-stats-details.html (+2/-2)
doc/src/sgml/html/planner-stats-security.html (+2/-2)
doc/src/sgml/html/planner-stats.html (+2/-2)
doc/src/sgml/html/plhandler.html (+2/-2)
doc/src/sgml/html/plperl-builtins.html (+2/-2)
doc/src/sgml/html/plperl-data.html (+2/-2)
doc/src/sgml/html/plperl-event-triggers.html (+2/-2)
doc/src/sgml/html/plperl-funcs.html (+2/-2)
doc/src/sgml/html/plperl-global.html (+2/-2)
doc/src/sgml/html/plperl-triggers.html (+2/-2)
doc/src/sgml/html/plperl-trusted.html (+2/-2)
doc/src/sgml/html/plperl-under-the-hood.html (+2/-2)
doc/src/sgml/html/plperl.html (+2/-2)
doc/src/sgml/html/plpgsql-control-structures.html (+2/-2)
doc/src/sgml/html/plpgsql-cursors.html (+2/-2)
doc/src/sgml/html/plpgsql-declarations.html (+2/-2)
doc/src/sgml/html/plpgsql-development-tips.html (+2/-2)
doc/src/sgml/html/plpgsql-errors-and-messages.html (+2/-2)
doc/src/sgml/html/plpgsql-expressions.html (+2/-2)
doc/src/sgml/html/plpgsql-implementation.html (+2/-2)
doc/src/sgml/html/plpgsql-overview.html (+2/-2)
doc/src/sgml/html/plpgsql-porting.html (+2/-2)
doc/src/sgml/html/plpgsql-statements.html (+2/-2)
doc/src/sgml/html/plpgsql-structure.html (+2/-2)
doc/src/sgml/html/plpgsql-transactions.html (+2/-2)
doc/src/sgml/html/plpgsql-trigger.html (+2/-2)
doc/src/sgml/html/plpgsql.html (+1/-1)
doc/src/sgml/html/plpython-data.html (+2/-2)
doc/src/sgml/html/plpython-database.html (+2/-2)
doc/src/sgml/html/plpython-do.html (+2/-2)
doc/src/sgml/html/plpython-envar.html (+2/-2)
doc/src/sgml/html/plpython-funcs.html (+2/-2)
doc/src/sgml/html/plpython-python23.html (+2/-2)
doc/src/sgml/html/plpython-sharing.html (+2/-2)
doc/src/sgml/html/plpython-subtransaction.html (+2/-2)
doc/src/sgml/html/plpython-transactions.html (+2/-2)
doc/src/sgml/html/plpython-trigger.html (+2/-2)
doc/src/sgml/html/plpython-util.html (+2/-2)
doc/src/sgml/html/plpython.html (+2/-2)
doc/src/sgml/html/pltcl-config.html (+2/-2)
doc/src/sgml/html/pltcl-data.html (+2/-2)
doc/src/sgml/html/pltcl-dbaccess.html (+2/-2)
doc/src/sgml/html/pltcl-error-handling.html (+2/-2)
doc/src/sgml/html/pltcl-event-trigger.html (+2/-2)
doc/src/sgml/html/pltcl-functions.html (+2/-2)
doc/src/sgml/html/pltcl-global.html (+2/-2)
doc/src/sgml/html/pltcl-overview.html (+2/-2)
doc/src/sgml/html/pltcl-procnames.html (+2/-2)
doc/src/sgml/html/pltcl-subtransactions.html (+2/-2)
doc/src/sgml/html/pltcl-transactions.html (+2/-2)
doc/src/sgml/html/pltcl-trigger.html (+2/-2)
doc/src/sgml/html/pltcl.html (+2/-2)
doc/src/sgml/html/populate.html (+2/-2)
doc/src/sgml/html/postgres-fdw.html (+6/-5)
doc/src/sgml/html/postgres-user.html (+2/-2)
doc/src/sgml/html/preface.html (+2/-2)
doc/src/sgml/html/preventing-server-spoofing.html (+2/-2)
doc/src/sgml/html/progress-reporting.html (+2/-2)
doc/src/sgml/html/protocol-changes.html (+2/-2)
doc/src/sgml/html/protocol-error-fields.html (+2/-2)
doc/src/sgml/html/protocol-flow.html (+2/-2)
doc/src/sgml/html/protocol-logical-replication.html (+2/-2)
doc/src/sgml/html/protocol-logicalrep-message-formats.html (+2/-2)
doc/src/sgml/html/protocol-message-formats.html (+2/-2)
doc/src/sgml/html/protocol-message-types.html (+2/-2)
doc/src/sgml/html/protocol-overview.html (+2/-2)
doc/src/sgml/html/protocol-replication.html (+2/-2)
doc/src/sgml/html/protocol.html (+2/-2)
doc/src/sgml/html/queries-limit.html (+2/-2)
doc/src/sgml/html/queries-order.html (+2/-2)
doc/src/sgml/html/queries-overview.html (+2/-2)
doc/src/sgml/html/queries-select-lists.html (+2/-2)
doc/src/sgml/html/queries-table-expressions.html (+2/-2)
doc/src/sgml/html/queries-union.html (+2/-2)
doc/src/sgml/html/queries-values.html (+2/-2)
doc/src/sgml/html/queries-with.html (+2/-2)
doc/src/sgml/html/queries.html (+2/-2)
doc/src/sgml/html/query-path.html (+2/-2)
doc/src/sgml/html/querytree.html (+2/-2)
doc/src/sgml/html/rangetypes.html (+2/-2)
doc/src/sgml/html/recovery-config.html (+3/-3)
doc/src/sgml/html/reference-client.html (+2/-2)
doc/src/sgml/html/reference-server.html (+2/-2)
doc/src/sgml/html/reference.html (+2/-2)
doc/src/sgml/html/regress-coverage.html (+2/-2)
doc/src/sgml/html/regress-evaluation.html (+2/-2)
doc/src/sgml/html/regress-run.html (+2/-2)
doc/src/sgml/html/regress-tap.html (+2/-2)
doc/src/sgml/html/regress-variant.html (+2/-2)
doc/src/sgml/html/regress.html (+2/-2)
doc/src/sgml/html/release-12-1.html (+5/-5)
doc/src/sgml/html/release-12-10.html (+6/-6)
doc/src/sgml/html/release-12-11.html (+299/-0)
doc/src/sgml/html/release-12-2.html (+5/-5)
doc/src/sgml/html/release-12-3.html (+6/-6)
doc/src/sgml/html/release-12-4.html (+6/-6)
doc/src/sgml/html/release-12-5.html (+6/-6)
doc/src/sgml/html/release-12-6.html (+6/-6)
doc/src/sgml/html/release-12-7.html (+6/-6)
doc/src/sgml/html/release-12-8.html (+6/-6)
doc/src/sgml/html/release-12-9.html (+6/-6)
doc/src/sgml/html/release-12.html (+25/-25)
doc/src/sgml/html/release-prior.html (+2/-2)
doc/src/sgml/html/release.html (+2/-2)
doc/src/sgml/html/replication-origins.html (+2/-2)
doc/src/sgml/html/resources.html (+2/-2)
doc/src/sgml/html/role-attributes.html (+2/-2)
doc/src/sgml/html/role-membership.html (+2/-2)
doc/src/sgml/html/role-removal.html (+2/-2)
doc/src/sgml/html/routine-reindex.html (+2/-2)
doc/src/sgml/html/routine-vacuuming.html (+22/-2)
doc/src/sgml/html/row-estimation-examples.html (+2/-2)
doc/src/sgml/html/rowtypes.html (+2/-2)
doc/src/sgml/html/rule-system.html (+2/-2)
doc/src/sgml/html/rules-materializedviews.html (+2/-2)
doc/src/sgml/html/rules-privileges.html (+2/-2)
doc/src/sgml/html/rules-status.html (+2/-2)
doc/src/sgml/html/rules-triggers.html (+2/-2)
doc/src/sgml/html/rules-update.html (+2/-2)
doc/src/sgml/html/rules-views.html (+2/-2)
doc/src/sgml/html/rules.html (+2/-2)
doc/src/sgml/html/runtime-config-autovacuum.html (+2/-2)
doc/src/sgml/html/runtime-config-client.html (+2/-2)
doc/src/sgml/html/runtime-config-compatible.html (+2/-2)
doc/src/sgml/html/runtime-config-connection.html (+2/-2)
doc/src/sgml/html/runtime-config-custom.html (+2/-2)
doc/src/sgml/html/runtime-config-developer.html (+2/-2)
doc/src/sgml/html/runtime-config-error-handling.html (+2/-2)
doc/src/sgml/html/runtime-config-file-locations.html (+2/-2)
doc/src/sgml/html/runtime-config-locks.html (+2/-2)
doc/src/sgml/html/runtime-config-logging.html (+2/-2)
doc/src/sgml/html/runtime-config-preset.html (+2/-2)
doc/src/sgml/html/runtime-config-query.html (+2/-2)
doc/src/sgml/html/runtime-config-replication.html (+2/-2)
doc/src/sgml/html/runtime-config-resource.html (+2/-2)
doc/src/sgml/html/runtime-config-short.html (+2/-2)
doc/src/sgml/html/runtime-config-statistics.html (+2/-2)
doc/src/sgml/html/runtime-config-wal.html (+2/-2)
doc/src/sgml/html/runtime-config.html (+2/-2)
doc/src/sgml/html/runtime.html (+2/-2)
doc/src/sgml/html/sasl-authentication.html (+2/-2)
doc/src/sgml/html/seg.html (+2/-2)
doc/src/sgml/html/sepgsql.html (+2/-2)
doc/src/sgml/html/server-programming.html (+2/-2)
doc/src/sgml/html/server-shutdown.html (+2/-2)
doc/src/sgml/html/server-start.html (+6/-6)
doc/src/sgml/html/source-conventions.html (+2/-2)
doc/src/sgml/html/source-format.html (+2/-2)
doc/src/sgml/html/source.html (+1/-1)
doc/src/sgml/html/sourcerepo.html (+2/-2)
doc/src/sgml/html/spgist-builtin-opclasses.html (+2/-2)
doc/src/sgml/html/spgist-examples.html (+2/-2)
doc/src/sgml/html/spgist-extensibility.html (+2/-2)
doc/src/sgml/html/spgist-implementation.html (+2/-2)
doc/src/sgml/html/spgist-intro.html (+2/-2)
doc/src/sgml/html/spgist.html (+1/-1)
doc/src/sgml/html/spi-examples.html (+2/-2)
doc/src/sgml/html/spi-interface-support.html (+2/-2)
doc/src/sgml/html/spi-interface.html (+2/-2)
doc/src/sgml/html/spi-memory.html (+2/-2)
doc/src/sgml/html/spi-realloc.html (+2/-2)
doc/src/sgml/html/spi-spi-commit.html (+2/-2)
doc/src/sgml/html/spi-spi-connect.html (+2/-2)
doc/src/sgml/html/spi-spi-copytuple.html (+2/-2)
doc/src/sgml/html/spi-spi-cursor-close.html (+2/-2)
doc/src/sgml/html/spi-spi-cursor-fetch.html (+2/-2)
doc/src/sgml/html/spi-spi-cursor-find.html (+2/-2)
doc/src/sgml/html/spi-spi-cursor-move.html (+2/-2)
doc/src/sgml/html/spi-spi-cursor-open-with-args.html (+2/-2)
doc/src/sgml/html/spi-spi-cursor-open-with-paramlist.html (+2/-2)
doc/src/sgml/html/spi-spi-cursor-open.html (+2/-2)
doc/src/sgml/html/spi-spi-exec.html (+2/-2)
doc/src/sgml/html/spi-spi-execp.html (+2/-2)
doc/src/sgml/html/spi-spi-execute-plan-with-paramlist.html (+2/-2)
doc/src/sgml/html/spi-spi-execute-plan.html (+2/-2)
doc/src/sgml/html/spi-spi-execute-with-args.html (+2/-2)
doc/src/sgml/html/spi-spi-execute.html (+2/-2)
doc/src/sgml/html/spi-spi-finish.html (+2/-2)
doc/src/sgml/html/spi-spi-fname.html (+2/-2)
doc/src/sgml/html/spi-spi-fnumber.html (+2/-2)
doc/src/sgml/html/spi-spi-freeplan.html (+2/-2)
doc/src/sgml/html/spi-spi-freetuple.html (+2/-2)
doc/src/sgml/html/spi-spi-freetupletable.html (+2/-2)
doc/src/sgml/html/spi-spi-getargcount.html (+2/-2)
doc/src/sgml/html/spi-spi-getargtypeid.html (+2/-2)
doc/src/sgml/html/spi-spi-getbinval.html (+2/-2)
doc/src/sgml/html/spi-spi-getnspname.html (+2/-2)
doc/src/sgml/html/spi-spi-getrelname.html (+2/-2)
doc/src/sgml/html/spi-spi-gettype.html (+2/-2)
doc/src/sgml/html/spi-spi-gettypeid.html (+2/-2)
doc/src/sgml/html/spi-spi-getvalue.html (+2/-2)
doc/src/sgml/html/spi-spi-is-cursor-plan.html (+2/-2)
doc/src/sgml/html/spi-spi-keepplan.html (+2/-2)
doc/src/sgml/html/spi-spi-modifytuple.html (+2/-2)
doc/src/sgml/html/spi-spi-palloc.html (+2/-2)
doc/src/sgml/html/spi-spi-pfree.html (+2/-2)
doc/src/sgml/html/spi-spi-prepare-cursor.html (+2/-2)
doc/src/sgml/html/spi-spi-prepare-params.html (+2/-2)
doc/src/sgml/html/spi-spi-prepare.html (+2/-2)
doc/src/sgml/html/spi-spi-register-relation.html (+2/-2)
doc/src/sgml/html/spi-spi-register-trigger-data.html (+2/-2)
doc/src/sgml/html/spi-spi-result-code-string.html (+2/-2)
doc/src/sgml/html/spi-spi-returntuple.html (+2/-2)
doc/src/sgml/html/spi-spi-rollback.html (+2/-2)
doc/src/sgml/html/spi-spi-saveplan.html (+2/-2)
doc/src/sgml/html/spi-spi-scroll-cursor-fetch.html (+2/-2)
doc/src/sgml/html/spi-spi-scroll-cursor-move.html (+2/-2)
doc/src/sgml/html/spi-spi-start-transaction.html (+2/-2)
doc/src/sgml/html/spi-spi-unregister-relation.html (+2/-2)
doc/src/sgml/html/spi-transaction.html (+2/-2)
doc/src/sgml/html/spi-visibility.html (+2/-2)
doc/src/sgml/html/spi.html (+2/-2)
doc/src/sgml/html/sql-abort.html (+2/-2)
doc/src/sgml/html/sql-alteraggregate.html (+2/-2)
doc/src/sgml/html/sql-altercollation.html (+2/-2)
doc/src/sgml/html/sql-alterconversion.html (+2/-2)
doc/src/sgml/html/sql-alterdatabase.html (+2/-2)
doc/src/sgml/html/sql-alterdefaultprivileges.html (+2/-2)
doc/src/sgml/html/sql-alterdomain.html (+2/-2)
doc/src/sgml/html/sql-altereventtrigger.html (+2/-2)
doc/src/sgml/html/sql-alterextension.html (+2/-2)
doc/src/sgml/html/sql-alterforeigndatawrapper.html (+2/-2)
doc/src/sgml/html/sql-alterforeigntable.html (+2/-2)
doc/src/sgml/html/sql-alterfunction.html (+2/-2)
doc/src/sgml/html/sql-altergroup.html (+2/-2)
doc/src/sgml/html/sql-alterindex.html (+2/-2)
doc/src/sgml/html/sql-alterlanguage.html (+2/-2)
doc/src/sgml/html/sql-alterlargeobject.html (+2/-2)
doc/src/sgml/html/sql-altermaterializedview.html (+3/-2)
doc/src/sgml/html/sql-alteropclass.html (+2/-2)
doc/src/sgml/html/sql-alteroperator.html (+2/-2)
doc/src/sgml/html/sql-alteropfamily.html (+2/-2)
doc/src/sgml/html/sql-alterpolicy.html (+2/-2)
doc/src/sgml/html/sql-alterprocedure.html (+2/-2)
doc/src/sgml/html/sql-alterpublication.html (+2/-2)
doc/src/sgml/html/sql-alterrole.html (+2/-2)
doc/src/sgml/html/sql-alterroutine.html (+2/-2)
doc/src/sgml/html/sql-alterrule.html (+2/-2)
doc/src/sgml/html/sql-alterschema.html (+2/-2)
doc/src/sgml/html/sql-altersequence.html (+2/-2)
doc/src/sgml/html/sql-alterserver.html (+2/-2)
doc/src/sgml/html/sql-alterstatistics.html (+2/-2)
doc/src/sgml/html/sql-altersubscription.html (+2/-2)
doc/src/sgml/html/sql-altersystem.html (+2/-2)
doc/src/sgml/html/sql-altertable.html (+7/-6)
doc/src/sgml/html/sql-altertablespace.html (+2/-2)
doc/src/sgml/html/sql-altertrigger.html (+2/-2)
doc/src/sgml/html/sql-altertsconfig.html (+2/-2)
doc/src/sgml/html/sql-altertsdictionary.html (+2/-2)
doc/src/sgml/html/sql-altertsparser.html (+2/-2)
doc/src/sgml/html/sql-altertstemplate.html (+2/-2)
doc/src/sgml/html/sql-altertype.html (+2/-2)
doc/src/sgml/html/sql-alteruser.html (+2/-2)
doc/src/sgml/html/sql-alterusermapping.html (+2/-2)
doc/src/sgml/html/sql-alterview.html (+2/-2)
doc/src/sgml/html/sql-analyze.html (+25/-5)
doc/src/sgml/html/sql-begin.html (+2/-2)
doc/src/sgml/html/sql-call.html (+2/-2)
doc/src/sgml/html/sql-checkpoint.html (+2/-2)
doc/src/sgml/html/sql-close.html (+2/-2)
doc/src/sgml/html/sql-cluster.html (+2/-2)
doc/src/sgml/html/sql-commands.html (+2/-2)
doc/src/sgml/html/sql-comment.html (+2/-2)
doc/src/sgml/html/sql-commit-prepared.html (+2/-2)
doc/src/sgml/html/sql-commit.html (+2/-2)
doc/src/sgml/html/sql-copy.html (+2/-2)
doc/src/sgml/html/sql-create-access-method.html (+2/-2)
doc/src/sgml/html/sql-createaggregate.html (+2/-2)
doc/src/sgml/html/sql-createcast.html (+2/-2)
doc/src/sgml/html/sql-createcollation.html (+2/-2)
doc/src/sgml/html/sql-createconversion.html (+2/-2)
doc/src/sgml/html/sql-createdatabase.html (+2/-2)
doc/src/sgml/html/sql-createdomain.html (+2/-2)
doc/src/sgml/html/sql-createeventtrigger.html (+2/-2)
doc/src/sgml/html/sql-createextension.html (+2/-2)
doc/src/sgml/html/sql-createforeigndatawrapper.html (+2/-2)
doc/src/sgml/html/sql-createforeigntable.html (+2/-2)
doc/src/sgml/html/sql-createfunction.html (+2/-2)
doc/src/sgml/html/sql-creategroup.html (+2/-2)
doc/src/sgml/html/sql-createindex.html (+2/-2)
doc/src/sgml/html/sql-createlanguage.html (+2/-2)
doc/src/sgml/html/sql-creatematerializedview.html (+2/-2)
doc/src/sgml/html/sql-createopclass.html (+2/-2)
doc/src/sgml/html/sql-createoperator.html (+2/-2)
doc/src/sgml/html/sql-createopfamily.html (+2/-2)
doc/src/sgml/html/sql-createpolicy.html (+2/-2)
doc/src/sgml/html/sql-createprocedure.html (+2/-2)
doc/src/sgml/html/sql-createpublication.html (+2/-2)
doc/src/sgml/html/sql-createrole.html (+2/-2)
doc/src/sgml/html/sql-createrule.html (+2/-2)
doc/src/sgml/html/sql-createschema.html (+2/-2)
doc/src/sgml/html/sql-createsequence.html (+2/-2)
doc/src/sgml/html/sql-createserver.html (+2/-2)
doc/src/sgml/html/sql-createstatistics.html (+2/-2)
doc/src/sgml/html/sql-createsubscription.html (+2/-2)
doc/src/sgml/html/sql-createtable.html (+2/-2)
doc/src/sgml/html/sql-createtableas.html (+2/-2)
doc/src/sgml/html/sql-createtablespace.html (+2/-2)
doc/src/sgml/html/sql-createtransform.html (+2/-2)
doc/src/sgml/html/sql-createtrigger.html (+2/-2)
doc/src/sgml/html/sql-createtsconfig.html (+2/-2)
doc/src/sgml/html/sql-createtsdictionary.html (+2/-2)
doc/src/sgml/html/sql-createtsparser.html (+2/-2)
doc/src/sgml/html/sql-createtstemplate.html (+2/-2)
doc/src/sgml/html/sql-createtype.html (+2/-2)
doc/src/sgml/html/sql-createuser.html (+2/-2)
doc/src/sgml/html/sql-createusermapping.html (+2/-2)
doc/src/sgml/html/sql-createview.html (+2/-2)
doc/src/sgml/html/sql-deallocate.html (+2/-2)
doc/src/sgml/html/sql-declare.html (+2/-2)
doc/src/sgml/html/sql-delete.html (+2/-2)
doc/src/sgml/html/sql-discard.html (+2/-2)
doc/src/sgml/html/sql-do.html (+2/-2)
doc/src/sgml/html/sql-drop-access-method.html (+2/-2)
doc/src/sgml/html/sql-drop-owned.html (+2/-2)
doc/src/sgml/html/sql-dropaggregate.html (+2/-2)
doc/src/sgml/html/sql-dropcast.html (+2/-2)
doc/src/sgml/html/sql-dropcollation.html (+2/-2)
doc/src/sgml/html/sql-dropconversion.html (+2/-2)
doc/src/sgml/html/sql-dropdatabase.html (+2/-2)
doc/src/sgml/html/sql-dropdomain.html (+2/-2)
doc/src/sgml/html/sql-dropeventtrigger.html (+2/-2)
doc/src/sgml/html/sql-dropextension.html (+2/-2)
doc/src/sgml/html/sql-dropforeigndatawrapper.html (+2/-2)
doc/src/sgml/html/sql-dropforeigntable.html (+2/-2)
doc/src/sgml/html/sql-dropfunction.html (+2/-2)
doc/src/sgml/html/sql-dropgroup.html (+2/-2)
doc/src/sgml/html/sql-dropindex.html (+2/-2)
doc/src/sgml/html/sql-droplanguage.html (+2/-2)
doc/src/sgml/html/sql-dropmaterializedview.html (+2/-2)
doc/src/sgml/html/sql-dropopclass.html (+2/-2)
doc/src/sgml/html/sql-dropoperator.html (+2/-2)
doc/src/sgml/html/sql-dropopfamily.html (+2/-2)
doc/src/sgml/html/sql-droppolicy.html (+2/-2)
doc/src/sgml/html/sql-dropprocedure.html (+2/-2)
doc/src/sgml/html/sql-droppublication.html (+2/-2)
doc/src/sgml/html/sql-droprole.html (+2/-2)
doc/src/sgml/html/sql-droproutine.html (+2/-2)
doc/src/sgml/html/sql-droprule.html (+2/-2)
doc/src/sgml/html/sql-dropschema.html (+2/-2)
doc/src/sgml/html/sql-dropsequence.html (+2/-2)
doc/src/sgml/html/sql-dropserver.html (+2/-2)
doc/src/sgml/html/sql-dropstatistics.html (+2/-2)
doc/src/sgml/html/sql-dropsubscription.html (+2/-2)
doc/src/sgml/html/sql-droptable.html (+2/-2)
doc/src/sgml/html/sql-droptablespace.html (+2/-2)
doc/src/sgml/html/sql-droptransform.html (+2/-2)
doc/src/sgml/html/sql-droptrigger.html (+2/-2)
doc/src/sgml/html/sql-droptsconfig.html (+2/-2)
doc/src/sgml/html/sql-droptsdictionary.html (+2/-2)
doc/src/sgml/html/sql-droptsparser.html (+2/-2)
doc/src/sgml/html/sql-droptstemplate.html (+2/-2)
doc/src/sgml/html/sql-droptype.html (+2/-2)
doc/src/sgml/html/sql-dropuser.html (+2/-2)
doc/src/sgml/html/sql-dropusermapping.html (+2/-2)
doc/src/sgml/html/sql-dropview.html (+2/-2)
doc/src/sgml/html/sql-end.html (+2/-2)
doc/src/sgml/html/sql-execute.html (+2/-2)
doc/src/sgml/html/sql-explain.html (+2/-2)
doc/src/sgml/html/sql-expressions.html (+2/-2)
doc/src/sgml/html/sql-fetch.html (+2/-2)
doc/src/sgml/html/sql-grant.html (+2/-2)
doc/src/sgml/html/sql-importforeignschema.html (+2/-2)
doc/src/sgml/html/sql-insert.html (+2/-2)
doc/src/sgml/html/sql-keywords-appendix.html (+3/-3)
doc/src/sgml/html/sql-listen.html (+2/-2)
doc/src/sgml/html/sql-load.html (+2/-2)
doc/src/sgml/html/sql-lock.html (+2/-2)
doc/src/sgml/html/sql-move.html (+2/-2)
doc/src/sgml/html/sql-notify.html (+2/-2)
doc/src/sgml/html/sql-prepare-transaction.html (+2/-2)
doc/src/sgml/html/sql-prepare.html (+2/-2)
doc/src/sgml/html/sql-reassign-owned.html (+2/-2)
doc/src/sgml/html/sql-refreshmaterializedview.html (+2/-2)
doc/src/sgml/html/sql-reindex.html (+2/-2)
doc/src/sgml/html/sql-release-savepoint.html (+2/-2)
doc/src/sgml/html/sql-reset.html (+2/-2)
doc/src/sgml/html/sql-revoke.html (+2/-2)
doc/src/sgml/html/sql-rollback-prepared.html (+2/-2)
doc/src/sgml/html/sql-rollback-to.html (+2/-2)
doc/src/sgml/html/sql-rollback.html (+2/-2)
doc/src/sgml/html/sql-savepoint.html (+2/-2)
doc/src/sgml/html/sql-security-label.html (+2/-2)
doc/src/sgml/html/sql-select.html (+2/-2)
doc/src/sgml/html/sql-selectinto.html (+2/-2)
doc/src/sgml/html/sql-set-constraints.html (+2/-2)
doc/src/sgml/html/sql-set-role.html (+2/-2)
doc/src/sgml/html/sql-set-session-authorization.html (+2/-2)
doc/src/sgml/html/sql-set-transaction.html (+2/-2)
doc/src/sgml/html/sql-set.html (+2/-2)
doc/src/sgml/html/sql-show.html (+2/-2)
doc/src/sgml/html/sql-start-transaction.html (+2/-2)
doc/src/sgml/html/sql-syntax-calling-funcs.html (+2/-2)
doc/src/sgml/html/sql-syntax-lexical.html (+2/-2)
doc/src/sgml/html/sql-syntax.html (+2/-2)
doc/src/sgml/html/sql-truncate.html (+2/-2)
doc/src/sgml/html/sql-unlisten.html (+2/-2)
doc/src/sgml/html/sql-update.html (+2/-2)
doc/src/sgml/html/sql-vacuum.html (+2/-2)
doc/src/sgml/html/sql-values.html (+2/-2)
doc/src/sgml/html/sql.html (+2/-2)
doc/src/sgml/html/ssh-tunnels.html (+2/-2)
doc/src/sgml/html/ssl-tcp.html (+2/-2)
doc/src/sgml/html/sslinfo.html (+2/-2)
doc/src/sgml/html/sspi-auth.html (+2/-2)
doc/src/sgml/html/storage-file-layout.html (+2/-2)
doc/src/sgml/html/storage-fsm.html (+2/-2)
doc/src/sgml/html/storage-init.html (+2/-2)
doc/src/sgml/html/storage-page-layout.html (+2/-2)
doc/src/sgml/html/storage-toast.html (+2/-2)
doc/src/sgml/html/storage-vm.html (+2/-2)
doc/src/sgml/html/storage.html (+2/-2)
doc/src/sgml/html/supported-platforms.html (+2/-2)
doc/src/sgml/html/system-catalog-declarations.html (+2/-2)
doc/src/sgml/html/system-catalog-initial-data.html (+2/-2)
doc/src/sgml/html/tableam.html (+2/-2)
doc/src/sgml/html/tablefunc.html (+2/-2)
doc/src/sgml/html/tablesample-method.html (+2/-2)
doc/src/sgml/html/tablesample-support-functions.html (+2/-2)
doc/src/sgml/html/tcn.html (+2/-2)
doc/src/sgml/html/test-decoding.html (+2/-2)
doc/src/sgml/html/textsearch-configuration.html (+2/-2)
doc/src/sgml/html/textsearch-controls.html (+2/-2)
doc/src/sgml/html/textsearch-debugging.html (+2/-2)
doc/src/sgml/html/textsearch-dictionaries.html (+2/-2)
doc/src/sgml/html/textsearch-features.html (+2/-2)
doc/src/sgml/html/textsearch-indexes.html (+9/-5)
doc/src/sgml/html/textsearch-intro.html (+3/-3)
doc/src/sgml/html/textsearch-limitations.html (+2/-2)
doc/src/sgml/html/textsearch-parsers.html (+2/-2)
doc/src/sgml/html/textsearch-psql.html (+2/-2)
doc/src/sgml/html/textsearch-tables.html (+4/-4)
doc/src/sgml/html/textsearch.html (+1/-1)
doc/src/sgml/html/transaction-iso.html (+2/-2)
doc/src/sgml/html/trigger-datachanges.html (+2/-2)
doc/src/sgml/html/trigger-definition.html (+2/-2)
doc/src/sgml/html/trigger-example.html (+2/-2)
doc/src/sgml/html/trigger-interface.html (+2/-2)
doc/src/sgml/html/triggers.html (+2/-2)
doc/src/sgml/html/tsm-system-rows.html (+2/-2)
doc/src/sgml/html/tsm-system-time.html (+2/-2)
doc/src/sgml/html/tutorial-accessdb.html (+4/-4)
doc/src/sgml/html/tutorial-advanced-intro.html (+2/-2)
doc/src/sgml/html/tutorial-advanced.html (+1/-1)
doc/src/sgml/html/tutorial-agg.html (+2/-2)
doc/src/sgml/html/tutorial-arch.html (+2/-2)
doc/src/sgml/html/tutorial-concepts.html (+2/-2)
doc/src/sgml/html/tutorial-conclusion.html (+2/-2)
doc/src/sgml/html/tutorial-createdb.html (+2/-2)
doc/src/sgml/html/tutorial-delete.html (+2/-2)
doc/src/sgml/html/tutorial-fk.html (+2/-2)
doc/src/sgml/html/tutorial-inheritance.html (+2/-2)
doc/src/sgml/html/tutorial-install.html (+2/-2)
doc/src/sgml/html/tutorial-join.html (+2/-2)
doc/src/sgml/html/tutorial-populate.html (+2/-2)
doc/src/sgml/html/tutorial-select.html (+2/-2)
doc/src/sgml/html/tutorial-sql-intro.html (+2/-2)
doc/src/sgml/html/tutorial-sql.html (+1/-1)
doc/src/sgml/html/tutorial-start.html (+1/-1)
doc/src/sgml/html/tutorial-table.html (+2/-2)
doc/src/sgml/html/tutorial-transactions.html (+2/-2)
doc/src/sgml/html/tutorial-update.html (+2/-2)
doc/src/sgml/html/tutorial-views.html (+2/-2)
doc/src/sgml/html/tutorial-window.html (+2/-2)
doc/src/sgml/html/tutorial.html (+2/-2)
doc/src/sgml/html/typeconv-func.html (+2/-2)
doc/src/sgml/html/typeconv-oper.html (+2/-2)
doc/src/sgml/html/typeconv-overview.html (+2/-2)
doc/src/sgml/html/typeconv-query.html (+2/-2)
doc/src/sgml/html/typeconv-select.html (+2/-2)
doc/src/sgml/html/typeconv-union-case.html (+2/-2)
doc/src/sgml/html/typeconv.html (+2/-2)
doc/src/sgml/html/unaccent.html (+2/-2)
doc/src/sgml/html/unsupported-features-sql-standard.html (+2/-2)
doc/src/sgml/html/upgrading.html (+3/-3)
doc/src/sgml/html/user-manag.html (+2/-2)
doc/src/sgml/html/using-explain.html (+2/-2)
doc/src/sgml/html/uuid-ossp.html (+2/-2)
doc/src/sgml/html/vacuumlo.html (+2/-2)
doc/src/sgml/html/view-pg-available-extension-versions.html (+2/-2)
doc/src/sgml/html/view-pg-available-extensions.html (+2/-2)
doc/src/sgml/html/view-pg-config.html (+2/-2)
doc/src/sgml/html/view-pg-cursors.html (+2/-2)
doc/src/sgml/html/view-pg-file-settings.html (+2/-2)
doc/src/sgml/html/view-pg-group.html (+2/-2)
doc/src/sgml/html/view-pg-hba-file-rules.html (+2/-2)
doc/src/sgml/html/view-pg-indexes.html (+2/-2)
doc/src/sgml/html/view-pg-locks.html (+2/-2)
doc/src/sgml/html/view-pg-matviews.html (+2/-2)
doc/src/sgml/html/view-pg-policies.html (+2/-2)
doc/src/sgml/html/view-pg-prepared-statements.html (+2/-2)
doc/src/sgml/html/view-pg-prepared-xacts.html (+2/-2)
doc/src/sgml/html/view-pg-publication-tables.html (+2/-2)
doc/src/sgml/html/view-pg-replication-origin-status.html (+2/-2)
doc/src/sgml/html/view-pg-replication-slots.html (+2/-2)
doc/src/sgml/html/view-pg-roles.html (+2/-2)
doc/src/sgml/html/view-pg-rules.html (+2/-2)
doc/src/sgml/html/view-pg-seclabels.html (+2/-2)
doc/src/sgml/html/view-pg-sequences.html (+2/-2)
doc/src/sgml/html/view-pg-settings.html (+2/-2)
doc/src/sgml/html/view-pg-shadow.html (+2/-2)
doc/src/sgml/html/view-pg-stats-ext.html (+2/-2)
doc/src/sgml/html/view-pg-stats.html (+2/-2)
doc/src/sgml/html/view-pg-tables.html (+2/-2)
doc/src/sgml/html/view-pg-timezone-abbrevs.html (+2/-2)
doc/src/sgml/html/view-pg-timezone-names.html (+2/-2)
doc/src/sgml/html/view-pg-user-mappings.html (+2/-2)
doc/src/sgml/html/view-pg-user.html (+2/-2)
doc/src/sgml/html/view-pg-views.html (+2/-2)
doc/src/sgml/html/views-overview.html (+2/-2)
doc/src/sgml/html/wal-async-commit.html (+2/-2)
doc/src/sgml/html/wal-configuration.html (+2/-2)
doc/src/sgml/html/wal-internals.html (+2/-2)
doc/src/sgml/html/wal-intro.html (+2/-2)
doc/src/sgml/html/wal-reliability.html (+2/-2)
doc/src/sgml/html/wal.html (+2/-2)
doc/src/sgml/html/warm-standby-failover.html (+2/-2)
doc/src/sgml/html/warm-standby.html (+2/-2)
doc/src/sgml/html/when-can-parallel-query-be-used.html (+2/-2)
doc/src/sgml/html/xaggr.html (+2/-2)
doc/src/sgml/html/xfunc-c.html (+2/-2)
doc/src/sgml/html/xfunc-internal.html (+2/-2)
doc/src/sgml/html/xfunc-optimization.html (+2/-2)
doc/src/sgml/html/xfunc-overload.html (+2/-2)
doc/src/sgml/html/xfunc-pl.html (+2/-2)
doc/src/sgml/html/xfunc-sql.html (+2/-2)
doc/src/sgml/html/xfunc-volatility.html (+2/-2)
doc/src/sgml/html/xfunc.html (+2/-2)
doc/src/sgml/html/xindex.html (+2/-2)
doc/src/sgml/html/xml-limits-conformance.html (+2/-2)
doc/src/sgml/html/xml2.html (+2/-2)
doc/src/sgml/html/xoper-optimization.html (+3/-3)
doc/src/sgml/html/xoper.html (+2/-2)
doc/src/sgml/html/xplang-install.html (+2/-2)
doc/src/sgml/html/xplang.html (+2/-2)
doc/src/sgml/html/xproc.html (+2/-2)
doc/src/sgml/html/xtypes.html (+2/-2)
doc/src/sgml/libpq.sgml (+19/-7)
doc/src/sgml/maintenance.sgml (+29/-0)
doc/src/sgml/man1/clusterdb.1 (+4/-4)
doc/src/sgml/man1/createdb.1 (+4/-4)
doc/src/sgml/man1/createuser.1 (+4/-4)
doc/src/sgml/man1/dropdb.1 (+4/-4)
doc/src/sgml/man1/dropuser.1 (+4/-4)
doc/src/sgml/man1/ecpg.1 (+4/-4)
doc/src/sgml/man1/initdb.1 (+4/-4)
doc/src/sgml/man1/oid2name.1 (+4/-4)
doc/src/sgml/man1/pg_archivecleanup.1 (+4/-4)
doc/src/sgml/man1/pg_basebackup.1 (+4/-4)
doc/src/sgml/man1/pg_checksums.1 (+4/-4)
doc/src/sgml/man1/pg_config.1 (+4/-4)
doc/src/sgml/man1/pg_controldata.1 (+4/-4)
doc/src/sgml/man1/pg_ctl.1 (+4/-4)
doc/src/sgml/man1/pg_dump.1 (+4/-4)
doc/src/sgml/man1/pg_dumpall.1 (+4/-4)
doc/src/sgml/man1/pg_isready.1 (+4/-4)
doc/src/sgml/man1/pg_receivewal.1 (+4/-4)
doc/src/sgml/man1/pg_recvlogical.1 (+4/-4)
doc/src/sgml/man1/pg_resetwal.1 (+4/-4)
doc/src/sgml/man1/pg_restore.1 (+4/-4)
doc/src/sgml/man1/pg_rewind.1 (+5/-5)
doc/src/sgml/man1/pg_standby.1 (+4/-4)
doc/src/sgml/man1/pg_test_fsync.1 (+4/-4)
doc/src/sgml/man1/pg_test_timing.1 (+4/-4)
doc/src/sgml/man1/pg_upgrade.1 (+4/-4)
doc/src/sgml/man1/pg_waldump.1 (+4/-4)
doc/src/sgml/man1/pgbench.1 (+4/-4)
doc/src/sgml/man1/postgres.1 (+4/-4)
doc/src/sgml/man1/postmaster.1 (+4/-4)
doc/src/sgml/man1/psql.1 (+5/-5)
doc/src/sgml/man1/reindexdb.1 (+4/-4)
doc/src/sgml/man1/vacuumdb.1 (+4/-4)
doc/src/sgml/man1/vacuumlo.1 (+4/-4)
doc/src/sgml/man3/SPI_commit.3 (+4/-4)
doc/src/sgml/man3/SPI_connect.3 (+4/-4)
doc/src/sgml/man3/SPI_copytuple.3 (+4/-4)
doc/src/sgml/man3/SPI_cursor_close.3 (+4/-4)
doc/src/sgml/man3/SPI_cursor_fetch.3 (+4/-4)
doc/src/sgml/man3/SPI_cursor_find.3 (+4/-4)
doc/src/sgml/man3/SPI_cursor_move.3 (+4/-4)
doc/src/sgml/man3/SPI_cursor_open.3 (+4/-4)
doc/src/sgml/man3/SPI_cursor_open_with_args.3 (+4/-4)
doc/src/sgml/man3/SPI_cursor_open_with_paramlist.3 (+4/-4)
doc/src/sgml/man3/SPI_exec.3 (+4/-4)
doc/src/sgml/man3/SPI_execp.3 (+4/-4)
doc/src/sgml/man3/SPI_execute.3 (+4/-4)
doc/src/sgml/man3/SPI_execute_plan.3 (+4/-4)
doc/src/sgml/man3/SPI_execute_plan_with_paramlist.3 (+4/-4)
doc/src/sgml/man3/SPI_execute_with_args.3 (+4/-4)
doc/src/sgml/man3/SPI_finish.3 (+4/-4)
doc/src/sgml/man3/SPI_fname.3 (+4/-4)
doc/src/sgml/man3/SPI_fnumber.3 (+4/-4)
doc/src/sgml/man3/SPI_freeplan.3 (+4/-4)
doc/src/sgml/man3/SPI_freetuple.3 (+4/-4)
doc/src/sgml/man3/SPI_freetuptable.3 (+4/-4)
doc/src/sgml/man3/SPI_getargcount.3 (+4/-4)
doc/src/sgml/man3/SPI_getargtypeid.3 (+4/-4)
doc/src/sgml/man3/SPI_getbinval.3 (+4/-4)
doc/src/sgml/man3/SPI_getnspname.3 (+4/-4)
doc/src/sgml/man3/SPI_getrelname.3 (+4/-4)
doc/src/sgml/man3/SPI_gettype.3 (+4/-4)
doc/src/sgml/man3/SPI_gettypeid.3 (+4/-4)
doc/src/sgml/man3/SPI_getvalue.3 (+4/-4)
doc/src/sgml/man3/SPI_is_cursor_plan.3 (+4/-4)
doc/src/sgml/man3/SPI_keepplan.3 (+4/-4)
doc/src/sgml/man3/SPI_modifytuple.3 (+4/-4)
doc/src/sgml/man3/SPI_palloc.3 (+4/-4)
doc/src/sgml/man3/SPI_pfree.3 (+4/-4)
doc/src/sgml/man3/SPI_prepare.3 (+4/-4)
doc/src/sgml/man3/SPI_prepare_cursor.3 (+4/-4)
doc/src/sgml/man3/SPI_prepare_params.3 (+4/-4)
doc/src/sgml/man3/SPI_register_relation.3 (+4/-4)
doc/src/sgml/man3/SPI_register_trigger_data.3 (+4/-4)
doc/src/sgml/man3/SPI_repalloc.3 (+4/-4)
doc/src/sgml/man3/SPI_result_code_string.3 (+4/-4)
doc/src/sgml/man3/SPI_returntuple.3 (+4/-4)
doc/src/sgml/man3/SPI_rollback.3 (+4/-4)
doc/src/sgml/man3/SPI_saveplan.3 (+4/-4)
doc/src/sgml/man3/SPI_scroll_cursor_fetch.3 (+4/-4)
doc/src/sgml/man3/SPI_scroll_cursor_move.3 (+4/-4)
doc/src/sgml/man3/SPI_start_transaction.3 (+4/-4)
doc/src/sgml/man3/SPI_unregister_relation.3 (+4/-4)
doc/src/sgml/man3/dblink.3 (+4/-4)
doc/src/sgml/man3/dblink_build_sql_delete.3 (+4/-4)
doc/src/sgml/man3/dblink_build_sql_insert.3 (+4/-4)
doc/src/sgml/man3/dblink_build_sql_update.3 (+4/-4)
doc/src/sgml/man3/dblink_cancel_query.3 (+4/-4)
doc/src/sgml/man3/dblink_close.3 (+4/-4)
doc/src/sgml/man3/dblink_connect.3 (+4/-4)
doc/src/sgml/man3/dblink_connect_u.3 (+4/-4)
doc/src/sgml/man3/dblink_disconnect.3 (+4/-4)
doc/src/sgml/man3/dblink_error_message.3 (+4/-4)
doc/src/sgml/man3/dblink_exec.3 (+4/-4)
doc/src/sgml/man3/dblink_fetch.3 (+4/-4)
doc/src/sgml/man3/dblink_get_connections.3 (+4/-4)
doc/src/sgml/man3/dblink_get_notify.3 (+4/-4)
doc/src/sgml/man3/dblink_get_pkey.3 (+4/-4)
doc/src/sgml/man3/dblink_get_result.3 (+4/-4)
doc/src/sgml/man3/dblink_is_busy.3 (+4/-4)
doc/src/sgml/man3/dblink_open.3 (+4/-4)
doc/src/sgml/man3/dblink_send_query.3 (+4/-4)
doc/src/sgml/man7/ABORT.7 (+4/-4)
doc/src/sgml/man7/ALTER_AGGREGATE.7 (+4/-4)
doc/src/sgml/man7/ALTER_COLLATION.7 (+4/-4)
doc/src/sgml/man7/ALTER_CONVERSION.7 (+4/-4)
doc/src/sgml/man7/ALTER_DATABASE.7 (+4/-4)
doc/src/sgml/man7/ALTER_DEFAULT_PRIVILEGES.7 (+4/-4)
doc/src/sgml/man7/ALTER_DOMAIN.7 (+4/-4)
doc/src/sgml/man7/ALTER_EVENT_TRIGGER.7 (+4/-4)
doc/src/sgml/man7/ALTER_EXTENSION.7 (+4/-4)
doc/src/sgml/man7/ALTER_FOREIGN_DATA_WRAPPER.7 (+4/-4)
doc/src/sgml/man7/ALTER_FOREIGN_TABLE.7 (+4/-4)
doc/src/sgml/man7/ALTER_FUNCTION.7 (+4/-4)
doc/src/sgml/man7/ALTER_GROUP.7 (+4/-4)
doc/src/sgml/man7/ALTER_INDEX.7 (+4/-4)
doc/src/sgml/man7/ALTER_LANGUAGE.7 (+4/-4)
doc/src/sgml/man7/ALTER_LARGE_OBJECT.7 (+4/-4)
doc/src/sgml/man7/ALTER_MATERIALIZED_VIEW.7 (+5/-4)
doc/src/sgml/man7/ALTER_OPERATOR.7 (+4/-4)
doc/src/sgml/man7/ALTER_OPERATOR_CLASS.7 (+4/-4)
doc/src/sgml/man7/ALTER_OPERATOR_FAMILY.7 (+4/-4)
doc/src/sgml/man7/ALTER_POLICY.7 (+4/-4)
doc/src/sgml/man7/ALTER_PROCEDURE.7 (+4/-4)
doc/src/sgml/man7/ALTER_PUBLICATION.7 (+4/-4)
doc/src/sgml/man7/ALTER_ROLE.7 (+4/-4)
doc/src/sgml/man7/ALTER_ROUTINE.7 (+4/-4)
doc/src/sgml/man7/ALTER_RULE.7 (+4/-4)
doc/src/sgml/man7/ALTER_SCHEMA.7 (+4/-4)
doc/src/sgml/man7/ALTER_SEQUENCE.7 (+4/-4)
doc/src/sgml/man7/ALTER_SERVER.7 (+4/-4)
doc/src/sgml/man7/ALTER_STATISTICS.7 (+4/-4)
doc/src/sgml/man7/ALTER_SUBSCRIPTION.7 (+4/-4)
doc/src/sgml/man7/ALTER_SYSTEM.7 (+4/-4)
doc/src/sgml/man7/ALTER_TABLE.7 (+5/-5)
doc/src/sgml/man7/ALTER_TABLESPACE.7 (+4/-4)
doc/src/sgml/man7/ALTER_TEXT_SEARCH_CONFIGURATION.7 (+4/-4)
doc/src/sgml/man7/ALTER_TEXT_SEARCH_DICTIONARY.7 (+4/-4)
doc/src/sgml/man7/ALTER_TEXT_SEARCH_PARSER.7 (+4/-4)
doc/src/sgml/man7/ALTER_TEXT_SEARCH_TEMPLATE.7 (+4/-4)
doc/src/sgml/man7/ALTER_TRIGGER.7 (+4/-4)
doc/src/sgml/man7/ALTER_TYPE.7 (+4/-4)
doc/src/sgml/man7/ALTER_USER.7 (+4/-4)
doc/src/sgml/man7/ALTER_USER_MAPPING.7 (+4/-4)
doc/src/sgml/man7/ALTER_VIEW.7 (+4/-4)
doc/src/sgml/man7/ANALYZE.7 (+18/-6)
doc/src/sgml/man7/BEGIN.7 (+4/-4)
doc/src/sgml/man7/CALL.7 (+4/-4)
doc/src/sgml/man7/CHECKPOINT.7 (+4/-4)
doc/src/sgml/man7/CLOSE.7 (+4/-4)
doc/src/sgml/man7/CLUSTER.7 (+4/-4)
doc/src/sgml/man7/COMMENT.7 (+4/-4)
doc/src/sgml/man7/COMMIT.7 (+4/-4)
doc/src/sgml/man7/COMMIT_PREPARED.7 (+4/-4)
doc/src/sgml/man7/COPY.7 (+4/-4)
doc/src/sgml/man7/CREATE_ACCESS_METHOD.7 (+4/-4)
doc/src/sgml/man7/CREATE_AGGREGATE.7 (+4/-4)
doc/src/sgml/man7/CREATE_CAST.7 (+4/-4)
doc/src/sgml/man7/CREATE_COLLATION.7 (+4/-4)
doc/src/sgml/man7/CREATE_CONVERSION.7 (+4/-4)
doc/src/sgml/man7/CREATE_DATABASE.7 (+4/-4)
doc/src/sgml/man7/CREATE_DOMAIN.7 (+4/-4)
doc/src/sgml/man7/CREATE_EVENT_TRIGGER.7 (+4/-4)
doc/src/sgml/man7/CREATE_EXTENSION.7 (+4/-4)
doc/src/sgml/man7/CREATE_FOREIGN_DATA_WRAPPER.7 (+4/-4)
doc/src/sgml/man7/CREATE_FOREIGN_TABLE.7 (+4/-4)
doc/src/sgml/man7/CREATE_FUNCTION.7 (+4/-4)
doc/src/sgml/man7/CREATE_GROUP.7 (+4/-4)
doc/src/sgml/man7/CREATE_INDEX.7 (+4/-4)
doc/src/sgml/man7/CREATE_LANGUAGE.7 (+4/-4)
doc/src/sgml/man7/CREATE_MATERIALIZED_VIEW.7 (+4/-4)
doc/src/sgml/man7/CREATE_OPERATOR.7 (+4/-4)
doc/src/sgml/man7/CREATE_OPERATOR_CLASS.7 (+4/-4)
doc/src/sgml/man7/CREATE_OPERATOR_FAMILY.7 (+4/-4)
doc/src/sgml/man7/CREATE_POLICY.7 (+4/-4)
doc/src/sgml/man7/CREATE_PROCEDURE.7 (+4/-4)
doc/src/sgml/man7/CREATE_PUBLICATION.7 (+4/-4)
doc/src/sgml/man7/CREATE_ROLE.7 (+4/-4)
doc/src/sgml/man7/CREATE_RULE.7 (+4/-4)
doc/src/sgml/man7/CREATE_SCHEMA.7 (+4/-4)
doc/src/sgml/man7/CREATE_SEQUENCE.7 (+4/-4)
doc/src/sgml/man7/CREATE_SERVER.7 (+4/-4)
doc/src/sgml/man7/CREATE_STATISTICS.7 (+4/-4)
doc/src/sgml/man7/CREATE_SUBSCRIPTION.7 (+4/-4)
doc/src/sgml/man7/CREATE_TABLE.7 (+4/-4)
doc/src/sgml/man7/CREATE_TABLESPACE.7 (+4/-4)
doc/src/sgml/man7/CREATE_TABLE_AS.7 (+4/-4)
doc/src/sgml/man7/CREATE_TEXT_SEARCH_CONFIGURATION.7 (+4/-4)
doc/src/sgml/man7/CREATE_TEXT_SEARCH_DICTIONARY.7 (+4/-4)
doc/src/sgml/man7/CREATE_TEXT_SEARCH_PARSER.7 (+4/-4)
doc/src/sgml/man7/CREATE_TEXT_SEARCH_TEMPLATE.7 (+4/-4)
doc/src/sgml/man7/CREATE_TRANSFORM.7 (+4/-4)
doc/src/sgml/man7/CREATE_TRIGGER.7 (+4/-4)
doc/src/sgml/man7/CREATE_TYPE.7 (+4/-4)
doc/src/sgml/man7/CREATE_USER.7 (+4/-4)
doc/src/sgml/man7/CREATE_USER_MAPPING.7 (+4/-4)
doc/src/sgml/man7/CREATE_VIEW.7 (+4/-4)
doc/src/sgml/man7/DEALLOCATE.7 (+4/-4)
doc/src/sgml/man7/DECLARE.7 (+4/-4)
doc/src/sgml/man7/DELETE.7 (+4/-4)
doc/src/sgml/man7/DISCARD.7 (+4/-4)
doc/src/sgml/man7/DO.7 (+4/-4)
doc/src/sgml/man7/DROP_ACCESS_METHOD.7 (+4/-4)
doc/src/sgml/man7/DROP_AGGREGATE.7 (+4/-4)
doc/src/sgml/man7/DROP_CAST.7 (+4/-4)
doc/src/sgml/man7/DROP_COLLATION.7 (+4/-4)
doc/src/sgml/man7/DROP_CONVERSION.7 (+4/-4)
doc/src/sgml/man7/DROP_DATABASE.7 (+4/-4)
doc/src/sgml/man7/DROP_DOMAIN.7 (+4/-4)
doc/src/sgml/man7/DROP_EVENT_TRIGGER.7 (+4/-4)
doc/src/sgml/man7/DROP_EXTENSION.7 (+4/-4)
doc/src/sgml/man7/DROP_FOREIGN_DATA_WRAPPER.7 (+4/-4)
doc/src/sgml/man7/DROP_FOREIGN_TABLE.7 (+4/-4)
doc/src/sgml/man7/DROP_FUNCTION.7 (+4/-4)
doc/src/sgml/man7/DROP_GROUP.7 (+4/-4)
doc/src/sgml/man7/DROP_INDEX.7 (+4/-4)
doc/src/sgml/man7/DROP_LANGUAGE.7 (+4/-4)
doc/src/sgml/man7/DROP_MATERIALIZED_VIEW.7 (+4/-4)
doc/src/sgml/man7/DROP_OPERATOR.7 (+4/-4)
doc/src/sgml/man7/DROP_OPERATOR_CLASS.7 (+4/-4)
doc/src/sgml/man7/DROP_OPERATOR_FAMILY.7 (+4/-4)
doc/src/sgml/man7/DROP_OWNED.7 (+4/-4)
doc/src/sgml/man7/DROP_POLICY.7 (+4/-4)
doc/src/sgml/man7/DROP_PROCEDURE.7 (+4/-4)
doc/src/sgml/man7/DROP_PUBLICATION.7 (+4/-4)
doc/src/sgml/man7/DROP_ROLE.7 (+4/-4)
doc/src/sgml/man7/DROP_ROUTINE.7 (+4/-4)
doc/src/sgml/man7/DROP_RULE.7 (+4/-4)
doc/src/sgml/man7/DROP_SCHEMA.7 (+4/-4)
doc/src/sgml/man7/DROP_SEQUENCE.7 (+4/-4)
doc/src/sgml/man7/DROP_SERVER.7 (+4/-4)
doc/src/sgml/man7/DROP_STATISTICS.7 (+4/-4)
doc/src/sgml/man7/DROP_SUBSCRIPTION.7 (+4/-4)
doc/src/sgml/man7/DROP_TABLE.7 (+4/-4)
doc/src/sgml/man7/DROP_TABLESPACE.7 (+4/-4)
doc/src/sgml/man7/DROP_TEXT_SEARCH_CONFIGURATION.7 (+4/-4)
doc/src/sgml/man7/DROP_TEXT_SEARCH_DICTIONARY.7 (+4/-4)
doc/src/sgml/man7/DROP_TEXT_SEARCH_PARSER.7 (+4/-4)
doc/src/sgml/man7/DROP_TEXT_SEARCH_TEMPLATE.7 (+4/-4)
doc/src/sgml/man7/DROP_TRANSFORM.7 (+4/-4)
doc/src/sgml/man7/DROP_TRIGGER.7 (+4/-4)
doc/src/sgml/man7/DROP_TYPE.7 (+4/-4)
doc/src/sgml/man7/DROP_USER.7 (+4/-4)
doc/src/sgml/man7/DROP_USER_MAPPING.7 (+4/-4)
doc/src/sgml/man7/DROP_VIEW.7 (+4/-4)
doc/src/sgml/man7/END.7 (+4/-4)
doc/src/sgml/man7/EXECUTE.7 (+4/-4)
doc/src/sgml/man7/EXPLAIN.7 (+4/-4)
doc/src/sgml/man7/FETCH.7 (+4/-4)
doc/src/sgml/man7/GRANT.7 (+4/-4)
doc/src/sgml/man7/IMPORT_FOREIGN_SCHEMA.7 (+4/-4)
doc/src/sgml/man7/INSERT.7 (+4/-4)
doc/src/sgml/man7/LISTEN.7 (+4/-4)
doc/src/sgml/man7/LOAD.7 (+4/-4)
doc/src/sgml/man7/LOCK.7 (+4/-4)
doc/src/sgml/man7/MOVE.7 (+4/-4)
doc/src/sgml/man7/NOTIFY.7 (+4/-4)
doc/src/sgml/man7/PREPARE.7 (+4/-4)
doc/src/sgml/man7/PREPARE_TRANSACTION.7 (+4/-4)
doc/src/sgml/man7/REASSIGN_OWNED.7 (+4/-4)
doc/src/sgml/man7/REFRESH_MATERIALIZED_VIEW.7 (+4/-4)
doc/src/sgml/man7/REINDEX.7 (+4/-4)
doc/src/sgml/man7/RELEASE_SAVEPOINT.7 (+4/-4)
doc/src/sgml/man7/RESET.7 (+4/-4)
doc/src/sgml/man7/REVOKE.7 (+4/-4)
doc/src/sgml/man7/ROLLBACK.7 (+4/-4)
doc/src/sgml/man7/ROLLBACK_PREPARED.7 (+4/-4)
doc/src/sgml/man7/ROLLBACK_TO_SAVEPOINT.7 (+4/-4)
doc/src/sgml/man7/SAVEPOINT.7 (+4/-4)
doc/src/sgml/man7/SECURITY_LABEL.7 (+4/-4)
doc/src/sgml/man7/SELECT.7 (+4/-4)
doc/src/sgml/man7/SELECT_INTO.7 (+4/-4)
doc/src/sgml/man7/SET.7 (+4/-4)
doc/src/sgml/man7/SET_CONSTRAINTS.7 (+4/-4)
doc/src/sgml/man7/SET_ROLE.7 (+4/-4)
doc/src/sgml/man7/SET_SESSION_AUTHORIZATION.7 (+4/-4)
doc/src/sgml/man7/SET_TRANSACTION.7 (+4/-4)
doc/src/sgml/man7/SHOW.7 (+4/-4)
doc/src/sgml/man7/START_TRANSACTION.7 (+4/-4)
doc/src/sgml/man7/TRUNCATE.7 (+4/-4)
doc/src/sgml/man7/UNLISTEN.7 (+4/-4)
doc/src/sgml/man7/UPDATE.7 (+4/-4)
doc/src/sgml/man7/VACUUM.7 (+4/-4)
doc/src/sgml/man7/VALUES.7 (+4/-4)
doc/src/sgml/monitoring.sgml (+6/-1)
doc/src/sgml/postgres-fdw.sgml (+4/-3)
doc/src/sgml/ref/alter_materialized_view.sgml (+1/-0)
doc/src/sgml/ref/alter_table.sgml (+5/-4)
doc/src/sgml/ref/analyze.sgml (+29/-3)
doc/src/sgml/ref/pg_rewind.sgml (+2/-2)
doc/src/sgml/release-12.sgml (+930/-0)
doc/src/sgml/runtime.sgml (+4/-4)
doc/src/sgml/textsearch.sgml (+8/-2)
src/backend/access/brin/brin.c (+28/-1)
src/backend/access/heap/heapam.c (+151/-72)
src/backend/access/heap/heapam_handler.c (+7/-8)
src/backend/access/heap/heapam_visibility.c (+2/-2)
src/backend/access/transam/clog.c (+3/-2)
src/backend/access/transam/twophase.c (+3/-0)
src/backend/access/transam/xact.c (+4/-2)
src/backend/access/transam/xlog.c (+22/-7)
src/backend/bootstrap/bootparse.c (+588/-675)
src/backend/catalog/index.c (+51/-14)
src/backend/catalog/namespace.c (+3/-0)
src/backend/catalog/storage.c (+25/-1)
src/backend/commands/cluster.c (+27/-13)
src/backend/commands/copy.c (+1/-1)
src/backend/commands/functioncmds.c (+3/-2)
src/backend/commands/indexcmds.c (+85/-13)
src/backend/commands/matview.c (+11/-19)
src/backend/commands/tablecmds.c (+43/-18)
src/backend/executor/execExpr.c (+4/-4)
src/backend/executor/execExprInterp.c (+33/-39)
src/backend/executor/execTuples.c (+13/-24)
src/backend/executor/nodeIndexscan.c (+5/-1)
src/backend/jit/llvm/Makefile (+6/-0)
src/backend/jit/llvm/llvmjit_error.cpp (+30/-5)
src/backend/jit/llvm/llvmjit_inline.cpp (+11/-1)
src/backend/libpq/be-secure-common.c (+13/-15)
src/backend/nodes/copyfuncs.c (+21/-33)
src/backend/nodes/nodeFuncs.c (+2/-0)
src/backend/optimizer/path/allpaths.c (+2/-1)
src/backend/optimizer/path/costsize.c (+6/-0)
src/backend/optimizer/plan/createplan.c (+18/-1)
src/backend/optimizer/plan/subselect.c (+19/-19)
src/backend/parser/analyze.c (+7/-14)
src/backend/parser/gram.c (+10041/-9592)
src/backend/parser/gram.h (+476/-471)
src/backend/parser/parse_utilcmd.c (+1/-1)
src/backend/po/de.po (+696/-681)
src/backend/po/fr.po (+708/-696)
src/backend/po/ru.po (+698/-686)
src/backend/po/sv.po (+804/-784)
src/backend/postmaster/pgstat.c (+3/-0)
src/backend/postmaster/postmaster.c (+1/-1)
src/backend/replication/logical/launcher.c (+4/-4)
src/backend/replication/logical/tablesync.c (+17/-4)
src/backend/replication/repl_gram.c (+579/-659)
src/backend/replication/syncrep_gram.c (+370/-496)
src/backend/storage/buffer/bufmgr.c (+3/-1)
src/backend/storage/ipc/latch.c (+1/-1)
src/backend/storage/ipc/procarray.c (+84/-18)
src/backend/storage/ipc/shm_mq.c (+5/-2)
src/backend/storage/ipc/standby.c (+12/-10)
src/backend/storage/lmgr/proc.c (+2/-2)
src/backend/storage/sync/sync.c (+16/-2)
src/backend/tcop/postgres.c (+11/-1)
src/backend/utils/adt/jsonpath_gram.c (+883/-645)
src/backend/utils/adt/numeric.c (+8/-0)
src/backend/utils/adt/ruleutils.c (+7/-3)
src/backend/utils/adt/xml.c (+2/-2)
src/backend/utils/cache/inval.c (+1/-1)
src/backend/utils/cache/relcache.c (+1/-1)
src/backend/utils/init/miscinit.c (+23/-9)
src/backend/utils/misc/guc.c (+1/-1)
src/backend/utils/sort/tuplesort.c (+3/-1)
src/backend/utils/time/snapmgr.c (+6/-4)
src/bin/initdb/po/ru.po (+9/-9)
src/bin/initdb/po/sv.po (+1/-1)
src/bin/pg_archivecleanup/po/sv.po (+1/-1)
src/bin/pg_basebackup/po/sv.po (+149/-144)
src/bin/pg_basebackup/t/010_pg_basebackup.pl (+11/-22)
src/bin/pg_checksums/po/sv.po (+1/-1)
src/bin/pg_checksums/t/002_actions.pl (+2/-8)
src/bin/pg_config/po/ru.po (+9/-9)
src/bin/pg_config/po/sv.po (+1/-1)
src/bin/pg_controldata/po/sv.po (+1/-1)
src/bin/pg_ctl/pg_ctl.c (+80/-48)
src/bin/pg_ctl/po/ru.po (+150/-150)
src/bin/pg_ctl/po/sv.po (+142/-142)
src/bin/pg_ctl/t/001_start_stop.pl (+1/-10)
src/bin/pg_ctl/t/004_logrotate.pl (+1/-1)
src/bin/pg_dump/Makefile (+1/-1)
src/bin/pg_dump/po/ru.po (+9/-9)
src/bin/pg_dump/po/sv.po (+224/-204)
src/bin/pg_dump/t/002_pg_dump.pl (+2/-1)
src/bin/pg_resetwal/po/sv.po (+1/-1)
src/bin/pg_rewind/parsexlog.c (+5/-1)
src/bin/pg_rewind/po/de.po (+75/-70)
src/bin/pg_rewind/po/fr.po (+194/-189)
src/bin/pg_rewind/po/ru.po (+19/-13)
src/bin/pg_rewind/po/sv.po (+18/-13)
src/bin/pg_rewind/t/RewindTest.pm (+0/-1)
src/bin/pg_test_fsync/po/sv.po (+1/-1)
src/bin/pg_test_timing/po/sv.po (+1/-1)
src/bin/pg_upgrade/po/sv.po (+1/-1)
src/bin/pg_waldump/pg_waldump.c (+6/-9)
src/bin/pg_waldump/po/ru.po (+47/-47)
src/bin/pg_waldump/po/sv.po (+1/-1)
src/bin/pgbench/exprparse.c (+576/-667)
src/bin/psql/po/ru.po (+759/-758)
src/bin/psql/po/sv.po (+1/-1)
src/bin/psql/sql_help.c (+3/-1)
src/bin/scripts/po/ru.po (+5/-5)
src/bin/scripts/po/sv.po (+11/-21)
src/bin/scripts/t/080_pg_isready.pl (+2/-2)
src/common/exec.c (+5/-0)
src/fe_utils/print.c (+2/-1)
src/include/access/heapam.h (+3/-0)
src/include/nodes/pathnodes.h (+2/-1)
src/include/pg_config.h.in (+3/-0)
src/include/pg_config.h.win32 (+4/-4)
src/include/pgstat.h (+2/-1)
src/include/storage/block.h (+1/-1)
src/include/storage/proc.h (+14/-2)
src/include/storage/procarray.h (+5/-1)
src/include/utils/relptr.h (+15/-2)
src/interfaces/ecpg/Makefile (+1/-0)
src/interfaces/ecpg/ecpglib/po/sv.po (+1/-1)
src/interfaces/ecpg/preproc/po/sv.po (+1/-1)
src/interfaces/ecpg/preproc/preproc.c (+14506/-13885)
src/interfaces/ecpg/preproc/preproc.h (+551/-546)
src/interfaces/libpq/fe-exec.c (+7/-3)
src/interfaces/libpq/fe-secure-openssl.c (+38/-4)
src/interfaces/libpq/libpq-dist.rc (+4/-4)
src/interfaces/libpq/libpq.rc.in (+4/-4)
src/interfaces/libpq/po/de.po (+40/-30)
src/interfaces/libpq/po/fr.po (+84/-70)
src/interfaces/libpq/po/ru.po (+49/-34)
src/interfaces/libpq/po/sv.po (+78/-68)
src/pl/plperl/GNUmakefile (+1/-1)
src/pl/plperl/plperl.c (+31/-2)
src/pl/plperl/po/ru.po (+44/-44)
src/pl/plperl/po/sv.po (+44/-44)
src/pl/plperl/ppport.h (+8/-0)
src/pl/plpgsql/src/pl_gram.c (+1230/-1378)
src/pl/plpgsql/src/pl_gram.h (+140/-135)
src/pl/plpgsql/src/po/sv.po (+1/-1)
src/pl/plpython/Makefile (+1/-1)
src/pl/plpython/po/sv.po (+1/-1)
src/pl/tcl/Makefile (+1/-1)
src/pl/tcl/po/sv.po (+1/-1)
src/port/win32ver.rc (+2/-2)
src/test/isolation/expected/partition-drop-index-locking.out (+100/-0)
src/test/isolation/expected/temp-schema-cleanup.out (+115/-0)
src/test/isolation/isolation_schedule (+2/-0)
src/test/isolation/specparse.c (+472/-580)
src/test/isolation/specs/partition-drop-index-locking.spec (+47/-0)
src/test/isolation/specs/temp-schema-cleanup.spec (+85/-0)
src/test/perl/PostgreSQL/Test/Cluster.pm (+16/-0)
src/test/perl/PostgreSQL/Test/Utils.pm (+45/-0)
src/test/perl/PostgresNode.pm (+93/-23)
src/test/perl/TestLib.pm (+75/-34)
src/test/recovery/t/002_archiving.pl (+25/-3)
src/test/recovery/t/006_logical_decoding.pl (+2/-2)
src/test/recovery/t/010_logical_decoding_timelines.pl (+2/-2)
src/test/recovery/t/013_crash_restart.pl (+11/-37)
src/test/recovery/t/014_unlogged_reinit.pl (+1/-3)
src/test/recovery/t/017_shm.pl (+8/-7)
src/test/recovery/t/025_stuck_on_old_timeline.pl (+1/-1)
src/test/recovery/t/026_overwrite_contrecord.pl (+4/-1)
src/test/recovery/t/031_recovery_conflict.pl (+377/-0)
src/test/recovery/t/cp_history_files (+0/-7)
src/test/regress/expected/cluster.out (+14/-0)
src/test/regress/expected/create_index.out (+27/-0)
src/test/regress/expected/gist.out (+16/-0)
src/test/regress/expected/groupingsets.out (+45/-0)
src/test/regress/expected/privileges.out (+74/-0)
src/test/regress/expected/rowtypes.out (+2/-21)
src/test/regress/expected/select.out (+7/-0)
src/test/regress/expected/timestamp.out (+60/-0)
src/test/regress/expected/timestamptz.out (+60/-0)
src/test/regress/expected/vacuum.out (+3/-3)
src/test/regress/expected/with.out (+64/-0)
src/test/regress/expected/xmlmap.out (+496/-432)
src/test/regress/expected/xmlmap_1.out (+8/-2)
src/test/regress/sql/cluster.sql (+6/-0)
src/test/regress/sql/create_index.sql (+4/-0)
src/test/regress/sql/gist.sql (+5/-0)
src/test/regress/sql/groupingsets.sql (+9/-0)
src/test/regress/sql/privileges.sql (+64/-0)
src/test/regress/sql/rowtypes.sql (+2/-4)
src/test/regress/sql/select.sql (+5/-0)
src/test/regress/sql/timestamp.sql (+14/-0)
src/test/regress/sql/timestamptz.sql (+14/-0)
src/test/regress/sql/vacuum.sql (+3/-3)
src/test/regress/sql/with.sql (+31/-0)
src/test/regress/sql/xmlmap.sql (+8/-2)
src/test/ssl/t/001_ssltests.pl (+15/-10)
src/timezone/data/tzdata.zi (+18/-16)
Reviewer Review Type Date Requested Status
Athos Ribeiro (community) Approve
Canonical Server packageset reviewers Pending
Canonical Server Pending
Review via email: mp+422794@code.launchpad.net

Commit message

This is the MRE for postgresql-12 on Focal (bug #1973627).

I've created a bileto ticket for this change; you can find it here:

https://bileto.ubuntu.com/#/ticket/4848

and the corresponding PPA is here:

https://launchpad.net/~ci-train-ppa-service/+archive/ubuntu/4848/+packages

The builds are still being published, and I'm not sure if bileto is triggering the dep8 tests or not (last time it wasn't), but I'm creating this MP now to get the review out of the way. If there are any dep8 failures I will address them later.

This update contains a CVE fix, which means that it will be uploaded to the security pocket.

To post a comment you must log in.
Revision history for this message
Athos Ribeiro (athos-ribeiro) wrote :

The changes LGTM!

Let's keep an eye on test re-triggers and verify the failures now.

review: Approve
Revision history for this message
Athos Ribeiro (athos-ribeiro) wrote :

None of the failures present in the related bileto ticket are regressions. We are clear to proceed here.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/.gitrevision b/.gitrevision
2index 89069ff..4c2cc76 100644
3--- a/.gitrevision
4+++ b/.gitrevision
5@@ -1 +1 @@
6-ec24521950fb055488e3ab2c652ffbf7fe0180b9
7+f4206b3e5f816bcc45511411bb208d21a68a7e6a
8diff --git a/INSTALL b/INSTALL
9index a263d3e..fec25a3 100644
10--- a/INSTALL
11+++ b/INSTALL
12@@ -1,4 +1,3 @@
13-
14 PostgreSQL Installation from Source Code
15
16 ------------------------------------------------------------------------
17@@ -12,7 +11,6 @@ with Microsoft's Visual C++, see the main documentation instead.
18
19 ------------------------------------------------------------------------
20
21-
22 Short Version
23
24 ./configure
25@@ -32,7 +30,6 @@ The long version is the rest of this document.
26
27 ------------------------------------------------------------------------
28
29-
30 Requirements
31
32 In general, a modern Unix-compatible platform should be able to run
33@@ -164,10 +161,9 @@ the "df" command to check free disk space.
34
35 ------------------------------------------------------------------------
36
37-
38 Installation Procedure
39
40-1. CONFIGURATION
41+1. Configuration
42
43 The first step of the installation procedure is to configure the
44 source tree for your system and choose the options you would like.
45@@ -279,7 +275,7 @@ Installation Procedure
46 The HTML-formatted documentation for PostgreSQL will be
47 installed under this directory. The default is "DATAROOTDIR".
48
49- NOTE:
50+ Note:
51
52 Care has been taken to make it possible to install PostgreSQL into
53 shared installation locations (such as "/usr/local/include") without
54@@ -821,7 +817,7 @@ Installation Procedure
55 export COPT='-Werror'
56 make
57
58- NOTE:
59+ Note:
60
61 When developing code inside the server, it is recommended to use the
62 configure options "--enable-cassert" (which turns on many run-time
63@@ -844,7 +840,7 @@ Installation Procedure
64 for one-time flag adjustments, while COPT might be kept set all the
65 time.
66
67-2. BUILD
68+2. Build
69
70 To start the build, type either of:
71
72@@ -882,7 +878,7 @@ Installation Procedure
73 Failure to do that can lead to strange error messages, typically
74 about missing header files.
75
76-3. REGRESSION TESTS
77+3. Regression Tests
78
79 If you want to test the newly built server before you install it,
80 you can run the regression tests at this point. The regression tests
81@@ -896,9 +892,9 @@ Installation Procedure
82 information about interpreting the test results. You can repeat this
83 test at any later time by issuing the same command.
84
85-4. INSTALLING THE FILES
86+4. Installing the Files
87
88- NOTE:
89+ Note:
90
91 If you are upgrading an existing system be sure to read the
92 documentation, which has instructions about upgrading a cluster.
93@@ -945,7 +941,7 @@ Installation Procedure
94 command was needed for the latter, but this step has been folded
95 into the standard install.)
96
97- CLIENT-ONLY INSTALLATION: If you want to install only the client
98+ Client-only installation: If you want to install only the client
99 applications and interface libraries, then you can use these
100 commands:
101
102@@ -957,10 +953,10 @@ Installation Procedure
103 "src/bin" has a few binaries for server-only use, but they are
104 small.
105
106-UNINSTALLATION: To undo the installation use the command "make
107+Uninstallation: To undo the installation use the command "make
108 uninstall". However, this will not remove any created directories.
109
110-CLEANING: After the installation you can free disk space by removing
111+Cleaning: After the installation you can free disk space by removing
112 the built files from the source tree with the command "make clean". This
113 will preserve the files made by the "configure" program, so that you can
114 rebuild everything with "make" later on. To reset the source tree to the
115@@ -979,7 +975,6 @@ need to.
116
117 ------------------------------------------------------------------------
118
119-
120 Post-Installation Setup
121
122 ------------------------------------------------------------------------
123@@ -1073,7 +1068,6 @@ communicated via command line options to most client programs.
124
125 ------------------------------------------------------------------------
126
127-
128 Getting Started
129
130 The following is a quick summary of how to get PostgreSQL up and running
131@@ -1129,7 +1123,6 @@ once installed. The main documentation contains more information.
132
133 ------------------------------------------------------------------------
134
135-
136 What Now?
137
138 - The PostgreSQL distribution contains a comprehensive documentation
139@@ -1164,7 +1157,6 @@ What Now?
140
141 ------------------------------------------------------------------------
142
143-
144 Supported Platforms
145
146 A platform (that is, a CPU architecture and operating system
147@@ -1203,7 +1195,6 @@ the appropriate place to discuss that.
148
149 ------------------------------------------------------------------------
150
151-
152 Platform-Specific Notes
153
154 This section documents additional platform-specific issues regarding the
155diff --git a/config/c-compiler.m4 b/config/c-compiler.m4
156index 71b6458..8b31675 100644
157--- a/config/c-compiler.m4
158+++ b/config/c-compiler.m4
159@@ -396,6 +396,28 @@ fi])# PGAC_CHECK_BUILTIN_FUNC
160
161
162
163+# PGAC_CHECK_BUILTIN_FUNC_PTR
164+# -----------------------
165+# Like PGAC_CHECK_BUILTIN_FUNC, except that the function is assumed to
166+# return a pointer type, and the argument(s) should be given literally.
167+# This handles some cases that PGAC_CHECK_BUILTIN_FUNC doesn't.
168+AC_DEFUN([PGAC_CHECK_BUILTIN_FUNC_PTR],
169+[AC_CACHE_CHECK(for $1, pgac_cv$1,
170+[AC_LINK_IFELSE([AC_LANG_PROGRAM([
171+void *
172+call$1(void)
173+{
174+ return $1($2);
175+}], [])],
176+[pgac_cv$1=yes],
177+[pgac_cv$1=no])])
178+if test x"${pgac_cv$1}" = xyes ; then
179+AC_DEFINE_UNQUOTED(AS_TR_CPP([HAVE$1]), 1,
180+ [Define to 1 if your compiler understands $1.])
181+fi])# PGAC_CHECK_BUILTIN_FUNC_PTR
182+
183+
184+
185 # PGAC_PROG_VARCC_VARFLAGS_OPT
186 # -----------------------
187 # Given a compiler, variable name and a string, check if the compiler
188diff --git a/configure b/configure
189index 43ba1ca..d2cb225 100755
190--- a/configure
191+++ b/configure
192@@ -1,6 +1,6 @@
193 #! /bin/sh
194 # Guess values for system-dependent variables and create Makefiles.
195-# Generated by GNU Autoconf 2.69 for PostgreSQL 12.10.
196+# Generated by GNU Autoconf 2.69 for PostgreSQL 12.11.
197 #
198 # Report bugs to <pgsql-bugs@lists.postgresql.org>.
199 #
200@@ -582,8 +582,8 @@ MAKEFLAGS=
201 # Identity of this package.
202 PACKAGE_NAME='PostgreSQL'
203 PACKAGE_TARNAME='postgresql'
204-PACKAGE_VERSION='12.10'
205-PACKAGE_STRING='PostgreSQL 12.10'
206+PACKAGE_VERSION='12.11'
207+PACKAGE_STRING='PostgreSQL 12.11'
208 PACKAGE_BUGREPORT='pgsql-bugs@lists.postgresql.org'
209 PACKAGE_URL=''
210
211@@ -1439,7 +1439,7 @@ if test "$ac_init_help" = "long"; then
212 # Omit some internal or obsolete options to make the list less imposing.
213 # This message is too long to be a string in the A/UX 3.1 sh.
214 cat <<_ACEOF
215-\`configure' configures PostgreSQL 12.10 to adapt to many kinds of systems.
216+\`configure' configures PostgreSQL 12.11 to adapt to many kinds of systems.
217
218 Usage: $0 [OPTION]... [VAR=VALUE]...
219
220@@ -1504,7 +1504,7 @@ fi
221
222 if test -n "$ac_init_help"; then
223 case $ac_init_help in
224- short | recursive ) echo "Configuration of PostgreSQL 12.10:";;
225+ short | recursive ) echo "Configuration of PostgreSQL 12.11:";;
226 esac
227 cat <<\_ACEOF
228
229@@ -1672,7 +1672,7 @@ fi
230 test -n "$ac_init_help" && exit $ac_status
231 if $ac_init_version; then
232 cat <<\_ACEOF
233-PostgreSQL configure 12.10
234+PostgreSQL configure 12.11
235 generated by GNU Autoconf 2.69
236
237 Copyright (C) 2012 Free Software Foundation, Inc.
238@@ -2425,7 +2425,7 @@ cat >config.log <<_ACEOF
239 This file contains any messages produced by compilers while
240 running configure, to aid debugging if configure makes a mistake.
241
242-It was created by PostgreSQL $as_me 12.10, which was
243+It was created by PostgreSQL $as_me 12.11, which was
244 generated by GNU Autoconf 2.69. Invocation command line was
245
246 $ $0 $@
247@@ -11328,9 +11328,12 @@ if test "$ac_res" != no; then :
248
249 fi
250
251-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing dlopen" >&5
252-$as_echo_n "checking for library containing dlopen... " >&6; }
253-if ${ac_cv_search_dlopen+:} false; then :
254+# gcc/clang's sanitizer helper library provides dlopen but not dlsym, thus
255+# when enabling asan the dlopen check doesn't notice that -ldl is actually
256+# required. Just checking for dlsym() ought to suffice.
257+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing dlsym" >&5
258+$as_echo_n "checking for library containing dlsym... " >&6; }
259+if ${ac_cv_search_dlsym+:} false; then :
260 $as_echo_n "(cached) " >&6
261 else
262 ac_func_search_save_LIBS=$LIBS
263@@ -11343,11 +11346,11 @@ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
264 #ifdef __cplusplus
265 extern "C"
266 #endif
267-char dlopen ();
268+char dlsym ();
269 int
270 main ()
271 {
272-return dlopen ();
273+return dlsym ();
274 ;
275 return 0;
276 }
277@@ -11360,25 +11363,25 @@ for ac_lib in '' dl; do
278 LIBS="-l$ac_lib $ac_func_search_save_LIBS"
279 fi
280 if ac_fn_c_try_link "$LINENO"; then :
281- ac_cv_search_dlopen=$ac_res
282+ ac_cv_search_dlsym=$ac_res
283 fi
284 rm -f core conftest.err conftest.$ac_objext \
285 conftest$ac_exeext
286- if ${ac_cv_search_dlopen+:} false; then :
287+ if ${ac_cv_search_dlsym+:} false; then :
288 break
289 fi
290 done
291-if ${ac_cv_search_dlopen+:} false; then :
292+if ${ac_cv_search_dlsym+:} false; then :
293
294 else
295- ac_cv_search_dlopen=no
296+ ac_cv_search_dlsym=no
297 fi
298 rm conftest.$ac_ext
299 LIBS=$ac_func_search_save_LIBS
300 fi
301-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_dlopen" >&5
302-$as_echo "$ac_cv_search_dlopen" >&6; }
303-ac_res=$ac_cv_search_dlopen
304+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_dlsym" >&5
305+$as_echo "$ac_cv_search_dlsym" >&6; }
306+ac_res=$ac_cv_search_dlsym
307 if test "$ac_res" != no; then :
308 test "$ac_res" = "none required" || LIBS="$ac_res $LIBS"
309
310@@ -15764,6 +15767,46 @@ cat >>confdefs.h <<_ACEOF
311 _ACEOF
312
313 fi
314+# __builtin_frame_address may draw a diagnostic for non-constant argument,
315+# so it needs a different test function.
316+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for __builtin_frame_address" >&5
317+$as_echo_n "checking for __builtin_frame_address... " >&6; }
318+if ${pgac_cv__builtin_frame_address+:} false; then :
319+ $as_echo_n "(cached) " >&6
320+else
321+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
322+/* end confdefs.h. */
323+
324+void *
325+call__builtin_frame_address(void)
326+{
327+ return __builtin_frame_address(0);
328+}
329+int
330+main ()
331+{
332+
333+ ;
334+ return 0;
335+}
336+_ACEOF
337+if ac_fn_c_try_link "$LINENO"; then :
338+ pgac_cv__builtin_frame_address=yes
339+else
340+ pgac_cv__builtin_frame_address=no
341+fi
342+rm -f core conftest.err conftest.$ac_objext \
343+ conftest$ac_exeext conftest.$ac_ext
344+fi
345+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv__builtin_frame_address" >&5
346+$as_echo "$pgac_cv__builtin_frame_address" >&6; }
347+if test x"${pgac_cv__builtin_frame_address}" = xyes ; then
348+
349+cat >>confdefs.h <<_ACEOF
350+#define HAVE__BUILTIN_FRAME_ADDRESS 1
351+_ACEOF
352+
353+fi
354
355 ac_fn_c_check_func "$LINENO" "fseeko" "ac_cv_func_fseeko"
356 if test "x$ac_cv_func_fseeko" = xyes; then :
357@@ -20125,7 +20168,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
358 # report actual input values of CONFIG_FILES etc. instead of their
359 # values after options handling.
360 ac_log="
361-This file was extended by PostgreSQL $as_me 12.10, which was
362+This file was extended by PostgreSQL $as_me 12.11, which was
363 generated by GNU Autoconf 2.69. Invocation command line was
364
365 CONFIG_FILES = $CONFIG_FILES
366@@ -20195,7 +20238,7 @@ _ACEOF
367 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
368 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
369 ac_cs_version="\\
370-PostgreSQL config.status 12.10
371+PostgreSQL config.status 12.11
372 configured by $0, generated by GNU Autoconf 2.69,
373 with options \\"\$ac_cs_config\\"
374
375diff --git a/configure.in b/configure.in
376index b41a7d7..f462b74 100644
377--- a/configure.in
378+++ b/configure.in
379@@ -17,7 +17,7 @@ dnl Read the Autoconf manual for details.
380 dnl
381 m4_pattern_forbid(^PGAC_)dnl to catch undefined macros
382
383-AC_INIT([PostgreSQL], [12.10], [pgsql-bugs@lists.postgresql.org])
384+AC_INIT([PostgreSQL], [12.11], [pgsql-bugs@lists.postgresql.org])
385
386 m4_if(m4_defn([m4_PACKAGE_VERSION]), [2.69], [], [m4_fatal([Autoconf version 2.69 is required.
387 Untested combinations of 'autoconf' and PostgreSQL versions are not
388@@ -1195,7 +1195,10 @@ AC_SUBST(PTHREAD_LIBS)
389
390 AC_CHECK_LIB(m, main)
391 AC_SEARCH_LIBS(setproctitle, util)
392-AC_SEARCH_LIBS(dlopen, dl)
393+# gcc/clang's sanitizer helper library provides dlopen but not dlsym, thus
394+# when enabling asan the dlopen check doesn't notice that -ldl is actually
395+# required. Just checking for dlsym() ought to suffice.
396+AC_SEARCH_LIBS(dlsym, dl)
397 AC_SEARCH_LIBS(socket, [socket ws2_32])
398 AC_SEARCH_LIBS(shl_load, dld)
399 AC_SEARCH_LIBS(getopt_long, [getopt gnugetopt])
400@@ -1724,6 +1727,9 @@ PGAC_CHECK_BUILTIN_FUNC([__builtin_bswap64], [long int x])
401 PGAC_CHECK_BUILTIN_FUNC([__builtin_clz], [unsigned int x])
402 PGAC_CHECK_BUILTIN_FUNC([__builtin_ctz], [unsigned int x])
403 PGAC_CHECK_BUILTIN_FUNC([__builtin_popcount], [unsigned int x])
404+# __builtin_frame_address may draw a diagnostic for non-constant argument,
405+# so it needs a different test function.
406+PGAC_CHECK_BUILTIN_FUNC_PTR([__builtin_frame_address], [0])
407
408 AC_REPLACE_FUNCS(fseeko)
409 case $host_os in
410diff --git a/contrib/amcheck/expected/check_btree.out b/contrib/amcheck/expected/check_btree.out
411index 59a805d..0fd6ea0 100644
412--- a/contrib/amcheck/expected/check_btree.out
413+++ b/contrib/amcheck/expected/check_btree.out
414@@ -168,11 +168,34 @@ SELECT bt_index_check('toasty', true);
415
416 (1 row)
417
418+--
419+-- Check that index expressions and predicates are run as the table's owner
420+--
421+TRUNCATE bttest_a;
422+INSERT INTO bttest_a SELECT * FROM generate_series(1, 1000);
423+ALTER TABLE bttest_a OWNER TO regress_bttest_role;
424+-- A dummy index function checking current_user
425+CREATE FUNCTION ifun(int8) RETURNS int8 AS $$
426+BEGIN
427+ ASSERT current_user = 'regress_bttest_role',
428+ format('ifun(%s) called by %s', $1, current_user);
429+ RETURN $1;
430+END;
431+$$ LANGUAGE plpgsql IMMUTABLE;
432+CREATE INDEX bttest_a_expr_idx ON bttest_a ((ifun(id) + ifun(0)))
433+ WHERE ifun(id + 10) > ifun(10);
434+SELECT bt_index_check('bttest_a_expr_idx', true);
435+ bt_index_check
436+----------------
437+
438+(1 row)
439+
440 -- cleanup
441 DROP TABLE bttest_a;
442 DROP TABLE bttest_b;
443 DROP TABLE bttest_multi;
444 DROP TABLE delete_test_table;
445 DROP TABLE toast_bug;
446+DROP FUNCTION ifun(int8);
447 DROP OWNED BY regress_bttest_role; -- permissions
448 DROP ROLE regress_bttest_role;
449diff --git a/contrib/amcheck/sql/check_btree.sql b/contrib/amcheck/sql/check_btree.sql
450index 99acbc8..3248187 100644
451--- a/contrib/amcheck/sql/check_btree.sql
452+++ b/contrib/amcheck/sql/check_btree.sql
453@@ -110,11 +110,32 @@ INSERT INTO toast_bug SELECT repeat('a', 2200);
454 -- Should not get false positive report of corruption:
455 SELECT bt_index_check('toasty', true);
456
457+--
458+-- Check that index expressions and predicates are run as the table's owner
459+--
460+TRUNCATE bttest_a;
461+INSERT INTO bttest_a SELECT * FROM generate_series(1, 1000);
462+ALTER TABLE bttest_a OWNER TO regress_bttest_role;
463+-- A dummy index function checking current_user
464+CREATE FUNCTION ifun(int8) RETURNS int8 AS $$
465+BEGIN
466+ ASSERT current_user = 'regress_bttest_role',
467+ format('ifun(%s) called by %s', $1, current_user);
468+ RETURN $1;
469+END;
470+$$ LANGUAGE plpgsql IMMUTABLE;
471+
472+CREATE INDEX bttest_a_expr_idx ON bttest_a ((ifun(id) + ifun(0)))
473+ WHERE ifun(id + 10) > ifun(10);
474+
475+SELECT bt_index_check('bttest_a_expr_idx', true);
476+
477 -- cleanup
478 DROP TABLE bttest_a;
479 DROP TABLE bttest_b;
480 DROP TABLE bttest_multi;
481 DROP TABLE delete_test_table;
482 DROP TABLE toast_bug;
483+DROP FUNCTION ifun(int8);
484 DROP OWNED BY regress_bttest_role; -- permissions
485 DROP ROLE regress_bttest_role;
486diff --git a/contrib/amcheck/t/002_cic.pl b/contrib/amcheck/t/002_cic.pl
487index 832ae8f..3587807 100644
488--- a/contrib/amcheck/t/002_cic.pl
489+++ b/contrib/amcheck/t/002_cic.pl
490@@ -18,7 +18,8 @@ my ($node, $result);
491 #
492 $node = get_new_node('CIC_test');
493 $node->init;
494-$node->append_conf('postgresql.conf', 'lock_timeout = 180000');
495+$node->append_conf('postgresql.conf',
496+ 'lock_timeout = ' . (1000 * $TestLib::timeout_default));
497 $node->start;
498 $node->safe_psql('postgres', q(CREATE EXTENSION amcheck));
499 $node->safe_psql('postgres', q(CREATE TABLE tbl(i int)));
500diff --git a/contrib/amcheck/t/003_cic_2pc.pl b/contrib/amcheck/t/003_cic_2pc.pl
501index d81734f..445aaba 100644
502--- a/contrib/amcheck/t/003_cic_2pc.pl
503+++ b/contrib/amcheck/t/003_cic_2pc.pl
504@@ -11,7 +11,8 @@ use TestLib;
505
506 use Test::More tests => 5;
507
508-local $TODO = 'filesystem bug' if TestLib::has_wal_read_bug;
509+Test::More->builder->todo_start('filesystem bug')
510+ if TestLib::has_wal_read_bug;
511
512 my ($node, $result);
513
514@@ -21,7 +22,8 @@ my ($node, $result);
515 $node = get_new_node('CIC_2PC_test');
516 $node->init;
517 $node->append_conf('postgresql.conf', 'max_prepared_transactions = 10');
518-$node->append_conf('postgresql.conf', 'lock_timeout = 180000');
519+$node->append_conf('postgresql.conf',
520+ 'lock_timeout = ' . (1000 * $TestLib::timeout_default));
521 $node->start;
522 $node->safe_psql('postgres', q(CREATE EXTENSION amcheck));
523 $node->safe_psql('postgres', q(CREATE TABLE tbl(i int)));
524@@ -37,7 +39,7 @@ $node->safe_psql('postgres', q(CREATE TABLE tbl(i int)));
525
526 my $main_in = '';
527 my $main_out = '';
528-my $main_timer = IPC::Run::timeout(180);
529+my $main_timer = IPC::Run::timeout($TestLib::timeout_default);
530
531 my $main_h =
532 $node->background_psql('postgres', \$main_in, \$main_out,
533@@ -51,7 +53,7 @@ pump $main_h until $main_out =~ /syncpoint1/ || $main_timer->is_expired;
534
535 my $cic_in = '';
536 my $cic_out = '';
537-my $cic_timer = IPC::Run::timeout(180);
538+my $cic_timer = IPC::Run::timeout($TestLib::timeout_default);
539 my $cic_h =
540 $node->background_psql('postgres', \$cic_in, \$cic_out,
541 $cic_timer, on_error_stop => 1);
542@@ -112,9 +114,10 @@ PREPARE TRANSACTION 'persists_forever';
543 ));
544 $node->restart;
545
546-my $reindex_in = '';
547-my $reindex_out = '';
548-my $reindex_timer = IPC::Run::timeout(180);
549+my $reindex_in = '';
550+my $reindex_out = '';
551+my $reindex_timer =
552+ IPC::Run::timeout($TestLib::timeout_default);
553 my $reindex_h =
554 $node->background_psql('postgres', \$reindex_in, \$reindex_out,
555 $reindex_timer, on_error_stop => 1);
556diff --git a/contrib/amcheck/verify_nbtree.c b/contrib/amcheck/verify_nbtree.c
557index 700a02f..cb6475d 100644
558--- a/contrib/amcheck/verify_nbtree.c
559+++ b/contrib/amcheck/verify_nbtree.c
560@@ -228,6 +228,9 @@ bt_index_check_internal(Oid indrelid, bool parentcheck, bool heapallindexed,
561 Relation indrel;
562 Relation heaprel;
563 LOCKMODE lockmode;
564+ Oid save_userid;
565+ int save_sec_context;
566+ int save_nestlevel;
567
568 if (parentcheck)
569 lockmode = ShareLock;
570@@ -244,9 +247,27 @@ bt_index_check_internal(Oid indrelid, bool parentcheck, bool heapallindexed,
571 */
572 heapid = IndexGetRelation(indrelid, true);
573 if (OidIsValid(heapid))
574+ {
575 heaprel = table_open(heapid, lockmode);
576+
577+ /*
578+ * Switch to the table owner's userid, so that any index functions are
579+ * run as that user. Also lock down security-restricted operations
580+ * and arrange to make GUC variable changes local to this command.
581+ */
582+ GetUserIdAndSecContext(&save_userid, &save_sec_context);
583+ SetUserIdAndSecContext(heaprel->rd_rel->relowner,
584+ save_sec_context | SECURITY_RESTRICTED_OPERATION);
585+ save_nestlevel = NewGUCNestLevel();
586+ }
587 else
588+ {
589 heaprel = NULL;
590+ /* for "gcc -Og" https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78394 */
591+ save_userid = InvalidOid;
592+ save_sec_context = -1;
593+ save_nestlevel = -1;
594+ }
595
596 /*
597 * Open the target index relations separately (like relation_openrv(), but
598@@ -293,6 +314,12 @@ bt_index_check_internal(Oid indrelid, bool parentcheck, bool heapallindexed,
599 heapallindexed, rootdescend);
600 }
601
602+ /* Roll back any GUC changes executed by index functions */
603+ AtEOXact_GUC(false, save_nestlevel);
604+
605+ /* Restore userid and security context */
606+ SetUserIdAndSecContext(save_userid, save_sec_context);
607+
608 /*
609 * Release locks early. That's ok here because nothing in the called
610 * routines will trigger shared cache invalidations to be sent, so we can
611diff --git a/contrib/bloom/t/001_wal.pl b/contrib/bloom/t/001_wal.pl
612index 3537041..86aee55 100644
613--- a/contrib/bloom/t/001_wal.pl
614+++ b/contrib/bloom/t/001_wal.pl
615@@ -3,7 +3,18 @@ use strict;
616 use warnings;
617 use PostgresNode;
618 use TestLib;
619-use Test::More tests => 31;
620+use Test::More;
621+
622+if (TestLib::has_wal_read_bug)
623+{
624+ # We'd prefer to use Test::More->builder->todo_start, but the bug causes
625+ # this test file to die(), not merely to fail.
626+ plan skip_all => 'filesystem bug';
627+}
628+else
629+{
630+ plan tests => 31;
631+}
632
633 my $node_master;
634 my $node_standby;
635diff --git a/contrib/cube/cubeparse.c b/contrib/cube/cubeparse.c
636index 95a05c7..273fbc1 100644
637--- a/contrib/cube/cubeparse.c
638+++ b/contrib/cube/cubeparse.c
639@@ -1,8 +1,8 @@
640-/* A Bison parser, made by GNU Bison 3.3.2. */
641+/* A Bison parser, made by GNU Bison 3.7.5. */
642
643 /* Bison implementation for Yacc-like parsers in C
644
645- Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2019 Free Software Foundation,
646+ Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2021 Free Software Foundation,
647 Inc.
648
649 This program is free software: you can redistribute it and/or modify
650@@ -34,6 +34,10 @@
651 /* C LALR(1) parser skeleton written by Richard Stallman, by
652 simplifying the original so-called "semantic" parser. */
653
654+/* DO NOT RELY ON FEATURES THAT ARE NOT DOCUMENTED in the manual,
655+ especially those whose name start with YY_ or yy_. They are
656+ private implementation details that can be changed or removed. */
657+
658 /* All symbols defined below should begin with yy or YY, to avoid
659 infringing on user name space. This should be done even for local
660 variables, as they might otherwise be expanded by user macros.
661@@ -41,14 +45,11 @@
662 define necessary library symbols; they are noted "INFRINGES ON
663 USER NAME SPACE" below. */
664
665-/* Undocumented macros, especially those whose name start with YY_,
666- are private implementation details. Do not rely on them. */
667-
668-/* Identify Bison output. */
669-#define YYBISON 1
670+/* Identify Bison output, and Bison version. */
671+#define YYBISON 30705
672
673-/* Bison version. */
674-#define YYBISON_VERSION "3.3.2"
675+/* Bison version string. */
676+#define YYBISON_VERSION "3.7.5"
677
678 /* Skeleton name. */
679 #define YYSKELETON_NAME "yacc.c"
680@@ -69,12 +70,11 @@
681 #define yyerror cube_yyerror
682 #define yydebug cube_yydebug
683 #define yynerrs cube_yynerrs
684-
685 #define yylval cube_yylval
686 #define yychar cube_yychar
687
688 /* First part of user prologue. */
689-#line 1 "cubeparse.y" /* yacc.c:337 */
690+#line 1 "cubeparse.y"
691
692 /* contrib/cube/cubeparse.y */
693
694@@ -108,7 +108,17 @@ static NDBOX *write_box(int dim, char *str1, char *str2);
695 static NDBOX *write_point_as_box(int dim, char *str);
696
697
698-#line 112 "cubeparse.c" /* yacc.c:337 */
699+#line 112 "cubeparse.c"
700+
701+# ifndef YY_CAST
702+# ifdef __cplusplus
703+# define YY_CAST(Type, Val) static_cast<Type> (Val)
704+# define YY_REINTERPRET_CAST(Type, Val) reinterpret_cast<Type> (Val)
705+# else
706+# define YY_CAST(Type, Val) ((Type) (Val))
707+# define YY_REINTERPRET_CAST(Type, Val) ((Type) (Val))
708+# endif
709+# endif
710 # ifndef YY_NULLPTR
711 # if defined __cplusplus
712 # if 201103L <= __cplusplus
713@@ -121,14 +131,6 @@ static NDBOX *write_point_as_box(int dim, char *str);
714 # endif
715 # endif
716
717-/* Enabling verbose error messages. */
718-#ifdef YYERROR_VERBOSE
719-# undef YYERROR_VERBOSE
720-# define YYERROR_VERBOSE 1
721-#else
722-# define YYERROR_VERBOSE 0
723-#endif
724-
725
726 /* Debug traces. */
727 #ifndef YYDEBUG
728@@ -138,18 +140,23 @@ static NDBOX *write_point_as_box(int dim, char *str);
729 extern int cube_yydebug;
730 #endif
731
732-/* Token type. */
733+/* Token kinds. */
734 #ifndef YYTOKENTYPE
735 # define YYTOKENTYPE
736 enum yytokentype
737 {
738- CUBEFLOAT = 258,
739- O_PAREN = 259,
740- C_PAREN = 260,
741- O_BRACKET = 261,
742- C_BRACKET = 262,
743- COMMA = 263
744+ YYEMPTY = -2,
745+ YYEOF = 0, /* "end of file" */
746+ YYerror = 256, /* error */
747+ YYUNDEF = 257, /* "invalid token" */
748+ CUBEFLOAT = 258, /* CUBEFLOAT */
749+ O_PAREN = 259, /* O_PAREN */
750+ C_PAREN = 260, /* C_PAREN */
751+ O_BRACKET = 261, /* O_BRACKET */
752+ C_BRACKET = 262, /* C_BRACKET */
753+ COMMA = 263 /* COMMA */
754 };
755+ typedef enum yytokentype yytoken_kind_t;
756 #endif
757
758 /* Value type. */
759@@ -165,6 +172,26 @@ extern YYSTYPE cube_yylval;
760 int cube_yyparse (NDBOX **result);
761
762
763+/* Symbol kind. */
764+enum yysymbol_kind_t
765+{
766+ YYSYMBOL_YYEMPTY = -2,
767+ YYSYMBOL_YYEOF = 0, /* "end of file" */
768+ YYSYMBOL_YYerror = 1, /* error */
769+ YYSYMBOL_YYUNDEF = 2, /* "invalid token" */
770+ YYSYMBOL_CUBEFLOAT = 3, /* CUBEFLOAT */
771+ YYSYMBOL_O_PAREN = 4, /* O_PAREN */
772+ YYSYMBOL_C_PAREN = 5, /* C_PAREN */
773+ YYSYMBOL_O_BRACKET = 6, /* O_BRACKET */
774+ YYSYMBOL_C_BRACKET = 7, /* C_BRACKET */
775+ YYSYMBOL_COMMA = 8, /* COMMA */
776+ YYSYMBOL_YYACCEPT = 9, /* $accept */
777+ YYSYMBOL_box = 10, /* box */
778+ YYSYMBOL_paren_list = 11, /* paren_list */
779+ YYSYMBOL_list = 12 /* list */
780+};
781+typedef enum yysymbol_kind_t yysymbol_kind_t;
782+
783
784
785
786@@ -172,28 +199,87 @@ int cube_yyparse (NDBOX **result);
787 # undef short
788 #endif
789
790-#ifdef YYTYPE_UINT8
791-typedef YYTYPE_UINT8 yytype_uint8;
792-#else
793-typedef unsigned char yytype_uint8;
794+/* On compilers that do not define __PTRDIFF_MAX__ etc., make sure
795+ <limits.h> and (if available) <stdint.h> are included
796+ so that the code can choose integer types of a good width. */
797+
798+#ifndef __PTRDIFF_MAX__
799+# include <limits.h> /* INFRINGES ON USER NAME SPACE */
800+# if defined __STDC_VERSION__ && 199901 <= __STDC_VERSION__
801+# include <stdint.h> /* INFRINGES ON USER NAME SPACE */
802+# define YY_STDINT_H
803+# endif
804 #endif
805
806-#ifdef YYTYPE_INT8
807-typedef YYTYPE_INT8 yytype_int8;
808+/* Narrow types that promote to a signed type and that can represent a
809+ signed or unsigned integer of at least N bits. In tables they can
810+ save space and decrease cache pressure. Promoting to a signed type
811+ helps avoid bugs in integer arithmetic. */
812+
813+#ifdef __INT_LEAST8_MAX__
814+typedef __INT_LEAST8_TYPE__ yytype_int8;
815+#elif defined YY_STDINT_H
816+typedef int_least8_t yytype_int8;
817 #else
818 typedef signed char yytype_int8;
819 #endif
820
821-#ifdef YYTYPE_UINT16
822-typedef YYTYPE_UINT16 yytype_uint16;
823+#ifdef __INT_LEAST16_MAX__
824+typedef __INT_LEAST16_TYPE__ yytype_int16;
825+#elif defined YY_STDINT_H
826+typedef int_least16_t yytype_int16;
827 #else
828-typedef unsigned short yytype_uint16;
829+typedef short yytype_int16;
830 #endif
831
832-#ifdef YYTYPE_INT16
833-typedef YYTYPE_INT16 yytype_int16;
834+/* Work around bug in HP-UX 11.23, which defines these macros
835+ incorrectly for preprocessor constants. This workaround can likely
836+ be removed in 2023, as HPE has promised support for HP-UX 11.23
837+ (aka HP-UX 11i v2) only through the end of 2022; see Table 2 of
838+ <https://h20195.www2.hpe.com/V2/getpdf.aspx/4AA4-7673ENW.pdf>. */
839+#ifdef __hpux
840+# undef UINT_LEAST8_MAX
841+# undef UINT_LEAST16_MAX
842+# define UINT_LEAST8_MAX 255
843+# define UINT_LEAST16_MAX 65535
844+#endif
845+
846+#if defined __UINT_LEAST8_MAX__ && __UINT_LEAST8_MAX__ <= __INT_MAX__
847+typedef __UINT_LEAST8_TYPE__ yytype_uint8;
848+#elif (!defined __UINT_LEAST8_MAX__ && defined YY_STDINT_H \
849+ && UINT_LEAST8_MAX <= INT_MAX)
850+typedef uint_least8_t yytype_uint8;
851+#elif !defined __UINT_LEAST8_MAX__ && UCHAR_MAX <= INT_MAX
852+typedef unsigned char yytype_uint8;
853 #else
854-typedef short yytype_int16;
855+typedef short yytype_uint8;
856+#endif
857+
858+#if defined __UINT_LEAST16_MAX__ && __UINT_LEAST16_MAX__ <= __INT_MAX__
859+typedef __UINT_LEAST16_TYPE__ yytype_uint16;
860+#elif (!defined __UINT_LEAST16_MAX__ && defined YY_STDINT_H \
861+ && UINT_LEAST16_MAX <= INT_MAX)
862+typedef uint_least16_t yytype_uint16;
863+#elif !defined __UINT_LEAST16_MAX__ && USHRT_MAX <= INT_MAX
864+typedef unsigned short yytype_uint16;
865+#else
866+typedef int yytype_uint16;
867+#endif
868+
869+#ifndef YYPTRDIFF_T
870+# if defined __PTRDIFF_TYPE__ && defined __PTRDIFF_MAX__
871+# define YYPTRDIFF_T __PTRDIFF_TYPE__
872+# define YYPTRDIFF_MAXIMUM __PTRDIFF_MAX__
873+# elif defined PTRDIFF_MAX
874+# ifndef ptrdiff_t
875+# include <stddef.h> /* INFRINGES ON USER NAME SPACE */
876+# endif
877+# define YYPTRDIFF_T ptrdiff_t
878+# define YYPTRDIFF_MAXIMUM PTRDIFF_MAX
879+# else
880+# define YYPTRDIFF_T long
881+# define YYPTRDIFF_MAXIMUM LONG_MAX
882+# endif
883 #endif
884
885 #ifndef YYSIZE_T
886@@ -201,7 +287,7 @@ typedef short yytype_int16;
887 # define YYSIZE_T __SIZE_TYPE__
888 # elif defined size_t
889 # define YYSIZE_T size_t
890-# elif ! defined YYSIZE_T
891+# elif defined __STDC_VERSION__ && 199901 <= __STDC_VERSION__
892 # include <stddef.h> /* INFRINGES ON USER NAME SPACE */
893 # define YYSIZE_T size_t
894 # else
895@@ -209,7 +295,20 @@ typedef short yytype_int16;
896 # endif
897 #endif
898
899-#define YYSIZE_MAXIMUM ((YYSIZE_T) -1)
900+#define YYSIZE_MAXIMUM \
901+ YY_CAST (YYPTRDIFF_T, \
902+ (YYPTRDIFF_MAXIMUM < YY_CAST (YYSIZE_T, -1) \
903+ ? YYPTRDIFF_MAXIMUM \
904+ : YY_CAST (YYSIZE_T, -1)))
905+
906+#define YYSIZEOF(X) YY_CAST (YYPTRDIFF_T, sizeof (X))
907+
908+
909+/* Stored state numbers (used for stacks). */
910+typedef yytype_int8 yy_state_t;
911+
912+/* State numbers in computations. */
913+typedef int yy_state_fast_t;
914
915 #ifndef YY_
916 # if defined YYENABLE_NLS && YYENABLE_NLS
917@@ -223,38 +322,37 @@ typedef short yytype_int16;
918 # endif
919 #endif
920
921-#ifndef YY_ATTRIBUTE
922-# if (defined __GNUC__ \
923- && (2 < __GNUC__ || (__GNUC__ == 2 && 96 <= __GNUC_MINOR__))) \
924- || defined __SUNPRO_C && 0x5110 <= __SUNPRO_C
925-# define YY_ATTRIBUTE(Spec) __attribute__(Spec)
926-# else
927-# define YY_ATTRIBUTE(Spec) /* empty */
928-# endif
929-#endif
930
931 #ifndef YY_ATTRIBUTE_PURE
932-# define YY_ATTRIBUTE_PURE YY_ATTRIBUTE ((__pure__))
933+# if defined __GNUC__ && 2 < __GNUC__ + (96 <= __GNUC_MINOR__)
934+# define YY_ATTRIBUTE_PURE __attribute__ ((__pure__))
935+# else
936+# define YY_ATTRIBUTE_PURE
937+# endif
938 #endif
939
940 #ifndef YY_ATTRIBUTE_UNUSED
941-# define YY_ATTRIBUTE_UNUSED YY_ATTRIBUTE ((__unused__))
942+# if defined __GNUC__ && 2 < __GNUC__ + (7 <= __GNUC_MINOR__)
943+# define YY_ATTRIBUTE_UNUSED __attribute__ ((__unused__))
944+# else
945+# define YY_ATTRIBUTE_UNUSED
946+# endif
947 #endif
948
949 /* Suppress unused-variable warnings by "using" E. */
950 #if ! defined lint || defined __GNUC__
951-# define YYUSE(E) ((void) (E))
952+# define YY_USE(E) ((void) (E))
953 #else
954-# define YYUSE(E) /* empty */
955+# define YY_USE(E) /* empty */
956 #endif
957
958 #if defined __GNUC__ && ! defined __ICC && 407 <= __GNUC__ * 100 + __GNUC_MINOR__
959 /* Suppress an incorrect diagnostic about yylval being uninitialized. */
960-# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \
961- _Pragma ("GCC diagnostic push") \
962- _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"")\
963+# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \
964+ _Pragma ("GCC diagnostic push") \
965+ _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"") \
966 _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"")
967-# define YY_IGNORE_MAYBE_UNINITIALIZED_END \
968+# define YY_IGNORE_MAYBE_UNINITIALIZED_END \
969 _Pragma ("GCC diagnostic pop")
970 #else
971 # define YY_INITIAL_VALUE(Value) Value
972@@ -267,8 +365,22 @@ typedef short yytype_int16;
973 # define YY_INITIAL_VALUE(Value) /* Nothing. */
974 #endif
975
976+#if defined __cplusplus && defined __GNUC__ && ! defined __ICC && 6 <= __GNUC__
977+# define YY_IGNORE_USELESS_CAST_BEGIN \
978+ _Pragma ("GCC diagnostic push") \
979+ _Pragma ("GCC diagnostic ignored \"-Wuseless-cast\"")
980+# define YY_IGNORE_USELESS_CAST_END \
981+ _Pragma ("GCC diagnostic pop")
982+#endif
983+#ifndef YY_IGNORE_USELESS_CAST_BEGIN
984+# define YY_IGNORE_USELESS_CAST_BEGIN
985+# define YY_IGNORE_USELESS_CAST_END
986+#endif
987
988-#if ! defined yyoverflow || YYERROR_VERBOSE
989+
990+#define YY_ASSERT(E) ((void) (0 && (E)))
991+
992+#if !defined yyoverflow
993
994 /* The parser invokes alloca or malloc; define the necessary symbols. */
995
996@@ -333,8 +445,7 @@ void free (void *); /* INFRINGES ON USER NAME SPACE */
997 # endif
998 # endif
999 # endif
1000-#endif /* ! defined yyoverflow || YYERROR_VERBOSE */
1001-
1002+#endif /* !defined yyoverflow */
1003
1004 #if (! defined yyoverflow \
1005 && (! defined __cplusplus \
1006@@ -343,17 +454,17 @@ void free (void *); /* INFRINGES ON USER NAME SPACE */
1007 /* A type that is properly aligned for any stack member. */
1008 union yyalloc
1009 {
1010- yytype_int16 yyss_alloc;
1011+ yy_state_t yyss_alloc;
1012 YYSTYPE yyvs_alloc;
1013 };
1014
1015 /* The size of the maximum gap between one aligned stack and the next. */
1016-# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)
1017+# define YYSTACK_GAP_MAXIMUM (YYSIZEOF (union yyalloc) - 1)
1018
1019 /* The size of an array large to enough to hold all stacks, each with
1020 N elements. */
1021 # define YYSTACK_BYTES(N) \
1022- ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \
1023+ ((N) * (YYSIZEOF (yy_state_t) + YYSIZEOF (YYSTYPE)) \
1024 + YYSTACK_GAP_MAXIMUM)
1025
1026 # define YYCOPY_NEEDED 1
1027@@ -366,11 +477,11 @@ union yyalloc
1028 # define YYSTACK_RELOCATE(Stack_alloc, Stack) \
1029 do \
1030 { \
1031- YYSIZE_T yynewbytes; \
1032+ YYPTRDIFF_T yynewbytes; \
1033 YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \
1034 Stack = &yyptr->Stack_alloc; \
1035- yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
1036- yyptr += yynewbytes / sizeof (*yyptr); \
1037+ yynewbytes = yystacksize * YYSIZEOF (*Stack) + YYSTACK_GAP_MAXIMUM; \
1038+ yyptr += yynewbytes / YYSIZEOF (*yyptr); \
1039 } \
1040 while (0)
1041
1042@@ -382,12 +493,12 @@ union yyalloc
1043 # ifndef YYCOPY
1044 # if defined __GNUC__ && 1 < __GNUC__
1045 # define YYCOPY(Dst, Src, Count) \
1046- __builtin_memcpy (Dst, Src, (Count) * sizeof (*(Src)))
1047+ __builtin_memcpy (Dst, Src, YY_CAST (YYSIZE_T, (Count)) * sizeof (*(Src)))
1048 # else
1049 # define YYCOPY(Dst, Src, Count) \
1050 do \
1051 { \
1052- YYSIZE_T yyi; \
1053+ YYPTRDIFF_T yyi; \
1054 for (yyi = 0; yyi < (Count); yyi++) \
1055 (Dst)[yyi] = (Src)[yyi]; \
1056 } \
1057@@ -410,17 +521,20 @@ union yyalloc
1058 /* YYNSTATES -- Number of states. */
1059 #define YYNSTATES 19
1060
1061-#define YYUNDEFTOK 2
1062+/* YYMAXUTOK -- Last valid token kind. */
1063 #define YYMAXUTOK 263
1064
1065+
1066 /* YYTRANSLATE(TOKEN-NUM) -- Symbol number corresponding to TOKEN-NUM
1067 as returned by yylex, with out-of-bounds checking. */
1068-#define YYTRANSLATE(YYX) \
1069- ((unsigned) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
1070+#define YYTRANSLATE(YYX) \
1071+ (0 <= (YYX) && (YYX) <= YYMAXUTOK \
1072+ ? YY_CAST (yysymbol_kind_t, yytranslate[YYX]) \
1073+ : YYSYMBOL_YYUNDEF)
1074
1075 /* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM
1076 as returned by yylex. */
1077-static const yytype_uint8 yytranslate[] =
1078+static const yytype_int8 yytranslate[] =
1079 {
1080 0, 2, 2, 2, 2, 2, 2, 2, 2, 2,
1081 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
1082@@ -459,34 +573,47 @@ static const yytype_uint8 yyrline[] =
1083 };
1084 #endif
1085
1086-#if YYDEBUG || YYERROR_VERBOSE || 0
1087+/** Accessing symbol of state STATE. */
1088+#define YY_ACCESSING_SYMBOL(State) YY_CAST (yysymbol_kind_t, yystos[State])
1089+
1090+#if YYDEBUG || 0
1091+/* The user-facing name of the symbol whose (internal) number is
1092+ YYSYMBOL. No bounds checking. */
1093+static const char *yysymbol_name (yysymbol_kind_t yysymbol) YY_ATTRIBUTE_UNUSED;
1094+
1095 /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
1096 First, the terminals, then, starting at YYNTOKENS, nonterminals. */
1097 static const char *const yytname[] =
1098 {
1099- "$end", "error", "$undefined", "CUBEFLOAT", "O_PAREN", "C_PAREN",
1100- "O_BRACKET", "C_BRACKET", "COMMA", "$accept", "box", "paren_list",
1101- "list", YY_NULLPTR
1102+ "\"end of file\"", "error", "\"invalid token\"", "CUBEFLOAT", "O_PAREN",
1103+ "C_PAREN", "O_BRACKET", "C_BRACKET", "COMMA", "$accept", "box",
1104+ "paren_list", "list", YY_NULLPTR
1105 };
1106+
1107+static const char *
1108+yysymbol_name (yysymbol_kind_t yysymbol)
1109+{
1110+ return yytname[yysymbol];
1111+}
1112 #endif
1113
1114-# ifdef YYPRINT
1115+#ifdef YYPRINT
1116 /* YYTOKNUM[NUM] -- (External) token number corresponding to the
1117 (internal) symbol number NUM (which must be that of a token). */
1118-static const yytype_uint16 yytoknum[] =
1119+static const yytype_int16 yytoknum[] =
1120 {
1121 0, 256, 257, 258, 259, 260, 261, 262, 263
1122 };
1123-# endif
1124+#endif
1125
1126-#define YYPACT_NINF -4
1127+#define YYPACT_NINF (-4)
1128
1129-#define yypact_value_is_default(Yystate) \
1130- (!!((Yystate) == (-4)))
1131+#define yypact_value_is_default(Yyn) \
1132+ ((Yyn) == YYPACT_NINF)
1133
1134-#define YYTABLE_NINF -1
1135+#define YYTABLE_NINF (-1)
1136
1137-#define yytable_value_is_error(Yytable_value) \
1138+#define yytable_value_is_error(Yyn) \
1139 0
1140
1141 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
1142@@ -500,7 +627,7 @@ static const yytype_int8 yypact[] =
1143 /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
1144 Performed when YYTABLE does not specify something else to do. Zero
1145 means the default is an error. */
1146-static const yytype_uint8 yydefact[] =
1147+static const yytype_int8 yydefact[] =
1148 {
1149 0, 8, 0, 0, 0, 4, 5, 7, 0, 0,
1150 1, 0, 0, 6, 0, 3, 9, 0, 2
1151@@ -515,19 +642,19 @@ static const yytype_int8 yypgoto[] =
1152 /* YYDEFGOTO[NTERM-NUM]. */
1153 static const yytype_int8 yydefgoto[] =
1154 {
1155- -1, 4, 5, 6
1156+ 0, 4, 5, 6
1157 };
1158
1159 /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If
1160 positive, shift that token. If negative, reduce the rule whose
1161 number is the opposite. If YYTABLE_NINF, syntax error. */
1162-static const yytype_uint8 yytable[] =
1163+static const yytype_int8 yytable[] =
1164 {
1165 9, 1, 2, 1, 3, 7, 13, 2, 15, 12,
1166 10, 17, 11, 12, 14, 16, 18, 8
1167 };
1168
1169-static const yytype_uint8 yycheck[] =
1170+static const yytype_int8 yycheck[] =
1171 {
1172 3, 3, 4, 3, 6, 5, 5, 4, 11, 8,
1173 0, 14, 8, 8, 8, 3, 7, 2
1174@@ -535,29 +662,29 @@ static const yytype_uint8 yycheck[] =
1175
1176 /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
1177 symbol of state STATE-NUM. */
1178-static const yytype_uint8 yystos[] =
1179+static const yytype_int8 yystos[] =
1180 {
1181 0, 3, 4, 6, 10, 11, 12, 5, 12, 11,
1182 0, 8, 8, 5, 8, 11, 3, 11, 7
1183 };
1184
1185 /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
1186-static const yytype_uint8 yyr1[] =
1187+static const yytype_int8 yyr1[] =
1188 {
1189 0, 9, 10, 10, 10, 10, 11, 11, 12, 12
1190 };
1191
1192 /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. */
1193-static const yytype_uint8 yyr2[] =
1194+static const yytype_int8 yyr2[] =
1195 {
1196 0, 2, 5, 3, 1, 1, 3, 2, 1, 3
1197 };
1198
1199
1200+enum { YYENOMEM = -2 };
1201+
1202 #define yyerrok (yyerrstatus = 0)
1203 #define yyclearin (yychar = YYEMPTY)
1204-#define YYEMPTY (-2)
1205-#define YYEOF 0
1206
1207 #define YYACCEPT goto yyacceptlab
1208 #define YYABORT goto yyabortlab
1209@@ -583,10 +710,9 @@ static const yytype_uint8 yyr2[] =
1210 } \
1211 while (0)
1212
1213-/* Error token number */
1214-#define YYTERROR 1
1215-#define YYERRCODE 256
1216-
1217+/* Backward compatibility with an undocumented macro.
1218+ Use YYerror or YYUNDEF. */
1219+#define YYERRCODE YYUNDEF
1220
1221
1222 /* Enable debugging if requested. */
1223@@ -604,18 +730,18 @@ do { \
1224 } while (0)
1225
1226 /* This macro is provided for backward compatibility. */
1227-#ifndef YY_LOCATION_PRINT
1228-# define YY_LOCATION_PRINT(File, Loc) ((void) 0)
1229-#endif
1230+# ifndef YY_LOCATION_PRINT
1231+# define YY_LOCATION_PRINT(File, Loc) ((void) 0)
1232+# endif
1233
1234
1235-# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \
1236+# define YY_SYMBOL_PRINT(Title, Kind, Value, Location) \
1237 do { \
1238 if (yydebug) \
1239 { \
1240 YYFPRINTF (stderr, "%s ", Title); \
1241 yy_symbol_print (stderr, \
1242- Type, Value, result); \
1243+ Kind, Value, result); \
1244 YYFPRINTF (stderr, "\n"); \
1245 } \
1246 } while (0)
1247@@ -626,18 +752,21 @@ do { \
1248 `-----------------------------------*/
1249
1250 static void
1251-yy_symbol_value_print (FILE *yyo, int yytype, YYSTYPE const * const yyvaluep, NDBOX **result)
1252+yy_symbol_value_print (FILE *yyo,
1253+ yysymbol_kind_t yykind, YYSTYPE const * const yyvaluep, NDBOX **result)
1254 {
1255 FILE *yyoutput = yyo;
1256- YYUSE (yyoutput);
1257- YYUSE (result);
1258+ YY_USE (yyoutput);
1259+ YY_USE (result);
1260 if (!yyvaluep)
1261 return;
1262 # ifdef YYPRINT
1263- if (yytype < YYNTOKENS)
1264- YYPRINT (yyo, yytoknum[yytype], *yyvaluep);
1265+ if (yykind < YYNTOKENS)
1266+ YYPRINT (yyo, yytoknum[yykind], *yyvaluep);
1267 # endif
1268- YYUSE (yytype);
1269+ YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
1270+ YY_USE (yykind);
1271+ YY_IGNORE_MAYBE_UNINITIALIZED_END
1272 }
1273
1274
1275@@ -646,12 +775,13 @@ yy_symbol_value_print (FILE *yyo, int yytype, YYSTYPE const * const yyvaluep, ND
1276 `---------------------------*/
1277
1278 static void
1279-yy_symbol_print (FILE *yyo, int yytype, YYSTYPE const * const yyvaluep, NDBOX **result)
1280+yy_symbol_print (FILE *yyo,
1281+ yysymbol_kind_t yykind, YYSTYPE const * const yyvaluep, NDBOX **result)
1282 {
1283 YYFPRINTF (yyo, "%s %s (",
1284- yytype < YYNTOKENS ? "token" : "nterm", yytname[yytype]);
1285+ yykind < YYNTOKENS ? "token" : "nterm", yysymbol_name (yykind));
1286
1287- yy_symbol_value_print (yyo, yytype, yyvaluep, result);
1288+ yy_symbol_value_print (yyo, yykind, yyvaluep, result);
1289 YYFPRINTF (yyo, ")");
1290 }
1291
1292@@ -661,7 +791,7 @@ yy_symbol_print (FILE *yyo, int yytype, YYSTYPE const * const yyvaluep, NDBOX **
1293 `------------------------------------------------------------------*/
1294
1295 static void
1296-yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop)
1297+yy_stack_print (yy_state_t *yybottom, yy_state_t *yytop)
1298 {
1299 YYFPRINTF (stderr, "Stack now");
1300 for (; yybottom <= yytop; yybottom++)
1301@@ -684,21 +814,21 @@ do { \
1302 `------------------------------------------------*/
1303
1304 static void
1305-yy_reduce_print (yytype_int16 *yyssp, YYSTYPE *yyvsp, int yyrule, NDBOX **result)
1306+yy_reduce_print (yy_state_t *yyssp, YYSTYPE *yyvsp,
1307+ int yyrule, NDBOX **result)
1308 {
1309- unsigned long yylno = yyrline[yyrule];
1310+ int yylno = yyrline[yyrule];
1311 int yynrhs = yyr2[yyrule];
1312 int yyi;
1313- YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n",
1314+ YYFPRINTF (stderr, "Reducing stack by rule %d (line %d):\n",
1315 yyrule - 1, yylno);
1316 /* The symbols being reduced. */
1317 for (yyi = 0; yyi < yynrhs; yyi++)
1318 {
1319 YYFPRINTF (stderr, " $%d = ", yyi + 1);
1320 yy_symbol_print (stderr,
1321- yystos[yyssp[yyi + 1 - yynrhs]],
1322- &yyvsp[(yyi + 1) - (yynrhs)]
1323- , result);
1324+ YY_ACCESSING_SYMBOL (+yyssp[yyi + 1 - yynrhs]),
1325+ &yyvsp[(yyi + 1) - (yynrhs)], result);
1326 YYFPRINTF (stderr, "\n");
1327 }
1328 }
1329@@ -713,8 +843,8 @@ do { \
1330 multiple parsers can coexist. */
1331 int yydebug;
1332 #else /* !YYDEBUG */
1333-# define YYDPRINTF(Args)
1334-# define YY_SYMBOL_PRINT(Title, Type, Value, Location)
1335+# define YYDPRINTF(Args) ((void) 0)
1336+# define YY_SYMBOL_PRINT(Title, Kind, Value, Location)
1337 # define YY_STACK_PRINT(Bottom, Top)
1338 # define YY_REDUCE_PRINT(Rule)
1339 #endif /* !YYDEBUG */
1340@@ -737,255 +867,31 @@ int yydebug;
1341 #endif
1342
1343
1344-#if YYERROR_VERBOSE
1345-
1346-# ifndef yystrlen
1347-# if defined __GLIBC__ && defined _STRING_H
1348-# define yystrlen strlen
1349-# else
1350-/* Return the length of YYSTR. */
1351-static YYSIZE_T
1352-yystrlen (const char *yystr)
1353-{
1354- YYSIZE_T yylen;
1355- for (yylen = 0; yystr[yylen]; yylen++)
1356- continue;
1357- return yylen;
1358-}
1359-# endif
1360-# endif
1361-
1362-# ifndef yystpcpy
1363-# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE
1364-# define yystpcpy stpcpy
1365-# else
1366-/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
1367- YYDEST. */
1368-static char *
1369-yystpcpy (char *yydest, const char *yysrc)
1370-{
1371- char *yyd = yydest;
1372- const char *yys = yysrc;
1373-
1374- while ((*yyd++ = *yys++) != '\0')
1375- continue;
1376
1377- return yyd - 1;
1378-}
1379-# endif
1380-# endif
1381
1382-# ifndef yytnamerr
1383-/* Copy to YYRES the contents of YYSTR after stripping away unnecessary
1384- quotes and backslashes, so that it's suitable for yyerror. The
1385- heuristic is that double-quoting is unnecessary unless the string
1386- contains an apostrophe, a comma, or backslash (other than
1387- backslash-backslash). YYSTR is taken from yytname. If YYRES is
1388- null, do not copy; instead, return the length of what the result
1389- would have been. */
1390-static YYSIZE_T
1391-yytnamerr (char *yyres, const char *yystr)
1392-{
1393- if (*yystr == '"')
1394- {
1395- YYSIZE_T yyn = 0;
1396- char const *yyp = yystr;
1397-
1398- for (;;)
1399- switch (*++yyp)
1400- {
1401- case '\'':
1402- case ',':
1403- goto do_not_strip_quotes;
1404-
1405- case '\\':
1406- if (*++yyp != '\\')
1407- goto do_not_strip_quotes;
1408- else
1409- goto append;
1410-
1411- append:
1412- default:
1413- if (yyres)
1414- yyres[yyn] = *yyp;
1415- yyn++;
1416- break;
1417-
1418- case '"':
1419- if (yyres)
1420- yyres[yyn] = '\0';
1421- return yyn;
1422- }
1423- do_not_strip_quotes: ;
1424- }
1425
1426- if (! yyres)
1427- return yystrlen (yystr);
1428-
1429- return (YYSIZE_T) (yystpcpy (yyres, yystr) - yyres);
1430-}
1431-# endif
1432-
1433-/* Copy into *YYMSG, which is of size *YYMSG_ALLOC, an error message
1434- about the unexpected token YYTOKEN for the state stack whose top is
1435- YYSSP.
1436-
1437- Return 0 if *YYMSG was successfully written. Return 1 if *YYMSG is
1438- not large enough to hold the message. In that case, also set
1439- *YYMSG_ALLOC to the required number of bytes. Return 2 if the
1440- required number of bytes is too large to store. */
1441-static int
1442-yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg,
1443- yytype_int16 *yyssp, int yytoken)
1444-{
1445- YYSIZE_T yysize0 = yytnamerr (YY_NULLPTR, yytname[yytoken]);
1446- YYSIZE_T yysize = yysize0;
1447- enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
1448- /* Internationalized format string. */
1449- const char *yyformat = YY_NULLPTR;
1450- /* Arguments of yyformat. */
1451- char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
1452- /* Number of reported tokens (one for the "unexpected", one per
1453- "expected"). */
1454- int yycount = 0;
1455-
1456- /* There are many possibilities here to consider:
1457- - If this state is a consistent state with a default action, then
1458- the only way this function was invoked is if the default action
1459- is an error action. In that case, don't check for expected
1460- tokens because there are none.
1461- - The only way there can be no lookahead present (in yychar) is if
1462- this state is a consistent state with a default action. Thus,
1463- detecting the absence of a lookahead is sufficient to determine
1464- that there is no unexpected or expected token to report. In that
1465- case, just report a simple "syntax error".
1466- - Don't assume there isn't a lookahead just because this state is a
1467- consistent state with a default action. There might have been a
1468- previous inconsistent state, consistent state with a non-default
1469- action, or user semantic action that manipulated yychar.
1470- - Of course, the expected token list depends on states to have
1471- correct lookahead information, and it depends on the parser not
1472- to perform extra reductions after fetching a lookahead from the
1473- scanner and before detecting a syntax error. Thus, state merging
1474- (from LALR or IELR) and default reductions corrupt the expected
1475- token list. However, the list is correct for canonical LR with
1476- one exception: it will still contain any token that will not be
1477- accepted due to an error action in a later state.
1478- */
1479- if (yytoken != YYEMPTY)
1480- {
1481- int yyn = yypact[*yyssp];
1482- yyarg[yycount++] = yytname[yytoken];
1483- if (!yypact_value_is_default (yyn))
1484- {
1485- /* Start YYX at -YYN if negative to avoid negative indexes in
1486- YYCHECK. In other words, skip the first -YYN actions for
1487- this state because they are default actions. */
1488- int yyxbegin = yyn < 0 ? -yyn : 0;
1489- /* Stay within bounds of both yycheck and yytname. */
1490- int yychecklim = YYLAST - yyn + 1;
1491- int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
1492- int yyx;
1493-
1494- for (yyx = yyxbegin; yyx < yyxend; ++yyx)
1495- if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR
1496- && !yytable_value_is_error (yytable[yyx + yyn]))
1497- {
1498- if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
1499- {
1500- yycount = 1;
1501- yysize = yysize0;
1502- break;
1503- }
1504- yyarg[yycount++] = yytname[yyx];
1505- {
1506- YYSIZE_T yysize1 = yysize + yytnamerr (YY_NULLPTR, yytname[yyx]);
1507- if (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM)
1508- yysize = yysize1;
1509- else
1510- return 2;
1511- }
1512- }
1513- }
1514- }
1515-
1516- switch (yycount)
1517- {
1518-# define YYCASE_(N, S) \
1519- case N: \
1520- yyformat = S; \
1521- break
1522- default: /* Avoid compiler warnings. */
1523- YYCASE_(0, YY_("syntax error"));
1524- YYCASE_(1, YY_("syntax error, unexpected %s"));
1525- YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s"));
1526- YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or %s"));
1527- YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s or %s"));
1528- YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"));
1529-# undef YYCASE_
1530- }
1531-
1532- {
1533- YYSIZE_T yysize1 = yysize + yystrlen (yyformat);
1534- if (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM)
1535- yysize = yysize1;
1536- else
1537- return 2;
1538- }
1539-
1540- if (*yymsg_alloc < yysize)
1541- {
1542- *yymsg_alloc = 2 * yysize;
1543- if (! (yysize <= *yymsg_alloc
1544- && *yymsg_alloc <= YYSTACK_ALLOC_MAXIMUM))
1545- *yymsg_alloc = YYSTACK_ALLOC_MAXIMUM;
1546- return 1;
1547- }
1548-
1549- /* Avoid sprintf, as that infringes on the user's name space.
1550- Don't have undefined behavior even if the translation
1551- produced a string with the wrong number of "%s"s. */
1552- {
1553- char *yyp = *yymsg;
1554- int yyi = 0;
1555- while ((*yyp = *yyformat) != '\0')
1556- if (*yyp == '%' && yyformat[1] == 's' && yyi < yycount)
1557- {
1558- yyp += yytnamerr (yyp, yyarg[yyi++]);
1559- yyformat += 2;
1560- }
1561- else
1562- {
1563- yyp++;
1564- yyformat++;
1565- }
1566- }
1567- return 0;
1568-}
1569-#endif /* YYERROR_VERBOSE */
1570
1571 /*-----------------------------------------------.
1572 | Release the memory associated to this symbol. |
1573 `-----------------------------------------------*/
1574
1575 static void
1576-yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, NDBOX **result)
1577+yydestruct (const char *yymsg,
1578+ yysymbol_kind_t yykind, YYSTYPE *yyvaluep, NDBOX **result)
1579 {
1580- YYUSE (yyvaluep);
1581- YYUSE (result);
1582+ YY_USE (yyvaluep);
1583+ YY_USE (result);
1584 if (!yymsg)
1585 yymsg = "Deleting";
1586- YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
1587+ YY_SYMBOL_PRINT (yymsg, yykind, yyvaluep, yylocationp);
1588
1589 YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
1590- YYUSE (yytype);
1591+ YY_USE (yykind);
1592 YY_IGNORE_MAYBE_UNINITIALIZED_END
1593 }
1594
1595
1596-
1597-
1598-/* The lookahead symbol. */
1599+/* Lookahead token kind. */
1600 int yychar;
1601
1602 /* The semantic value of the lookahead symbol. */
1603@@ -994,6 +900,8 @@ YYSTYPE yylval;
1604 int yynerrs;
1605
1606
1607+
1608+
1609 /*----------.
1610 | yyparse. |
1611 `----------*/
1612@@ -1001,43 +909,36 @@ int yynerrs;
1613 int
1614 yyparse (NDBOX **result)
1615 {
1616- int yystate;
1617+ yy_state_fast_t yystate = 0;
1618 /* Number of tokens to shift before error messages enabled. */
1619- int yyerrstatus;
1620-
1621- /* The stacks and their tools:
1622- 'yyss': related to states.
1623- 'yyvs': related to semantic values.
1624+ int yyerrstatus = 0;
1625
1626- Refer to the stacks through separate pointers, to allow yyoverflow
1627+ /* Refer to the stacks through separate pointers, to allow yyoverflow
1628 to reallocate them elsewhere. */
1629
1630- /* The state stack. */
1631- yytype_int16 yyssa[YYINITDEPTH];
1632- yytype_int16 *yyss;
1633- yytype_int16 *yyssp;
1634+ /* Their size. */
1635+ YYPTRDIFF_T yystacksize = YYINITDEPTH;
1636
1637- /* The semantic value stack. */
1638- YYSTYPE yyvsa[YYINITDEPTH];
1639- YYSTYPE *yyvs;
1640- YYSTYPE *yyvsp;
1641+ /* The state stack: array, bottom, top. */
1642+ yy_state_t yyssa[YYINITDEPTH];
1643+ yy_state_t *yyss = yyssa;
1644+ yy_state_t *yyssp = yyss;
1645
1646- YYSIZE_T yystacksize;
1647+ /* The semantic value stack: array, bottom, top. */
1648+ YYSTYPE yyvsa[YYINITDEPTH];
1649+ YYSTYPE *yyvs = yyvsa;
1650+ YYSTYPE *yyvsp = yyvs;
1651
1652 int yyn;
1653+ /* The return value of yyparse. */
1654 int yyresult;
1655- /* Lookahead token as an internal (translated) token number. */
1656- int yytoken = 0;
1657+ /* Lookahead symbol kind. */
1658+ yysymbol_kind_t yytoken = YYSYMBOL_YYEMPTY;
1659 /* The variables used to return semantic value and location from the
1660 action routines. */
1661 YYSTYPE yyval;
1662
1663-#if YYERROR_VERBOSE
1664- /* Buffer for error messages, and its allocated size. */
1665- char yymsgbuf[128];
1666- char *yymsg = yymsgbuf;
1667- YYSIZE_T yymsg_alloc = sizeof yymsgbuf;
1668-#endif
1669+
1670
1671 #define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N))
1672
1673@@ -1045,15 +946,8 @@ yyparse (NDBOX **result)
1674 Keep to zero when no symbol should be popped. */
1675 int yylen = 0;
1676
1677- yyssp = yyss = yyssa;
1678- yyvsp = yyvs = yyvsa;
1679- yystacksize = YYINITDEPTH;
1680-
1681 YYDPRINTF ((stderr, "Starting parse\n"));
1682
1683- yystate = 0;
1684- yyerrstatus = 0;
1685- yynerrs = 0;
1686 yychar = YYEMPTY; /* Cause a token to be read. */
1687 goto yysetstate;
1688
1689@@ -1068,10 +962,15 @@ yynewstate:
1690
1691
1692 /*--------------------------------------------------------------------.
1693-| yynewstate -- set current state (the top of the stack) to yystate. |
1694+| yysetstate -- set current state (the top of the stack) to yystate. |
1695 `--------------------------------------------------------------------*/
1696 yysetstate:
1697- *yyssp = (yytype_int16) yystate;
1698+ YYDPRINTF ((stderr, "Entering state %d\n", yystate));
1699+ YY_ASSERT (0 <= yystate && yystate < YYNSTATES);
1700+ YY_IGNORE_USELESS_CAST_BEGIN
1701+ *yyssp = YY_CAST (yy_state_t, yystate);
1702+ YY_IGNORE_USELESS_CAST_END
1703+ YY_STACK_PRINT (yyss, yyssp);
1704
1705 if (yyss + yystacksize - 1 <= yyssp)
1706 #if !defined yyoverflow && !defined YYSTACK_RELOCATE
1707@@ -1079,23 +978,23 @@ yysetstate:
1708 #else
1709 {
1710 /* Get the current used size of the three stacks, in elements. */
1711- YYSIZE_T yysize = (YYSIZE_T) (yyssp - yyss + 1);
1712+ YYPTRDIFF_T yysize = yyssp - yyss + 1;
1713
1714 # if defined yyoverflow
1715 {
1716 /* Give user a chance to reallocate the stack. Use copies of
1717 these so that the &'s don't force the real ones into
1718 memory. */
1719+ yy_state_t *yyss1 = yyss;
1720 YYSTYPE *yyvs1 = yyvs;
1721- yytype_int16 *yyss1 = yyss;
1722
1723 /* Each stack pointer address is followed by the size of the
1724 data in use in that stack, in bytes. This used to be a
1725 conditional around just the two extra args, but that might
1726 be undefined if yyoverflow is a macro. */
1727 yyoverflow (YY_("memory exhausted"),
1728- &yyss1, yysize * sizeof (*yyssp),
1729- &yyvs1, yysize * sizeof (*yyvsp),
1730+ &yyss1, yysize * YYSIZEOF (*yyssp),
1731+ &yyvs1, yysize * YYSIZEOF (*yyvsp),
1732 &yystacksize);
1733 yyss = yyss1;
1734 yyvs = yyvs1;
1735@@ -1109,14 +1008,15 @@ yysetstate:
1736 yystacksize = YYMAXDEPTH;
1737
1738 {
1739- yytype_int16 *yyss1 = yyss;
1740+ yy_state_t *yyss1 = yyss;
1741 union yyalloc *yyptr =
1742- (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
1743+ YY_CAST (union yyalloc *,
1744+ YYSTACK_ALLOC (YY_CAST (YYSIZE_T, YYSTACK_BYTES (yystacksize))));
1745 if (! yyptr)
1746 goto yyexhaustedlab;
1747 YYSTACK_RELOCATE (yyss_alloc, yyss);
1748 YYSTACK_RELOCATE (yyvs_alloc, yyvs);
1749-# undef YYSTACK_RELOCATE
1750+# undef YYSTACK_RELOCATE
1751 if (yyss1 != yyssa)
1752 YYSTACK_FREE (yyss1);
1753 }
1754@@ -1125,16 +1025,16 @@ yysetstate:
1755 yyssp = yyss + yysize - 1;
1756 yyvsp = yyvs + yysize - 1;
1757
1758- YYDPRINTF ((stderr, "Stack size increased to %lu\n",
1759- (unsigned long) yystacksize));
1760+ YY_IGNORE_USELESS_CAST_BEGIN
1761+ YYDPRINTF ((stderr, "Stack size increased to %ld\n",
1762+ YY_CAST (long, yystacksize)));
1763+ YY_IGNORE_USELESS_CAST_END
1764
1765 if (yyss + yystacksize - 1 <= yyssp)
1766 YYABORT;
1767 }
1768 #endif /* !defined yyoverflow && !defined YYSTACK_RELOCATE */
1769
1770- YYDPRINTF ((stderr, "Entering state %d\n", yystate));
1771-
1772 if (yystate == YYFINAL)
1773 YYACCEPT;
1774
1775@@ -1155,18 +1055,29 @@ yybackup:
1776
1777 /* Not known => get a lookahead token if don't already have one. */
1778
1779- /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */
1780+ /* YYCHAR is either empty, or end-of-input, or a valid lookahead. */
1781 if (yychar == YYEMPTY)
1782 {
1783- YYDPRINTF ((stderr, "Reading a token: "));
1784+ YYDPRINTF ((stderr, "Reading a token\n"));
1785 yychar = yylex ();
1786 }
1787
1788 if (yychar <= YYEOF)
1789 {
1790- yychar = yytoken = YYEOF;
1791+ yychar = YYEOF;
1792+ yytoken = YYSYMBOL_YYEOF;
1793 YYDPRINTF ((stderr, "Now at end of input.\n"));
1794 }
1795+ else if (yychar == YYerror)
1796+ {
1797+ /* The scanner already issued an error message, process directly
1798+ to error recovery. But do not keep the error token as
1799+ lookahead, it is too special and may lead us to an endless
1800+ loop in error recovery. */
1801+ yychar = YYUNDEF;
1802+ yytoken = YYSYMBOL_YYerror;
1803+ goto yyerrlab1;
1804+ }
1805 else
1806 {
1807 yytoken = YYTRANSLATE (yychar);
1808@@ -1194,15 +1105,13 @@ yybackup:
1809
1810 /* Shift the lookahead token. */
1811 YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
1812-
1813- /* Discard the shifted token. */
1814- yychar = YYEMPTY;
1815-
1816 yystate = yyn;
1817 YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
1818 *++yyvsp = yylval;
1819 YY_IGNORE_MAYBE_UNINITIALIZED_END
1820
1821+ /* Discard the shifted token. */
1822+ yychar = YYEMPTY;
1823 goto yynewstate;
1824
1825
1826@@ -1237,9 +1146,9 @@ yyreduce:
1827 YY_REDUCE_PRINT (yyn);
1828 switch (yyn)
1829 {
1830- case 2:
1831-#line 47 "cubeparse.y" /* yacc.c:1652 */
1832- {
1833+ case 2: /* box: O_BRACKET paren_list COMMA paren_list C_BRACKET */
1834+#line 47 "cubeparse.y"
1835+ {
1836 int dim;
1837
1838 dim = item_count(yyvsp[-3], ',');
1839@@ -1264,12 +1173,12 @@ yyreduce:
1840
1841 *result = write_box( dim, yyvsp[-3], yyvsp[-1] );
1842 }
1843-#line 1268 "cubeparse.c" /* yacc.c:1652 */
1844+#line 1177 "cubeparse.c"
1845 break;
1846
1847- case 3:
1848-#line 74 "cubeparse.y" /* yacc.c:1652 */
1849- {
1850+ case 3: /* box: paren_list COMMA paren_list */
1851+#line 74 "cubeparse.y"
1852+ {
1853 int dim;
1854
1855 dim = item_count(yyvsp[-2], ',');
1856@@ -1294,12 +1203,12 @@ yyreduce:
1857
1858 *result = write_box( dim, yyvsp[-2], yyvsp[0] );
1859 }
1860-#line 1298 "cubeparse.c" /* yacc.c:1652 */
1861+#line 1207 "cubeparse.c"
1862 break;
1863
1864- case 4:
1865-#line 101 "cubeparse.y" /* yacc.c:1652 */
1866- {
1867+ case 4: /* box: paren_list */
1868+#line 101 "cubeparse.y"
1869+ {
1870 int dim;
1871
1872 dim = item_count(yyvsp[0], ',');
1873@@ -1315,12 +1224,12 @@ yyreduce:
1874
1875 *result = write_point_as_box(dim, yyvsp[0]);
1876 }
1877-#line 1319 "cubeparse.c" /* yacc.c:1652 */
1878+#line 1228 "cubeparse.c"
1879 break;
1880
1881- case 5:
1882-#line 119 "cubeparse.y" /* yacc.c:1652 */
1883- {
1884+ case 5: /* box: list */
1885+#line 119 "cubeparse.y"
1886+ {
1887 int dim;
1888
1889 dim = item_count(yyvsp[0], ',');
1890@@ -1336,47 +1245,48 @@ yyreduce:
1891
1892 *result = write_point_as_box(dim, yyvsp[0]);
1893 }
1894-#line 1340 "cubeparse.c" /* yacc.c:1652 */
1895+#line 1249 "cubeparse.c"
1896 break;
1897
1898- case 6:
1899-#line 138 "cubeparse.y" /* yacc.c:1652 */
1900- {
1901+ case 6: /* paren_list: O_PAREN list C_PAREN */
1902+#line 138 "cubeparse.y"
1903+ {
1904 yyval = yyvsp[-1];
1905 }
1906-#line 1348 "cubeparse.c" /* yacc.c:1652 */
1907+#line 1257 "cubeparse.c"
1908 break;
1909
1910- case 7:
1911-#line 142 "cubeparse.y" /* yacc.c:1652 */
1912- {
1913+ case 7: /* paren_list: O_PAREN C_PAREN */
1914+#line 142 "cubeparse.y"
1915+ {
1916 yyval = pstrdup("");
1917 }
1918-#line 1356 "cubeparse.c" /* yacc.c:1652 */
1919+#line 1265 "cubeparse.c"
1920 break;
1921
1922- case 8:
1923-#line 148 "cubeparse.y" /* yacc.c:1652 */
1924- {
1925+ case 8: /* list: CUBEFLOAT */
1926+#line 148 "cubeparse.y"
1927+ {
1928 /* alloc enough space to be sure whole list will fit */
1929 yyval = palloc(scanbuflen + 1);
1930 strcpy(yyval, yyvsp[0]);
1931 }
1932-#line 1366 "cubeparse.c" /* yacc.c:1652 */
1933+#line 1275 "cubeparse.c"
1934 break;
1935
1936- case 9:
1937-#line 154 "cubeparse.y" /* yacc.c:1652 */
1938- {
1939+ case 9: /* list: list COMMA CUBEFLOAT */
1940+#line 154 "cubeparse.y"
1941+ {
1942 yyval = yyvsp[-2];
1943 strcat(yyval, ",");
1944 strcat(yyval, yyvsp[0]);
1945 }
1946-#line 1376 "cubeparse.c" /* yacc.c:1652 */
1947+#line 1285 "cubeparse.c"
1948 break;
1949
1950
1951-#line 1380 "cubeparse.c" /* yacc.c:1652 */
1952+#line 1289 "cubeparse.c"
1953+
1954 default: break;
1955 }
1956 /* User semantic actions sometimes alter yychar, and that requires
1957@@ -1390,11 +1300,10 @@ yyreduce:
1958 case of YYERROR or YYBACKUP, subsequent parser actions might lead
1959 to an incorrect destructor call or verbose syntax error message
1960 before the lookahead is translated. */
1961- YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
1962+ YY_SYMBOL_PRINT ("-> $$ =", YY_CAST (yysymbol_kind_t, yyr1[yyn]), &yyval, &yyloc);
1963
1964 YYPOPSTACK (yylen);
1965 yylen = 0;
1966- YY_STACK_PRINT (yyss, yyssp);
1967
1968 *++yyvsp = yyval;
1969
1970@@ -1418,50 +1327,14 @@ yyreduce:
1971 yyerrlab:
1972 /* Make sure we have latest lookahead translation. See comments at
1973 user semantic actions for why this is necessary. */
1974- yytoken = yychar == YYEMPTY ? YYEMPTY : YYTRANSLATE (yychar);
1975-
1976+ yytoken = yychar == YYEMPTY ? YYSYMBOL_YYEMPTY : YYTRANSLATE (yychar);
1977 /* If not already recovering from an error, report this error. */
1978 if (!yyerrstatus)
1979 {
1980 ++yynerrs;
1981-#if ! YYERROR_VERBOSE
1982 yyerror (result, YY_("syntax error"));
1983-#else
1984-# define YYSYNTAX_ERROR yysyntax_error (&yymsg_alloc, &yymsg, \
1985- yyssp, yytoken)
1986- {
1987- char const *yymsgp = YY_("syntax error");
1988- int yysyntax_error_status;
1989- yysyntax_error_status = YYSYNTAX_ERROR;
1990- if (yysyntax_error_status == 0)
1991- yymsgp = yymsg;
1992- else if (yysyntax_error_status == 1)
1993- {
1994- if (yymsg != yymsgbuf)
1995- YYSTACK_FREE (yymsg);
1996- yymsg = (char *) YYSTACK_ALLOC (yymsg_alloc);
1997- if (!yymsg)
1998- {
1999- yymsg = yymsgbuf;
2000- yymsg_alloc = sizeof yymsgbuf;
2001- yysyntax_error_status = 2;
2002- }
2003- else
2004- {
2005- yysyntax_error_status = YYSYNTAX_ERROR;
2006- yymsgp = yymsg;
2007- }
2008- }
2009- yyerror (result, yymsgp);
2010- if (yysyntax_error_status == 2)
2011- goto yyexhaustedlab;
2012- }
2013-# undef YYSYNTAX_ERROR
2014-#endif
2015 }
2016
2017-
2018-
2019 if (yyerrstatus == 3)
2020 {
2021 /* If just tried and failed to reuse lookahead token after an
2022@@ -1510,13 +1383,14 @@ yyerrorlab:
2023 yyerrlab1:
2024 yyerrstatus = 3; /* Each real token shifted decrements this. */
2025
2026+ /* Pop stack until we find a state that shifts the error token. */
2027 for (;;)
2028 {
2029 yyn = yypact[yystate];
2030 if (!yypact_value_is_default (yyn))
2031 {
2032- yyn += YYTERROR;
2033- if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
2034+ yyn += YYSYMBOL_YYerror;
2035+ if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYSYMBOL_YYerror)
2036 {
2037 yyn = yytable[yyn];
2038 if (0 < yyn)
2039@@ -1530,7 +1404,7 @@ yyerrlab1:
2040
2041
2042 yydestruct ("Error: popping",
2043- yystos[yystate], yyvsp, result);
2044+ YY_ACCESSING_SYMBOL (yystate), yyvsp, result);
2045 YYPOPSTACK (1);
2046 yystate = *yyssp;
2047 YY_STACK_PRINT (yyss, yyssp);
2048@@ -1542,7 +1416,7 @@ yyerrlab1:
2049
2050
2051 /* Shift the error token. */
2052- YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp);
2053+ YY_SYMBOL_PRINT ("Shifting", YY_ACCESSING_SYMBOL (yyn), yyvsp, yylsp);
2054
2055 yystate = yyn;
2056 goto yynewstate;
2057@@ -1564,20 +1438,20 @@ yyabortlab:
2058 goto yyreturn;
2059
2060
2061-#if !defined yyoverflow || YYERROR_VERBOSE
2062+#if !defined yyoverflow
2063 /*-------------------------------------------------.
2064 | yyexhaustedlab -- memory exhaustion comes here. |
2065 `-------------------------------------------------*/
2066 yyexhaustedlab:
2067 yyerror (result, YY_("memory exhausted"));
2068 yyresult = 2;
2069- /* Fall through. */
2070+ goto yyreturn;
2071 #endif
2072
2073
2074-/*-----------------------------------------------------.
2075-| yyreturn -- parsing is finished, return the result. |
2076-`-----------------------------------------------------*/
2077+/*-------------------------------------------------------.
2078+| yyreturn -- parsing is finished, clean up and return. |
2079+`-------------------------------------------------------*/
2080 yyreturn:
2081 if (yychar != YYEMPTY)
2082 {
2083@@ -1594,20 +1468,18 @@ yyreturn:
2084 while (yyssp != yyss)
2085 {
2086 yydestruct ("Cleanup: popping",
2087- yystos[*yyssp], yyvsp, result);
2088+ YY_ACCESSING_SYMBOL (+*yyssp), yyvsp, result);
2089 YYPOPSTACK (1);
2090 }
2091 #ifndef yyoverflow
2092 if (yyss != yyssa)
2093 YYSTACK_FREE (yyss);
2094 #endif
2095-#if YYERROR_VERBOSE
2096- if (yymsg != yymsgbuf)
2097- YYSTACK_FREE (yymsg);
2098-#endif
2099+
2100 return yyresult;
2101 }
2102-#line 161 "cubeparse.y" /* yacc.c:1918 */
2103+
2104+#line 161 "cubeparse.y"
2105
2106
2107 /* This assumes the string has been normalized by productions above */
2108diff --git a/contrib/pageinspect/brinfuncs.c b/contrib/pageinspect/brinfuncs.c
2109index 04140ec..f1b096e 100644
2110--- a/contrib/pageinspect/brinfuncs.c
2111+++ b/contrib/pageinspect/brinfuncs.c
2112@@ -18,6 +18,7 @@
2113 #include "access/brin_revmap.h"
2114 #include "access/brin_tuple.h"
2115 #include "catalog/index.h"
2116+#include "catalog/pg_am_d.h"
2117 #include "catalog/pg_type.h"
2118 #include "funcapi.h"
2119 #include "lib/stringinfo.h"
2120@@ -33,6 +34,8 @@ PG_FUNCTION_INFO_V1(brin_page_items);
2121 PG_FUNCTION_INFO_V1(brin_metapage_info);
2122 PG_FUNCTION_INFO_V1(brin_revmap_data);
2123
2124+#define IS_BRIN(r) ((r)->rd_rel->relam == BRIN_AM_OID)
2125+
2126 typedef struct brin_column_state
2127 {
2128 int nstored;
2129@@ -47,8 +50,7 @@ Datum
2130 brin_page_type(PG_FUNCTION_ARGS)
2131 {
2132 bytea *raw_page = PG_GETARG_BYTEA_P(0);
2133- Page page = VARDATA(raw_page);
2134- int raw_page_size;
2135+ Page page;
2136 char *type;
2137
2138 if (!superuser())
2139@@ -56,14 +58,19 @@ brin_page_type(PG_FUNCTION_ARGS)
2140 (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
2141 (errmsg("must be superuser to use raw page functions"))));
2142
2143- raw_page_size = VARSIZE(raw_page) - VARHDRSZ;
2144+ page = get_page_from_raw(raw_page);
2145
2146- if (raw_page_size != BLCKSZ)
2147- ereport(ERROR,
2148- (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
2149- errmsg("input page too small"),
2150- errdetail("Expected size %d, got %d",
2151- BLCKSZ, raw_page_size)));
2152+ if (PageIsNew(page))
2153+ PG_RETURN_NULL();
2154+
2155+ /* verify the special space has the expected size */
2156+ if (PageGetSpecialSize(page) != MAXALIGN(sizeof(BrinSpecialSpace)))
2157+ ereport(ERROR,
2158+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
2159+ errmsg("input page is not a valid %s page", "BRIN"),
2160+ errdetail("Expected special size %d, got %d.",
2161+ (int) MAXALIGN(sizeof(BrinSpecialSpace)),
2162+ (int) PageGetSpecialSize(page))));
2163
2164 switch (BrinPageType(page))
2165 {
2166@@ -91,19 +98,19 @@ brin_page_type(PG_FUNCTION_ARGS)
2167 static Page
2168 verify_brin_page(bytea *raw_page, uint16 type, const char *strtype)
2169 {
2170- Page page;
2171- int raw_page_size;
2172+ Page page = get_page_from_raw(raw_page);
2173
2174- raw_page_size = VARSIZE(raw_page) - VARHDRSZ;
2175+ if (PageIsNew(page))
2176+ return page;
2177
2178- if (raw_page_size != BLCKSZ)
2179- ereport(ERROR,
2180- (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
2181- errmsg("input page too small"),
2182- errdetail("Expected size %d, got %d",
2183- BLCKSZ, raw_page_size)));
2184-
2185- page = VARDATA(raw_page);
2186+ /* verify the special space has the expected size */
2187+ if (PageGetSpecialSize(page) != MAXALIGN(sizeof(BrinSpecialSpace)))
2188+ ereport(ERROR,
2189+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
2190+ errmsg("input page is not a valid %s page", "BRIN"),
2191+ errdetail("Expected special size %d, got %d.",
2192+ (int) MAXALIGN(sizeof(BrinSpecialSpace)),
2193+ (int) PageGetSpecialSize(page))));
2194
2195 /* verify the special space says this page is what we want */
2196 if (BrinPageType(page) != type)
2197@@ -171,11 +178,25 @@ brin_page_items(PG_FUNCTION_ARGS)
2198 MemoryContextSwitchTo(oldcontext);
2199
2200 indexRel = index_open(indexRelid, AccessShareLock);
2201+
2202+ if (!IS_BRIN(indexRel))
2203+ ereport(ERROR,
2204+ (errcode(ERRCODE_WRONG_OBJECT_TYPE),
2205+ errmsg("\"%s\" is not a %s index",
2206+ RelationGetRelationName(indexRel), "BRIN")));
2207+
2208 bdesc = brin_build_desc(indexRel);
2209
2210 /* minimally verify the page we got */
2211 page = verify_brin_page(raw_page, BRIN_PAGETYPE_REGULAR, "regular");
2212
2213+ if (PageIsNew(page))
2214+ {
2215+ brin_free_desc(bdesc);
2216+ index_close(indexRel, AccessShareLock);
2217+ PG_RETURN_NULL();
2218+ }
2219+
2220 /*
2221 * Initialize output functions for all indexed datatypes; simplifies
2222 * calling them later.
2223@@ -342,6 +363,9 @@ brin_metapage_info(PG_FUNCTION_ARGS)
2224
2225 page = verify_brin_page(raw_page, BRIN_PAGETYPE_META, "metapage");
2226
2227+ if (PageIsNew(page))
2228+ PG_RETURN_NULL();
2229+
2230 /* Build a tuple descriptor for our result type */
2231 if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE)
2232 elog(ERROR, "return type must be a row type");
2233@@ -384,15 +408,21 @@ brin_revmap_data(PG_FUNCTION_ARGS)
2234 MemoryContext mctx;
2235 Page page;
2236
2237- /* minimally verify the page we got */
2238- page = verify_brin_page(raw_page, BRIN_PAGETYPE_REVMAP, "revmap");
2239-
2240 /* create a function context for cross-call persistence */
2241 fctx = SRF_FIRSTCALL_INIT();
2242
2243 /* switch to memory context appropriate for multiple function calls */
2244 mctx = MemoryContextSwitchTo(fctx->multi_call_memory_ctx);
2245
2246+ /* minimally verify the page we got */
2247+ page = verify_brin_page(raw_page, BRIN_PAGETYPE_REVMAP, "revmap");
2248+
2249+ if (PageIsNew(page))
2250+ {
2251+ MemoryContextSwitchTo(mctx);
2252+ PG_RETURN_NULL();
2253+ }
2254+
2255 state = palloc(sizeof(*state));
2256 state->tids = ((RevmapContents *) PageGetContents(page))->rm_tids;
2257 state->idx = 0;
2258diff --git a/contrib/pageinspect/btreefuncs.c b/contrib/pageinspect/btreefuncs.c
2259index dd15caa..2613d73 100644
2260--- a/contrib/pageinspect/btreefuncs.c
2261+++ b/contrib/pageinspect/btreefuncs.c
2262@@ -182,8 +182,10 @@ bt_page_stats(PG_FUNCTION_ARGS)
2263 rel = relation_openrv(relrv, AccessShareLock);
2264
2265 if (!IS_INDEX(rel) || !IS_BTREE(rel))
2266- elog(ERROR, "relation \"%s\" is not a btree index",
2267- RelationGetRelationName(rel));
2268+ ereport(ERROR,
2269+ (errcode(ERRCODE_WRONG_OBJECT_TYPE),
2270+ errmsg("\"%s\" is not a %s index",
2271+ RelationGetRelationName(rel), "btree")));
2272
2273 /*
2274 * Reject attempts to read non-local temporary relations; we would be
2275@@ -336,8 +338,10 @@ bt_page_items(PG_FUNCTION_ARGS)
2276 rel = relation_openrv(relrv, AccessShareLock);
2277
2278 if (!IS_INDEX(rel) || !IS_BTREE(rel))
2279- elog(ERROR, "relation \"%s\" is not a btree index",
2280- RelationGetRelationName(rel));
2281+ ereport(ERROR,
2282+ (errcode(ERRCODE_WRONG_OBJECT_TYPE),
2283+ errmsg("\"%s\" is not a %s index",
2284+ RelationGetRelationName(rel), "btree")));
2285
2286 /*
2287 * Reject attempts to read non-local temporary relations; we would be
2288@@ -425,7 +429,6 @@ bt_page_items_bytea(PG_FUNCTION_ARGS)
2289 Datum result;
2290 FuncCallContext *fctx;
2291 struct user_args *uargs;
2292- int raw_page_size;
2293
2294 if (!superuser())
2295 ereport(ERROR,
2296@@ -438,22 +441,30 @@ bt_page_items_bytea(PG_FUNCTION_ARGS)
2297 MemoryContext mctx;
2298 TupleDesc tupleDesc;
2299
2300- raw_page_size = VARSIZE(raw_page) - VARHDRSZ;
2301-
2302- if (raw_page_size < SizeOfPageHeaderData)
2303- ereport(ERROR,
2304- (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
2305- errmsg("input page too small (%d bytes)", raw_page_size)));
2306-
2307 fctx = SRF_FIRSTCALL_INIT();
2308 mctx = MemoryContextSwitchTo(fctx->multi_call_memory_ctx);
2309
2310 uargs = palloc(sizeof(struct user_args));
2311
2312- uargs->page = VARDATA(raw_page);
2313+ uargs->page = get_page_from_raw(raw_page);
2314+
2315+ if (PageIsNew(uargs->page))
2316+ {
2317+ MemoryContextSwitchTo(mctx);
2318+ PG_RETURN_NULL();
2319+ }
2320
2321 uargs->offset = FirstOffsetNumber;
2322
2323+ /* verify the special space has the expected size */
2324+ if (PageGetSpecialSize(uargs->page) != MAXALIGN(sizeof(BTPageOpaqueData)))
2325+ ereport(ERROR,
2326+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
2327+ errmsg("input page is not a valid %s page", "btree"),
2328+ errdetail("Expected special size %d, got %d.",
2329+ (int) MAXALIGN(sizeof(BTPageOpaqueData)),
2330+ (int) PageGetSpecialSize(uargs->page))));
2331+
2332 opaque = (BTPageOpaque) PageGetSpecialPointer(uargs->page);
2333
2334 if (P_ISMETA(opaque))
2335@@ -461,6 +472,11 @@ bt_page_items_bytea(PG_FUNCTION_ARGS)
2336 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
2337 errmsg("block is a meta page")));
2338
2339+ if (P_ISLEAF(opaque) && opaque->btpo.level != 0)
2340+ ereport(ERROR,
2341+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
2342+ errmsg("block is not a valid btree leaf page")));
2343+
2344 if (P_ISDELETED(opaque))
2345 elog(NOTICE, "page is deleted");
2346
2347@@ -526,8 +542,10 @@ bt_metap(PG_FUNCTION_ARGS)
2348 rel = relation_openrv(relrv, AccessShareLock);
2349
2350 if (!IS_INDEX(rel) || !IS_BTREE(rel))
2351- elog(ERROR, "relation \"%s\" is not a btree index",
2352- RelationGetRelationName(rel));
2353+ ereport(ERROR,
2354+ (errcode(ERRCODE_WRONG_OBJECT_TYPE),
2355+ errmsg("\"%s\" is not a %s index",
2356+ RelationGetRelationName(rel), "btree")));
2357
2358 /*
2359 * Reject attempts to read non-local temporary relations; we would be
2360diff --git a/contrib/pageinspect/expected/brin.out b/contrib/pageinspect/expected/brin.out
2361index 71eb190..d19cdc3 100644
2362--- a/contrib/pageinspect/expected/brin.out
2363+++ b/contrib/pageinspect/expected/brin.out
2364@@ -48,4 +48,43 @@ SELECT * FROM brin_page_items(get_raw_page('test1_a_idx', 2), 'test1_a_idx')
2365 1 | 0 | 1 | f | f | f | {1 .. 1}
2366 (1 row)
2367
2368+-- Failure for non-BRIN index.
2369+CREATE INDEX test1_a_btree ON test1 (a);
2370+SELECT brin_page_items(get_raw_page('test1_a_btree', 0), 'test1_a_btree');
2371+ERROR: "test1_a_btree" is not a BRIN index
2372+-- Mask DETAIL messages as these are not portable across architectures.
2373+\set VERBOSITY terse
2374+-- Invalid special area size
2375+SELECT brin_page_type(get_raw_page('test1', 0));
2376+ERROR: input page is not a valid BRIN page
2377+SELECT * FROM brin_metapage_info(get_raw_page('test1', 0));
2378+ERROR: input page is not a valid BRIN page
2379+SELECT * FROM brin_revmap_data(get_raw_page('test1', 0));
2380+ERROR: input page is not a valid BRIN page
2381+\set VERBOSITY default
2382+-- Tests with all-zero pages.
2383+SHOW block_size \gset
2384+SELECT brin_page_type(decode(repeat('00', :block_size), 'hex'));
2385+ brin_page_type
2386+----------------
2387+
2388+(1 row)
2389+
2390+SELECT brin_page_items(decode(repeat('00', :block_size), 'hex'), 'test1_a_idx');
2391+ brin_page_items
2392+-----------------
2393+(0 rows)
2394+
2395+SELECT brin_metapage_info(decode(repeat('00', :block_size), 'hex'));
2396+ brin_metapage_info
2397+--------------------
2398+
2399+(1 row)
2400+
2401+SELECT brin_revmap_data(decode(repeat('00', :block_size), 'hex'));
2402+ brin_revmap_data
2403+------------------
2404+
2405+(1 row)
2406+
2407 DROP TABLE test1;
2408diff --git a/contrib/pageinspect/expected/btree.out b/contrib/pageinspect/expected/btree.out
2409index 07c2dcd..5fe5403 100644
2410--- a/contrib/pageinspect/expected/btree.out
2411+++ b/contrib/pageinspect/expected/btree.out
2412@@ -1,5 +1,5 @@
2413-CREATE TABLE test1 (a int8, b text);
2414-INSERT INTO test1 VALUES (72057594037927937, 'text');
2415+CREATE TABLE test1 (a int8, b int4range);
2416+INSERT INTO test1 VALUES (72057594037927937, '[0,1)');
2417 CREATE INDEX test1_a_idx ON test1 USING btree (a);
2418 \x
2419 SELECT * FROM bt_metap('test1_a_idx');
2420@@ -57,4 +57,39 @@ data | 01 00 00 00 00 00 00 01
2421
2422 SELECT * FROM bt_page_items(get_raw_page('test1_a_idx', 2));
2423 ERROR: block number 2 is out of range for relation "test1_a_idx"
2424+-- Failure when using a non-btree index.
2425+CREATE INDEX test1_a_hash ON test1 USING hash(a);
2426+SELECT bt_metap('test1_a_hash');
2427+ERROR: "test1_a_hash" is not a btree index
2428+SELECT bt_page_stats('test1_a_hash', 0);
2429+ERROR: "test1_a_hash" is not a btree index
2430+SELECT bt_page_items('test1_a_hash', 0);
2431+ERROR: "test1_a_hash" is not a btree index
2432+SELECT bt_page_items(get_raw_page('test1_a_hash', 0));
2433+ERROR: block is a meta page
2434+CREATE INDEX test1_b_gist ON test1 USING gist(b);
2435+-- Special area of GiST is the same as btree, this complains about inconsistent
2436+-- leaf data on the page.
2437+SELECT bt_page_items(get_raw_page('test1_b_gist', 0));
2438+ERROR: block is not a valid btree leaf page
2439+-- Several failure modes.
2440+-- Suppress the DETAIL message, to allow the tests to work across various
2441+-- page sizes and architectures.
2442+\set VERBOSITY terse
2443+-- invalid page size
2444+SELECT bt_page_items('aaa'::bytea);
2445+ERROR: invalid page size
2446+-- invalid special area size
2447+CREATE INDEX test1_a_brin ON test1 USING brin(a);
2448+SELECT bt_page_items(get_raw_page('test1', 0));
2449+ERROR: input page is not a valid btree page
2450+SELECT bt_page_items(get_raw_page('test1_a_brin', 0));
2451+ERROR: input page is not a valid btree page
2452+\set VERBOSITY default
2453+-- Tests with all-zero pages.
2454+SHOW block_size \gset
2455+SELECT bt_page_items(decode(repeat('00', :block_size), 'hex'));
2456+-[ RECORD 1 ]-+-
2457+bt_page_items |
2458+
2459 DROP TABLE test1;
2460diff --git a/contrib/pageinspect/expected/gin.out b/contrib/pageinspect/expected/gin.out
2461index 82f63b2..5f49ff5 100644
2462--- a/contrib/pageinspect/expected/gin.out
2463+++ b/contrib/pageinspect/expected/gin.out
2464@@ -35,3 +35,36 @@ FROM gin_leafpage_items(get_raw_page('test1_y_idx',
2465 -[ RECORD 1 ]
2466 ?column? | t
2467
2468+-- Failure with various modes.
2469+-- Suppress the DETAIL message, to allow the tests to work across various
2470+-- page sizes and architectures.
2471+\set VERBOSITY terse
2472+-- invalid page size
2473+SELECT gin_leafpage_items('aaa'::bytea);
2474+ERROR: invalid page size
2475+SELECT gin_metapage_info('bbb'::bytea);
2476+ERROR: invalid page size
2477+SELECT gin_page_opaque_info('ccc'::bytea);
2478+ERROR: invalid page size
2479+-- invalid special area size
2480+SELECT * FROM gin_metapage_info(get_raw_page('test1', 0));
2481+ERROR: input page is not a valid GIN metapage
2482+SELECT * FROM gin_page_opaque_info(get_raw_page('test1', 0));
2483+ERROR: input page is not a valid GIN data leaf page
2484+SELECT * FROM gin_leafpage_items(get_raw_page('test1', 0));
2485+ERROR: input page is not a valid GIN data leaf page
2486+\set VERBOSITY default
2487+-- Tests with all-zero pages.
2488+SHOW block_size \gset
2489+SELECT gin_leafpage_items(decode(repeat('00', :block_size), 'hex'));
2490+-[ RECORD 1 ]------+-
2491+gin_leafpage_items |
2492+
2493+SELECT gin_metapage_info(decode(repeat('00', :block_size), 'hex'));
2494+-[ RECORD 1 ]-----+-
2495+gin_metapage_info |
2496+
2497+SELECT gin_page_opaque_info(decode(repeat('00', :block_size), 'hex'));
2498+-[ RECORD 1 ]--------+-
2499+gin_page_opaque_info |
2500+
2501diff --git a/contrib/pageinspect/expected/hash.out b/contrib/pageinspect/expected/hash.out
2502index 75d7bcf..82f1875 100644
2503--- a/contrib/pageinspect/expected/hash.out
2504+++ b/contrib/pageinspect/expected/hash.out
2505@@ -159,4 +159,43 @@ SELECT * FROM hash_page_items(get_raw_page('test_hash_a_idx', 4));
2506
2507 SELECT * FROM hash_page_items(get_raw_page('test_hash_a_idx', 5));
2508 ERROR: page is not a hash bucket or overflow page
2509+-- Failure with non-hash index
2510+CREATE INDEX test_hash_a_btree ON test_hash USING btree (a);
2511+SELECT hash_bitmap_info('test_hash_a_btree', 0);
2512+ERROR: "test_hash_a_btree" is not a hash index
2513+-- Failure with various modes.
2514+-- Suppress the DETAIL message, to allow the tests to work across various
2515+-- page sizes and architectures.
2516+\set VERBOSITY terse
2517+-- invalid page size
2518+SELECT hash_metapage_info('aaa'::bytea);
2519+ERROR: invalid page size
2520+SELECT hash_page_items('bbb'::bytea);
2521+ERROR: invalid page size
2522+SELECT hash_page_stats('ccc'::bytea);
2523+ERROR: invalid page size
2524+SELECT hash_page_type('ddd'::bytea);
2525+ERROR: invalid page size
2526+-- invalid special area size
2527+SELECT hash_metapage_info(get_raw_page('test_hash', 0));
2528+ERROR: input page is not a valid hash page
2529+SELECT hash_page_items(get_raw_page('test_hash', 0));
2530+ERROR: input page is not a valid hash page
2531+SELECT hash_page_stats(get_raw_page('test_hash', 0));
2532+ERROR: input page is not a valid hash page
2533+SELECT hash_page_type(get_raw_page('test_hash', 0));
2534+ERROR: input page is not a valid hash page
2535+\set VERBOSITY default
2536+-- Tests with all-zero pages.
2537+SHOW block_size \gset
2538+SELECT hash_metapage_info(decode(repeat('00', :block_size), 'hex'));
2539+ERROR: page is not a hash meta page
2540+SELECT hash_page_items(decode(repeat('00', :block_size), 'hex'));
2541+ERROR: page is not a hash bucket or overflow page
2542+SELECT hash_page_stats(decode(repeat('00', :block_size), 'hex'));
2543+ERROR: page is not a hash bucket or overflow page
2544+SELECT hash_page_type(decode(repeat('00', :block_size), 'hex'));
2545+-[ RECORD 1 ]--+-------
2546+hash_page_type | unused
2547+
2548 DROP TABLE test_hash;
2549diff --git a/contrib/pageinspect/expected/page.out b/contrib/pageinspect/expected/page.out
2550index e4e0c22..bb6b116 100644
2551--- a/contrib/pageinspect/expected/page.out
2552+++ b/contrib/pageinspect/expected/page.out
2553@@ -113,3 +113,34 @@ select tuple_data_split('test8'::regclass, t_data, t_infomask, t_infomask2, t_bi
2554 (1 row)
2555
2556 drop table test8;
2557+-- Failure with incorrect page size
2558+-- Suppress the DETAIL message, to allow the tests to work across various
2559+-- page sizes.
2560+\set VERBOSITY terse
2561+SELECT fsm_page_contents('aaa'::bytea);
2562+ERROR: invalid page size
2563+SELECT page_checksum('bbb'::bytea, 0);
2564+ERROR: invalid page size
2565+SELECT page_header('ccc'::bytea);
2566+ERROR: invalid page size
2567+\set VERBOSITY default
2568+-- Tests with all-zero pages.
2569+SHOW block_size \gset
2570+SELECT fsm_page_contents(decode(repeat('00', :block_size), 'hex'));
2571+ fsm_page_contents
2572+-------------------
2573+
2574+(1 row)
2575+
2576+SELECT page_header(decode(repeat('00', :block_size), 'hex'));
2577+ page_header
2578+-----------------------
2579+ (0/0,0,0,0,0,0,0,0,0)
2580+(1 row)
2581+
2582+SELECT page_checksum(decode(repeat('00', :block_size), 'hex'), 1);
2583+ page_checksum
2584+---------------
2585+
2586+(1 row)
2587+
2588diff --git a/contrib/pageinspect/fsmfuncs.c b/contrib/pageinspect/fsmfuncs.c
2589index 4b3c596..f5d74d9 100644
2590--- a/contrib/pageinspect/fsmfuncs.c
2591+++ b/contrib/pageinspect/fsmfuncs.c
2592@@ -37,6 +37,7 @@ fsm_page_contents(PG_FUNCTION_ARGS)
2593 {
2594 bytea *raw_page = PG_GETARG_BYTEA_P(0);
2595 StringInfoData sinfo;
2596+ Page page;
2597 FSMPage fsmpage;
2598 int i;
2599
2600@@ -45,7 +46,12 @@ fsm_page_contents(PG_FUNCTION_ARGS)
2601 (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
2602 (errmsg("must be superuser to use raw page functions"))));
2603
2604- fsmpage = (FSMPage) PageGetContents(VARDATA(raw_page));
2605+ page = get_page_from_raw(raw_page);
2606+
2607+ if (PageIsNew(page))
2608+ PG_RETURN_NULL();
2609+
2610+ fsmpage = (FSMPage) PageGetContents(page);
2611
2612 initStringInfo(&sinfo);
2613
2614diff --git a/contrib/pageinspect/ginfuncs.c b/contrib/pageinspect/ginfuncs.c
2615index 229f9f9..b35fdae 100644
2616--- a/contrib/pageinspect/ginfuncs.c
2617+++ b/contrib/pageinspect/ginfuncs.c
2618@@ -50,6 +50,17 @@ gin_metapage_info(PG_FUNCTION_ARGS)
2619
2620 page = get_page_from_raw(raw_page);
2621
2622+ if (PageIsNew(page))
2623+ PG_RETURN_NULL();
2624+
2625+ if (PageGetSpecialSize(page) != MAXALIGN(sizeof(GinPageOpaqueData)))
2626+ ereport(ERROR,
2627+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
2628+ errmsg("input page is not a valid GIN metapage"),
2629+ errdetail("Expected special size %d, got %d.",
2630+ (int) MAXALIGN(sizeof(GinPageOpaqueData)),
2631+ (int) PageGetSpecialSize(page))));
2632+
2633 opaq = (GinPageOpaque) PageGetSpecialPointer(page);
2634 if (opaq->flags != GIN_META)
2635 ereport(ERROR,
2636@@ -108,6 +119,17 @@ gin_page_opaque_info(PG_FUNCTION_ARGS)
2637
2638 page = get_page_from_raw(raw_page);
2639
2640+ if (PageIsNew(page))
2641+ PG_RETURN_NULL();
2642+
2643+ if (PageGetSpecialSize(page) != MAXALIGN(sizeof(GinPageOpaqueData)))
2644+ ereport(ERROR,
2645+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
2646+ errmsg("input page is not a valid GIN data leaf page"),
2647+ errdetail("Expected special size %d, got %d.",
2648+ (int) MAXALIGN(sizeof(GinPageOpaqueData)),
2649+ (int) PageGetSpecialSize(page))));
2650+
2651 opaq = (GinPageOpaque) PageGetSpecialPointer(page);
2652
2653 /* Build a tuple descriptor for our result type */
2654@@ -184,13 +206,19 @@ gin_leafpage_items(PG_FUNCTION_ARGS)
2655
2656 page = get_page_from_raw(raw_page);
2657
2658+ if (PageIsNew(page))
2659+ {
2660+ MemoryContextSwitchTo(mctx);
2661+ PG_RETURN_NULL();
2662+ }
2663+
2664 if (PageGetSpecialSize(page) != MAXALIGN(sizeof(GinPageOpaqueData)))
2665 ereport(ERROR,
2666 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
2667 errmsg("input page is not a valid GIN data leaf page"),
2668- errdetail("Special size %d, expected %d",
2669- (int) PageGetSpecialSize(page),
2670- (int) MAXALIGN(sizeof(GinPageOpaqueData)))));
2671+ errdetail("Expected special size %d, got %d.",
2672+ (int) MAXALIGN(sizeof(GinPageOpaqueData)),
2673+ (int) PageGetSpecialSize(page))));
2674
2675 opaq = (GinPageOpaque) PageGetSpecialPointer(page);
2676 if (opaq->flags != (GIN_DATA | GIN_LEAF | GIN_COMPRESSED))
2677diff --git a/contrib/pageinspect/hashfuncs.c b/contrib/pageinspect/hashfuncs.c
2678index e699133..6ba7b27 100644
2679--- a/contrib/pageinspect/hashfuncs.c
2680+++ b/contrib/pageinspect/hashfuncs.c
2681@@ -66,14 +66,17 @@ verify_hash_page(bytea *raw_page, int flags)
2682
2683 if (PageGetSpecialSize(page) != MAXALIGN(sizeof(HashPageOpaqueData)))
2684 ereport(ERROR,
2685- (errcode(ERRCODE_INDEX_CORRUPTED),
2686- errmsg("index table contains corrupted page")));
2687+ (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
2688+ errmsg("input page is not a valid %s page", "hash"),
2689+ errdetail("Expected special size %d, got %d.",
2690+ (int) MAXALIGN(sizeof(HashPageOpaqueData)),
2691+ (int) PageGetSpecialSize(page))));
2692
2693 pageopaque = (HashPageOpaque) PageGetSpecialPointer(page);
2694 if (pageopaque->hasho_page_id != HASHO_PAGE_ID)
2695 ereport(ERROR,
2696 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
2697- errmsg("page is not a hash page"),
2698+ errmsg("input page is not a valid %s page", "hash"),
2699 errdetail("Expected %08x, got %08x.",
2700 HASHO_PAGE_ID, pageopaque->hasho_page_id)));
2701
2702@@ -134,7 +137,7 @@ verify_hash_page(bytea *raw_page, int flags)
2703 ereport(ERROR,
2704 (errcode(ERRCODE_INDEX_CORRUPTED),
2705 errmsg("invalid version for metadata"),
2706- errdetail("Expected %d, got %d",
2707+ errdetail("Expected %d, got %d.",
2708 HASH_VERSION, metap->hashm_version)));
2709 }
2710
2711@@ -420,8 +423,10 @@ hash_bitmap_info(PG_FUNCTION_ARGS)
2712 indexRel = index_open(indexRelid, AccessShareLock);
2713
2714 if (!IS_HASH(indexRel))
2715- elog(ERROR, "relation \"%s\" is not a hash index",
2716- RelationGetRelationName(indexRel));
2717+ ereport(ERROR,
2718+ (errcode(ERRCODE_WRONG_OBJECT_TYPE),
2719+ errmsg("\"%s\" is not a %s index",
2720+ RelationGetRelationName(indexRel), "hash")));
2721
2722 if (RELATION_IS_OTHER_TEMP(indexRel))
2723 ereport(ERROR,
2724diff --git a/contrib/pageinspect/rawpage.c b/contrib/pageinspect/rawpage.c
2725index f08f62f..60e5586 100644
2726--- a/contrib/pageinspect/rawpage.c
2727+++ b/contrib/pageinspect/rawpage.c
2728@@ -219,7 +219,6 @@ Datum
2729 page_header(PG_FUNCTION_ARGS)
2730 {
2731 bytea *raw_page = PG_GETARG_BYTEA_P(0);
2732- int raw_page_size;
2733
2734 TupleDesc tupdesc;
2735
2736@@ -236,18 +235,7 @@ page_header(PG_FUNCTION_ARGS)
2737 (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
2738 (errmsg("must be superuser to use raw page functions"))));
2739
2740- raw_page_size = VARSIZE(raw_page) - VARHDRSZ;
2741-
2742- /*
2743- * Check that enough data was supplied, so that we don't try to access
2744- * fields outside the supplied buffer.
2745- */
2746- if (raw_page_size < SizeOfPageHeaderData)
2747- ereport(ERROR,
2748- (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
2749- errmsg("input page too small (%d bytes)", raw_page_size)));
2750-
2751- page = (PageHeader) VARDATA(raw_page);
2752+ page = (PageHeader) get_page_from_raw(raw_page);
2753
2754 /* Build a tuple descriptor for our result type */
2755 if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE)
2756@@ -300,25 +288,17 @@ page_checksum(PG_FUNCTION_ARGS)
2757 {
2758 bytea *raw_page = PG_GETARG_BYTEA_P(0);
2759 uint32 blkno = PG_GETARG_INT32(1);
2760- int raw_page_size;
2761- PageHeader page;
2762+ Page page;
2763
2764 if (!superuser())
2765 ereport(ERROR,
2766 (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
2767 (errmsg("must be superuser to use raw page functions"))));
2768
2769- raw_page_size = VARSIZE(raw_page) - VARHDRSZ;
2770-
2771- /*
2772- * Check that the supplied page is of the right size.
2773- */
2774- if (raw_page_size != BLCKSZ)
2775- ereport(ERROR,
2776- (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
2777- errmsg("incorrect size of input page (%d bytes)", raw_page_size)));
2778+ page = get_page_from_raw(raw_page);
2779
2780- page = (PageHeader) VARDATA(raw_page);
2781+ if (PageIsNew(page))
2782+ PG_RETURN_NULL();
2783
2784 PG_RETURN_INT16(pg_checksum_page((char *) page, blkno));
2785 }
2786diff --git a/contrib/pageinspect/sql/brin.sql b/contrib/pageinspect/sql/brin.sql
2787index 735bc3b..45098c1 100644
2788--- a/contrib/pageinspect/sql/brin.sql
2789+++ b/contrib/pageinspect/sql/brin.sql
2790@@ -15,4 +15,23 @@ SELECT * FROM brin_revmap_data(get_raw_page('test1_a_idx', 1)) LIMIT 5;
2791 SELECT * FROM brin_page_items(get_raw_page('test1_a_idx', 2), 'test1_a_idx')
2792 ORDER BY blknum, attnum LIMIT 5;
2793
2794+-- Failure for non-BRIN index.
2795+CREATE INDEX test1_a_btree ON test1 (a);
2796+SELECT brin_page_items(get_raw_page('test1_a_btree', 0), 'test1_a_btree');
2797+
2798+-- Mask DETAIL messages as these are not portable across architectures.
2799+\set VERBOSITY terse
2800+-- Invalid special area size
2801+SELECT brin_page_type(get_raw_page('test1', 0));
2802+SELECT * FROM brin_metapage_info(get_raw_page('test1', 0));
2803+SELECT * FROM brin_revmap_data(get_raw_page('test1', 0));
2804+\set VERBOSITY default
2805+
2806+-- Tests with all-zero pages.
2807+SHOW block_size \gset
2808+SELECT brin_page_type(decode(repeat('00', :block_size), 'hex'));
2809+SELECT brin_page_items(decode(repeat('00', :block_size), 'hex'), 'test1_a_idx');
2810+SELECT brin_metapage_info(decode(repeat('00', :block_size), 'hex'));
2811+SELECT brin_revmap_data(decode(repeat('00', :block_size), 'hex'));
2812+
2813 DROP TABLE test1;
2814diff --git a/contrib/pageinspect/sql/btree.sql b/contrib/pageinspect/sql/btree.sql
2815index 8eac64c..75587c1 100644
2816--- a/contrib/pageinspect/sql/btree.sql
2817+++ b/contrib/pageinspect/sql/btree.sql
2818@@ -1,5 +1,5 @@
2819-CREATE TABLE test1 (a int8, b text);
2820-INSERT INTO test1 VALUES (72057594037927937, 'text');
2821+CREATE TABLE test1 (a int8, b int4range);
2822+INSERT INTO test1 VALUES (72057594037927937, '[0,1)');
2823 CREATE INDEX test1_a_idx ON test1 USING btree (a);
2824
2825 \x
2826@@ -18,4 +18,31 @@ SELECT * FROM bt_page_items(get_raw_page('test1_a_idx', 0));
2827 SELECT * FROM bt_page_items(get_raw_page('test1_a_idx', 1));
2828 SELECT * FROM bt_page_items(get_raw_page('test1_a_idx', 2));
2829
2830+-- Failure when using a non-btree index.
2831+CREATE INDEX test1_a_hash ON test1 USING hash(a);
2832+SELECT bt_metap('test1_a_hash');
2833+SELECT bt_page_stats('test1_a_hash', 0);
2834+SELECT bt_page_items('test1_a_hash', 0);
2835+SELECT bt_page_items(get_raw_page('test1_a_hash', 0));
2836+CREATE INDEX test1_b_gist ON test1 USING gist(b);
2837+-- Special area of GiST is the same as btree, this complains about inconsistent
2838+-- leaf data on the page.
2839+SELECT bt_page_items(get_raw_page('test1_b_gist', 0));
2840+
2841+-- Several failure modes.
2842+-- Suppress the DETAIL message, to allow the tests to work across various
2843+-- page sizes and architectures.
2844+\set VERBOSITY terse
2845+-- invalid page size
2846+SELECT bt_page_items('aaa'::bytea);
2847+-- invalid special area size
2848+CREATE INDEX test1_a_brin ON test1 USING brin(a);
2849+SELECT bt_page_items(get_raw_page('test1', 0));
2850+SELECT bt_page_items(get_raw_page('test1_a_brin', 0));
2851+\set VERBOSITY default
2852+
2853+-- Tests with all-zero pages.
2854+SHOW block_size \gset
2855+SELECT bt_page_items(decode(repeat('00', :block_size), 'hex'));
2856+
2857 DROP TABLE test1;
2858diff --git a/contrib/pageinspect/sql/gin.sql b/contrib/pageinspect/sql/gin.sql
2859index d516ed3..b0c20c0 100644
2860--- a/contrib/pageinspect/sql/gin.sql
2861+++ b/contrib/pageinspect/sql/gin.sql
2862@@ -17,3 +17,23 @@ SELECT COUNT(*) > 0
2863 FROM gin_leafpage_items(get_raw_page('test1_y_idx',
2864 (pg_relation_size('test1_y_idx') /
2865 current_setting('block_size')::bigint)::int - 1));
2866+
2867+-- Failure with various modes.
2868+-- Suppress the DETAIL message, to allow the tests to work across various
2869+-- page sizes and architectures.
2870+\set VERBOSITY terse
2871+-- invalid page size
2872+SELECT gin_leafpage_items('aaa'::bytea);
2873+SELECT gin_metapage_info('bbb'::bytea);
2874+SELECT gin_page_opaque_info('ccc'::bytea);
2875+-- invalid special area size
2876+SELECT * FROM gin_metapage_info(get_raw_page('test1', 0));
2877+SELECT * FROM gin_page_opaque_info(get_raw_page('test1', 0));
2878+SELECT * FROM gin_leafpage_items(get_raw_page('test1', 0));
2879+\set VERBOSITY default
2880+
2881+-- Tests with all-zero pages.
2882+SHOW block_size \gset
2883+SELECT gin_leafpage_items(decode(repeat('00', :block_size), 'hex'));
2884+SELECT gin_metapage_info(decode(repeat('00', :block_size), 'hex'));
2885+SELECT gin_page_opaque_info(decode(repeat('00', :block_size), 'hex'));
2886diff --git a/contrib/pageinspect/sql/hash.sql b/contrib/pageinspect/sql/hash.sql
2887index 87ee549..3acdc7d 100644
2888--- a/contrib/pageinspect/sql/hash.sql
2889+++ b/contrib/pageinspect/sql/hash.sql
2890@@ -76,5 +76,31 @@ SELECT * FROM hash_page_items(get_raw_page('test_hash_a_idx', 3));
2891 SELECT * FROM hash_page_items(get_raw_page('test_hash_a_idx', 4));
2892 SELECT * FROM hash_page_items(get_raw_page('test_hash_a_idx', 5));
2893
2894+-- Failure with non-hash index
2895+CREATE INDEX test_hash_a_btree ON test_hash USING btree (a);
2896+SELECT hash_bitmap_info('test_hash_a_btree', 0);
2897+
2898+-- Failure with various modes.
2899+-- Suppress the DETAIL message, to allow the tests to work across various
2900+-- page sizes and architectures.
2901+\set VERBOSITY terse
2902+-- invalid page size
2903+SELECT hash_metapage_info('aaa'::bytea);
2904+SELECT hash_page_items('bbb'::bytea);
2905+SELECT hash_page_stats('ccc'::bytea);
2906+SELECT hash_page_type('ddd'::bytea);
2907+-- invalid special area size
2908+SELECT hash_metapage_info(get_raw_page('test_hash', 0));
2909+SELECT hash_page_items(get_raw_page('test_hash', 0));
2910+SELECT hash_page_stats(get_raw_page('test_hash', 0));
2911+SELECT hash_page_type(get_raw_page('test_hash', 0));
2912+\set VERBOSITY default
2913+
2914+-- Tests with all-zero pages.
2915+SHOW block_size \gset
2916+SELECT hash_metapage_info(decode(repeat('00', :block_size), 'hex'));
2917+SELECT hash_page_items(decode(repeat('00', :block_size), 'hex'));
2918+SELECT hash_page_stats(decode(repeat('00', :block_size), 'hex'));
2919+SELECT hash_page_type(decode(repeat('00', :block_size), 'hex'));
2920
2921 DROP TABLE test_hash;
2922diff --git a/contrib/pageinspect/sql/page.sql b/contrib/pageinspect/sql/page.sql
2923index 42b69e6..71f7679 100644
2924--- a/contrib/pageinspect/sql/page.sql
2925+++ b/contrib/pageinspect/sql/page.sql
2926@@ -52,3 +52,18 @@ select t_bits, t_data from heap_page_items(get_raw_page('test8', 0));
2927 select tuple_data_split('test8'::regclass, t_data, t_infomask, t_infomask2, t_bits)
2928 from heap_page_items(get_raw_page('test8', 0));
2929 drop table test8;
2930+
2931+-- Failure with incorrect page size
2932+-- Suppress the DETAIL message, to allow the tests to work across various
2933+-- page sizes.
2934+\set VERBOSITY terse
2935+SELECT fsm_page_contents('aaa'::bytea);
2936+SELECT page_checksum('bbb'::bytea, 0);
2937+SELECT page_header('ccc'::bytea);
2938+\set VERBOSITY default
2939+
2940+-- Tests with all-zero pages.
2941+SHOW block_size \gset
2942+SELECT fsm_page_contents(decode(repeat('00', :block_size), 'hex'));
2943+SELECT page_header(decode(repeat('00', :block_size), 'hex'));
2944+SELECT page_checksum(decode(repeat('00', :block_size), 'hex'), 1);
2945diff --git a/contrib/pgcrypto/px.c b/contrib/pgcrypto/px.c
2946index 2c6704e..e4fbfd7 100644
2947--- a/contrib/pgcrypto/px.c
2948+++ b/contrib/pgcrypto/px.c
2949@@ -200,7 +200,7 @@ combo_init(PX_Combo *cx, const uint8 *key, unsigned klen,
2950 memset(ivbuf, 0, ivs);
2951 if (ivlen > ivs)
2952 memcpy(ivbuf, iv, ivs);
2953- else
2954+ else if (ivlen > 0)
2955 memcpy(ivbuf, iv, ivlen);
2956 }
2957
2958diff --git a/contrib/postgres_fdw/deparse.c b/contrib/postgres_fdw/deparse.c
2959index a74111c..c50d2d4 100644
2960--- a/contrib/postgres_fdw/deparse.c
2961+++ b/contrib/postgres_fdw/deparse.c
2962@@ -42,6 +42,7 @@
2963 #include "catalog/pg_collation.h"
2964 #include "catalog/pg_namespace.h"
2965 #include "catalog/pg_operator.h"
2966+#include "catalog/pg_opfamily.h"
2967 #include "catalog/pg_proc.h"
2968 #include "catalog/pg_type.h"
2969 #include "commands/defrem.h"
2970@@ -181,6 +182,8 @@ static void deparseRangeTblRef(StringInfo buf, PlannerInfo *root,
2971 Index ignore_rel, List **ignore_conds, List **params_list);
2972 static void deparseAggref(Aggref *node, deparse_expr_cxt *context);
2973 static void appendGroupByClause(List *tlist, deparse_expr_cxt *context);
2974+static void appendOrderBySuffix(Oid sortop, Oid sortcoltype, bool nulls_first,
2975+ deparse_expr_cxt *context);
2976 static void appendAggOrderBy(List *orderList, List *targetList,
2977 deparse_expr_cxt *context);
2978 static void appendFunctionName(Oid funcid, deparse_expr_cxt *context);
2979@@ -907,6 +910,33 @@ is_foreign_param(PlannerInfo *root,
2980 }
2981
2982 /*
2983+ * Returns true if it's safe to push down the sort expression described by
2984+ * 'pathkey' to the foreign server.
2985+ */
2986+bool
2987+is_foreign_pathkey(PlannerInfo *root,
2988+ RelOptInfo *baserel,
2989+ PathKey *pathkey)
2990+{
2991+ EquivalenceClass *pathkey_ec = pathkey->pk_eclass;
2992+ PgFdwRelationInfo *fpinfo = (PgFdwRelationInfo *) baserel->fdw_private;
2993+
2994+ /*
2995+ * is_foreign_expr would detect volatile expressions as well, but checking
2996+ * ec_has_volatile here saves some cycles.
2997+ */
2998+ if (pathkey_ec->ec_has_volatile)
2999+ return false;
3000+
3001+ /* can't push down the sort if the pathkey's opfamily is not shippable */
3002+ if (!is_shippable(pathkey->pk_opfamily, OperatorFamilyRelationId, fpinfo))
3003+ return false;
3004+
3005+ /* can push if a suitable EC member exists */
3006+ return (find_em_for_rel(root, pathkey_ec, baserel) != NULL);
3007+}
3008+
3009+/*
3010 * Convert type OID + typmod info into a type name we can ship to the remote
3011 * server. Someplace else had better have verified that this type name is
3012 * expected to be known on the remote end.
3013@@ -3072,44 +3102,59 @@ appendAggOrderBy(List *orderList, List *targetList, deparse_expr_cxt *context)
3014 {
3015 SortGroupClause *srt = (SortGroupClause *) lfirst(lc);
3016 Node *sortexpr;
3017- Oid sortcoltype;
3018- TypeCacheEntry *typentry;
3019
3020 if (!first)
3021 appendStringInfoString(buf, ", ");
3022 first = false;
3023
3024+ /* Deparse the sort expression proper. */
3025 sortexpr = deparseSortGroupClause(srt->tleSortGroupRef, targetList,
3026 false, context);
3027- sortcoltype = exprType(sortexpr);
3028- /* See whether operator is default < or > for datatype */
3029- typentry = lookup_type_cache(sortcoltype,
3030- TYPECACHE_LT_OPR | TYPECACHE_GT_OPR);
3031- if (srt->sortop == typentry->lt_opr)
3032- appendStringInfoString(buf, " ASC");
3033- else if (srt->sortop == typentry->gt_opr)
3034- appendStringInfoString(buf, " DESC");
3035- else
3036- {
3037- HeapTuple opertup;
3038- Form_pg_operator operform;
3039-
3040- appendStringInfoString(buf, " USING ");
3041-
3042- /* Append operator name. */
3043- opertup = SearchSysCache1(OPEROID, ObjectIdGetDatum(srt->sortop));
3044- if (!HeapTupleIsValid(opertup))
3045- elog(ERROR, "cache lookup failed for operator %u", srt->sortop);
3046- operform = (Form_pg_operator) GETSTRUCT(opertup);
3047- deparseOperatorName(buf, operform);
3048- ReleaseSysCache(opertup);
3049- }
3050+ /* Add decoration as needed. */
3051+ appendOrderBySuffix(srt->sortop, exprType(sortexpr), srt->nulls_first,
3052+ context);
3053+ }
3054+}
3055
3056- if (srt->nulls_first)
3057- appendStringInfoString(buf, " NULLS FIRST");
3058- else
3059- appendStringInfoString(buf, " NULLS LAST");
3060+/*
3061+ * Append the ASC, DESC, USING <OPERATOR> and NULLS FIRST / NULLS LAST parts
3062+ * of an ORDER BY clause.
3063+ */
3064+static void
3065+appendOrderBySuffix(Oid sortop, Oid sortcoltype, bool nulls_first,
3066+ deparse_expr_cxt *context)
3067+{
3068+ StringInfo buf = context->buf;
3069+ TypeCacheEntry *typentry;
3070+
3071+ /* See whether operator is default < or > for sort expr's datatype. */
3072+ typentry = lookup_type_cache(sortcoltype,
3073+ TYPECACHE_LT_OPR | TYPECACHE_GT_OPR);
3074+
3075+ if (sortop == typentry->lt_opr)
3076+ appendStringInfoString(buf, " ASC");
3077+ else if (sortop == typentry->gt_opr)
3078+ appendStringInfoString(buf, " DESC");
3079+ else
3080+ {
3081+ HeapTuple opertup;
3082+ Form_pg_operator operform;
3083+
3084+ appendStringInfoString(buf, " USING ");
3085+
3086+ /* Append operator name. */
3087+ opertup = SearchSysCache1(OPEROID, ObjectIdGetDatum(sortop));
3088+ if (!HeapTupleIsValid(opertup))
3089+ elog(ERROR, "cache lookup failed for operator %u", sortop);
3090+ operform = (Form_pg_operator) GETSTRUCT(opertup);
3091+ deparseOperatorName(buf, operform);
3092+ ReleaseSysCache(opertup);
3093 }
3094+
3095+ if (nulls_first)
3096+ appendStringInfoString(buf, " NULLS FIRST");
3097+ else
3098+ appendStringInfoString(buf, " NULLS LAST");
3099 }
3100
3101 /*
3102@@ -3192,9 +3237,13 @@ appendGroupByClause(List *tlist, deparse_expr_cxt *context)
3103 }
3104
3105 /*
3106- * Deparse ORDER BY clause according to the given pathkeys for given base
3107- * relation. From given pathkeys expressions belonging entirely to the given
3108- * base relation are obtained and deparsed.
3109+ * Deparse ORDER BY clause defined by the given pathkeys.
3110+ *
3111+ * The clause should use Vars from context->scanrel if !has_final_sort,
3112+ * or from context->foreignrel's targetlist if has_final_sort.
3113+ *
3114+ * We find a suitable pathkey expression (some earlier step
3115+ * should have verified that there is one) and deparse it.
3116 */
3117 static void
3118 appendOrderByClause(List *pathkeys, bool has_final_sort,
3119@@ -3202,8 +3251,7 @@ appendOrderByClause(List *pathkeys, bool has_final_sort,
3120 {
3121 ListCell *lcell;
3122 int nestlevel;
3123- char *delim = " ";
3124- RelOptInfo *baserel = context->scanrel;
3125+ const char *delim = " ";
3126 StringInfo buf = context->buf;
3127
3128 /* Make sure any constants in the exprs are printed portably */
3129@@ -3213,7 +3261,9 @@ appendOrderByClause(List *pathkeys, bool has_final_sort,
3130 foreach(lcell, pathkeys)
3131 {
3132 PathKey *pathkey = lfirst(lcell);
3133+ EquivalenceMember *em;
3134 Expr *em_expr;
3135+ Oid oprid;
3136
3137 if (has_final_sort)
3138 {
3139@@ -3221,26 +3271,48 @@ appendOrderByClause(List *pathkeys, bool has_final_sort,
3140 * By construction, context->foreignrel is the input relation to
3141 * the final sort.
3142 */
3143- em_expr = find_em_expr_for_input_target(context->root,
3144- pathkey->pk_eclass,
3145- context->foreignrel->reltarget);
3146+ em = find_em_for_rel_target(context->root,
3147+ pathkey->pk_eclass,
3148+ context->foreignrel);
3149 }
3150 else
3151- em_expr = find_em_expr_for_rel(pathkey->pk_eclass, baserel);
3152+ em = find_em_for_rel(context->root,
3153+ pathkey->pk_eclass,
3154+ context->scanrel);
3155+
3156+ /*
3157+ * We don't expect any error here; it would mean that shippability
3158+ * wasn't verified earlier. For the same reason, we don't recheck
3159+ * shippability of the sort operator.
3160+ */
3161+ if (em == NULL)
3162+ elog(ERROR, "could not find pathkey item to sort");
3163
3164- Assert(em_expr != NULL);
3165+ em_expr = em->em_expr;
3166+
3167+ /*
3168+ * Lookup the operator corresponding to the strategy in the opclass.
3169+ * The datatype used by the opfamily is not necessarily the same as
3170+ * the expression type (for array types for example).
3171+ */
3172+ oprid = get_opfamily_member(pathkey->pk_opfamily,
3173+ em->em_datatype,
3174+ em->em_datatype,
3175+ pathkey->pk_strategy);
3176+ if (!OidIsValid(oprid))
3177+ elog(ERROR, "missing operator %d(%u,%u) in opfamily %u",
3178+ pathkey->pk_strategy, em->em_datatype, em->em_datatype,
3179+ pathkey->pk_opfamily);
3180
3181 appendStringInfoString(buf, delim);
3182 deparseExpr(em_expr, context);
3183- if (pathkey->pk_strategy == BTLessStrategyNumber)
3184- appendStringInfoString(buf, " ASC");
3185- else
3186- appendStringInfoString(buf, " DESC");
3187
3188- if (pathkey->pk_nulls_first)
3189- appendStringInfoString(buf, " NULLS FIRST");
3190- else
3191- appendStringInfoString(buf, " NULLS LAST");
3192+ /*
3193+ * Here we need to use the expression's actual type to discover
3194+ * whether the desired operator will be the default or not.
3195+ */
3196+ appendOrderBySuffix(oprid, exprType((Node *) em_expr),
3197+ pathkey->pk_nulls_first, context);
3198
3199 delim = ", ";
3200 }
3201diff --git a/contrib/postgres_fdw/expected/postgres_fdw.out b/contrib/postgres_fdw/expected/postgres_fdw.out
3202index 43b73e7..edf58af 100644
3203--- a/contrib/postgres_fdw/expected/postgres_fdw.out
3204+++ b/contrib/postgres_fdw/expected/postgres_fdw.out
3205@@ -3130,6 +3130,19 @@ select array_agg(c1 order by c1 using operator(public.<^)) from ft2 where c2 = 6
3206 Remote SQL: SELECT "C 1", c2 FROM "S 1"."T 1" WHERE (("C 1" < 100)) AND ((c2 = 6))
3207 (6 rows)
3208
3209+-- This should not be pushed either.
3210+explain (verbose, costs off)
3211+select * from ft2 order by c1 using operator(public.<^);
3212+ QUERY PLAN
3213+-------------------------------------------------------------------------------
3214+ Sort
3215+ Output: c1, c2, c3, c4, c5, c6, c7, c8
3216+ Sort Key: ft2.c1 USING <^
3217+ -> Foreign Scan on public.ft2
3218+ Output: c1, c2, c3, c4, c5, c6, c7, c8
3219+ Remote SQL: SELECT "C 1", c2, c3, c4, c5, c6, c7, c8 FROM "S 1"."T 1"
3220+(6 rows)
3221+
3222 -- Update local stats on ft2
3223 ANALYZE ft2;
3224 -- Add into extension
3225@@ -3157,6 +3170,16 @@ select array_agg(c1 order by c1 using operator(public.<^)) from ft2 where c2 = 6
3226 {6,16,26,36,46,56,66,76,86,96}
3227 (1 row)
3228
3229+-- This should be pushed too.
3230+explain (verbose, costs off)
3231+select * from ft2 order by c1 using operator(public.<^);
3232+ QUERY PLAN
3233+-----------------------------------------------------------------------------------------------------------------------------
3234+ Foreign Scan on public.ft2
3235+ Output: c1, c2, c3, c4, c5, c6, c7, c8
3236+ Remote SQL: SELECT "C 1", c2, c3, c4, c5, c6, c7, c8 FROM "S 1"."T 1" ORDER BY "C 1" USING OPERATOR(public.<^) NULLS LAST
3237+(3 rows)
3238+
3239 -- Remove from extension
3240 alter extension postgres_fdw drop operator class my_op_class using btree;
3241 alter extension postgres_fdw drop function my_op_cmp(a int, b int);
3242diff --git a/contrib/postgres_fdw/postgres_fdw.c b/contrib/postgres_fdw/postgres_fdw.c
3243index 4c599fa..4fc1a7b 100644
3244--- a/contrib/postgres_fdw/postgres_fdw.c
3245+++ b/contrib/postgres_fdw/postgres_fdw.c
3246@@ -18,6 +18,7 @@
3247 #include "access/sysattr.h"
3248 #include "access/table.h"
3249 #include "catalog/pg_class.h"
3250+#include "catalog/pg_opfamily.h"
3251 #include "commands/defrem.h"
3252 #include "commands/explain.h"
3253 #include "commands/vacuum.h"
3254@@ -878,8 +879,6 @@ get_useful_pathkeys_for_relation(PlannerInfo *root, RelOptInfo *rel)
3255 foreach(lc, root->query_pathkeys)
3256 {
3257 PathKey *pathkey = (PathKey *) lfirst(lc);
3258- EquivalenceClass *pathkey_ec = pathkey->pk_eclass;
3259- Expr *em_expr;
3260
3261 /*
3262 * The planner and executor don't have any clever strategy for
3263@@ -887,13 +886,8 @@ get_useful_pathkeys_for_relation(PlannerInfo *root, RelOptInfo *rel)
3264 * getting it to be sorted by all of those pathkeys. We'll just
3265 * end up resorting the entire data set. So, unless we can push
3266 * down all of the query pathkeys, forget it.
3267- *
3268- * is_foreign_expr would detect volatile expressions as well, but
3269- * checking ec_has_volatile here saves some cycles.
3270 */
3271- if (pathkey_ec->ec_has_volatile ||
3272- !(em_expr = find_em_expr_for_rel(pathkey_ec, rel)) ||
3273- !is_foreign_expr(root, rel, em_expr))
3274+ if (!is_foreign_pathkey(root, rel, pathkey))
3275 {
3276 query_pathkeys_ok = false;
3277 break;
3278@@ -940,16 +934,19 @@ get_useful_pathkeys_for_relation(PlannerInfo *root, RelOptInfo *rel)
3279 foreach(lc, useful_eclass_list)
3280 {
3281 EquivalenceClass *cur_ec = lfirst(lc);
3282- Expr *em_expr;
3283 PathKey *pathkey;
3284
3285 /* If redundant with what we did above, skip it. */
3286 if (cur_ec == query_ec)
3287 continue;
3288
3289+ /* Can't push down the sort if the EC's opfamily is not shippable. */
3290+ if (!is_shippable(linitial_oid(cur_ec->ec_opfamilies),
3291+ OperatorFamilyRelationId, fpinfo))
3292+ continue;
3293+
3294 /* If no pushable expression for this rel, skip it. */
3295- em_expr = find_em_expr_for_rel(cur_ec, rel);
3296- if (em_expr == NULL || !is_foreign_expr(root, rel, em_expr))
3297+ if (find_em_for_rel(root, cur_ec, rel) == NULL)
3298 continue;
3299
3300 /* Looks like we can generate a pathkey, so let's do it. */
3301@@ -6001,7 +5998,6 @@ add_foreign_ordered_paths(PlannerInfo *root, RelOptInfo *input_rel,
3302 {
3303 PathKey *pathkey = (PathKey *) lfirst(lc);
3304 EquivalenceClass *pathkey_ec = pathkey->pk_eclass;
3305- Expr *sort_expr;
3306
3307 /*
3308 * is_foreign_expr would detect volatile expressions as well, but
3309@@ -6010,13 +6006,20 @@ add_foreign_ordered_paths(PlannerInfo *root, RelOptInfo *input_rel,
3310 if (pathkey_ec->ec_has_volatile)
3311 return;
3312
3313- /* Get the sort expression for the pathkey_ec */
3314- sort_expr = find_em_expr_for_input_target(root,
3315- pathkey_ec,
3316- input_rel->reltarget);
3317+ /*
3318+ * Can't push down the sort if pathkey's opfamily is not shippable.
3319+ */
3320+ if (!is_shippable(pathkey->pk_opfamily, OperatorFamilyRelationId,
3321+ fpinfo))
3322+ return;
3323
3324- /* If it's unsafe to remote, we cannot push down the final sort */
3325- if (!is_foreign_expr(root, input_rel, sort_expr))
3326+ /*
3327+ * The EC must contain a shippable EM that is computed in input_rel's
3328+ * reltarget, else we can't push down the sort.
3329+ */
3330+ if (find_em_for_rel_target(root,
3331+ pathkey_ec,
3332+ input_rel) == NULL)
3333 return;
3334 }
3335
3336@@ -6550,43 +6553,55 @@ conversion_error_callback(void *arg)
3337 }
3338
3339 /*
3340- * Find an equivalence class member expression, all of whose Vars, come from
3341- * the indicated relation.
3342+ * Given an EquivalenceClass and a foreign relation, find an EC member
3343+ * that can be used to sort the relation remotely according to a pathkey
3344+ * using this EC.
3345+ *
3346+ * If there is more than one suitable candidate, return an arbitrary
3347+ * one of them. If there is none, return NULL.
3348+ *
3349+ * This checks that the EC member expression uses only Vars from the given
3350+ * rel and is shippable. Caller must separately verify that the pathkey's
3351+ * ordering operator is shippable.
3352 */
3353-Expr *
3354-find_em_expr_for_rel(EquivalenceClass *ec, RelOptInfo *rel)
3355+EquivalenceMember *
3356+find_em_for_rel(PlannerInfo *root, EquivalenceClass *ec, RelOptInfo *rel)
3357 {
3358- ListCell *lc_em;
3359+ ListCell *lc;
3360
3361- foreach(lc_em, ec->ec_members)
3362+ foreach(lc, ec->ec_members)
3363 {
3364- EquivalenceMember *em = lfirst(lc_em);
3365+ EquivalenceMember *em = (EquivalenceMember *) lfirst(lc);
3366
3367+ /*
3368+ * Note we require !bms_is_empty, else we'd accept constant
3369+ * expressions which are not suitable for the purpose.
3370+ */
3371 if (bms_is_subset(em->em_relids, rel->relids) &&
3372- !bms_is_empty(em->em_relids))
3373- {
3374- /*
3375- * If there is more than one equivalence member whose Vars are
3376- * taken entirely from this relation, we'll be content to choose
3377- * any one of those.
3378- */
3379- return em->em_expr;
3380- }
3381+ !bms_is_empty(em->em_relids) &&
3382+ is_foreign_expr(root, rel, em->em_expr))
3383+ return em;
3384 }
3385
3386- /* We didn't find any suitable equivalence class expression */
3387 return NULL;
3388 }
3389
3390 /*
3391- * Find an equivalence class member expression to be computed as a sort column
3392- * in the given target.
3393+ * Find an EquivalenceClass member that is to be computed as a sort column
3394+ * in the given rel's reltarget, and is shippable.
3395+ *
3396+ * If there is more than one suitable candidate, return an arbitrary
3397+ * one of them. If there is none, return NULL.
3398+ *
3399+ * This checks that the EC member expression uses only Vars from the given
3400+ * rel and is shippable. Caller must separately verify that the pathkey's
3401+ * ordering operator is shippable.
3402 */
3403-Expr *
3404-find_em_expr_for_input_target(PlannerInfo *root,
3405- EquivalenceClass *ec,
3406- PathTarget *target)
3407+EquivalenceMember *
3408+find_em_for_rel_target(PlannerInfo *root, EquivalenceClass *ec,
3409+ RelOptInfo *rel)
3410 {
3411+ PathTarget *target = rel->reltarget;
3412 ListCell *lc1;
3413 int i;
3414
3415@@ -6629,13 +6644,16 @@ find_em_expr_for_input_target(PlannerInfo *root,
3416 while (em_expr && IsA(em_expr, RelabelType))
3417 em_expr = ((RelabelType *) em_expr)->arg;
3418
3419- if (equal(em_expr, expr))
3420- return em->em_expr;
3421+ if (!equal(em_expr, expr))
3422+ continue;
3423+
3424+ /* Check that expression (including relabels!) is shippable */
3425+ if (is_foreign_expr(root, rel, em->em_expr))
3426+ return em;
3427 }
3428
3429 i++;
3430 }
3431
3432- elog(ERROR, "could not find pathkey item to sort");
3433- return NULL; /* keep compiler quiet */
3434+ return NULL;
3435 }
3436diff --git a/contrib/postgres_fdw/postgres_fdw.h b/contrib/postgres_fdw/postgres_fdw.h
3437index 6acb7dc..a15f7b3 100644
3438--- a/contrib/postgres_fdw/postgres_fdw.h
3439+++ b/contrib/postgres_fdw/postgres_fdw.h
3440@@ -155,6 +155,9 @@ extern bool is_foreign_expr(PlannerInfo *root,
3441 extern bool is_foreign_param(PlannerInfo *root,
3442 RelOptInfo *baserel,
3443 Expr *expr);
3444+extern bool is_foreign_pathkey(PlannerInfo *root,
3445+ RelOptInfo *baserel,
3446+ PathKey *pathkey);
3447 extern void deparseInsertSql(StringInfo buf, RangeTblEntry *rte,
3448 Index rtindex, Relation rel,
3449 List *targetAttrs, bool doNothing,
3450@@ -189,10 +192,12 @@ extern void deparseAnalyzeSizeSql(StringInfo buf, Relation rel);
3451 extern void deparseAnalyzeSql(StringInfo buf, Relation rel,
3452 List **retrieved_attrs);
3453 extern void deparseStringLiteral(StringInfo buf, const char *val);
3454-extern Expr *find_em_expr_for_rel(EquivalenceClass *ec, RelOptInfo *rel);
3455-extern Expr *find_em_expr_for_input_target(PlannerInfo *root,
3456- EquivalenceClass *ec,
3457- PathTarget *target);
3458+extern EquivalenceMember *find_em_for_rel(PlannerInfo *root,
3459+ EquivalenceClass *ec,
3460+ RelOptInfo *rel);
3461+extern EquivalenceMember *find_em_for_rel_target(PlannerInfo *root,
3462+ EquivalenceClass *ec,
3463+ RelOptInfo *rel);
3464 extern List *build_tlist_to_deparse(RelOptInfo *foreignrel);
3465 extern void deparseSelectStmtForRel(StringInfo buf, PlannerInfo *root,
3466 RelOptInfo *foreignrel, List *tlist,
3467diff --git a/contrib/postgres_fdw/sql/postgres_fdw.sql b/contrib/postgres_fdw/sql/postgres_fdw.sql
3468index d663e08..58acd7d 100644
3469--- a/contrib/postgres_fdw/sql/postgres_fdw.sql
3470+++ b/contrib/postgres_fdw/sql/postgres_fdw.sql
3471@@ -836,6 +836,10 @@ create operator class my_op_class for type int using btree family my_op_family a
3472 explain (verbose, costs off)
3473 select array_agg(c1 order by c1 using operator(public.<^)) from ft2 where c2 = 6 and c1 < 100 group by c2;
3474
3475+-- This should not be pushed either.
3476+explain (verbose, costs off)
3477+select * from ft2 order by c1 using operator(public.<^);
3478+
3479 -- Update local stats on ft2
3480 ANALYZE ft2;
3481
3482@@ -853,6 +857,10 @@ explain (verbose, costs off)
3483 select array_agg(c1 order by c1 using operator(public.<^)) from ft2 where c2 = 6 and c1 < 100 group by c2;
3484 select array_agg(c1 order by c1 using operator(public.<^)) from ft2 where c2 = 6 and c1 < 100 group by c2;
3485
3486+-- This should be pushed too.
3487+explain (verbose, costs off)
3488+select * from ft2 order by c1 using operator(public.<^);
3489+
3490 -- Remove from extension
3491 alter extension postgres_fdw drop operator class my_op_class using btree;
3492 alter extension postgres_fdw drop function my_op_cmp(a int, b int);
3493diff --git a/contrib/seg/segparse.c b/contrib/seg/segparse.c
3494index b5bcb70..ec32a58 100644
3495--- a/contrib/seg/segparse.c
3496+++ b/contrib/seg/segparse.c
3497@@ -1,8 +1,8 @@
3498-/* A Bison parser, made by GNU Bison 3.3.2. */
3499+/* A Bison parser, made by GNU Bison 3.7.5. */
3500
3501 /* Bison implementation for Yacc-like parsers in C
3502
3503- Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2019 Free Software Foundation,
3504+ Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2021 Free Software Foundation,
3505 Inc.
3506
3507 This program is free software: you can redistribute it and/or modify
3508@@ -34,6 +34,10 @@
3509 /* C LALR(1) parser skeleton written by Richard Stallman, by
3510 simplifying the original so-called "semantic" parser. */
3511
3512+/* DO NOT RELY ON FEATURES THAT ARE NOT DOCUMENTED in the manual,
3513+ especially those whose name start with YY_ or yy_. They are
3514+ private implementation details that can be changed or removed. */
3515+
3516 /* All symbols defined below should begin with yy or YY, to avoid
3517 infringing on user name space. This should be done even for local
3518 variables, as they might otherwise be expanded by user macros.
3519@@ -41,14 +45,11 @@
3520 define necessary library symbols; they are noted "INFRINGES ON
3521 USER NAME SPACE" below. */
3522
3523-/* Undocumented macros, especially those whose name start with YY_,
3524- are private implementation details. Do not rely on them. */
3525-
3526-/* Identify Bison output. */
3527-#define YYBISON 1
3528+/* Identify Bison output, and Bison version. */
3529+#define YYBISON 30705
3530
3531-/* Bison version. */
3532-#define YYBISON_VERSION "3.3.2"
3533+/* Bison version string. */
3534+#define YYBISON_VERSION "3.7.5"
3535
3536 /* Skeleton name. */
3537 #define YYSKELETON_NAME "yacc.c"
3538@@ -69,12 +70,11 @@
3539 #define yyerror seg_yyerror
3540 #define yydebug seg_yydebug
3541 #define yynerrs seg_yynerrs
3542-
3543 #define yylval seg_yylval
3544 #define yychar seg_yychar
3545
3546 /* First part of user prologue. */
3547-#line 1 "segparse.y" /* yacc.c:337 */
3548+#line 1 "segparse.y"
3549
3550 /* contrib/seg/segparse.y */
3551
3552@@ -109,7 +109,17 @@ static char strbuf[25] = {
3553 };
3554
3555
3556-#line 113 "segparse.c" /* yacc.c:337 */
3557+#line 113 "segparse.c"
3558+
3559+# ifndef YY_CAST
3560+# ifdef __cplusplus
3561+# define YY_CAST(Type, Val) static_cast<Type> (Val)
3562+# define YY_REINTERPRET_CAST(Type, Val) reinterpret_cast<Type> (Val)
3563+# else
3564+# define YY_CAST(Type, Val) ((Type) (Val))
3565+# define YY_REINTERPRET_CAST(Type, Val) ((Type) (Val))
3566+# endif
3567+# endif
3568 # ifndef YY_NULLPTR
3569 # if defined __cplusplus
3570 # if 201103L <= __cplusplus
3571@@ -122,14 +132,6 @@ static char strbuf[25] = {
3572 # endif
3573 # endif
3574
3575-/* Enabling verbose error messages. */
3576-#ifdef YYERROR_VERBOSE
3577-# undef YYERROR_VERBOSE
3578-# define YYERROR_VERBOSE 1
3579-#else
3580-# define YYERROR_VERBOSE 0
3581-#endif
3582-
3583
3584 /* Debug traces. */
3585 #ifndef YYDEBUG
3586@@ -139,24 +141,28 @@ static char strbuf[25] = {
3587 extern int seg_yydebug;
3588 #endif
3589
3590-/* Token type. */
3591+/* Token kinds. */
3592 #ifndef YYTOKENTYPE
3593 # define YYTOKENTYPE
3594 enum yytokentype
3595 {
3596- SEGFLOAT = 258,
3597- RANGE = 259,
3598- PLUMIN = 260,
3599- EXTENSION = 261
3600+ YYEMPTY = -2,
3601+ YYEOF = 0, /* "end of file" */
3602+ YYerror = 256, /* error */
3603+ YYUNDEF = 257, /* "invalid token" */
3604+ SEGFLOAT = 258, /* SEGFLOAT */
3605+ RANGE = 259, /* RANGE */
3606+ PLUMIN = 260, /* PLUMIN */
3607+ EXTENSION = 261 /* EXTENSION */
3608 };
3609+ typedef enum yytokentype yytoken_kind_t;
3610 #endif
3611
3612 /* Value type. */
3613 #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
3614-
3615 union YYSTYPE
3616 {
3617-#line 41 "segparse.y" /* yacc.c:352 */
3618+#line 41 "segparse.y"
3619
3620 struct BND {
3621 float val;
3622@@ -165,9 +171,9 @@ union YYSTYPE
3623 } bnd;
3624 char * text;
3625
3626-#line 169 "segparse.c" /* yacc.c:352 */
3627-};
3628+#line 175 "segparse.c"
3629
3630+};
3631 typedef union YYSTYPE YYSTYPE;
3632 # define YYSTYPE_IS_TRIVIAL 1
3633 # define YYSTYPE_IS_DECLARED 1
3634@@ -179,6 +185,24 @@ extern YYSTYPE seg_yylval;
3635 int seg_yyparse (SEG *result);
3636
3637
3638+/* Symbol kind. */
3639+enum yysymbol_kind_t
3640+{
3641+ YYSYMBOL_YYEMPTY = -2,
3642+ YYSYMBOL_YYEOF = 0, /* "end of file" */
3643+ YYSYMBOL_YYerror = 1, /* error */
3644+ YYSYMBOL_YYUNDEF = 2, /* "invalid token" */
3645+ YYSYMBOL_SEGFLOAT = 3, /* SEGFLOAT */
3646+ YYSYMBOL_RANGE = 4, /* RANGE */
3647+ YYSYMBOL_PLUMIN = 5, /* PLUMIN */
3648+ YYSYMBOL_EXTENSION = 6, /* EXTENSION */
3649+ YYSYMBOL_YYACCEPT = 7, /* $accept */
3650+ YYSYMBOL_range = 8, /* range */
3651+ YYSYMBOL_boundary = 9, /* boundary */
3652+ YYSYMBOL_deviation = 10 /* deviation */
3653+};
3654+typedef enum yysymbol_kind_t yysymbol_kind_t;
3655+
3656
3657
3658
3659@@ -186,28 +210,87 @@ int seg_yyparse (SEG *result);
3660 # undef short
3661 #endif
3662
3663-#ifdef YYTYPE_UINT8
3664-typedef YYTYPE_UINT8 yytype_uint8;
3665-#else
3666-typedef unsigned char yytype_uint8;
3667+/* On compilers that do not define __PTRDIFF_MAX__ etc., make sure
3668+ <limits.h> and (if available) <stdint.h> are included
3669+ so that the code can choose integer types of a good width. */
3670+
3671+#ifndef __PTRDIFF_MAX__
3672+# include <limits.h> /* INFRINGES ON USER NAME SPACE */
3673+# if defined __STDC_VERSION__ && 199901 <= __STDC_VERSION__
3674+# include <stdint.h> /* INFRINGES ON USER NAME SPACE */
3675+# define YY_STDINT_H
3676+# endif
3677 #endif
3678
3679-#ifdef YYTYPE_INT8
3680-typedef YYTYPE_INT8 yytype_int8;
3681+/* Narrow types that promote to a signed type and that can represent a
3682+ signed or unsigned integer of at least N bits. In tables they can
3683+ save space and decrease cache pressure. Promoting to a signed type
3684+ helps avoid bugs in integer arithmetic. */
3685+
3686+#ifdef __INT_LEAST8_MAX__
3687+typedef __INT_LEAST8_TYPE__ yytype_int8;
3688+#elif defined YY_STDINT_H
3689+typedef int_least8_t yytype_int8;
3690 #else
3691 typedef signed char yytype_int8;
3692 #endif
3693
3694-#ifdef YYTYPE_UINT16
3695-typedef YYTYPE_UINT16 yytype_uint16;
3696+#ifdef __INT_LEAST16_MAX__
3697+typedef __INT_LEAST16_TYPE__ yytype_int16;
3698+#elif defined YY_STDINT_H
3699+typedef int_least16_t yytype_int16;
3700 #else
3701-typedef unsigned short yytype_uint16;
3702+typedef short yytype_int16;
3703+#endif
3704+
3705+/* Work around bug in HP-UX 11.23, which defines these macros
3706+ incorrectly for preprocessor constants. This workaround can likely
3707+ be removed in 2023, as HPE has promised support for HP-UX 11.23
3708+ (aka HP-UX 11i v2) only through the end of 2022; see Table 2 of
3709+ <https://h20195.www2.hpe.com/V2/getpdf.aspx/4AA4-7673ENW.pdf>. */
3710+#ifdef __hpux
3711+# undef UINT_LEAST8_MAX
3712+# undef UINT_LEAST16_MAX
3713+# define UINT_LEAST8_MAX 255
3714+# define UINT_LEAST16_MAX 65535
3715+#endif
3716+
3717+#if defined __UINT_LEAST8_MAX__ && __UINT_LEAST8_MAX__ <= __INT_MAX__
3718+typedef __UINT_LEAST8_TYPE__ yytype_uint8;
3719+#elif (!defined __UINT_LEAST8_MAX__ && defined YY_STDINT_H \
3720+ && UINT_LEAST8_MAX <= INT_MAX)
3721+typedef uint_least8_t yytype_uint8;
3722+#elif !defined __UINT_LEAST8_MAX__ && UCHAR_MAX <= INT_MAX
3723+typedef unsigned char yytype_uint8;
3724+#else
3725+typedef short yytype_uint8;
3726 #endif
3727
3728-#ifdef YYTYPE_INT16
3729-typedef YYTYPE_INT16 yytype_int16;
3730+#if defined __UINT_LEAST16_MAX__ && __UINT_LEAST16_MAX__ <= __INT_MAX__
3731+typedef __UINT_LEAST16_TYPE__ yytype_uint16;
3732+#elif (!defined __UINT_LEAST16_MAX__ && defined YY_STDINT_H \
3733+ && UINT_LEAST16_MAX <= INT_MAX)
3734+typedef uint_least16_t yytype_uint16;
3735+#elif !defined __UINT_LEAST16_MAX__ && USHRT_MAX <= INT_MAX
3736+typedef unsigned short yytype_uint16;
3737 #else
3738-typedef short yytype_int16;
3739+typedef int yytype_uint16;
3740+#endif
3741+
3742+#ifndef YYPTRDIFF_T
3743+# if defined __PTRDIFF_TYPE__ && defined __PTRDIFF_MAX__
3744+# define YYPTRDIFF_T __PTRDIFF_TYPE__
3745+# define YYPTRDIFF_MAXIMUM __PTRDIFF_MAX__
3746+# elif defined PTRDIFF_MAX
3747+# ifndef ptrdiff_t
3748+# include <stddef.h> /* INFRINGES ON USER NAME SPACE */
3749+# endif
3750+# define YYPTRDIFF_T ptrdiff_t
3751+# define YYPTRDIFF_MAXIMUM PTRDIFF_MAX
3752+# else
3753+# define YYPTRDIFF_T long
3754+# define YYPTRDIFF_MAXIMUM LONG_MAX
3755+# endif
3756 #endif
3757
3758 #ifndef YYSIZE_T
3759@@ -215,7 +298,7 @@ typedef short yytype_int16;
3760 # define YYSIZE_T __SIZE_TYPE__
3761 # elif defined size_t
3762 # define YYSIZE_T size_t
3763-# elif ! defined YYSIZE_T
3764+# elif defined __STDC_VERSION__ && 199901 <= __STDC_VERSION__
3765 # include <stddef.h> /* INFRINGES ON USER NAME SPACE */
3766 # define YYSIZE_T size_t
3767 # else
3768@@ -223,7 +306,20 @@ typedef short yytype_int16;
3769 # endif
3770 #endif
3771
3772-#define YYSIZE_MAXIMUM ((YYSIZE_T) -1)
3773+#define YYSIZE_MAXIMUM \
3774+ YY_CAST (YYPTRDIFF_T, \
3775+ (YYPTRDIFF_MAXIMUM < YY_CAST (YYSIZE_T, -1) \
3776+ ? YYPTRDIFF_MAXIMUM \
3777+ : YY_CAST (YYSIZE_T, -1)))
3778+
3779+#define YYSIZEOF(X) YY_CAST (YYPTRDIFF_T, sizeof (X))
3780+
3781+
3782+/* Stored state numbers (used for stacks). */
3783+typedef yytype_int8 yy_state_t;
3784+
3785+/* State numbers in computations. */
3786+typedef int yy_state_fast_t;
3787
3788 #ifndef YY_
3789 # if defined YYENABLE_NLS && YYENABLE_NLS
3790@@ -237,38 +333,37 @@ typedef short yytype_int16;
3791 # endif
3792 #endif
3793
3794-#ifndef YY_ATTRIBUTE
3795-# if (defined __GNUC__ \
3796- && (2 < __GNUC__ || (__GNUC__ == 2 && 96 <= __GNUC_MINOR__))) \
3797- || defined __SUNPRO_C && 0x5110 <= __SUNPRO_C
3798-# define YY_ATTRIBUTE(Spec) __attribute__(Spec)
3799-# else
3800-# define YY_ATTRIBUTE(Spec) /* empty */
3801-# endif
3802-#endif
3803
3804 #ifndef YY_ATTRIBUTE_PURE
3805-# define YY_ATTRIBUTE_PURE YY_ATTRIBUTE ((__pure__))
3806+# if defined __GNUC__ && 2 < __GNUC__ + (96 <= __GNUC_MINOR__)
3807+# define YY_ATTRIBUTE_PURE __attribute__ ((__pure__))
3808+# else
3809+# define YY_ATTRIBUTE_PURE
3810+# endif
3811 #endif
3812
3813 #ifndef YY_ATTRIBUTE_UNUSED
3814-# define YY_ATTRIBUTE_UNUSED YY_ATTRIBUTE ((__unused__))
3815+# if defined __GNUC__ && 2 < __GNUC__ + (7 <= __GNUC_MINOR__)
3816+# define YY_ATTRIBUTE_UNUSED __attribute__ ((__unused__))
3817+# else
3818+# define YY_ATTRIBUTE_UNUSED
3819+# endif
3820 #endif
3821
3822 /* Suppress unused-variable warnings by "using" E. */
3823 #if ! defined lint || defined __GNUC__
3824-# define YYUSE(E) ((void) (E))
3825+# define YY_USE(E) ((void) (E))
3826 #else
3827-# define YYUSE(E) /* empty */
3828+# define YY_USE(E) /* empty */
3829 #endif
3830
3831 #if defined __GNUC__ && ! defined __ICC && 407 <= __GNUC__ * 100 + __GNUC_MINOR__
3832 /* Suppress an incorrect diagnostic about yylval being uninitialized. */
3833-# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \
3834- _Pragma ("GCC diagnostic push") \
3835- _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"")\
3836+# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \
3837+ _Pragma ("GCC diagnostic push") \
3838+ _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"") \
3839 _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"")
3840-# define YY_IGNORE_MAYBE_UNINITIALIZED_END \
3841+# define YY_IGNORE_MAYBE_UNINITIALIZED_END \
3842 _Pragma ("GCC diagnostic pop")
3843 #else
3844 # define YY_INITIAL_VALUE(Value) Value
3845@@ -281,8 +376,22 @@ typedef short yytype_int16;
3846 # define YY_INITIAL_VALUE(Value) /* Nothing. */
3847 #endif
3848
3849+#if defined __cplusplus && defined __GNUC__ && ! defined __ICC && 6 <= __GNUC__
3850+# define YY_IGNORE_USELESS_CAST_BEGIN \
3851+ _Pragma ("GCC diagnostic push") \
3852+ _Pragma ("GCC diagnostic ignored \"-Wuseless-cast\"")
3853+# define YY_IGNORE_USELESS_CAST_END \
3854+ _Pragma ("GCC diagnostic pop")
3855+#endif
3856+#ifndef YY_IGNORE_USELESS_CAST_BEGIN
3857+# define YY_IGNORE_USELESS_CAST_BEGIN
3858+# define YY_IGNORE_USELESS_CAST_END
3859+#endif
3860+
3861+
3862+#define YY_ASSERT(E) ((void) (0 && (E)))
3863
3864-#if ! defined yyoverflow || YYERROR_VERBOSE
3865+#if !defined yyoverflow
3866
3867 /* The parser invokes alloca or malloc; define the necessary symbols. */
3868
3869@@ -347,8 +456,7 @@ void free (void *); /* INFRINGES ON USER NAME SPACE */
3870 # endif
3871 # endif
3872 # endif
3873-#endif /* ! defined yyoverflow || YYERROR_VERBOSE */
3874-
3875+#endif /* !defined yyoverflow */
3876
3877 #if (! defined yyoverflow \
3878 && (! defined __cplusplus \
3879@@ -357,17 +465,17 @@ void free (void *); /* INFRINGES ON USER NAME SPACE */
3880 /* A type that is properly aligned for any stack member. */
3881 union yyalloc
3882 {
3883- yytype_int16 yyss_alloc;
3884+ yy_state_t yyss_alloc;
3885 YYSTYPE yyvs_alloc;
3886 };
3887
3888 /* The size of the maximum gap between one aligned stack and the next. */
3889-# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)
3890+# define YYSTACK_GAP_MAXIMUM (YYSIZEOF (union yyalloc) - 1)
3891
3892 /* The size of an array large to enough to hold all stacks, each with
3893 N elements. */
3894 # define YYSTACK_BYTES(N) \
3895- ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \
3896+ ((N) * (YYSIZEOF (yy_state_t) + YYSIZEOF (YYSTYPE)) \
3897 + YYSTACK_GAP_MAXIMUM)
3898
3899 # define YYCOPY_NEEDED 1
3900@@ -380,11 +488,11 @@ union yyalloc
3901 # define YYSTACK_RELOCATE(Stack_alloc, Stack) \
3902 do \
3903 { \
3904- YYSIZE_T yynewbytes; \
3905+ YYPTRDIFF_T yynewbytes; \
3906 YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \
3907 Stack = &yyptr->Stack_alloc; \
3908- yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
3909- yyptr += yynewbytes / sizeof (*yyptr); \
3910+ yynewbytes = yystacksize * YYSIZEOF (*Stack) + YYSTACK_GAP_MAXIMUM; \
3911+ yyptr += yynewbytes / YYSIZEOF (*yyptr); \
3912 } \
3913 while (0)
3914
3915@@ -396,12 +504,12 @@ union yyalloc
3916 # ifndef YYCOPY
3917 # if defined __GNUC__ && 1 < __GNUC__
3918 # define YYCOPY(Dst, Src, Count) \
3919- __builtin_memcpy (Dst, Src, (Count) * sizeof (*(Src)))
3920+ __builtin_memcpy (Dst, Src, YY_CAST (YYSIZE_T, (Count)) * sizeof (*(Src)))
3921 # else
3922 # define YYCOPY(Dst, Src, Count) \
3923 do \
3924 { \
3925- YYSIZE_T yyi; \
3926+ YYPTRDIFF_T yyi; \
3927 for (yyi = 0; yyi < (Count); yyi++) \
3928 (Dst)[yyi] = (Src)[yyi]; \
3929 } \
3930@@ -424,17 +532,20 @@ union yyalloc
3931 /* YYNSTATES -- Number of states. */
3932 #define YYNSTATES 14
3933
3934-#define YYUNDEFTOK 2
3935+/* YYMAXUTOK -- Last valid token kind. */
3936 #define YYMAXUTOK 261
3937
3938+
3939 /* YYTRANSLATE(TOKEN-NUM) -- Symbol number corresponding to TOKEN-NUM
3940 as returned by yylex, with out-of-bounds checking. */
3941-#define YYTRANSLATE(YYX) \
3942- ((unsigned) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
3943+#define YYTRANSLATE(YYX) \
3944+ (0 <= (YYX) && (YYX) <= YYMAXUTOK \
3945+ ? YY_CAST (yysymbol_kind_t, yytranslate[YYX]) \
3946+ : YYSYMBOL_YYUNDEF)
3947
3948 /* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM
3949 as returned by yylex. */
3950-static const yytype_uint8 yytranslate[] =
3951+static const yytype_int8 yytranslate[] =
3952 {
3953 0, 2, 2, 2, 2, 2, 2, 2, 2, 2,
3954 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
3955@@ -473,33 +584,46 @@ static const yytype_uint8 yyrline[] =
3956 };
3957 #endif
3958
3959-#if YYDEBUG || YYERROR_VERBOSE || 0
3960+/** Accessing symbol of state STATE. */
3961+#define YY_ACCESSING_SYMBOL(State) YY_CAST (yysymbol_kind_t, yystos[State])
3962+
3963+#if YYDEBUG || 0
3964+/* The user-facing name of the symbol whose (internal) number is
3965+ YYSYMBOL. No bounds checking. */
3966+static const char *yysymbol_name (yysymbol_kind_t yysymbol) YY_ATTRIBUTE_UNUSED;
3967+
3968 /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
3969 First, the terminals, then, starting at YYNTOKENS, nonterminals. */
3970 static const char *const yytname[] =
3971 {
3972- "$end", "error", "$undefined", "SEGFLOAT", "RANGE", "PLUMIN",
3973- "EXTENSION", "$accept", "range", "boundary", "deviation", YY_NULLPTR
3974+ "\"end of file\"", "error", "\"invalid token\"", "SEGFLOAT", "RANGE",
3975+ "PLUMIN", "EXTENSION", "$accept", "range", "boundary", "deviation", YY_NULLPTR
3976 };
3977+
3978+static const char *
3979+yysymbol_name (yysymbol_kind_t yysymbol)
3980+{
3981+ return yytname[yysymbol];
3982+}
3983 #endif
3984
3985-# ifdef YYPRINT
3986+#ifdef YYPRINT
3987 /* YYTOKNUM[NUM] -- (External) token number corresponding to the
3988 (internal) symbol number NUM (which must be that of a token). */
3989-static const yytype_uint16 yytoknum[] =
3990+static const yytype_int16 yytoknum[] =
3991 {
3992 0, 256, 257, 258, 259, 260, 261
3993 };
3994-# endif
3995+#endif
3996
3997-#define YYPACT_NINF -3
3998+#define YYPACT_NINF (-3)
3999
4000-#define yypact_value_is_default(Yystate) \
4001- (!!((Yystate) == (-3)))
4002+#define yypact_value_is_default(Yyn) \
4003+ ((Yyn) == YYPACT_NINF)
4004
4005-#define YYTABLE_NINF -1
4006+#define YYTABLE_NINF (-1)
4007
4008-#define yytable_value_is_error(Yytable_value) \
4009+#define yytable_value_is_error(Yyn) \
4010 0
4011
4012 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
4013@@ -513,7 +637,7 @@ static const yytype_int8 yypact[] =
4014 /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
4015 Performed when YYTABLE does not specify something else to do. Zero
4016 means the default is an error. */
4017-static const yytype_uint8 yydefact[] =
4018+static const yytype_int8 yydefact[] =
4019 {
4020 0, 7, 0, 0, 0, 6, 5, 8, 1, 4,
4021 0, 3, 9, 2
4022@@ -528,13 +652,13 @@ static const yytype_int8 yypgoto[] =
4023 /* YYDEFGOTO[NTERM-NUM]. */
4024 static const yytype_int8 yydefgoto[] =
4025 {
4026- -1, 4, 5, 13
4027+ 0, 4, 5, 13
4028 };
4029
4030 /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If
4031 positive, shift that token. If negative, reduce the rule whose
4032 number is the opposite. If YYTABLE_NINF, syntax error. */
4033-static const yytype_uint8 yytable[] =
4034+static const yytype_int8 yytable[] =
4035 {
4036 6, 0, 1, 2, 7, 3, 1, 11, 8, 3,
4037 9, 10, 12
4038@@ -548,29 +672,29 @@ static const yytype_int8 yycheck[] =
4039
4040 /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
4041 symbol of state STATE-NUM. */
4042-static const yytype_uint8 yystos[] =
4043+static const yytype_int8 yystos[] =
4044 {
4045 0, 3, 4, 6, 8, 9, 9, 3, 0, 4,
4046 5, 9, 3, 10
4047 };
4048
4049 /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
4050-static const yytype_uint8 yyr1[] =
4051+static const yytype_int8 yyr1[] =
4052 {
4053 0, 7, 8, 8, 8, 8, 8, 9, 9, 10
4054 };
4055
4056 /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. */
4057-static const yytype_uint8 yyr2[] =
4058+static const yytype_int8 yyr2[] =
4059 {
4060 0, 2, 3, 3, 2, 2, 1, 1, 2, 1
4061 };
4062
4063
4064+enum { YYENOMEM = -2 };
4065+
4066 #define yyerrok (yyerrstatus = 0)
4067 #define yyclearin (yychar = YYEMPTY)
4068-#define YYEMPTY (-2)
4069-#define YYEOF 0
4070
4071 #define YYACCEPT goto yyacceptlab
4072 #define YYABORT goto yyabortlab
4073@@ -596,10 +720,9 @@ static const yytype_uint8 yyr2[] =
4074 } \
4075 while (0)
4076
4077-/* Error token number */
4078-#define YYTERROR 1
4079-#define YYERRCODE 256
4080-
4081+/* Backward compatibility with an undocumented macro.
4082+ Use YYerror or YYUNDEF. */
4083+#define YYERRCODE YYUNDEF
4084
4085
4086 /* Enable debugging if requested. */
4087@@ -617,18 +740,18 @@ do { \
4088 } while (0)
4089
4090 /* This macro is provided for backward compatibility. */
4091-#ifndef YY_LOCATION_PRINT
4092-# define YY_LOCATION_PRINT(File, Loc) ((void) 0)
4093-#endif
4094+# ifndef YY_LOCATION_PRINT
4095+# define YY_LOCATION_PRINT(File, Loc) ((void) 0)
4096+# endif
4097
4098
4099-# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \
4100+# define YY_SYMBOL_PRINT(Title, Kind, Value, Location) \
4101 do { \
4102 if (yydebug) \
4103 { \
4104 YYFPRINTF (stderr, "%s ", Title); \
4105 yy_symbol_print (stderr, \
4106- Type, Value, result); \
4107+ Kind, Value, result); \
4108 YYFPRINTF (stderr, "\n"); \
4109 } \
4110 } while (0)
4111@@ -639,18 +762,21 @@ do { \
4112 `-----------------------------------*/
4113
4114 static void
4115-yy_symbol_value_print (FILE *yyo, int yytype, YYSTYPE const * const yyvaluep, SEG *result)
4116+yy_symbol_value_print (FILE *yyo,
4117+ yysymbol_kind_t yykind, YYSTYPE const * const yyvaluep, SEG *result)
4118 {
4119 FILE *yyoutput = yyo;
4120- YYUSE (yyoutput);
4121- YYUSE (result);
4122+ YY_USE (yyoutput);
4123+ YY_USE (result);
4124 if (!yyvaluep)
4125 return;
4126 # ifdef YYPRINT
4127- if (yytype < YYNTOKENS)
4128- YYPRINT (yyo, yytoknum[yytype], *yyvaluep);
4129+ if (yykind < YYNTOKENS)
4130+ YYPRINT (yyo, yytoknum[yykind], *yyvaluep);
4131 # endif
4132- YYUSE (yytype);
4133+ YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
4134+ YY_USE (yykind);
4135+ YY_IGNORE_MAYBE_UNINITIALIZED_END
4136 }
4137
4138
4139@@ -659,12 +785,13 @@ yy_symbol_value_print (FILE *yyo, int yytype, YYSTYPE const * const yyvaluep, SE
4140 `---------------------------*/
4141
4142 static void
4143-yy_symbol_print (FILE *yyo, int yytype, YYSTYPE const * const yyvaluep, SEG *result)
4144+yy_symbol_print (FILE *yyo,
4145+ yysymbol_kind_t yykind, YYSTYPE const * const yyvaluep, SEG *result)
4146 {
4147 YYFPRINTF (yyo, "%s %s (",
4148- yytype < YYNTOKENS ? "token" : "nterm", yytname[yytype]);
4149+ yykind < YYNTOKENS ? "token" : "nterm", yysymbol_name (yykind));
4150
4151- yy_symbol_value_print (yyo, yytype, yyvaluep, result);
4152+ yy_symbol_value_print (yyo, yykind, yyvaluep, result);
4153 YYFPRINTF (yyo, ")");
4154 }
4155
4156@@ -674,7 +801,7 @@ yy_symbol_print (FILE *yyo, int yytype, YYSTYPE const * const yyvaluep, SEG *res
4157 `------------------------------------------------------------------*/
4158
4159 static void
4160-yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop)
4161+yy_stack_print (yy_state_t *yybottom, yy_state_t *yytop)
4162 {
4163 YYFPRINTF (stderr, "Stack now");
4164 for (; yybottom <= yytop; yybottom++)
4165@@ -697,21 +824,21 @@ do { \
4166 `------------------------------------------------*/
4167
4168 static void
4169-yy_reduce_print (yytype_int16 *yyssp, YYSTYPE *yyvsp, int yyrule, SEG *result)
4170+yy_reduce_print (yy_state_t *yyssp, YYSTYPE *yyvsp,
4171+ int yyrule, SEG *result)
4172 {
4173- unsigned long yylno = yyrline[yyrule];
4174+ int yylno = yyrline[yyrule];
4175 int yynrhs = yyr2[yyrule];
4176 int yyi;
4177- YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n",
4178+ YYFPRINTF (stderr, "Reducing stack by rule %d (line %d):\n",
4179 yyrule - 1, yylno);
4180 /* The symbols being reduced. */
4181 for (yyi = 0; yyi < yynrhs; yyi++)
4182 {
4183 YYFPRINTF (stderr, " $%d = ", yyi + 1);
4184 yy_symbol_print (stderr,
4185- yystos[yyssp[yyi + 1 - yynrhs]],
4186- &yyvsp[(yyi + 1) - (yynrhs)]
4187- , result);
4188+ YY_ACCESSING_SYMBOL (+yyssp[yyi + 1 - yynrhs]),
4189+ &yyvsp[(yyi + 1) - (yynrhs)], result);
4190 YYFPRINTF (stderr, "\n");
4191 }
4192 }
4193@@ -726,8 +853,8 @@ do { \
4194 multiple parsers can coexist. */
4195 int yydebug;
4196 #else /* !YYDEBUG */
4197-# define YYDPRINTF(Args)
4198-# define YY_SYMBOL_PRINT(Title, Type, Value, Location)
4199+# define YYDPRINTF(Args) ((void) 0)
4200+# define YY_SYMBOL_PRINT(Title, Kind, Value, Location)
4201 # define YY_STACK_PRINT(Bottom, Top)
4202 # define YY_REDUCE_PRINT(Rule)
4203 #endif /* !YYDEBUG */
4204@@ -750,255 +877,31 @@ int yydebug;
4205 #endif
4206
4207
4208-#if YYERROR_VERBOSE
4209-
4210-# ifndef yystrlen
4211-# if defined __GLIBC__ && defined _STRING_H
4212-# define yystrlen strlen
4213-# else
4214-/* Return the length of YYSTR. */
4215-static YYSIZE_T
4216-yystrlen (const char *yystr)
4217-{
4218- YYSIZE_T yylen;
4219- for (yylen = 0; yystr[yylen]; yylen++)
4220- continue;
4221- return yylen;
4222-}
4223-# endif
4224-# endif
4225-
4226-# ifndef yystpcpy
4227-# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE
4228-# define yystpcpy stpcpy
4229-# else
4230-/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
4231- YYDEST. */
4232-static char *
4233-yystpcpy (char *yydest, const char *yysrc)
4234-{
4235- char *yyd = yydest;
4236- const char *yys = yysrc;
4237-
4238- while ((*yyd++ = *yys++) != '\0')
4239- continue;
4240-
4241- return yyd - 1;
4242-}
4243-# endif
4244-# endif
4245-
4246-# ifndef yytnamerr
4247-/* Copy to YYRES the contents of YYSTR after stripping away unnecessary
4248- quotes and backslashes, so that it's suitable for yyerror. The
4249- heuristic is that double-quoting is unnecessary unless the string
4250- contains an apostrophe, a comma, or backslash (other than
4251- backslash-backslash). YYSTR is taken from yytname. If YYRES is
4252- null, do not copy; instead, return the length of what the result
4253- would have been. */
4254-static YYSIZE_T
4255-yytnamerr (char *yyres, const char *yystr)
4256-{
4257- if (*yystr == '"')
4258- {
4259- YYSIZE_T yyn = 0;
4260- char const *yyp = yystr;
4261-
4262- for (;;)
4263- switch (*++yyp)
4264- {
4265- case '\'':
4266- case ',':
4267- goto do_not_strip_quotes;
4268-
4269- case '\\':
4270- if (*++yyp != '\\')
4271- goto do_not_strip_quotes;
4272- else
4273- goto append;
4274-
4275- append:
4276- default:
4277- if (yyres)
4278- yyres[yyn] = *yyp;
4279- yyn++;
4280- break;
4281-
4282- case '"':
4283- if (yyres)
4284- yyres[yyn] = '\0';
4285- return yyn;
4286- }
4287- do_not_strip_quotes: ;
4288- }
4289-
4290- if (! yyres)
4291- return yystrlen (yystr);
4292
4293- return (YYSIZE_T) (yystpcpy (yyres, yystr) - yyres);
4294-}
4295-# endif
4296
4297-/* Copy into *YYMSG, which is of size *YYMSG_ALLOC, an error message
4298- about the unexpected token YYTOKEN for the state stack whose top is
4299- YYSSP.
4300-
4301- Return 0 if *YYMSG was successfully written. Return 1 if *YYMSG is
4302- not large enough to hold the message. In that case, also set
4303- *YYMSG_ALLOC to the required number of bytes. Return 2 if the
4304- required number of bytes is too large to store. */
4305-static int
4306-yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg,
4307- yytype_int16 *yyssp, int yytoken)
4308-{
4309- YYSIZE_T yysize0 = yytnamerr (YY_NULLPTR, yytname[yytoken]);
4310- YYSIZE_T yysize = yysize0;
4311- enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
4312- /* Internationalized format string. */
4313- const char *yyformat = YY_NULLPTR;
4314- /* Arguments of yyformat. */
4315- char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
4316- /* Number of reported tokens (one for the "unexpected", one per
4317- "expected"). */
4318- int yycount = 0;
4319-
4320- /* There are many possibilities here to consider:
4321- - If this state is a consistent state with a default action, then
4322- the only way this function was invoked is if the default action
4323- is an error action. In that case, don't check for expected
4324- tokens because there are none.
4325- - The only way there can be no lookahead present (in yychar) is if
4326- this state is a consistent state with a default action. Thus,
4327- detecting the absence of a lookahead is sufficient to determine
4328- that there is no unexpected or expected token to report. In that
4329- case, just report a simple "syntax error".
4330- - Don't assume there isn't a lookahead just because this state is a
4331- consistent state with a default action. There might have been a
4332- previous inconsistent state, consistent state with a non-default
4333- action, or user semantic action that manipulated yychar.
4334- - Of course, the expected token list depends on states to have
4335- correct lookahead information, and it depends on the parser not
4336- to perform extra reductions after fetching a lookahead from the
4337- scanner and before detecting a syntax error. Thus, state merging
4338- (from LALR or IELR) and default reductions corrupt the expected
4339- token list. However, the list is correct for canonical LR with
4340- one exception: it will still contain any token that will not be
4341- accepted due to an error action in a later state.
4342- */
4343- if (yytoken != YYEMPTY)
4344- {
4345- int yyn = yypact[*yyssp];
4346- yyarg[yycount++] = yytname[yytoken];
4347- if (!yypact_value_is_default (yyn))
4348- {
4349- /* Start YYX at -YYN if negative to avoid negative indexes in
4350- YYCHECK. In other words, skip the first -YYN actions for
4351- this state because they are default actions. */
4352- int yyxbegin = yyn < 0 ? -yyn : 0;
4353- /* Stay within bounds of both yycheck and yytname. */
4354- int yychecklim = YYLAST - yyn + 1;
4355- int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
4356- int yyx;
4357-
4358- for (yyx = yyxbegin; yyx < yyxend; ++yyx)
4359- if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR
4360- && !yytable_value_is_error (yytable[yyx + yyn]))
4361- {
4362- if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
4363- {
4364- yycount = 1;
4365- yysize = yysize0;
4366- break;
4367- }
4368- yyarg[yycount++] = yytname[yyx];
4369- {
4370- YYSIZE_T yysize1 = yysize + yytnamerr (YY_NULLPTR, yytname[yyx]);
4371- if (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM)
4372- yysize = yysize1;
4373- else
4374- return 2;
4375- }
4376- }
4377- }
4378- }
4379-
4380- switch (yycount)
4381- {
4382-# define YYCASE_(N, S) \
4383- case N: \
4384- yyformat = S; \
4385- break
4386- default: /* Avoid compiler warnings. */
4387- YYCASE_(0, YY_("syntax error"));
4388- YYCASE_(1, YY_("syntax error, unexpected %s"));
4389- YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s"));
4390- YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or %s"));
4391- YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s or %s"));
4392- YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"));
4393-# undef YYCASE_
4394- }
4395
4396- {
4397- YYSIZE_T yysize1 = yysize + yystrlen (yyformat);
4398- if (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM)
4399- yysize = yysize1;
4400- else
4401- return 2;
4402- }
4403-
4404- if (*yymsg_alloc < yysize)
4405- {
4406- *yymsg_alloc = 2 * yysize;
4407- if (! (yysize <= *yymsg_alloc
4408- && *yymsg_alloc <= YYSTACK_ALLOC_MAXIMUM))
4409- *yymsg_alloc = YYSTACK_ALLOC_MAXIMUM;
4410- return 1;
4411- }
4412-
4413- /* Avoid sprintf, as that infringes on the user's name space.
4414- Don't have undefined behavior even if the translation
4415- produced a string with the wrong number of "%s"s. */
4416- {
4417- char *yyp = *yymsg;
4418- int yyi = 0;
4419- while ((*yyp = *yyformat) != '\0')
4420- if (*yyp == '%' && yyformat[1] == 's' && yyi < yycount)
4421- {
4422- yyp += yytnamerr (yyp, yyarg[yyi++]);
4423- yyformat += 2;
4424- }
4425- else
4426- {
4427- yyp++;
4428- yyformat++;
4429- }
4430- }
4431- return 0;
4432-}
4433-#endif /* YYERROR_VERBOSE */
4434
4435 /*-----------------------------------------------.
4436 | Release the memory associated to this symbol. |
4437 `-----------------------------------------------*/
4438
4439 static void
4440-yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, SEG *result)
4441+yydestruct (const char *yymsg,
4442+ yysymbol_kind_t yykind, YYSTYPE *yyvaluep, SEG *result)
4443 {
4444- YYUSE (yyvaluep);
4445- YYUSE (result);
4446+ YY_USE (yyvaluep);
4447+ YY_USE (result);
4448 if (!yymsg)
4449 yymsg = "Deleting";
4450- YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
4451+ YY_SYMBOL_PRINT (yymsg, yykind, yyvaluep, yylocationp);
4452
4453 YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
4454- YYUSE (yytype);
4455+ YY_USE (yykind);
4456 YY_IGNORE_MAYBE_UNINITIALIZED_END
4457 }
4458
4459
4460-
4461-
4462-/* The lookahead symbol. */
4463+/* Lookahead token kind. */
4464 int yychar;
4465
4466 /* The semantic value of the lookahead symbol. */
4467@@ -1007,6 +910,8 @@ YYSTYPE yylval;
4468 int yynerrs;
4469
4470
4471+
4472+
4473 /*----------.
4474 | yyparse. |
4475 `----------*/
4476@@ -1014,43 +919,36 @@ int yynerrs;
4477 int
4478 yyparse (SEG *result)
4479 {
4480- int yystate;
4481+ yy_state_fast_t yystate = 0;
4482 /* Number of tokens to shift before error messages enabled. */
4483- int yyerrstatus;
4484+ int yyerrstatus = 0;
4485
4486- /* The stacks and their tools:
4487- 'yyss': related to states.
4488- 'yyvs': related to semantic values.
4489-
4490- Refer to the stacks through separate pointers, to allow yyoverflow
4491+ /* Refer to the stacks through separate pointers, to allow yyoverflow
4492 to reallocate them elsewhere. */
4493
4494- /* The state stack. */
4495- yytype_int16 yyssa[YYINITDEPTH];
4496- yytype_int16 *yyss;
4497- yytype_int16 *yyssp;
4498+ /* Their size. */
4499+ YYPTRDIFF_T yystacksize = YYINITDEPTH;
4500
4501- /* The semantic value stack. */
4502- YYSTYPE yyvsa[YYINITDEPTH];
4503- YYSTYPE *yyvs;
4504- YYSTYPE *yyvsp;
4505+ /* The state stack: array, bottom, top. */
4506+ yy_state_t yyssa[YYINITDEPTH];
4507+ yy_state_t *yyss = yyssa;
4508+ yy_state_t *yyssp = yyss;
4509
4510- YYSIZE_T yystacksize;
4511+ /* The semantic value stack: array, bottom, top. */
4512+ YYSTYPE yyvsa[YYINITDEPTH];
4513+ YYSTYPE *yyvs = yyvsa;
4514+ YYSTYPE *yyvsp = yyvs;
4515
4516 int yyn;
4517+ /* The return value of yyparse. */
4518 int yyresult;
4519- /* Lookahead token as an internal (translated) token number. */
4520- int yytoken = 0;
4521+ /* Lookahead symbol kind. */
4522+ yysymbol_kind_t yytoken = YYSYMBOL_YYEMPTY;
4523 /* The variables used to return semantic value and location from the
4524 action routines. */
4525 YYSTYPE yyval;
4526
4527-#if YYERROR_VERBOSE
4528- /* Buffer for error messages, and its allocated size. */
4529- char yymsgbuf[128];
4530- char *yymsg = yymsgbuf;
4531- YYSIZE_T yymsg_alloc = sizeof yymsgbuf;
4532-#endif
4533+
4534
4535 #define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N))
4536
4537@@ -1058,15 +956,8 @@ yyparse (SEG *result)
4538 Keep to zero when no symbol should be popped. */
4539 int yylen = 0;
4540
4541- yyssp = yyss = yyssa;
4542- yyvsp = yyvs = yyvsa;
4543- yystacksize = YYINITDEPTH;
4544-
4545 YYDPRINTF ((stderr, "Starting parse\n"));
4546
4547- yystate = 0;
4548- yyerrstatus = 0;
4549- yynerrs = 0;
4550 yychar = YYEMPTY; /* Cause a token to be read. */
4551 goto yysetstate;
4552
4553@@ -1081,10 +972,15 @@ yynewstate:
4554
4555
4556 /*--------------------------------------------------------------------.
4557-| yynewstate -- set current state (the top of the stack) to yystate. |
4558+| yysetstate -- set current state (the top of the stack) to yystate. |
4559 `--------------------------------------------------------------------*/
4560 yysetstate:
4561- *yyssp = (yytype_int16) yystate;
4562+ YYDPRINTF ((stderr, "Entering state %d\n", yystate));
4563+ YY_ASSERT (0 <= yystate && yystate < YYNSTATES);
4564+ YY_IGNORE_USELESS_CAST_BEGIN
4565+ *yyssp = YY_CAST (yy_state_t, yystate);
4566+ YY_IGNORE_USELESS_CAST_END
4567+ YY_STACK_PRINT (yyss, yyssp);
4568
4569 if (yyss + yystacksize - 1 <= yyssp)
4570 #if !defined yyoverflow && !defined YYSTACK_RELOCATE
4571@@ -1092,23 +988,23 @@ yysetstate:
4572 #else
4573 {
4574 /* Get the current used size of the three stacks, in elements. */
4575- YYSIZE_T yysize = (YYSIZE_T) (yyssp - yyss + 1);
4576+ YYPTRDIFF_T yysize = yyssp - yyss + 1;
4577
4578 # if defined yyoverflow
4579 {
4580 /* Give user a chance to reallocate the stack. Use copies of
4581 these so that the &'s don't force the real ones into
4582 memory. */
4583+ yy_state_t *yyss1 = yyss;
4584 YYSTYPE *yyvs1 = yyvs;
4585- yytype_int16 *yyss1 = yyss;
4586
4587 /* Each stack pointer address is followed by the size of the
4588 data in use in that stack, in bytes. This used to be a
4589 conditional around just the two extra args, but that might
4590 be undefined if yyoverflow is a macro. */
4591 yyoverflow (YY_("memory exhausted"),
4592- &yyss1, yysize * sizeof (*yyssp),
4593- &yyvs1, yysize * sizeof (*yyvsp),
4594+ &yyss1, yysize * YYSIZEOF (*yyssp),
4595+ &yyvs1, yysize * YYSIZEOF (*yyvsp),
4596 &yystacksize);
4597 yyss = yyss1;
4598 yyvs = yyvs1;
4599@@ -1122,14 +1018,15 @@ yysetstate:
4600 yystacksize = YYMAXDEPTH;
4601
4602 {
4603- yytype_int16 *yyss1 = yyss;
4604+ yy_state_t *yyss1 = yyss;
4605 union yyalloc *yyptr =
4606- (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
4607+ YY_CAST (union yyalloc *,
4608+ YYSTACK_ALLOC (YY_CAST (YYSIZE_T, YYSTACK_BYTES (yystacksize))));
4609 if (! yyptr)
4610 goto yyexhaustedlab;
4611 YYSTACK_RELOCATE (yyss_alloc, yyss);
4612 YYSTACK_RELOCATE (yyvs_alloc, yyvs);
4613-# undef YYSTACK_RELOCATE
4614+# undef YYSTACK_RELOCATE
4615 if (yyss1 != yyssa)
4616 YYSTACK_FREE (yyss1);
4617 }
4618@@ -1138,16 +1035,16 @@ yysetstate:
4619 yyssp = yyss + yysize - 1;
4620 yyvsp = yyvs + yysize - 1;
4621
4622- YYDPRINTF ((stderr, "Stack size increased to %lu\n",
4623- (unsigned long) yystacksize));
4624+ YY_IGNORE_USELESS_CAST_BEGIN
4625+ YYDPRINTF ((stderr, "Stack size increased to %ld\n",
4626+ YY_CAST (long, yystacksize)));
4627+ YY_IGNORE_USELESS_CAST_END
4628
4629 if (yyss + yystacksize - 1 <= yyssp)
4630 YYABORT;
4631 }
4632 #endif /* !defined yyoverflow && !defined YYSTACK_RELOCATE */
4633
4634- YYDPRINTF ((stderr, "Entering state %d\n", yystate));
4635-
4636 if (yystate == YYFINAL)
4637 YYACCEPT;
4638
4639@@ -1168,18 +1065,29 @@ yybackup:
4640
4641 /* Not known => get a lookahead token if don't already have one. */
4642
4643- /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */
4644+ /* YYCHAR is either empty, or end-of-input, or a valid lookahead. */
4645 if (yychar == YYEMPTY)
4646 {
4647- YYDPRINTF ((stderr, "Reading a token: "));
4648+ YYDPRINTF ((stderr, "Reading a token\n"));
4649 yychar = yylex ();
4650 }
4651
4652 if (yychar <= YYEOF)
4653 {
4654- yychar = yytoken = YYEOF;
4655+ yychar = YYEOF;
4656+ yytoken = YYSYMBOL_YYEOF;
4657 YYDPRINTF ((stderr, "Now at end of input.\n"));
4658 }
4659+ else if (yychar == YYerror)
4660+ {
4661+ /* The scanner already issued an error message, process directly
4662+ to error recovery. But do not keep the error token as
4663+ lookahead, it is too special and may lead us to an endless
4664+ loop in error recovery. */
4665+ yychar = YYUNDEF;
4666+ yytoken = YYSYMBOL_YYerror;
4667+ goto yyerrlab1;
4668+ }
4669 else
4670 {
4671 yytoken = YYTRANSLATE (yychar);
4672@@ -1207,15 +1115,13 @@ yybackup:
4673
4674 /* Shift the lookahead token. */
4675 YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
4676-
4677- /* Discard the shifted token. */
4678- yychar = YYEMPTY;
4679-
4680 yystate = yyn;
4681 YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
4682 *++yyvsp = yylval;
4683 YY_IGNORE_MAYBE_UNINITIALIZED_END
4684
4685+ /* Discard the shifted token. */
4686+ yychar = YYEMPTY;
4687 goto yynewstate;
4688
4689
4690@@ -1250,9 +1156,9 @@ yyreduce:
4691 YY_REDUCE_PRINT (yyn);
4692 switch (yyn)
4693 {
4694- case 2:
4695-#line 62 "segparse.y" /* yacc.c:1652 */
4696- {
4697+ case 2: /* range: boundary PLUMIN deviation */
4698+#line 62 "segparse.y"
4699+ {
4700 result->lower = (yyvsp[-2].bnd).val - (yyvsp[0].bnd).val;
4701 result->upper = (yyvsp[-2].bnd).val + (yyvsp[0].bnd).val;
4702 sprintf(strbuf, "%g", result->lower);
4703@@ -1262,12 +1168,12 @@ yyreduce:
4704 result->l_ext = '\0';
4705 result->u_ext = '\0';
4706 }
4707-#line 1266 "segparse.c" /* yacc.c:1652 */
4708+#line 1172 "segparse.c"
4709 break;
4710
4711- case 3:
4712-#line 74 "segparse.y" /* yacc.c:1652 */
4713- {
4714+ case 3: /* range: boundary RANGE boundary */
4715+#line 74 "segparse.y"
4716+ {
4717 result->lower = (yyvsp[-2].bnd).val;
4718 result->upper = (yyvsp[0].bnd).val;
4719 if ( result->lower > result->upper ) {
4720@@ -1283,12 +1189,12 @@ yyreduce:
4721 result->l_ext = ( (yyvsp[-2].bnd).ext ? (yyvsp[-2].bnd).ext : '\0' );
4722 result->u_ext = ( (yyvsp[0].bnd).ext ? (yyvsp[0].bnd).ext : '\0' );
4723 }
4724-#line 1287 "segparse.c" /* yacc.c:1652 */
4725+#line 1193 "segparse.c"
4726 break;
4727
4728- case 4:
4729-#line 92 "segparse.y" /* yacc.c:1652 */
4730- {
4731+ case 4: /* range: boundary RANGE */
4732+#line 92 "segparse.y"
4733+ {
4734 result->lower = (yyvsp[-1].bnd).val;
4735 result->upper = HUGE_VAL;
4736 result->l_sigd = (yyvsp[-1].bnd).sigd;
4737@@ -1296,12 +1202,12 @@ yyreduce:
4738 result->l_ext = ( (yyvsp[-1].bnd).ext ? (yyvsp[-1].bnd).ext : '\0' );
4739 result->u_ext = '-';
4740 }
4741-#line 1300 "segparse.c" /* yacc.c:1652 */
4742+#line 1206 "segparse.c"
4743 break;
4744
4745- case 5:
4746-#line 102 "segparse.y" /* yacc.c:1652 */
4747- {
4748+ case 5: /* range: RANGE boundary */
4749+#line 102 "segparse.y"
4750+ {
4751 result->lower = -HUGE_VAL;
4752 result->upper = (yyvsp[0].bnd).val;
4753 result->l_sigd = 0;
4754@@ -1309,22 +1215,22 @@ yyreduce:
4755 result->l_ext = '-';
4756 result->u_ext = ( (yyvsp[0].bnd).ext ? (yyvsp[0].bnd).ext : '\0' );
4757 }
4758-#line 1313 "segparse.c" /* yacc.c:1652 */
4759+#line 1219 "segparse.c"
4760 break;
4761
4762- case 6:
4763-#line 112 "segparse.y" /* yacc.c:1652 */
4764- {
4765+ case 6: /* range: boundary */
4766+#line 112 "segparse.y"
4767+ {
4768 result->lower = result->upper = (yyvsp[0].bnd).val;
4769 result->l_sigd = result->u_sigd = (yyvsp[0].bnd).sigd;
4770 result->l_ext = result->u_ext = ( (yyvsp[0].bnd).ext ? (yyvsp[0].bnd).ext : '\0' );
4771 }
4772-#line 1323 "segparse.c" /* yacc.c:1652 */
4773+#line 1229 "segparse.c"
4774 break;
4775
4776- case 7:
4777-#line 120 "segparse.y" /* yacc.c:1652 */
4778- {
4779+ case 7: /* boundary: SEGFLOAT */
4780+#line 120 "segparse.y"
4781+ {
4782 /* temp variable avoids a gcc 3.3.x bug on Sparc64 */
4783 float val = seg_atof((yyvsp[0].text));
4784
4785@@ -1332,12 +1238,12 @@ yyreduce:
4786 (yyval.bnd).sigd = significant_digits((yyvsp[0].text));
4787 (yyval.bnd).val = val;
4788 }
4789-#line 1336 "segparse.c" /* yacc.c:1652 */
4790+#line 1242 "segparse.c"
4791 break;
4792
4793- case 8:
4794-#line 129 "segparse.y" /* yacc.c:1652 */
4795- {
4796+ case 8: /* boundary: EXTENSION SEGFLOAT */
4797+#line 129 "segparse.y"
4798+ {
4799 /* temp variable avoids a gcc 3.3.x bug on Sparc64 */
4800 float val = seg_atof((yyvsp[0].text));
4801
4802@@ -1345,12 +1251,12 @@ yyreduce:
4803 (yyval.bnd).sigd = significant_digits((yyvsp[0].text));
4804 (yyval.bnd).val = val;
4805 }
4806-#line 1349 "segparse.c" /* yacc.c:1652 */
4807+#line 1255 "segparse.c"
4808 break;
4809
4810- case 9:
4811-#line 140 "segparse.y" /* yacc.c:1652 */
4812- {
4813+ case 9: /* deviation: SEGFLOAT */
4814+#line 140 "segparse.y"
4815+ {
4816 /* temp variable avoids a gcc 3.3.x bug on Sparc64 */
4817 float val = seg_atof((yyvsp[0].text));
4818
4819@@ -1358,11 +1264,12 @@ yyreduce:
4820 (yyval.bnd).sigd = significant_digits((yyvsp[0].text));
4821 (yyval.bnd).val = val;
4822 }
4823-#line 1362 "segparse.c" /* yacc.c:1652 */
4824+#line 1268 "segparse.c"
4825 break;
4826
4827
4828-#line 1366 "segparse.c" /* yacc.c:1652 */
4829+#line 1272 "segparse.c"
4830+
4831 default: break;
4832 }
4833 /* User semantic actions sometimes alter yychar, and that requires
4834@@ -1376,11 +1283,10 @@ yyreduce:
4835 case of YYERROR or YYBACKUP, subsequent parser actions might lead
4836 to an incorrect destructor call or verbose syntax error message
4837 before the lookahead is translated. */
4838- YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
4839+ YY_SYMBOL_PRINT ("-> $$ =", YY_CAST (yysymbol_kind_t, yyr1[yyn]), &yyval, &yyloc);
4840
4841 YYPOPSTACK (yylen);
4842 yylen = 0;
4843- YY_STACK_PRINT (yyss, yyssp);
4844
4845 *++yyvsp = yyval;
4846
4847@@ -1404,50 +1310,14 @@ yyreduce:
4848 yyerrlab:
4849 /* Make sure we have latest lookahead translation. See comments at
4850 user semantic actions for why this is necessary. */
4851- yytoken = yychar == YYEMPTY ? YYEMPTY : YYTRANSLATE (yychar);
4852-
4853+ yytoken = yychar == YYEMPTY ? YYSYMBOL_YYEMPTY : YYTRANSLATE (yychar);
4854 /* If not already recovering from an error, report this error. */
4855 if (!yyerrstatus)
4856 {
4857 ++yynerrs;
4858-#if ! YYERROR_VERBOSE
4859 yyerror (result, YY_("syntax error"));
4860-#else
4861-# define YYSYNTAX_ERROR yysyntax_error (&yymsg_alloc, &yymsg, \
4862- yyssp, yytoken)
4863- {
4864- char const *yymsgp = YY_("syntax error");
4865- int yysyntax_error_status;
4866- yysyntax_error_status = YYSYNTAX_ERROR;
4867- if (yysyntax_error_status == 0)
4868- yymsgp = yymsg;
4869- else if (yysyntax_error_status == 1)
4870- {
4871- if (yymsg != yymsgbuf)
4872- YYSTACK_FREE (yymsg);
4873- yymsg = (char *) YYSTACK_ALLOC (yymsg_alloc);
4874- if (!yymsg)
4875- {
4876- yymsg = yymsgbuf;
4877- yymsg_alloc = sizeof yymsgbuf;
4878- yysyntax_error_status = 2;
4879- }
4880- else
4881- {
4882- yysyntax_error_status = YYSYNTAX_ERROR;
4883- yymsgp = yymsg;
4884- }
4885- }
4886- yyerror (result, yymsgp);
4887- if (yysyntax_error_status == 2)
4888- goto yyexhaustedlab;
4889- }
4890-# undef YYSYNTAX_ERROR
4891-#endif
4892 }
4893
4894-
4895-
4896 if (yyerrstatus == 3)
4897 {
4898 /* If just tried and failed to reuse lookahead token after an
4899@@ -1496,13 +1366,14 @@ yyerrorlab:
4900 yyerrlab1:
4901 yyerrstatus = 3; /* Each real token shifted decrements this. */
4902
4903+ /* Pop stack until we find a state that shifts the error token. */
4904 for (;;)
4905 {
4906 yyn = yypact[yystate];
4907 if (!yypact_value_is_default (yyn))
4908 {
4909- yyn += YYTERROR;
4910- if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
4911+ yyn += YYSYMBOL_YYerror;
4912+ if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYSYMBOL_YYerror)
4913 {
4914 yyn = yytable[yyn];
4915 if (0 < yyn)
4916@@ -1516,7 +1387,7 @@ yyerrlab1:
4917
4918
4919 yydestruct ("Error: popping",
4920- yystos[yystate], yyvsp, result);
4921+ YY_ACCESSING_SYMBOL (yystate), yyvsp, result);
4922 YYPOPSTACK (1);
4923 yystate = *yyssp;
4924 YY_STACK_PRINT (yyss, yyssp);
4925@@ -1528,7 +1399,7 @@ yyerrlab1:
4926
4927
4928 /* Shift the error token. */
4929- YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp);
4930+ YY_SYMBOL_PRINT ("Shifting", YY_ACCESSING_SYMBOL (yyn), yyvsp, yylsp);
4931
4932 yystate = yyn;
4933 goto yynewstate;
4934@@ -1550,20 +1421,20 @@ yyabortlab:
4935 goto yyreturn;
4936
4937
4938-#if !defined yyoverflow || YYERROR_VERBOSE
4939+#if !defined yyoverflow
4940 /*-------------------------------------------------.
4941 | yyexhaustedlab -- memory exhaustion comes here. |
4942 `-------------------------------------------------*/
4943 yyexhaustedlab:
4944 yyerror (result, YY_("memory exhausted"));
4945 yyresult = 2;
4946- /* Fall through. */
4947+ goto yyreturn;
4948 #endif
4949
4950
4951-/*-----------------------------------------------------.
4952-| yyreturn -- parsing is finished, return the result. |
4953-`-----------------------------------------------------*/
4954+/*-------------------------------------------------------.
4955+| yyreturn -- parsing is finished, clean up and return. |
4956+`-------------------------------------------------------*/
4957 yyreturn:
4958 if (yychar != YYEMPTY)
4959 {
4960@@ -1580,20 +1451,18 @@ yyreturn:
4961 while (yyssp != yyss)
4962 {
4963 yydestruct ("Cleanup: popping",
4964- yystos[*yyssp], yyvsp, result);
4965+ YY_ACCESSING_SYMBOL (+*yyssp), yyvsp, result);
4966 YYPOPSTACK (1);
4967 }
4968 #ifndef yyoverflow
4969 if (yyss != yyssa)
4970 YYSTACK_FREE (yyss);
4971 #endif
4972-#if YYERROR_VERBOSE
4973- if (yymsg != yymsgbuf)
4974- YYSTACK_FREE (yymsg);
4975-#endif
4976+
4977 return yyresult;
4978 }
4979-#line 150 "segparse.y" /* yacc.c:1918 */
4980+
4981+#line 150 "segparse.y"
4982
4983
4984
4985diff --git a/contrib/test_decoding/expected/toast.out b/contrib/test_decoding/expected/toast.out
4986index cd03e9d..a757e7d 100644
4987--- a/contrib/test_decoding/expected/toast.out
4988+++ b/contrib/test_decoding/expected/toast.out
4989@@ -77,7 +77,7 @@ SELECT substr(data, 1, 200) FROM pg_logical_slot_get_changes('regression_slot',
4990 table public.toasted_key: INSERT: id[integer]:1 toasted_key[text]:'1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123
4991 COMMIT
4992 BEGIN
4993- table public.toasted_key: UPDATE: id[integer]:1 toasted_key[text]:unchanged-toast-datum toasted_col1[text]:unchanged-toast-datum toasted_col2[text]:'987654321098765432109876543210987654321098765432109
4994+ table public.toasted_key: UPDATE: old-key: toasted_key[text]:'123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678
4995 COMMIT
4996 BEGIN
4997 table public.toasted_key: UPDATE: old-key: toasted_key[text]:'123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678
4998diff --git a/debian/changelog b/debian/changelog
4999index d404738..ac0877c 100644
5000--- a/debian/changelog
The diff has been truncated for viewing.

Subscribers

People subscribed via source and target branches